mongo 2.0.6 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (317) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +5 -2
  3. data/lib/mongo/address/ipv4.rb +6 -1
  4. data/lib/mongo/address/unix.rb +2 -2
  5. data/lib/mongo/address.rb +18 -10
  6. data/lib/mongo/auth/cr/conversation.rb +1 -1
  7. data/lib/mongo/auth/ldap/conversation.rb +7 -3
  8. data/lib/mongo/auth/scram/conversation.rb +9 -3
  9. data/lib/mongo/auth/user/view.rb +23 -2
  10. data/lib/mongo/auth/x509/conversation.rb +1 -1
  11. data/lib/mongo/bulk_write/combineable.rb +51 -0
  12. data/lib/mongo/bulk_write/ordered_combiner.rb +55 -0
  13. data/lib/mongo/bulk_write/result.rb +191 -0
  14. data/lib/mongo/bulk_write/result_combiner.rb +117 -0
  15. data/lib/mongo/bulk_write/transformable.rb +132 -0
  16. data/lib/mongo/bulk_write/unordered_combiner.rb +52 -0
  17. data/lib/mongo/bulk_write/validatable.rb +62 -0
  18. data/lib/mongo/bulk_write.rb +159 -23
  19. data/lib/mongo/client.rb +52 -16
  20. data/lib/mongo/cluster/topology/replica_set.rb +27 -9
  21. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  22. data/lib/mongo/cluster/topology/unknown.rb +5 -2
  23. data/lib/mongo/cluster.rb +42 -7
  24. data/lib/mongo/collection/view/aggregation.rb +48 -9
  25. data/lib/mongo/collection/view/immutable.rb +6 -6
  26. data/lib/mongo/collection/view/iterable.rb +18 -4
  27. data/lib/mongo/collection/view/map_reduce.rb +58 -17
  28. data/lib/mongo/collection/view/readable.rb +173 -42
  29. data/lib/mongo/collection/view/writable.rb +37 -23
  30. data/lib/mongo/collection/view.rb +2 -2
  31. data/lib/mongo/collection.rb +370 -33
  32. data/lib/mongo/cursor.rb +15 -3
  33. data/lib/mongo/database/view.rb +5 -4
  34. data/lib/mongo/database.rb +14 -4
  35. data/lib/mongo/dbref.rb +113 -0
  36. data/lib/mongo/error/closed_stream.rb +34 -0
  37. data/lib/mongo/error/extra_file_chunk.rb +34 -0
  38. data/lib/mongo/error/{invalid_uri_option.rb → file_not_found.rb} +11 -12
  39. data/lib/mongo/error/invalid_file.rb +2 -2
  40. data/lib/mongo/error/invalid_file_revision.rb +37 -0
  41. data/lib/mongo/error/invalid_uri.rb +5 -4
  42. data/lib/mongo/error/missing_file_chunk.rb +38 -0
  43. data/lib/mongo/error/operation_failure.rb +1 -1
  44. data/lib/mongo/error/parser.rb +1 -1
  45. data/lib/mongo/error/unchangeable_collection_option.rb +38 -0
  46. data/lib/mongo/error/unexpected_chunk_length.rb +39 -0
  47. data/lib/mongo/error.rb +13 -2
  48. data/lib/mongo/event/description_changed.rb +1 -1
  49. data/lib/mongo/grid/file/chunk.rb +6 -6
  50. data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
  51. data/lib/mongo/grid/file.rb +13 -10
  52. data/lib/mongo/grid/fs_bucket.rb +448 -0
  53. data/lib/mongo/grid/stream/read.rb +208 -0
  54. data/lib/mongo/grid/stream/write.rb +187 -0
  55. data/lib/mongo/grid/stream.rb +64 -0
  56. data/lib/mongo/grid.rb +2 -1
  57. data/lib/mongo/index/view.rb +3 -3
  58. data/lib/mongo/index.rb +5 -0
  59. data/lib/mongo/loggable.rb +34 -57
  60. data/lib/mongo/logger.rb +16 -78
  61. data/lib/mongo/monitoring/command_log_subscriber.rb +112 -0
  62. data/lib/mongo/monitoring/event/command_failed.rb +96 -0
  63. data/lib/mongo/monitoring/event/command_started.rb +89 -0
  64. data/lib/mongo/monitoring/event/command_succeeded.rb +118 -0
  65. data/lib/mongo/monitoring/event/secure.rb +58 -0
  66. data/lib/mongo/monitoring/event.rb +18 -0
  67. data/lib/mongo/monitoring/publishable.rb +106 -0
  68. data/lib/mongo/monitoring.rb +195 -0
  69. data/lib/mongo/operation/{aggregate.rb → commands/aggregate.rb} +3 -41
  70. data/lib/mongo/operation/commands/collections_info/result.rb +39 -0
  71. data/lib/mongo/operation/commands/collections_info.rb +68 -0
  72. data/lib/mongo/operation/{command.rb → commands/command.rb} +2 -18
  73. data/lib/mongo/operation/commands/indexes.rb +70 -0
  74. data/lib/mongo/operation/commands/list_collections/result.rb +112 -0
  75. data/lib/mongo/operation/commands/list_collections.rb +54 -0
  76. data/lib/mongo/operation/commands/list_indexes/result.rb +116 -0
  77. data/lib/mongo/operation/commands/list_indexes.rb +56 -0
  78. data/lib/mongo/operation/{map_reduce → commands/map_reduce}/result.rb +1 -1
  79. data/lib/mongo/operation/{map_reduce.rb → commands/map_reduce.rb} +3 -41
  80. data/lib/mongo/operation/commands/parallel_scan/result.rb +72 -0
  81. data/lib/mongo/operation/commands/parallel_scan.rb +56 -0
  82. data/lib/mongo/operation/commands/user_query.rb +69 -0
  83. data/lib/mongo/{bulk_write/ordered_bulk_write.rb → operation/commands/users_info/result.rb} +18 -30
  84. data/lib/mongo/operation/commands/users_info.rb +53 -0
  85. data/lib/mongo/operation/commands.rb +24 -0
  86. data/lib/mongo/operation/executable.rb +4 -68
  87. data/lib/mongo/operation/kill_cursors.rb +3 -3
  88. data/lib/mongo/operation/read/get_more.rb +2 -22
  89. data/lib/mongo/{bulk_write/unordered_bulk_write.rb → operation/read/query/result.rb} +20 -26
  90. data/lib/mongo/operation/read/query.rb +4 -21
  91. data/lib/mongo/operation/read.rb +0 -4
  92. data/lib/mongo/operation/{read_preferrable.rb → read_preference.rb} +3 -2
  93. data/lib/mongo/operation/result.rb +13 -1
  94. data/lib/mongo/operation/specifiable.rb +42 -0
  95. data/lib/mongo/operation/write/bulk/bulkable.rb +82 -0
  96. data/lib/mongo/operation/write/bulk/delete/result.rb +74 -0
  97. data/lib/mongo/operation/write/bulk/delete.rb +71 -0
  98. data/lib/mongo/operation/write/bulk/insert/result.rb +129 -0
  99. data/lib/mongo/operation/write/bulk/insert.rb +96 -0
  100. data/lib/mongo/operation/write/bulk/legacy_mergable.rb +87 -0
  101. data/lib/mongo/operation/write/bulk/mergable.rb +71 -0
  102. data/lib/mongo/operation/write/bulk/update/result.rb +174 -0
  103. data/lib/mongo/operation/write/bulk/update.rb +81 -0
  104. data/lib/mongo/operation/write/bulk.rb +6 -3
  105. data/lib/mongo/operation/write/command/create_index.rb +0 -1
  106. data/lib/mongo/operation/write/command/create_user.rb +0 -1
  107. data/lib/mongo/operation/write/command/delete.rb +0 -1
  108. data/lib/mongo/operation/write/command/drop_index.rb +0 -1
  109. data/lib/mongo/operation/write/command/insert.rb +0 -1
  110. data/lib/mongo/operation/write/command/remove_user.rb +0 -1
  111. data/lib/mongo/operation/write/command/update.rb +0 -1
  112. data/lib/mongo/operation/write/command/update_user.rb +0 -1
  113. data/lib/mongo/operation/write/command/writable.rb +13 -18
  114. data/lib/mongo/operation/write/create_index.rb +4 -27
  115. data/lib/mongo/operation/write/create_user.rb +4 -30
  116. data/lib/mongo/operation/write/delete.rb +6 -29
  117. data/lib/mongo/operation/write/drop_index.rb +3 -3
  118. data/lib/mongo/operation/write/gle.rb +48 -0
  119. data/lib/mongo/operation/write/idable.rb +5 -0
  120. data/lib/mongo/operation/write/insert.rb +2 -24
  121. data/lib/mongo/operation/write/remove_user.rb +4 -27
  122. data/lib/mongo/operation/write/update.rb +13 -36
  123. data/lib/mongo/operation/write/update_user.rb +4 -30
  124. data/lib/mongo/operation/write/write_command_enabled.rb +53 -0
  125. data/lib/mongo/operation/write.rb +2 -0
  126. data/lib/mongo/operation.rb +32 -4
  127. data/lib/mongo/options/mapper.rb +4 -2
  128. data/lib/mongo/options/redacted.rb +156 -0
  129. data/lib/mongo/options.rb +1 -0
  130. data/lib/mongo/protocol/delete.rb +75 -15
  131. data/lib/mongo/protocol/get_more.rb +65 -13
  132. data/lib/mongo/protocol/insert.rb +85 -13
  133. data/lib/mongo/protocol/kill_cursors.rb +59 -14
  134. data/lib/mongo/protocol/message.rb +12 -12
  135. data/lib/mongo/protocol/query.rb +163 -37
  136. data/lib/mongo/protocol/reply.rb +103 -0
  137. data/lib/mongo/protocol/serializers.rb +1 -1
  138. data/lib/mongo/protocol/update.rb +82 -14
  139. data/lib/mongo/retryable.rb +83 -0
  140. data/lib/mongo/server/connectable.rb +21 -25
  141. data/lib/mongo/server/connection.rb +75 -4
  142. data/lib/mongo/server/connection_pool/queue.rb +15 -0
  143. data/lib/mongo/server/connection_pool.rb +12 -0
  144. data/lib/mongo/server/description/features.rb +2 -1
  145. data/lib/mongo/server/description.rb +52 -1
  146. data/lib/mongo/server/monitor/connection.rb +26 -2
  147. data/lib/mongo/server/monitor.rb +19 -3
  148. data/lib/mongo/server.rb +39 -5
  149. data/lib/mongo/server_selector/selectable.rb +40 -31
  150. data/lib/mongo/server_selector.rb +19 -10
  151. data/lib/mongo/socket/ssl.rb +28 -16
  152. data/lib/mongo/socket/tcp.rb +3 -3
  153. data/lib/mongo/socket/unix.rb +5 -8
  154. data/lib/mongo/socket.rb +11 -4
  155. data/lib/mongo/uri.rb +248 -137
  156. data/lib/mongo/version.rb +1 -1
  157. data/lib/mongo.rb +5 -3
  158. data/spec/mongo/address/unix_spec.rb +1 -1
  159. data/spec/mongo/address_spec.rb +25 -0
  160. data/spec/mongo/auth/cr_spec.rb +9 -1
  161. data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
  162. data/spec/mongo/auth/ldap_spec.rb +9 -1
  163. data/spec/mongo/auth/scram_spec.rb +9 -1
  164. data/spec/mongo/auth/user/view_spec.rb +26 -1
  165. data/spec/mongo/auth/x509_spec.rb +9 -1
  166. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +271 -0
  167. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
  168. data/spec/mongo/bulk_write_spec.rb +428 -0
  169. data/spec/mongo/client_spec.rb +167 -17
  170. data/spec/mongo/cluster/topology/replica_set_spec.rb +18 -9
  171. data/spec/mongo/cluster/topology/sharded_spec.rb +11 -3
  172. data/spec/mongo/cluster/topology/single_spec.rb +12 -4
  173. data/spec/mongo/cluster_spec.rb +55 -10
  174. data/spec/mongo/collection/view/aggregation_spec.rb +188 -1
  175. data/spec/mongo/collection/view/explainable_spec.rb +1 -1
  176. data/spec/mongo/collection/view/immutable_spec.rb +103 -0
  177. data/spec/mongo/collection/view/map_reduce_spec.rb +99 -4
  178. data/spec/mongo/collection/view/readable_spec.rb +238 -6
  179. data/spec/mongo/collection/view/writable_spec.rb +4 -4
  180. data/spec/mongo/collection/view_spec.rb +459 -71
  181. data/spec/mongo/collection_spec.rb +1291 -9
  182. data/spec/mongo/command_monitoring_spec.rb +51 -0
  183. data/spec/mongo/connection_string_spec.rb +115 -0
  184. data/spec/mongo/crud_spec.rb +2 -2
  185. data/spec/mongo/cursor_spec.rb +3 -3
  186. data/spec/mongo/database_spec.rb +47 -11
  187. data/spec/mongo/dbref_spec.rb +149 -0
  188. data/spec/mongo/grid/file/chunk_spec.rb +5 -5
  189. data/spec/mongo/grid/file/{metadata_spec.rb → info_spec.rb} +29 -17
  190. data/spec/mongo/grid/file_spec.rb +8 -8
  191. data/spec/mongo/grid/fs_bucket_spec.rb +1020 -0
  192. data/spec/mongo/grid/stream/read_spec.rb +275 -0
  193. data/spec/mongo/grid/stream/write_spec.rb +440 -0
  194. data/spec/mongo/grid/stream_spec.rb +48 -0
  195. data/spec/mongo/gridfs_spec.rb +50 -0
  196. data/spec/mongo/logger_spec.rb +0 -40
  197. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +76 -0
  198. data/spec/mongo/monitoring/event/command_started_spec.rb +26 -0
  199. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +26 -0
  200. data/spec/mongo/monitoring/event/secure_spec.rb +57 -0
  201. data/spec/mongo/monitoring_spec.rb +168 -0
  202. data/spec/mongo/operation/commands/aggregate_spec.rb +69 -0
  203. data/spec/mongo/operation/{read → commands}/collections_info_spec.rb +1 -1
  204. data/spec/mongo/operation/{command_spec.rb → commands/command_spec.rb} +0 -18
  205. data/spec/mongo/operation/{read → commands}/indexes_spec.rb +1 -1
  206. data/spec/mongo/operation/{map_reduce_spec.rb → commands/map_reduce_spec.rb} +1 -19
  207. data/spec/mongo/operation/kill_cursors_spec.rb +1 -17
  208. data/spec/mongo/operation/read/get_more_spec.rb +0 -16
  209. data/spec/mongo/operation/read/query_spec.rb +19 -16
  210. data/spec/mongo/operation/{read_preferrable_spec.rb → read_preference_spec.rb} +11 -11
  211. data/spec/mongo/operation/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +18 -29
  212. data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +3 -14
  213. data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +8 -19
  214. data/spec/mongo/operation/write/command/delete_spec.rb +0 -16
  215. data/spec/mongo/operation/write/command/insert_spec.rb +0 -16
  216. data/spec/mongo/operation/write/command/update_spec.rb +0 -16
  217. data/spec/mongo/operation/write/delete_spec.rb +4 -4
  218. data/spec/mongo/operation/write/insert_spec.rb +2 -13
  219. data/spec/mongo/operation/write/update_spec.rb +7 -7
  220. data/spec/mongo/options/redacted_spec.rb +350 -0
  221. data/spec/mongo/protocol/kill_cursors_spec.rb +5 -3
  222. data/spec/mongo/protocol/query_spec.rb +15 -30
  223. data/spec/mongo/retryable_spec.rb +147 -0
  224. data/spec/mongo/server/connection_pool/queue_spec.rb +16 -0
  225. data/spec/mongo/server/connection_pool_spec.rb +50 -6
  226. data/spec/mongo/server/connection_spec.rb +49 -4
  227. data/spec/mongo/server/description_spec.rb +49 -3
  228. data/spec/mongo/server/monitor_spec.rb +51 -0
  229. data/spec/mongo/server_discovery_and_monitoring_spec.rb +32 -59
  230. data/spec/mongo/server_selection_rtt_spec.rb +37 -57
  231. data/spec/mongo/server_selection_spec.rb +19 -9
  232. data/spec/mongo/server_selector/nearest_spec.rb +35 -27
  233. data/spec/mongo/server_selector/primary_preferred_spec.rb +32 -30
  234. data/spec/mongo/server_selector/primary_spec.rb +21 -14
  235. data/spec/mongo/server_selector/secondary_preferred_spec.rb +28 -26
  236. data/spec/mongo/server_selector/secondary_spec.rb +24 -22
  237. data/spec/mongo/server_selector_spec.rb +87 -24
  238. data/spec/mongo/server_spec.rb +94 -8
  239. data/spec/mongo/socket/ssl_spec.rb +123 -13
  240. data/spec/mongo/socket/unix_spec.rb +52 -0
  241. data/spec/mongo/uri_spec.rb +295 -67
  242. data/spec/spec_helper.rb +40 -24
  243. data/spec/support/authorization.rb +23 -9
  244. data/spec/support/certificates/client.pem +4 -4
  245. data/spec/support/command_monitoring/bulkWrite.yml +73 -0
  246. data/spec/support/command_monitoring/command.yml +42 -0
  247. data/spec/support/command_monitoring/deleteMany.yml +55 -0
  248. data/spec/support/command_monitoring/deleteOne.yml +55 -0
  249. data/spec/support/command_monitoring/find.yml +219 -0
  250. data/spec/support/command_monitoring/insertMany.yml +81 -0
  251. data/spec/support/command_monitoring/insertOne.yml +51 -0
  252. data/spec/support/command_monitoring/updateMany.yml +67 -0
  253. data/spec/support/command_monitoring/updateOne.yml +95 -0
  254. data/spec/support/command_monitoring.rb +365 -0
  255. data/spec/support/connection_string.rb +228 -0
  256. data/spec/support/connection_string_tests/invalid-uris.yml +193 -0
  257. data/spec/support/connection_string_tests/valid-auth.yml +256 -0
  258. data/spec/support/connection_string_tests/valid-host_identifiers.yml +121 -0
  259. data/spec/support/connection_string_tests/valid-options.yml +30 -0
  260. data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +197 -0
  261. data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +213 -0
  262. data/spec/support/connection_string_tests/valid-warnings.yml +55 -0
  263. data/spec/support/crud/read.rb +22 -19
  264. data/spec/support/crud/write.rb +58 -27
  265. data/spec/support/crud.rb +10 -2
  266. data/spec/support/gridfs.rb +637 -0
  267. data/spec/support/gridfs_tests/delete.yml +157 -0
  268. data/spec/support/gridfs_tests/download.yml +210 -0
  269. data/spec/support/gridfs_tests/download_by_name.yml +113 -0
  270. data/spec/support/gridfs_tests/upload.yml +158 -0
  271. data/spec/support/matchers.rb +1 -1
  272. data/spec/support/sdam/rs/equal_electionids.yml +44 -0
  273. data/spec/support/sdam/rs/new_primary_new_electionid.yml +95 -0
  274. data/spec/support/sdam/rs/null_election_id.yml +144 -0
  275. data/spec/support/sdam/rs/primary_disconnect_electionid.yml +124 -0
  276. data/spec/support/sdam/rs/primary_mismatched_me.yml +37 -0
  277. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +75 -0
  278. data/spec/support/sdam/rs/secondary_mismatched_me.yml +37 -0
  279. data/spec/support/sdam/sharded/mongos_disconnect.yml +104 -0
  280. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
  281. data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
  282. data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
  283. data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
  284. data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
  285. data/spec/support/sdam/single/not_ok_response.yml +0 -1
  286. data/spec/support/server_discovery_and_monitoring.rb +22 -3
  287. data/spec/support/server_selection.rb +3 -1
  288. data/spec/support/shared/bulk_write.rb +218 -22
  289. data/spec/support/shared/server_selector.rb +80 -14
  290. data.tar.gz.sig +0 -0
  291. metadata +188 -59
  292. metadata.gz.sig +0 -0
  293. data/lib/mongo/bulk_write/bulk_writable.rb +0 -196
  294. data/lib/mongo/bulk_write/deletable.rb +0 -56
  295. data/lib/mongo/bulk_write/insertable.rb +0 -48
  296. data/lib/mongo/bulk_write/replacable.rb +0 -57
  297. data/lib/mongo/bulk_write/updatable.rb +0 -68
  298. data/lib/mongo/grid/fs.rb +0 -149
  299. data/lib/mongo/operation/list_collections/result.rb +0 -114
  300. data/lib/mongo/operation/list_indexes/result.rb +0 -118
  301. data/lib/mongo/operation/read/collections_info.rb +0 -68
  302. data/lib/mongo/operation/read/indexes.rb +0 -69
  303. data/lib/mongo/operation/read/list_collections.rb +0 -76
  304. data/lib/mongo/operation/read/list_indexes.rb +0 -78
  305. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +0 -75
  306. data/lib/mongo/operation/write/bulk/bulk_delete.rb +0 -145
  307. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +0 -130
  308. data/lib/mongo/operation/write/bulk/bulk_insert.rb +0 -132
  309. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +0 -67
  310. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +0 -162
  311. data/lib/mongo/operation/write/bulk/bulk_update.rb +0 -154
  312. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +0 -83
  313. data/spec/mongo/bulk/bulk_write_spec.rb +0 -262
  314. data/spec/mongo/grid/fs_spec.rb +0 -160
  315. data/spec/mongo/loggable_spec.rb +0 -63
  316. data/spec/mongo/operation/aggregate_spec.rb +0 -127
  317. /data/lib/mongo/operation/{aggregate → commands/aggregate}/result.rb +0 -0
@@ -1,6 +1,6 @@
1
1
  description: "Connect to standalone"
2
2
 
3
- uri: "mongodb://a/?connect=direct"
3
+ uri: "mongodb://a"
4
4
 
5
5
  phases: [
6
6
 
@@ -26,7 +26,6 @@ phases: [
26
26
 
27
27
  "a:27017": {
28
28
 
29
- address: "a",
30
29
  type: "Unknown",
31
30
  setName:
32
31
  }
@@ -45,6 +45,15 @@ module Mongo
45
45
  client.cluster.instance_variable_get(:@servers).detect{ |s| s.address.to_s == uri }
46
46
  end
47
47
 
48
+ # Helper to convert an extended JSON ObjectId electionId to BSON::ObjectId.
49
+ #
50
+ # @since 2.1.0
51
+ def self.convert_election_ids(docs)
52
+ docs.each do |doc |
53
+ doc['electionId'] = BSON::ObjectId.from_string(doc['electionId']['$oid']) if doc['electionId']
54
+ end
55
+ end
56
+
48
57
  # Represents a specification.
49
58
  #
50
59
  # @since 2.0.0
@@ -71,7 +80,9 @@ module Mongo
71
80
  #
72
81
  # @since 2.0.0
73
82
  def initialize(file)
74
- @test = YAML.load(ERB.new(File.new(file).read).result)
83
+ file = File.new(file)
84
+ @test = YAML.load(ERB.new(file.read).result)
85
+ file.close
75
86
  @description = @test['description']
76
87
  @uri_string = @test['uri']
77
88
  @uri = URI.new(uri_string)
@@ -102,7 +113,7 @@ module Mongo
102
113
  # @since 2.0.0
103
114
  def initialize(phase, uri)
104
115
  @phase = phase
105
- @responses = @phase['responses'].map{ |response| Response.new(response, uri) }
116
+ @responses = @phase['responses'].map{ |response| Response.new(SDAM::convert_election_ids(response), uri) }
106
117
  @outcome = Outcome.new(@phase['outcome'])
107
118
  end
108
119
  end
@@ -158,10 +169,18 @@ module Mongo
158
169
  #
159
170
  # @since 2.0.0
160
171
  def initialize(outcome)
161
- @servers = outcome['servers']
172
+ @servers = process_servers(outcome['servers'])
162
173
  @set_name = outcome['setName']
163
174
  @topology_type = outcome['topologyType']
164
175
  end
176
+
177
+ private
178
+
179
+ def process_servers(servers)
180
+ servers.each do |s|
181
+ SDAM::convert_election_ids([ s[1] ])
182
+ end
183
+ end
165
184
  end
166
185
  end
167
186
  end
@@ -70,7 +70,9 @@ module Mongo
70
70
  #
71
71
  # @since 2.0.0
72
72
  def initialize(file)
73
- @test = YAML.load(ERB.new(File.new(file).read).result)
73
+ file = File.new(file)
74
+ @test = YAML.load(ERB.new(file.read).result)
75
+ file.close
74
76
  @description = "#{@test['topology_description']['type']}: #{File.basename(file)}"
75
77
  @read_preference = @test['read_preference']
76
78
  @read_preference['mode'] = READ_PREFERENCES[@read_preference['mode']]
@@ -28,6 +28,19 @@ shared_examples 'a bulk write object' do
28
28
 
29
29
  context 'when an insert_one operation is provided' do
30
30
 
31
+ context 'when there is a write failure' do
32
+
33
+ let(:operations) do
34
+ [{ insert_one: { _id: 1 }}, { insert_one: { _id: 1 }}]
35
+ end
36
+
37
+ it 'raises a BulkWriteError' do
38
+ expect {
39
+ bulk.execute
40
+ }.to raise_error(Mongo::Error::BulkWriteError)
41
+ end
42
+ end
43
+
31
44
  context 'when a document is provided' do
32
45
 
33
46
  let(:operations) do
@@ -35,13 +48,34 @@ shared_examples 'a bulk write object' do
35
48
  end
36
49
 
37
50
  it 'returns n_inserted of 1' do
38
- expect(bulk.execute[:n_inserted]).to eq(1)
51
+ expect(bulk.execute.inserted_count).to eq(1)
39
52
  end
40
53
 
41
54
  it 'only inserts that document' do
42
55
  bulk.execute
43
56
  expect(authorized_collection.find.first['name']).to eq('test')
44
57
  end
58
+
59
+ context 'when there is a write concern error' do
60
+
61
+ context 'when the server version is < 2.6' do
62
+
63
+ it 'raises a BulkWriteError', if: !write_command_enabled? && standalone? do
64
+ expect {
65
+ bulk_invalid_write_concern.execute
66
+ }.to raise_error(Mongo::Error::BulkWriteError)
67
+ end
68
+ end
69
+
70
+ context 'when the server version has write commands enabled' do
71
+
72
+ it 'raises an OperationFailure', if: write_command_enabled? && standalone? do
73
+ expect {
74
+ bulk_invalid_write_concern.execute
75
+ }.to raise_error(Mongo::Error::OperationFailure)
76
+ end
77
+ end
78
+ end
45
79
  end
46
80
 
47
81
  context 'when an invalid object is provided' do
@@ -94,13 +128,34 @@ shared_examples 'a bulk write object' do
94
128
  context 'when multiple documents match delete selector' do
95
129
 
96
130
  it 'reports n_removed correctly' do
97
- expect(bulk.execute[:n_removed]).to eq(1)
131
+ expect(bulk.execute.deleted_count).to eq(1)
98
132
  end
99
133
 
100
134
  it 'deletes only matching documents' do
101
135
  bulk.execute
102
136
  expect(authorized_collection.find.projection(_id: 0).to_a).to eq(expected)
103
137
  end
138
+
139
+ context 'when there is a write concern error' do
140
+
141
+ context 'when the server version is < 2.6' do
142
+
143
+ it 'raises a BulkWriteError', if: !write_command_enabled? && standalone? do
144
+ expect {
145
+ bulk_invalid_write_concern.execute
146
+ }.to raise_error(Mongo::Error::BulkWriteError)
147
+ end
148
+ end
149
+
150
+ context 'when the server version has write commands enabled' do
151
+
152
+ it 'raises an OperationFailure', if: write_command_enabled? && standalone? do
153
+ expect {
154
+ bulk_invalid_write_concern.execute
155
+ }.to raise_error(Mongo::Error::OperationFailure)
156
+ end
157
+ end
158
+ end
104
159
  end
105
160
  end
106
161
 
@@ -136,13 +191,34 @@ shared_examples 'a bulk write object' do
136
191
  context 'when multiple documents match delete selector' do
137
192
 
138
193
  it 'reports n_removed correctly' do
139
- expect(bulk.execute[:n_removed]).to eq(2)
194
+ expect(bulk.execute.deleted_count).to eq(2)
140
195
  end
141
196
 
142
197
  it 'deletes all matching documents' do
143
198
  bulk.execute
144
199
  expect(authorized_collection.find.to_a).to be_empty
145
200
  end
201
+
202
+ context 'when there is a write concern error' do
203
+
204
+ context 'when the server version is < 2.6' do
205
+
206
+ it 'raises a BulkWriteError', if: !write_command_enabled? && standalone? do
207
+ expect {
208
+ bulk_invalid_write_concern.execute
209
+ }.to raise_error(Mongo::Error::BulkWriteError)
210
+ end
211
+ end
212
+
213
+ context 'when the server version has write commands enabled' do
214
+
215
+ it 'raises an OperationFailure', if: write_command_enabled? && standalone? do
216
+ expect {
217
+ bulk_invalid_write_concern.execute
218
+ }.to raise_error(Mongo::Error::OperationFailure)
219
+ end
220
+ end
221
+ end
146
222
  end
147
223
 
148
224
  context 'when only one document matches delete selector' do
@@ -156,7 +232,7 @@ shared_examples 'a bulk write object' do
156
232
  end
157
233
 
158
234
  it 'reports n_removed correctly' do
159
- expect(bulk.execute[:n_removed]).to eq(1)
235
+ expect(bulk.execute.deleted_count).to eq(1)
160
236
  end
161
237
 
162
238
  it 'deletes all matching documents' do
@@ -233,7 +309,7 @@ shared_examples 'a bulk write object' do
233
309
  end
234
310
 
235
311
  it 'reports n_matched correctly' do
236
- expect(bulk.execute[:n_matched]).to eq(1)
312
+ expect(bulk.execute.matched_count).to eq(1)
237
313
  end
238
314
 
239
315
  it 'only applies the replacement to one matching document' do
@@ -241,6 +317,27 @@ shared_examples 'a bulk write object' do
241
317
  expect(authorized_collection.find.projection(_id: 0).to_a).to eq(expected)
242
318
  end
243
319
 
320
+ context 'when there is a write concern error' do
321
+
322
+ context 'when the server version is < 2.6' do
323
+
324
+ it 'raises a BulkWriteError', if: !write_command_enabled? && standalone? do
325
+ expect {
326
+ bulk_invalid_write_concern.execute
327
+ }.to raise_error(Mongo::Error::BulkWriteError)
328
+ end
329
+ end
330
+
331
+ context 'when the server version has write commands enabled' do
332
+
333
+ it 'raises an OperationFailure', if: write_command_enabled? && standalone? do
334
+ expect {
335
+ bulk_invalid_write_concern.execute
336
+ }.to raise_error(Mongo::Error::OperationFailure)
337
+ end
338
+ end
339
+ end
340
+
244
341
  context 'when upsert is true' do
245
342
 
246
343
  let(:operations) do
@@ -260,7 +357,7 @@ shared_examples 'a bulk write object' do
260
357
  end
261
358
 
262
359
  it 'reports n_matched correctly' do
263
- expect(bulk.execute[:n_matched]).to eq(0)
360
+ expect(bulk.execute.matched_count).to eq(0)
264
361
  end
265
362
 
266
363
  it 'does not replace any documents' do
@@ -296,6 +393,22 @@ shared_examples 'a bulk write object' do
296
393
  [{ 'a' => 2 }, { 'a' => 1 }]
297
394
  end
298
395
 
396
+ context 'when there is a write failure' do
397
+
398
+ let(:operations) do
399
+ [{ update_one: { find: { a: 1 },
400
+ update: { '$st' => { field: 'blah' } },
401
+ upsert: false }
402
+ }]
403
+ end
404
+
405
+ it 'raises a BulkWriteError' do
406
+ expect {
407
+ bulk.execute
408
+ }.to raise_error(Mongo::Error::BulkWriteError)
409
+ end
410
+ end
411
+
299
412
  context 'when an update document is not specified' do
300
413
 
301
414
  let(:operations) do
@@ -331,19 +444,19 @@ shared_examples 'a bulk write object' do
331
444
  context 'when a valid update document is specified' do
332
445
 
333
446
  it 'reports n_modified correctly', if: write_command_enabled? do
334
- expect(bulk.execute[:n_modified]).to eq(1)
447
+ expect(bulk.execute.modified_count).to eq(1)
335
448
  end
336
449
 
337
450
  it 'reports n_modified correctly', unless: write_command_enabled? do
338
- expect(bulk.execute[:n_modified]).to eq(nil)
451
+ expect(bulk.execute.modified_count).to eq(nil)
339
452
  end
340
453
 
341
454
  it 'reports n_upserted correctly' do
342
- expect(bulk.execute[:n_upserted]).to eq(0)
455
+ expect(bulk.execute.upserted_count).to eq(0)
343
456
  end
344
457
 
345
458
  it 'reports n_matched correctly' do
346
- expect(bulk.execute[:n_matched]).to eq(1)
459
+ expect(bulk.execute.matched_count).to eq(1)
347
460
  end
348
461
 
349
462
  it 'applies the correct writes' do
@@ -351,6 +464,27 @@ shared_examples 'a bulk write object' do
351
464
  expect(authorized_collection.find.projection(_id: 0).to_a).to eq(expected)
352
465
  end
353
466
 
467
+ context 'when there is a write concern error' do
468
+
469
+ context 'when the server version is < 2.6' do
470
+
471
+ it 'raises a BulkWriteError', if: !write_command_enabled? && standalone? do
472
+ expect {
473
+ bulk_invalid_write_concern.execute
474
+ }.to raise_error(Mongo::Error::BulkWriteError)
475
+ end
476
+ end
477
+
478
+ context 'when the server version has write commands enabled' do
479
+
480
+ it 'raises an OperationFailure', if: write_command_enabled? && standalone? do
481
+ expect {
482
+ bulk_invalid_write_concern.execute
483
+ }.to raise_error(Mongo::Error::OperationFailure)
484
+ end
485
+ end
486
+ end
487
+
354
488
  context 'when upsert is true' do
355
489
 
356
490
  let(:operations) do
@@ -365,19 +499,23 @@ shared_examples 'a bulk write object' do
365
499
  end
366
500
 
367
501
  it 'reports n_modified correctly', if: write_command_enabled? do
368
- expect(bulk.execute[:n_modified]).to eq(0)
502
+ expect(bulk.execute.modified_count).to eq(0)
369
503
  end
370
504
 
371
505
  it 'reports n_modified correctly', unless: write_command_enabled? do
372
- expect(bulk.execute[:n_modified]).to eq(nil)
506
+ expect(bulk.execute.modified_count).to eq(nil)
373
507
  end
374
508
 
375
509
  it 'reports n_upserted correctly' do
376
- expect(bulk.execute[:n_upserted]).to eq(1)
510
+ expect(bulk.execute.upserted_count).to eq(1)
511
+ end
512
+
513
+ it 'returns the upserted ids', if: write_command_enabled? do
514
+ expect(bulk.execute.upserted_ids.size).to eq(1)
377
515
  end
378
516
 
379
517
  it 'reports n_matched correctly' do
380
- expect(bulk.execute[:n_matched]).to eq(0)
518
+ expect(bulk.execute.matched_count).to eq(0)
381
519
  end
382
520
 
383
521
  it 'applies the correct writes' do
@@ -413,6 +551,22 @@ shared_examples 'a bulk write object' do
413
551
  authorized_collection.insert_many(docs)
414
552
  end
415
553
 
554
+ context 'when there is a write failure' do
555
+
556
+ let(:operations) do
557
+ [{ update_many: { find: { a: 1 },
558
+ update: { '$st' => { field: 'blah' } },
559
+ upsert: false }
560
+ }]
561
+ end
562
+
563
+ it 'raises an BulkWriteError' do
564
+ expect {
565
+ bulk.execute
566
+ }.to raise_error(Mongo::Error::BulkWriteError)
567
+ end
568
+ end
569
+
416
570
  context 'when an update document is not specified' do
417
571
 
418
572
  let(:operations) do
@@ -444,19 +598,19 @@ shared_examples 'a bulk write object' do
444
598
  context 'when a valid update document is specified' do
445
599
 
446
600
  it 'reports n_modified correctly', if: write_command_enabled? do
447
- expect(bulk.execute[:n_modified]).to eq(2)
601
+ expect(bulk.execute.modified_count).to eq(2)
448
602
  end
449
603
 
450
604
  it 'reports n_modified correctly', unless: write_command_enabled? do
451
- expect(bulk.execute[:n_modified]).to eq(nil)
605
+ expect(bulk.execute.modified_count).to eq(nil)
452
606
  end
453
607
 
454
608
  it 'reports n_upserted correctly' do
455
- expect(bulk.execute[:n_upserted]).to eq(0)
609
+ expect(bulk.execute.upserted_count).to eq(0)
456
610
  end
457
611
 
458
612
  it 'reports n_matched correctly' do
459
- expect(bulk.execute[:n_matched]).to eq(2)
613
+ expect(bulk.execute.matched_count).to eq(2)
460
614
  end
461
615
 
462
616
  it 'applies the correct writes' do
@@ -464,6 +618,27 @@ shared_examples 'a bulk write object' do
464
618
  expect(authorized_collection.find.projection(_id: 0).to_a).to eq(expected)
465
619
  end
466
620
 
621
+ context 'when there is a write concern error' do
622
+
623
+ context 'when the server version is < 2.6' do
624
+
625
+ it 'raises a BulkWriteError', if: !write_command_enabled? && standalone? do
626
+ expect {
627
+ bulk_invalid_write_concern.execute
628
+ }.to raise_error(Mongo::Error::BulkWriteError)
629
+ end
630
+ end
631
+
632
+ context 'when the server version has write commands enabled' do
633
+
634
+ it 'raises an OperationFailure', if: write_command_enabled? && standalone? do
635
+ expect {
636
+ bulk_invalid_write_concern.execute
637
+ }.to raise_error(Mongo::Error::OperationFailure)
638
+ end
639
+ end
640
+ end
641
+
467
642
  context 'when upsert is true' do
468
643
 
469
644
  let(:operations) do
@@ -478,19 +653,19 @@ shared_examples 'a bulk write object' do
478
653
  end
479
654
 
480
655
  it 'reports n_modified correctly', if: write_command_enabled? do
481
- expect(bulk.execute[:n_modified]).to eq(0)
656
+ expect(bulk.execute.modified_count).to eq(0)
482
657
  end
483
658
 
484
659
  it 'reports n_modified correctly', unless: write_command_enabled? do
485
- expect(bulk.execute[:n_modified]).to eq(nil)
660
+ expect(bulk.execute.modified_count).to eq(nil)
486
661
  end
487
662
 
488
663
  it 'reports n_upserted correctly' do
489
- expect(bulk.execute[:n_upserted]).to eq(1)
664
+ expect(bulk.execute.upserted_count).to eq(1)
490
665
  end
491
666
 
492
667
  it 'reports n_matched correctly' do
493
- expect(bulk.execute[:n_matched]).to eq(0)
668
+ expect(bulk.execute.matched_count).to eq(0)
494
669
  end
495
670
 
496
671
  it 'applies the correct writes' do
@@ -531,5 +706,26 @@ shared_examples 'a bulk write object' do
531
706
  bulk.execute
532
707
  expect(authorized_collection.find(x: { '$lte' => 3000 }).to_a.size).to eq(3000)
533
708
  end
709
+
710
+ context 'when there is a write concern error' do
711
+
712
+ context 'when the server version is < 2.6' do
713
+
714
+ it 'raises a BulkWriteError', if: !write_command_enabled? && standalone? do
715
+ expect {
716
+ bulk_invalid_write_concern.execute
717
+ }.to raise_error(Mongo::Error::BulkWriteError)
718
+ end
719
+ end
720
+
721
+ context 'when the server version has write commands enabled' do
722
+
723
+ it 'raises an OperationFailure', if: write_command_enabled? && standalone? do
724
+ expect {
725
+ bulk_invalid_write_concern.execute
726
+ }.to raise_error(Mongo::Error::OperationFailure)
727
+ end
728
+ end
729
+ end
534
730
  end
535
731
  end
@@ -11,9 +11,10 @@ def server(mode, options = {})
11
11
  }
12
12
 
13
13
  listeners = Mongo::Event::Listeners.new
14
- address = Mongo::Address.new('127.0.0.1:27017')
14
+ monitoring = Mongo::Monitoring.new
15
+ address = Mongo::Address.new(DEFAULT_ADDRESS)
15
16
 
16
- server = Mongo::Server.new(address, double('cluster'), listeners, TEST_OPTIONS)
17
+ server = Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
17
18
  description = Mongo::Server::Description.new(address, ismaster, average_round_trip_time)
18
19
  server.tap do |s|
19
20
  allow(s).to receive(:description).and_return(description)
@@ -21,7 +22,7 @@ def server(mode, options = {})
21
22
  end
22
23
 
23
24
  shared_context 'server selector' do
24
- let(:read_pref) { described_class.new(tag_sets) }
25
+
25
26
  let(:tag_sets) { [] }
26
27
  let(:tag_set) do
27
28
  { 'test' => 'tag' }
@@ -31,37 +32,82 @@ shared_context 'server selector' do
31
32
  end
32
33
  let(:primary) { server(:primary) }
33
34
  let(:secondary) { server(:secondary) }
35
+ let(:options) { { :mode => name, :tag_sets => tag_sets } }
36
+ let(:selector) { described_class.new(options) }
37
+
38
+ before(:all) do
39
+ module Mongo
40
+ # We monkey-patch the server here, so the monitors do not run and no
41
+ # real TCP connection is attempted.
42
+ #
43
+ # @since 2.1.0
44
+ class Server
45
+
46
+ alias :original_initialize :initialize
47
+ def initialize(address, cluster, monitoring, event_listeners, options = {})
48
+ @address = address
49
+ @cluster = cluster
50
+ @monitoring = monitoring
51
+ @options = options.freeze
52
+ @monitor = Monitor.new(address, event_listeners, options)
53
+ end
54
+
55
+ alias :original_disconnect! :disconnect!
56
+ def disconnect!; true; end
57
+ end
58
+ end
59
+ end
60
+
61
+ after(:all) do
62
+
63
+ # Return the server implementation to its original for the other
64
+ # tests in the suite.
65
+ module Mongo
66
+ class Server
67
+ alias :initialize :original_initialize
68
+ remove_method(:original_initialize)
69
+
70
+ alias :disconnect! :original_disconnect!
71
+ remove_method(:original_disconnect!)
72
+ end
73
+ end
74
+ end
34
75
  end
35
76
 
36
- shared_examples 'a read preference mode' do
77
+ shared_examples 'a server selector mode' do
37
78
 
38
79
  describe '#name' do
39
80
 
40
81
  it 'returns the name' do
41
- expect(read_pref.name).to eq(name)
82
+ expect(selector.name).to eq(name)
42
83
  end
43
84
  end
44
85
 
45
86
  describe '#slave_ok?' do
46
87
 
47
88
  it 'returns whether the slave_ok bit should be set' do
48
- expect(read_pref.slave_ok?).to eq(slave_ok)
89
+ expect(selector.slave_ok?).to eq(slave_ok)
49
90
  end
50
91
  end
51
92
 
52
93
  describe '#==' do
53
94
 
54
95
  context 'when mode is the same' do
55
- let(:other) { described_class.new }
96
+
97
+ let(:other) do
98
+ described_class.new
99
+ end
56
100
 
57
101
  context 'tag sets are the same' do
102
+
58
103
  it 'returns true' do
59
- expect(read_pref).to eq(other)
104
+ expect(selector).to eq(other)
60
105
  end
61
106
  end
62
107
  end
63
108
 
64
109
  context 'mode is different' do
110
+
65
111
  let(:other) do
66
112
  double('selectable').tap do |mode|
67
113
  allow(mode).to receive(:name).and_return(:other)
@@ -69,28 +115,31 @@ shared_examples 'a read preference mode' do
69
115
  end
70
116
 
71
117
  it 'returns false' do
72
- expect(read_pref).not_to eq(other)
118
+ expect(selector).not_to eq(other)
73
119
  end
74
120
  end
75
121
  end
76
122
  end
77
123
 
78
- shared_examples 'a read preference mode accepting tag sets' do
124
+ shared_examples 'a server selector accepting tag sets' do
79
125
 
80
126
  describe '#tag_sets' do
81
127
 
82
128
  context 'tags not provided' do
83
129
 
84
130
  it 'returns an empty array' do
85
- expect(read_pref.tag_sets).to be_empty
131
+ expect(selector.tag_sets).to be_empty
86
132
  end
87
133
  end
88
134
 
89
135
  context 'tag sets provided' do
90
- let(:tag_sets) { [tag_set] }
136
+
137
+ let(:tag_sets) do
138
+ [ tag_set ]
139
+ end
91
140
 
92
141
  it 'returns the tag sets' do
93
- expect(read_pref.tag_sets).to eq(tag_sets)
142
+ expect(selector.tag_sets).to eq(tag_sets)
94
143
  end
95
144
  end
96
145
  end
@@ -103,9 +152,26 @@ shared_examples 'a read preference mode accepting tag sets' do
103
152
  let(:tag_sets) { { 'other' => 'tag' } }
104
153
 
105
154
  it 'returns false' do
106
- expect(read_pref).not_to eq(other)
155
+ expect(selector).not_to eq(other)
107
156
  end
108
157
  end
109
158
  end
110
159
  end
111
160
  end
161
+
162
+ shared_examples 'a server selector with sensitive data in its options' do
163
+
164
+ describe '#inspect' do
165
+
166
+ context 'when there is sensitive data in the options' do
167
+
168
+ let(:options) do
169
+ Mongo::Options::Redacted.new(:mode => name, :password => 'sensitive_data')
170
+ end
171
+
172
+ it 'does not print out sensitive data' do
173
+ expect(selector.inspect).not_to match(options[:password])
174
+ end
175
+ end
176
+ end
177
+ end
data.tar.gz.sig CHANGED
Binary file