collection_test.go 19 KB

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