collection_test.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663
  1. package mon
  2. import (
  3. "context"
  4. "errors"
  5. "strings"
  6. "testing"
  7. "github.com/stretchr/testify/assert"
  8. "github.com/zeromicro/go-zero/core/breaker"
  9. "github.com/zeromicro/go-zero/core/logx"
  10. "github.com/zeromicro/go-zero/core/stringx"
  11. "github.com/zeromicro/go-zero/core/timex"
  12. "go.mongodb.org/mongo-driver/bson"
  13. "go.mongodb.org/mongo-driver/bson/primitive"
  14. "go.mongodb.org/mongo-driver/mongo"
  15. "go.mongodb.org/mongo-driver/mongo/integration/mtest"
  16. mopt "go.mongodb.org/mongo-driver/mongo/options"
  17. )
  18. var errDummy = errors.New("dummy")
  19. func TestKeepPromise_accept(t *testing.T) {
  20. p := new(mockPromise)
  21. kp := keepablePromise{
  22. promise: p,
  23. log: func(error) {},
  24. }
  25. assert.Nil(t, kp.accept(nil))
  26. assert.Equal(t, ErrNotFound, kp.accept(ErrNotFound))
  27. }
  28. func TestKeepPromise_keep(t *testing.T) {
  29. tests := []struct {
  30. err error
  31. accepted bool
  32. reason string
  33. }{
  34. {
  35. err: nil,
  36. accepted: true,
  37. reason: "",
  38. },
  39. {
  40. err: ErrNotFound,
  41. accepted: true,
  42. reason: "",
  43. },
  44. {
  45. err: errors.New("any"),
  46. accepted: false,
  47. reason: "any",
  48. },
  49. }
  50. for _, test := range tests {
  51. t.Run(stringx.RandId(), func(t *testing.T) {
  52. p := new(mockPromise)
  53. kp := keepablePromise{
  54. promise: p,
  55. log: func(error) {},
  56. }
  57. assert.Equal(t, test.err, kp.keep(test.err))
  58. assert.Equal(t, test.accepted, p.accepted)
  59. assert.Equal(t, test.reason, p.reason)
  60. })
  61. }
  62. }
  63. func TestNewCollection(t *testing.T) {
  64. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  65. defer mt.Close()
  66. mt.Run("test", func(mt *mtest.T) {
  67. coll := mt.Coll
  68. assert.NotNil(t, coll)
  69. col := newCollection(coll, breaker.GetBreaker("localhost"))
  70. assert.Equal(t, t.Name()+"/test", col.(*decoratedCollection).name)
  71. })
  72. }
  73. func TestCollection_Aggregate(t *testing.T) {
  74. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  75. defer mt.Close()
  76. mt.Run("test", func(mt *mtest.T) {
  77. coll := mt.Coll
  78. assert.NotNil(t, coll)
  79. col := newCollection(coll, breaker.GetBreaker("localhost"))
  80. ns := mt.Coll.Database().Name() + "." + mt.Coll.Name()
  81. aggRes := mtest.CreateCursorResponse(1, ns, mtest.FirstBatch)
  82. mt.AddMockResponses(aggRes)
  83. assert.Equal(t, t.Name()+"/test", col.(*decoratedCollection).name)
  84. cursor, err := col.Aggregate(context.Background(), mongo.Pipeline{}, mopt.Aggregate())
  85. assert.Nil(t, err)
  86. cursor.Close(context.Background())
  87. })
  88. }
  89. func TestCollection_BulkWrite(t *testing.T) {
  90. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  91. defer mt.Close()
  92. mt.Run("test", func(mt *mtest.T) {
  93. c := decoratedCollection{
  94. Collection: mt.Coll,
  95. brk: breaker.NewBreaker(),
  96. }
  97. mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{{Key: "ok", Value: 1}}...))
  98. res, err := c.BulkWrite(context.Background(), []mongo.WriteModel{
  99. mongo.NewInsertOneModel().SetDocument(bson.D{{Key: "foo", Value: 1}})},
  100. )
  101. assert.Nil(t, err)
  102. assert.NotNil(t, res)
  103. c.brk = new(dropBreaker)
  104. _, err = c.BulkWrite(context.Background(), []mongo.WriteModel{
  105. mongo.NewInsertOneModel().SetDocument(bson.D{{Key: "foo", Value: 1}})},
  106. )
  107. assert.Equal(t, errDummy, err)
  108. })
  109. }
  110. func TestCollection_CountDocuments(t *testing.T) {
  111. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  112. defer mt.Close()
  113. mt.Run("test", func(mt *mtest.T) {
  114. c := decoratedCollection{
  115. Collection: mt.Coll,
  116. brk: breaker.NewBreaker(),
  117. }
  118. mt.AddMockResponses(mtest.CreateCursorResponse(
  119. 1,
  120. "DBName.CollectionName",
  121. mtest.FirstBatch,
  122. bson.D{
  123. {Key: "n", Value: 1},
  124. }))
  125. res, err := c.CountDocuments(context.Background(), bson.D{})
  126. assert.Nil(t, err)
  127. assert.Equal(t, int64(1), res)
  128. c.brk = new(dropBreaker)
  129. _, err = c.CountDocuments(context.Background(), bson.D{{Key: "foo", Value: 1}})
  130. assert.Equal(t, errDummy, err)
  131. })
  132. }
  133. func TestDecoratedCollection_DeleteMany(t *testing.T) {
  134. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  135. defer mt.Close()
  136. mt.Run("test", func(mt *mtest.T) {
  137. c := decoratedCollection{
  138. Collection: mt.Coll,
  139. brk: breaker.NewBreaker(),
  140. }
  141. mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{{Key: "n", Value: 1}}...))
  142. res, err := c.DeleteMany(context.Background(), bson.D{})
  143. assert.Nil(t, err)
  144. assert.Equal(t, int64(1), res.DeletedCount)
  145. c.brk = new(dropBreaker)
  146. _, err = c.DeleteMany(context.Background(), bson.D{{Key: "foo", Value: 1}})
  147. assert.Equal(t, errDummy, err)
  148. })
  149. }
  150. func TestCollection_Distinct(t *testing.T) {
  151. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  152. defer mt.Close()
  153. mt.Run("test", func(mt *mtest.T) {
  154. c := decoratedCollection{
  155. Collection: mt.Coll,
  156. brk: breaker.NewBreaker(),
  157. }
  158. mt.AddMockResponses(bson.D{{Key: "ok", Value: 1}, {Key: "values", Value: []int{1}}})
  159. resp, err := c.Distinct(context.Background(), "foo", bson.D{})
  160. assert.Nil(t, err)
  161. assert.Equal(t, 1, len(resp))
  162. c.brk = new(dropBreaker)
  163. _, err = c.Distinct(context.Background(), "foo", bson.D{{Key: "foo", Value: 1}})
  164. assert.Equal(t, errDummy, err)
  165. })
  166. }
  167. func TestCollection_EstimatedDocumentCount(t *testing.T) {
  168. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  169. defer mt.Close()
  170. mt.Run("test", func(mt *mtest.T) {
  171. c := decoratedCollection{
  172. Collection: mt.Coll,
  173. brk: breaker.NewBreaker(),
  174. }
  175. mt.AddMockResponses(bson.D{{Key: "ok", Value: 1}, {Key: "n", Value: 1}})
  176. res, err := c.EstimatedDocumentCount(context.Background())
  177. assert.Nil(t, err)
  178. assert.Equal(t, int64(1), res)
  179. c.brk = new(dropBreaker)
  180. _, err = c.EstimatedDocumentCount(context.Background())
  181. assert.Equal(t, errDummy, err)
  182. })
  183. }
  184. func TestCollectionFind(t *testing.T) {
  185. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  186. defer mt.Close()
  187. mt.Run("test", func(mt *mtest.T) {
  188. c := decoratedCollection{
  189. Collection: mt.Coll,
  190. brk: breaker.NewBreaker(),
  191. }
  192. find := mtest.CreateCursorResponse(
  193. 1,
  194. "DBName.CollectionName",
  195. mtest.FirstBatch,
  196. bson.D{
  197. {Key: "name", Value: "John"},
  198. })
  199. getMore := mtest.CreateCursorResponse(
  200. 1,
  201. "DBName.CollectionName",
  202. mtest.NextBatch,
  203. bson.D{
  204. {Key: "name", Value: "Mary"},
  205. })
  206. killCursors := mtest.CreateCursorResponse(
  207. 0,
  208. "DBName.CollectionName",
  209. mtest.NextBatch)
  210. mt.AddMockResponses(find, getMore, killCursors)
  211. filter := bson.D{{Key: "x", Value: 1}}
  212. cursor, err := c.Find(context.Background(), filter, mopt.Find())
  213. assert.Nil(t, err)
  214. defer cursor.Close(context.Background())
  215. var val []struct {
  216. ID primitive.ObjectID `bson:"_id"`
  217. Name string `bson:"name"`
  218. }
  219. assert.Nil(t, cursor.All(context.Background(), &val))
  220. assert.Equal(t, 2, len(val))
  221. assert.Equal(t, "John", val[0].Name)
  222. assert.Equal(t, "Mary", val[1].Name)
  223. c.brk = new(dropBreaker)
  224. _, err = c.Find(context.Background(), filter, mopt.Find())
  225. assert.Equal(t, errDummy, err)
  226. })
  227. }
  228. func TestCollectionFindOne(t *testing.T) {
  229. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  230. defer mt.Close()
  231. mt.Run("test", func(mt *mtest.T) {
  232. c := decoratedCollection{
  233. Collection: mt.Coll,
  234. brk: breaker.NewBreaker(),
  235. }
  236. find := mtest.CreateCursorResponse(
  237. 1,
  238. "DBName.CollectionName",
  239. mtest.FirstBatch,
  240. bson.D{
  241. {Key: "name", Value: "John"},
  242. })
  243. getMore := mtest.CreateCursorResponse(
  244. 1,
  245. "DBName.CollectionName",
  246. mtest.NextBatch,
  247. bson.D{
  248. {Key: "name", Value: "Mary"},
  249. })
  250. killCursors := mtest.CreateCursorResponse(
  251. 0,
  252. "DBName.CollectionName",
  253. mtest.NextBatch)
  254. mt.AddMockResponses(find, getMore, killCursors)
  255. filter := bson.D{{Key: "x", Value: 1}}
  256. resp, err := c.FindOne(context.Background(), filter)
  257. assert.Nil(t, err)
  258. var val struct {
  259. ID primitive.ObjectID `bson:"_id"`
  260. Name string `bson:"name"`
  261. }
  262. assert.Nil(t, resp.Decode(&val))
  263. assert.Equal(t, "John", val.Name)
  264. c.brk = new(dropBreaker)
  265. _, err = c.FindOne(context.Background(), filter)
  266. assert.Equal(t, errDummy, err)
  267. })
  268. }
  269. func TestCollection_FindOneAndDelete(t *testing.T) {
  270. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  271. defer mt.Close()
  272. mt.Run("test", func(mt *mtest.T) {
  273. c := decoratedCollection{
  274. Collection: mt.Coll,
  275. brk: breaker.NewBreaker(),
  276. }
  277. filter := bson.D{}
  278. mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{}...))
  279. _, err := c.FindOneAndDelete(context.Background(), filter, mopt.FindOneAndDelete())
  280. assert.Equal(t, mongo.ErrNoDocuments, err)
  281. mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{
  282. {Key: "value", Value: bson.D{{Key: "name", Value: "John"}}},
  283. }...))
  284. resp, err := c.FindOneAndDelete(context.Background(), filter, mopt.FindOneAndDelete())
  285. assert.Nil(t, err)
  286. var val struct {
  287. Name string `bson:"name"`
  288. }
  289. assert.Nil(t, resp.Decode(&val))
  290. assert.Equal(t, "John", val.Name)
  291. c.brk = new(dropBreaker)
  292. _, err = c.FindOneAndDelete(context.Background(), bson.D{{Key: "foo", Value: "bar"}})
  293. assert.Equal(t, errDummy, err)
  294. })
  295. }
  296. func TestCollection_FindOneAndReplace(t *testing.T) {
  297. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  298. defer mt.Close()
  299. mt.Run("test", func(mt *mtest.T) {
  300. c := decoratedCollection{
  301. Collection: mt.Coll,
  302. brk: breaker.NewBreaker(),
  303. }
  304. mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{}...))
  305. filter := bson.D{{Key: "x", Value: 1}}
  306. replacement := bson.D{{Key: "x", Value: 2}}
  307. opts := mopt.FindOneAndReplace().SetUpsert(true)
  308. _, err := c.FindOneAndReplace(context.Background(), filter, replacement, opts)
  309. assert.Equal(t, mongo.ErrNoDocuments, err)
  310. mt.AddMockResponses(bson.D{{Key: "ok", Value: 1}, {Key: "value", Value: bson.D{
  311. {Key: "name", Value: "John"},
  312. }}})
  313. resp, err := c.FindOneAndReplace(context.Background(), filter, replacement, opts)
  314. assert.Nil(t, err)
  315. var val struct {
  316. Name string `bson:"name"`
  317. }
  318. assert.Nil(t, resp.Decode(&val))
  319. assert.Equal(t, "John", val.Name)
  320. c.brk = new(dropBreaker)
  321. _, err = c.FindOneAndReplace(context.Background(), filter, replacement, opts)
  322. assert.Equal(t, errDummy, err)
  323. })
  324. }
  325. func TestCollection_FindOneAndUpdate(t *testing.T) {
  326. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  327. defer mt.Close()
  328. mt.Run("test", func(mt *mtest.T) {
  329. c := decoratedCollection{
  330. Collection: mt.Coll,
  331. brk: breaker.NewBreaker(),
  332. }
  333. mt.AddMockResponses(bson.D{{Key: "ok", Value: 1}})
  334. filter := bson.D{{Key: "x", Value: 1}}
  335. update := bson.D{{Key: "$x", Value: 2}}
  336. opts := mopt.FindOneAndUpdate().SetUpsert(true)
  337. _, err := c.FindOneAndUpdate(context.Background(), filter, update, opts)
  338. assert.Equal(t, mongo.ErrNoDocuments, err)
  339. mt.AddMockResponses(bson.D{{Key: "ok", Value: 1}, {Key: "value", Value: bson.D{
  340. {Key: "name", Value: "John"},
  341. }}})
  342. resp, err := c.FindOneAndUpdate(context.Background(), filter, update, opts)
  343. assert.Nil(t, err)
  344. var val struct {
  345. Name string `bson:"name"`
  346. }
  347. assert.Nil(t, resp.Decode(&val))
  348. assert.Equal(t, "John", val.Name)
  349. c.brk = new(dropBreaker)
  350. _, err = c.FindOneAndUpdate(context.Background(), filter, update, opts)
  351. assert.Equal(t, errDummy, err)
  352. })
  353. }
  354. func TestCollection_InsertOne(t *testing.T) {
  355. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  356. defer mt.Close()
  357. mt.Run("test", func(mt *mtest.T) {
  358. c := decoratedCollection{
  359. Collection: mt.Coll,
  360. brk: breaker.NewBreaker(),
  361. }
  362. mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{{Key: "ok", Value: 1}}...))
  363. res, err := c.InsertOne(context.Background(), bson.D{{Key: "foo", Value: "bar"}})
  364. assert.Nil(t, err)
  365. assert.NotNil(t, res)
  366. c.brk = new(dropBreaker)
  367. _, err = c.InsertOne(context.Background(), bson.D{{Key: "foo", Value: "bar"}})
  368. assert.Equal(t, errDummy, err)
  369. })
  370. }
  371. func TestCollection_InsertMany(t *testing.T) {
  372. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  373. defer mt.Close()
  374. mt.Run("test", func(mt *mtest.T) {
  375. c := decoratedCollection{
  376. Collection: mt.Coll,
  377. brk: breaker.NewBreaker(),
  378. }
  379. mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{{Key: "ok", Value: 1}}...))
  380. res, err := c.InsertMany(context.Background(), []interface{}{
  381. bson.D{{Key: "foo", Value: "bar"}},
  382. bson.D{{Key: "foo", Value: "baz"}},
  383. })
  384. assert.Nil(t, err)
  385. assert.NotNil(t, res)
  386. assert.Equal(t, 2, len(res.InsertedIDs))
  387. c.brk = new(dropBreaker)
  388. _, err = c.InsertMany(context.Background(), []interface{}{bson.D{{Key: "foo", Value: "bar"}}})
  389. assert.Equal(t, errDummy, err)
  390. })
  391. }
  392. func TestCollection_Remove(t *testing.T) {
  393. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  394. defer mt.Close()
  395. mt.Run("test", func(mt *mtest.T) {
  396. c := decoratedCollection{
  397. Collection: mt.Coll,
  398. brk: breaker.NewBreaker(),
  399. }
  400. mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{{Key: "n", Value: 1}}...))
  401. res, err := c.DeleteOne(context.Background(), bson.D{{Key: "foo", Value: "bar"}})
  402. assert.Nil(t, err)
  403. assert.Equal(t, int64(1), res.DeletedCount)
  404. c.brk = new(dropBreaker)
  405. _, err = c.DeleteOne(context.Background(), bson.D{{Key: "foo", Value: "bar"}})
  406. assert.Equal(t, errDummy, err)
  407. })
  408. }
  409. func TestCollectionRemoveAll(t *testing.T) {
  410. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  411. defer mt.Close()
  412. mt.Run("test", func(mt *mtest.T) {
  413. c := decoratedCollection{
  414. Collection: mt.Coll,
  415. brk: breaker.NewBreaker(),
  416. }
  417. mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{{Key: "n", Value: 1}}...))
  418. res, err := c.DeleteMany(context.Background(), bson.D{{Key: "foo", Value: "bar"}})
  419. assert.Nil(t, err)
  420. assert.Equal(t, int64(1), res.DeletedCount)
  421. c.brk = new(dropBreaker)
  422. _, err = c.DeleteMany(context.Background(), bson.D{{Key: "foo", Value: "bar"}})
  423. assert.Equal(t, errDummy, err)
  424. })
  425. }
  426. func TestCollection_ReplaceOne(t *testing.T) {
  427. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  428. defer mt.Close()
  429. mt.Run("test", func(mt *mtest.T) {
  430. c := decoratedCollection{
  431. Collection: mt.Coll,
  432. brk: breaker.NewBreaker(),
  433. }
  434. mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{{Key: "n", Value: 1}}...))
  435. res, err := c.ReplaceOne(context.Background(), bson.D{{Key: "foo", Value: "bar"}},
  436. bson.D{{Key: "foo", Value: "baz"}},
  437. )
  438. assert.Nil(t, err)
  439. assert.Equal(t, int64(1), res.MatchedCount)
  440. c.brk = new(dropBreaker)
  441. _, err = c.ReplaceOne(context.Background(), bson.D{{Key: "foo", Value: "bar"}},
  442. bson.D{{Key: "foo", Value: "baz"}})
  443. assert.Equal(t, errDummy, err)
  444. })
  445. }
  446. func TestCollection_UpdateOne(t *testing.T) {
  447. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  448. defer mt.Close()
  449. mt.Run("test", func(mt *mtest.T) {
  450. c := decoratedCollection{
  451. Collection: mt.Coll,
  452. brk: breaker.NewBreaker(),
  453. }
  454. mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{{Key: "n", Value: 1}}...))
  455. resp, err := c.UpdateOne(context.Background(), bson.D{{Key: "foo", Value: "bar"}},
  456. bson.D{{Key: "$set", Value: bson.D{{Key: "baz", Value: "qux"}}}})
  457. assert.Nil(t, err)
  458. assert.Equal(t, int64(1), resp.MatchedCount)
  459. c.brk = new(dropBreaker)
  460. _, err = c.UpdateOne(context.Background(), bson.D{{Key: "foo", Value: "bar"}},
  461. bson.D{{Key: "$set", Value: bson.D{{Key: "baz", Value: "qux"}}}})
  462. assert.Equal(t, errDummy, err)
  463. })
  464. }
  465. func TestCollection_UpdateByID(t *testing.T) {
  466. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  467. defer mt.Close()
  468. mt.Run("test", func(mt *mtest.T) {
  469. c := decoratedCollection{
  470. Collection: mt.Coll,
  471. brk: breaker.NewBreaker(),
  472. }
  473. mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{{Key: "n", Value: 1}}...))
  474. resp, err := c.UpdateByID(context.Background(), primitive.NewObjectID(),
  475. bson.D{{Key: "$set", Value: bson.D{{Key: "baz", Value: "qux"}}}})
  476. assert.Nil(t, err)
  477. assert.Equal(t, int64(1), resp.MatchedCount)
  478. c.brk = new(dropBreaker)
  479. _, err = c.UpdateByID(context.Background(), primitive.NewObjectID(),
  480. bson.D{{Key: "$set", Value: bson.D{{Key: "baz", Value: "qux"}}}})
  481. assert.Equal(t, errDummy, err)
  482. })
  483. }
  484. func TestCollection_UpdateMany(t *testing.T) {
  485. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  486. defer mt.Close()
  487. mt.Run("test", func(mt *mtest.T) {
  488. c := decoratedCollection{
  489. Collection: mt.Coll,
  490. brk: breaker.NewBreaker(),
  491. }
  492. mt.AddMockResponses(mtest.CreateSuccessResponse(bson.D{{Key: "n", Value: 1}}...))
  493. resp, err := c.UpdateMany(context.Background(), bson.D{{Key: "foo", Value: "bar"}},
  494. bson.D{{Key: "$set", Value: bson.D{{Key: "baz", Value: "qux"}}}})
  495. assert.Nil(t, err)
  496. assert.Equal(t, int64(1), resp.MatchedCount)
  497. c.brk = new(dropBreaker)
  498. _, err = c.UpdateMany(context.Background(), bson.D{{Key: "foo", Value: "bar"}},
  499. bson.D{{Key: "$set", Value: bson.D{{Key: "baz", Value: "qux"}}}})
  500. assert.Equal(t, errDummy, err)
  501. })
  502. }
  503. func Test_DecoratedCollectionLogDuration(t *testing.T) {
  504. mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
  505. defer mt.Close()
  506. c := decoratedCollection{
  507. Collection: mt.Coll,
  508. brk: breaker.NewBreaker(),
  509. }
  510. var buf strings.Builder
  511. w := logx.NewWriter(&buf)
  512. o := logx.Reset()
  513. logx.SetWriter(w)
  514. defer func() {
  515. logx.Reset()
  516. logx.SetWriter(o)
  517. }()
  518. buf.Reset()
  519. c.logDuration(context.Background(), "foo", timex.Now(), nil, "bar")
  520. assert.Contains(t, buf.String(), "foo")
  521. assert.Contains(t, buf.String(), "bar")
  522. buf.Reset()
  523. c.logDuration(context.Background(), "foo", timex.Now(), errors.New("bar"), make(chan int))
  524. assert.Contains(t, buf.String(), "foo")
  525. assert.Contains(t, buf.String(), "bar")
  526. buf.Reset()
  527. c.logDuration(context.Background(), "foo", timex.Now(), nil, make(chan int))
  528. assert.Contains(t, buf.String(), "foo")
  529. buf.Reset()
  530. c.logDuration(context.Background(), "foo", timex.Now()-slowThreshold.Load()*2,
  531. nil, make(chan int))
  532. assert.Contains(t, buf.String(), "foo")
  533. assert.Contains(t, buf.String(), "slowcall")
  534. buf.Reset()
  535. c.logDuration(context.Background(), "foo", timex.Now()-slowThreshold.Load()*2,
  536. errors.New("bar"), make(chan int))
  537. assert.Contains(t, buf.String(), "foo")
  538. assert.Contains(t, buf.String(), "bar")
  539. assert.Contains(t, buf.String(), "slowcall")
  540. buf.Reset()
  541. c.logDuration(context.Background(), "foo", timex.Now()-slowThreshold.Load()*2,
  542. errors.New("bar"))
  543. assert.Contains(t, buf.String(), "foo")
  544. assert.Contains(t, buf.String(), "slowcall")
  545. buf.Reset()
  546. c.logDuration(context.Background(), "foo", timex.Now()-slowThreshold.Load()*2, nil)
  547. assert.Contains(t, buf.String(), "foo")
  548. assert.Contains(t, buf.String(), "slowcall")
  549. }
  550. type mockPromise struct {
  551. accepted bool
  552. reason string
  553. }
  554. func (p *mockPromise) Accept() {
  555. p.accepted = true
  556. }
  557. func (p *mockPromise) Reject(reason string) {
  558. p.reason = reason
  559. }
  560. type dropBreaker struct{}
  561. func (d *dropBreaker) Name() string {
  562. return "dummy"
  563. }
  564. func (d *dropBreaker) Allow() (breaker.Promise, error) {
  565. return nil, errDummy
  566. }
  567. func (d *dropBreaker) Do(_ func() error) error {
  568. return nil
  569. }
  570. func (d *dropBreaker) DoWithAcceptable(_ func() error, _ breaker.Acceptable) error {
  571. return errDummy
  572. }
  573. func (d *dropBreaker) DoWithFallback(_ func() error, _ func(err error) error) error {
  574. return nil
  575. }
  576. func (d *dropBreaker) DoWithFallbackAcceptable(_ func() error, _ func(err error) error,
  577. _ breaker.Acceptable) error {
  578. return nil
  579. }