mongo 2.1.0.beta → 2.1.0.rc0

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 (253) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/Rakefile +2 -2
  5. data/lib/mongo.rb +2 -3
  6. data/lib/mongo/address.rb +7 -5
  7. data/lib/mongo/address/unix.rb +2 -2
  8. data/lib/mongo/auth/ldap/conversation.rb +6 -2
  9. data/lib/mongo/auth/scram/conversation.rb +8 -2
  10. data/lib/mongo/auth/user/view.rb +21 -0
  11. data/lib/mongo/bulk_write.rb +155 -23
  12. data/lib/mongo/bulk_write/combineable.rb +51 -0
  13. data/lib/mongo/bulk_write/ordered_combiner.rb +55 -0
  14. data/lib/mongo/bulk_write/result.rb +61 -8
  15. data/lib/mongo/bulk_write/result_combiner.rb +117 -0
  16. data/lib/mongo/bulk_write/transformable.rb +117 -0
  17. data/lib/mongo/bulk_write/unordered_combiner.rb +52 -0
  18. data/lib/mongo/bulk_write/validatable.rb +62 -0
  19. data/lib/mongo/client.rb +7 -3
  20. data/lib/mongo/cluster.rb +3 -3
  21. data/lib/mongo/cluster/topology/replica_set.rb +8 -6
  22. data/lib/mongo/cluster/topology/unknown.rb +5 -2
  23. data/lib/mongo/collection.rb +75 -4
  24. data/lib/mongo/collection/view.rb +1 -2
  25. data/lib/mongo/collection/view/aggregation.rb +13 -8
  26. data/lib/mongo/collection/view/immutable.rb +6 -6
  27. data/lib/mongo/collection/view/iterable.rb +13 -4
  28. data/lib/mongo/collection/view/map_reduce.rb +22 -17
  29. data/lib/mongo/collection/view/readable.rb +121 -70
  30. data/lib/mongo/cursor.rb +5 -1
  31. data/lib/mongo/database.rb +3 -3
  32. data/lib/mongo/database/view.rb +1 -1
  33. data/lib/mongo/error.rb +7 -0
  34. data/lib/mongo/{bulk_write/unordered_bulk_write.rb → error/closed_stream.rb} +12 -21
  35. data/lib/mongo/{bulk_write/ordered_bulk_write.rb → error/extra_file_chunk.rb} +13 -27
  36. data/lib/mongo/error/file_not_found.rb +37 -0
  37. data/lib/mongo/error/invalid_file.rb +2 -2
  38. data/lib/mongo/error/invalid_file_revision.rb +37 -0
  39. data/lib/mongo/error/invalid_uri.rb +5 -4
  40. data/lib/mongo/error/missing_file_chunk.rb +38 -0
  41. data/lib/mongo/error/operation_failure.rb +1 -1
  42. data/lib/mongo/error/unchangeable_collection_option.rb +38 -0
  43. data/lib/mongo/error/unexpected_chunk_length.rb +39 -0
  44. data/lib/mongo/grid.rb +2 -1
  45. data/lib/mongo/grid/file.rb +12 -9
  46. data/lib/mongo/grid/file/chunk.rb +6 -6
  47. data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
  48. data/lib/mongo/grid/fs_bucket.rb +441 -0
  49. data/lib/mongo/grid/stream.rb +64 -0
  50. data/lib/mongo/grid/stream/read.rb +208 -0
  51. data/lib/mongo/grid/stream/write.rb +187 -0
  52. data/lib/mongo/index/view.rb +1 -1
  53. data/lib/mongo/loggable.rb +34 -57
  54. data/lib/mongo/logger.rb +16 -78
  55. data/lib/mongo/monitoring.rb +1 -5
  56. data/lib/mongo/monitoring/command_log_subscriber.rb +35 -17
  57. data/lib/mongo/monitoring/event/command_succeeded.rb +20 -1
  58. data/lib/mongo/monitoring/publishable.rb +22 -12
  59. data/lib/mongo/operation.rb +3 -6
  60. data/lib/mongo/operation/commands.rb +24 -0
  61. data/lib/mongo/operation/{aggregate.rb → commands/aggregate.rb} +3 -41
  62. data/lib/mongo/operation/{aggregate → commands/aggregate}/result.rb +0 -0
  63. data/lib/mongo/operation/commands/collections_info.rb +66 -0
  64. data/lib/mongo/operation/{command.rb → commands/command.rb} +2 -18
  65. data/lib/mongo/operation/commands/indexes.rb +70 -0
  66. data/lib/mongo/operation/commands/list_collections.rb +54 -0
  67. data/lib/mongo/operation/commands/list_collections/result.rb +112 -0
  68. data/lib/mongo/operation/commands/list_indexes.rb +56 -0
  69. data/lib/mongo/operation/commands/list_indexes/result.rb +115 -0
  70. data/lib/mongo/operation/{map_reduce.rb → commands/map_reduce.rb} +3 -41
  71. data/lib/mongo/operation/{map_reduce → commands/map_reduce}/result.rb +0 -0
  72. data/lib/mongo/operation/{parallel_scan.rb → commands/parallel_scan.rb} +3 -23
  73. data/lib/mongo/operation/{parallel_scan → commands/parallel_scan}/result.rb +0 -0
  74. data/lib/mongo/operation/commands/user_query.rb +69 -0
  75. data/lib/mongo/operation/commands/users_info.rb +53 -0
  76. data/lib/mongo/operation/commands/users_info/result.rb +36 -0
  77. data/lib/mongo/operation/executable.rb +4 -68
  78. data/lib/mongo/operation/kill_cursors.rb +3 -3
  79. data/lib/mongo/operation/read.rb +0 -4
  80. data/lib/mongo/operation/read/get_more.rb +2 -22
  81. data/lib/mongo/operation/read/query.rb +2 -21
  82. data/lib/mongo/operation/{read_preferrable.rb → read_preference.rb} +3 -2
  83. data/lib/mongo/operation/specifiable.rb +24 -0
  84. data/lib/mongo/operation/write.rb +2 -0
  85. data/lib/mongo/operation/write/bulk.rb +6 -3
  86. data/lib/mongo/operation/write/bulk/bulkable.rb +82 -0
  87. data/lib/mongo/operation/write/bulk/delete.rb +71 -0
  88. data/lib/mongo/operation/write/bulk/delete/result.rb +74 -0
  89. data/lib/mongo/operation/write/bulk/insert.rb +96 -0
  90. data/lib/mongo/operation/write/bulk/insert/result.rb +129 -0
  91. data/lib/mongo/operation/write/bulk/legacy_mergable.rb +87 -0
  92. data/lib/mongo/operation/write/bulk/mergable.rb +71 -0
  93. data/lib/mongo/operation/write/bulk/update.rb +81 -0
  94. data/lib/mongo/operation/write/bulk/update/result.rb +174 -0
  95. data/lib/mongo/operation/write/command/create_index.rb +0 -1
  96. data/lib/mongo/operation/write/command/create_user.rb +0 -1
  97. data/lib/mongo/operation/write/command/delete.rb +0 -1
  98. data/lib/mongo/operation/write/command/drop_index.rb +0 -1
  99. data/lib/mongo/operation/write/command/insert.rb +0 -1
  100. data/lib/mongo/operation/write/command/remove_user.rb +0 -1
  101. data/lib/mongo/operation/write/command/update.rb +0 -1
  102. data/lib/mongo/operation/write/command/update_user.rb +0 -1
  103. data/lib/mongo/operation/write/command/writable.rb +13 -18
  104. data/lib/mongo/operation/write/create_index.rb +4 -27
  105. data/lib/mongo/operation/write/create_user.rb +4 -30
  106. data/lib/mongo/operation/write/delete.rb +5 -28
  107. data/lib/mongo/operation/write/drop_index.rb +3 -3
  108. data/lib/mongo/operation/write/gle.rb +48 -0
  109. data/lib/mongo/operation/write/idable.rb +5 -0
  110. data/lib/mongo/operation/write/insert.rb +2 -24
  111. data/lib/mongo/operation/write/remove_user.rb +4 -27
  112. data/lib/mongo/operation/write/update.rb +4 -32
  113. data/lib/mongo/operation/write/update_user.rb +4 -30
  114. data/lib/mongo/operation/write/write_command_enabled.rb +53 -0
  115. data/lib/mongo/options/mapper.rb +4 -2
  116. data/lib/mongo/protocol/delete.rb +68 -3
  117. data/lib/mongo/protocol/get_more.rb +54 -2
  118. data/lib/mongo/protocol/insert.rb +59 -1
  119. data/lib/mongo/protocol/kill_cursors.rb +53 -4
  120. data/lib/mongo/protocol/message.rb +12 -12
  121. data/lib/mongo/protocol/query.rb +139 -65
  122. data/lib/mongo/protocol/reply.rb +69 -1
  123. data/lib/mongo/protocol/update.rb +70 -1
  124. data/lib/mongo/server/connection.rb +11 -3
  125. data/lib/mongo/server/description.rb +29 -0
  126. data/lib/mongo/server/description/features.rb +2 -1
  127. data/lib/mongo/server/monitor.rb +2 -2
  128. data/lib/mongo/server_selector.rb +14 -10
  129. data/lib/mongo/server_selector/selectable.rb +24 -22
  130. data/lib/mongo/socket.rb +6 -3
  131. data/lib/mongo/socket/tcp.rb +2 -2
  132. data/lib/mongo/socket/unix.rb +5 -8
  133. data/lib/mongo/uri.rb +243 -139
  134. data/lib/mongo/version.rb +1 -1
  135. data/spec/mongo/address/unix_spec.rb +1 -1
  136. data/spec/mongo/address_spec.rb +25 -0
  137. data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
  138. data/spec/mongo/auth/user/view_spec.rb +26 -1
  139. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +271 -0
  140. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
  141. data/spec/mongo/bulk_write_spec.rb +332 -166
  142. data/spec/mongo/client_spec.rb +25 -0
  143. data/spec/mongo/cluster/topology/replica_set_spec.rb +2 -0
  144. data/spec/mongo/collection/view/aggregation_spec.rb +65 -0
  145. data/spec/mongo/collection/view/immutable_spec.rb +103 -0
  146. data/spec/mongo/collection/view/map_reduce_spec.rb +98 -3
  147. data/spec/mongo/collection/view/readable_spec.rb +17 -30
  148. data/spec/mongo/collection/view_spec.rb +233 -7
  149. data/spec/mongo/collection_spec.rb +360 -18
  150. data/spec/mongo/command_monitoring_spec.rb +51 -0
  151. data/spec/mongo/connection_string_spec.rb +137 -0
  152. data/spec/mongo/database_spec.rb +27 -11
  153. data/spec/mongo/grid/file/chunk_spec.rb +5 -5
  154. data/spec/mongo/grid/file/{metadata_spec.rb → info_spec.rb} +29 -17
  155. data/spec/mongo/grid/file_spec.rb +8 -8
  156. data/spec/mongo/grid/fs_bucket_spec.rb +1020 -0
  157. data/spec/mongo/grid/stream/read_spec.rb +275 -0
  158. data/spec/mongo/grid/stream/write_spec.rb +440 -0
  159. data/spec/mongo/grid/stream_spec.rb +48 -0
  160. data/spec/mongo/gridfs_spec.rb +50 -0
  161. data/spec/mongo/logger_spec.rb +0 -40
  162. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +76 -0
  163. data/spec/mongo/operation/{aggregate_spec.rb → commands/aggregate_spec.rb} +0 -42
  164. data/spec/mongo/operation/{read → commands}/collections_info_spec.rb +1 -1
  165. data/spec/mongo/operation/{command_spec.rb → commands/command_spec.rb} +0 -0
  166. data/spec/mongo/operation/{read → commands}/indexes_spec.rb +1 -1
  167. data/spec/mongo/operation/{map_reduce_spec.rb → commands/map_reduce_spec.rb} +0 -18
  168. data/spec/mongo/operation/kill_cursors_spec.rb +1 -1
  169. data/spec/mongo/operation/{read_preferrable_spec.rb → read_preference_spec.rb} +11 -11
  170. data/spec/mongo/operation/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +1 -12
  171. data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +1 -12
  172. data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +1 -12
  173. data/spec/mongo/operation/write/insert_spec.rb +0 -11
  174. data/spec/mongo/protocol/kill_cursors_spec.rb +5 -3
  175. data/spec/mongo/server/description_spec.rb +42 -0
  176. data/spec/mongo/server/monitor_spec.rb +21 -0
  177. data/spec/mongo/server_discovery_and_monitoring_spec.rb +1 -0
  178. data/spec/mongo/server_selection_spec.rb +3 -3
  179. data/spec/mongo/server_selector/nearest_spec.rb +34 -27
  180. data/spec/mongo/server_selector/primary_preferred_spec.rb +31 -30
  181. data/spec/mongo/server_selector/primary_spec.rb +14 -13
  182. data/spec/mongo/server_selector/secondary_preferred_spec.rb +27 -26
  183. data/spec/mongo/server_selector/secondary_spec.rb +23 -22
  184. data/spec/mongo/server_selector_spec.rb +87 -24
  185. data/spec/mongo/socket/unix_spec.rb +52 -0
  186. data/spec/mongo/uri_spec.rb +251 -39
  187. data/spec/spec_helper.rb +11 -4
  188. data/spec/support/authorization.rb +4 -5
  189. data/spec/support/command_monitoring.rb +365 -0
  190. data/spec/support/command_monitoring/bulkWrite.yml +73 -0
  191. data/spec/support/command_monitoring/command.yml +42 -0
  192. data/spec/support/command_monitoring/deleteMany.yml +55 -0
  193. data/spec/support/command_monitoring/deleteOne.yml +55 -0
  194. data/spec/support/command_monitoring/find.yml +219 -0
  195. data/spec/support/command_monitoring/insertMany.yml +81 -0
  196. data/spec/support/command_monitoring/insertOne.yml +51 -0
  197. data/spec/support/command_monitoring/updateMany.yml +67 -0
  198. data/spec/support/command_monitoring/updateOne.yml +95 -0
  199. data/spec/support/connection_string.rb +228 -0
  200. data/spec/support/connection_string_tests/invalid-uris.yml +193 -0
  201. data/spec/support/connection_string_tests/valid-auth.yml +256 -0
  202. data/spec/support/connection_string_tests/valid-host_identifiers.yml +121 -0
  203. data/spec/support/connection_string_tests/valid-options.yml +30 -0
  204. data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +197 -0
  205. data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +213 -0
  206. data/spec/support/connection_string_tests/valid-warnings.yml +55 -0
  207. data/spec/support/crud.rb +3 -1
  208. data/spec/support/crud/read.rb +14 -10
  209. data/spec/support/crud/write.rb +36 -9
  210. data/spec/support/gridfs.rb +637 -0
  211. data/spec/support/gridfs_tests/delete.yml +157 -0
  212. data/spec/support/gridfs_tests/download.yml +210 -0
  213. data/spec/support/gridfs_tests/download_by_name.yml +113 -0
  214. data/spec/support/gridfs_tests/upload.yml +158 -0
  215. data/spec/support/sdam/rs/equal_electionids.yml +1 -2
  216. data/spec/support/sdam/rs/new_primary_new_electionid.yml +0 -3
  217. data/spec/support/sdam/rs/primary_mismatched_me.yml +37 -0
  218. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +75 -0
  219. data/spec/support/sdam/rs/secondary_mismatched_me.yml +37 -0
  220. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
  221. data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
  222. data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
  223. data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
  224. data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
  225. data/spec/support/sdam/single/not_ok_response.yml +0 -1
  226. data/spec/support/server_discovery_and_monitoring.rb +3 -1
  227. data/spec/support/server_selection.rb +3 -1
  228. data/spec/support/shared/bulk_write.rb +192 -0
  229. data/spec/support/shared/server_selector.rb +21 -12
  230. metadata +147 -57
  231. metadata.gz.sig +0 -0
  232. data/lib/mongo/bulk_write/bulk_writable.rb +0 -252
  233. data/lib/mongo/bulk_write/deletable.rb +0 -57
  234. data/lib/mongo/bulk_write/insertable.rb +0 -49
  235. data/lib/mongo/bulk_write/replacable.rb +0 -58
  236. data/lib/mongo/bulk_write/updatable.rb +0 -69
  237. data/lib/mongo/grid/fs.rb +0 -146
  238. data/lib/mongo/operation/list_collections/result.rb +0 -114
  239. data/lib/mongo/operation/list_indexes/result.rb +0 -118
  240. data/lib/mongo/operation/read/collections_info.rb +0 -68
  241. data/lib/mongo/operation/read/indexes.rb +0 -69
  242. data/lib/mongo/operation/read/list_collections.rb +0 -76
  243. data/lib/mongo/operation/read/list_indexes.rb +0 -78
  244. data/lib/mongo/operation/write/bulk/bulk_delete.rb +0 -145
  245. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +0 -75
  246. data/lib/mongo/operation/write/bulk/bulk_insert.rb +0 -132
  247. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +0 -130
  248. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +0 -67
  249. data/lib/mongo/operation/write/bulk/bulk_update.rb +0 -154
  250. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +0 -174
  251. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +0 -83
  252. data/spec/mongo/grid/fs_spec.rb +0 -160
  253. data/spec/mongo/loggable_spec.rb +0 -63
@@ -0,0 +1,158 @@
1
+ data:
2
+ files: []
3
+ chunks: []
4
+
5
+ tests:
6
+ -
7
+ description: "Upload when length is 0"
8
+ act:
9
+ operation: upload
10
+ arguments:
11
+ filename: "filename"
12
+ source: { $hex : "" }
13
+ options: { chunkSizeBytes : 4 }
14
+ assert:
15
+ result: "&result"
16
+ data:
17
+ -
18
+ { insert : "expected.files", documents : [
19
+ { _id : "*result", length : 0, chunkSize : 4, uploadDate : "*actual", md5 : "d41d8cd98f00b204e9800998ecf8427e", filename : "filename" }
20
+ ] }
21
+ -
22
+ description: "Upload when length is 1"
23
+ act:
24
+ operation: upload
25
+ arguments:
26
+ filename: "filename"
27
+ source: { $hex : "11" }
28
+ options: { chunkSizeBytes : 4 }
29
+ assert:
30
+ result: "&result"
31
+ data:
32
+ -
33
+ { insert : "expected.files", documents : [
34
+ { _id : "*result", length : 1, chunkSize : 4, uploadDate : "*actual", md5 : "47ed733b8d10be225eceba344d533586", filename : "filename" }
35
+ ] }
36
+ -
37
+ { insert : "expected.chunks", documents : [
38
+ { _id : "*actual", files_id : "*result", n : 0, data : { $hex : "11" } }
39
+ ] }
40
+ -
41
+ description: "Upload when length is 3"
42
+ act:
43
+ operation: upload
44
+ arguments:
45
+ filename: "filename"
46
+ source: { $hex : "112233" }
47
+ options: { chunkSizeBytes : 4 }
48
+ assert:
49
+ result: "&result"
50
+ data:
51
+ -
52
+ { insert : "expected.files", documents : [
53
+ { _id : "*result", length : 3, chunkSize : 4, uploadDate : "*actual", md5 : "bafae3a174ab91fc70db7a6aa50f4f52", filename : "filename" }
54
+ ] }
55
+ -
56
+ { insert : "expected.chunks", documents : [
57
+ { _id : "*actual", files_id : "*result", n : 0, data : { $hex : "112233" } }
58
+ ] }
59
+ -
60
+ description: "Upload when length is 4"
61
+ act:
62
+ operation: upload
63
+ arguments:
64
+ filename: "filename"
65
+ source: { $hex : "11223344" }
66
+ options: { chunkSizeBytes : 4 }
67
+ assert:
68
+ result: "&result"
69
+ data:
70
+ -
71
+ { insert : "expected.files", documents : [
72
+ { _id : "*result", length : 4, chunkSize : 4, uploadDate : "*actual", md5 : "7e7c77cff5705d1f7574a25ef6662117", filename : "filename" }
73
+ ] }
74
+ -
75
+ { insert : "expected.chunks", documents : [
76
+ { _id : "*actual", files_id : "*result", n : 0, data : { $hex : "11223344" } }
77
+ ] }
78
+ -
79
+ description: "Upload when length is 5"
80
+ act:
81
+ operation: upload
82
+ arguments:
83
+ filename: "filename"
84
+ source: { $hex : "1122334455" }
85
+ options: { chunkSizeBytes : 4 }
86
+ assert:
87
+ result: "&result"
88
+ data:
89
+ -
90
+ { insert : "expected.files", documents : [
91
+ { _id : "*result", length : 5, chunkSize : 4, uploadDate : "*actual", md5 : "283d4fea5dded59cf837d3047328f5af", filename : "filename" }
92
+ ] }
93
+ -
94
+ { insert : "expected.chunks", documents : [
95
+ { _id : "*actual", files_id : "*result", n : 0, data : { $hex : "11223344" } },
96
+ { _id : "*actual", files_id : "*result", n : 1, data : { $hex : "55" } }
97
+ ] }
98
+ -
99
+ description: "Upload when length is 8"
100
+ act:
101
+ operation: upload
102
+ arguments:
103
+ filename: "filename"
104
+ source: { $hex : "1122334455667788" }
105
+ options: { chunkSizeBytes : 4 }
106
+ assert:
107
+ result: "&result"
108
+ data:
109
+ -
110
+ { insert : "expected.files", documents : [
111
+ { _id : "*result", length : 8, chunkSize : 4, uploadDate : "*actual", md5 : "dd254cdc958e53abaa67da9f797125f5", filename : "filename" }
112
+
113
+ ] }
114
+ -
115
+ { insert : "expected.chunks", documents : [
116
+ { _id : "*actual", files_id : "*result", n : 0, data : { $hex : "11223344" } },
117
+ { _id : "*actual", files_id : "*result", n : 1, data : { $hex : "55667788" } }
118
+ ] }
119
+ -
120
+ description: "Upload when contentType is provided"
121
+ act:
122
+ operation: upload
123
+ arguments:
124
+ filename: "filename"
125
+ source: { $hex : "11" }
126
+ options: { chunkSizeBytes : 4, contentType : "image/jpeg" }
127
+ assert:
128
+ result: "&result"
129
+ data:
130
+ -
131
+ { insert : "expected.files", documents : [
132
+ { _id : "*result", length : 1, chunkSize : 4, uploadDate : "*actual", md5 : "47ed733b8d10be225eceba344d533586", filename : "filename", contentType : "image/jpeg" }
133
+ ] }
134
+ -
135
+ { insert : "expected.chunks", documents : [
136
+ { _id : "*actual", files_id : "*result", n : 0, data : { $hex : "11" } }
137
+ ] }
138
+ -
139
+ description: "Upload when metadata is provided"
140
+ act:
141
+ operation: upload
142
+ arguments:
143
+ filename: "filename"
144
+ source: { $hex : "11" }
145
+ options:
146
+ chunkSizeBytes: 4
147
+ metadata: { x : 1 }
148
+ assert:
149
+ result: "&result"
150
+ data:
151
+ -
152
+ { insert : "expected.files", documents : [
153
+ { _id : "*result", length : 1, chunkSize : 4, uploadDate : "*actual", md5 : "47ed733b8d10be225eceba344d533586", filename : "filename", metadata : { x : 1 } }
154
+ ] }
155
+ -
156
+ { insert : "expected.chunks", documents : [
157
+ { _id : "*actual", files_id : "*result", n : 0, data : { $hex : "11" } }
158
+ ] }
@@ -29,7 +29,7 @@ phases: [
29
29
  "a:27017": {
30
30
  type: "Unknown",
31
31
  setName: ,
32
- electionId: ,
32
+ electionId:
33
33
  },
34
34
  "b:27017": {
35
35
  type: "RSPrimary",
@@ -39,7 +39,6 @@ phases: [
39
39
  },
40
40
  topologyType: "ReplicaSetWithPrimary",
41
41
  setName: "rs",
42
- maxElectionId: {"$oid": "000000000000000000000001"}
43
42
  }
44
43
  }
45
44
  ]
@@ -31,7 +31,6 @@ phases: [
31
31
  },
32
32
  topologyType: "ReplicaSetWithPrimary",
33
33
  setName: "rs",
34
- maxElectionId: {"$oid": "000000000000000000000001"}
35
34
  }
36
35
  },
37
36
 
@@ -62,7 +61,6 @@ phases: [
62
61
  },
63
62
  topologyType: "ReplicaSetWithPrimary",
64
63
  setName: "rs",
65
- maxElectionId: {"$oid": "000000000000000000000002"}
66
64
  }
67
65
  },
68
66
 
@@ -92,7 +90,6 @@ phases: [
92
90
  },
93
91
  topologyType: "ReplicaSetWithPrimary",
94
92
  setName: "rs",
95
- maxElectionId: {"$oid": "000000000000000000000002"}
96
93
  }
97
94
  }
98
95
  ]
@@ -0,0 +1,37 @@
1
+ {
2
+ "description": "Primary mismatched me",
3
+ "phases": [
4
+ {
5
+ "outcome": {
6
+ "servers": {
7
+ "a:27017": {
8
+ "setName": null,
9
+ "type": "Unknown"
10
+ },
11
+ "b:27017": {
12
+ "setName": null,
13
+ "type": "Unknown"
14
+ }
15
+ },
16
+ "setName": "rs",
17
+ "topologyType": "ReplicaSetNoPrimary"
18
+ },
19
+ "responses": [
20
+ [
21
+ "localhost:27017",
22
+ {
23
+ "me": "a:27017",
24
+ "hosts": [
25
+ "a:27017",
26
+ "b:27017"
27
+ ],
28
+ "ismaster": true,
29
+ "ok": 1,
30
+ "setName": "rs"
31
+ }
32
+ ]
33
+ ]
34
+ }
35
+ ],
36
+ "uri": "mongodb://localhost:27017/?replicaSet=rs"
37
+ }
@@ -0,0 +1,75 @@
1
+ description: "Primary to no primary with mismatched me"
2
+
3
+ uri: "mongodb://a/?replicaSet=rs"
4
+
5
+ phases: [
6
+
7
+ {
8
+ responses: [
9
+
10
+ ["a:27017", {
11
+
12
+ ok: 1,
13
+ ismaster: true,
14
+ hosts: ["a:27017", "b:27017"],
15
+ me: "a:27017",
16
+ setName: "rs"
17
+ }]
18
+ ],
19
+
20
+ outcome: {
21
+
22
+ servers: {
23
+
24
+ "a:27017": {
25
+
26
+ type: "RSPrimary",
27
+ setName: "rs"
28
+ },
29
+
30
+ "b:27017": {
31
+
32
+ type: "Unknown",
33
+ setName:
34
+ }
35
+ },
36
+
37
+ topologyType: "ReplicaSetWithPrimary",
38
+ setName: "rs"
39
+ }
40
+ },
41
+ {
42
+ responses: [
43
+
44
+ ["a:27017", {
45
+
46
+ ok: 1,
47
+ ismaster: true,
48
+ hosts: ["c:27017", "d:27017"],
49
+ me : "c:27017",
50
+ setName: "rs"
51
+ }]
52
+ ],
53
+
54
+ outcome: {
55
+
56
+ servers: {
57
+
58
+ "c:27017": {
59
+
60
+ type: "Unknown",
61
+ setName:
62
+ },
63
+
64
+ "d:27017": {
65
+
66
+ type: "Unknown",
67
+ setName:
68
+ }
69
+ },
70
+
71
+ topologyType: "ReplicaSetNoPrimary",
72
+ setName: "rs"
73
+ }
74
+ }
75
+ ]
@@ -0,0 +1,37 @@
1
+ {
2
+ "description": "Secondary mismatched me",
3
+ "phases": [
4
+ {
5
+ "outcome": {
6
+ "servers": {
7
+ "a:27017": {
8
+ "setName": null,
9
+ "type": "Unknown"
10
+ },
11
+ "b:27017": {
12
+ "setName": null,
13
+ "type": "Unknown"
14
+ }
15
+ },
16
+ "setName": "rs",
17
+ "topologyType": "ReplicaSetNoPrimary"
18
+ },
19
+ "responses": [
20
+ [
21
+ "localhost:27017",
22
+ {
23
+ "me": "a:27017",
24
+ "hosts": [
25
+ "a:27017",
26
+ "b:27017"
27
+ ],
28
+ "ismaster": false,
29
+ "ok": 1,
30
+ "setName": "rs"
31
+ }
32
+ ]
33
+ ]
34
+ }
35
+ ],
36
+ "uri": "mongodb://localhost:27017/?replicaSet=rs"
37
+ }
@@ -12,7 +12,7 @@ phases: [
12
12
  ok: 1,
13
13
  ismaster: false,
14
14
  arbiterOnly: true,
15
- hosts: ["a"],
15
+ hosts: ["a:27017"],
16
16
  setName: "rs"
17
17
  }]
18
18
  ],
@@ -11,7 +11,7 @@ phases: [
11
11
 
12
12
  ok: 1,
13
13
  ismaster: true,
14
- hosts: ["a"],
14
+ hosts: ["a:27017"],
15
15
  setName: "rs"
16
16
  }]
17
17
  ],
@@ -12,7 +12,7 @@ phases: [
12
12
  ok: 1,
13
13
  ismaster: false,
14
14
  secondary: true,
15
- hosts: ["a"],
15
+ hosts: ["a:27017"],
16
16
  setName: "rs"
17
17
  }]
18
18
  ],
@@ -1,6 +1,6 @@
1
1
  description: "Direct connection to slave"
2
2
 
3
- uri: "mongodb://a/?connect=direct"
3
+ uri: "mongodb://a"
4
4
 
5
5
  phases: [
6
6
 
@@ -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
  }
@@ -80,7 +80,9 @@ module Mongo
80
80
  #
81
81
  # @since 2.0.0
82
82
  def initialize(file)
83
- @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
84
86
  @description = @test['description']
85
87
  @uri_string = @test['uri']
86
88
  @uri = URI.new(uri_string)
@@ -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
@@ -42,6 +55,27 @@ shared_examples 'a bulk write object' 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
@@ -101,6 +135,27 @@ shared_examples 'a bulk write object' 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
 
@@ -143,6 +198,27 @@ shared_examples 'a bulk write object' 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
@@ -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
@@ -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
@@ -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
@@ -417,6 +551,22 @@ shared_examples 'a bulk write object' do
417
551
  authorized_collection.insert_many(docs)
418
552
  end
419
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
+
420
570
  context 'when an update document is not specified' do
421
571
 
422
572
  let(:operations) do
@@ -468,6 +618,27 @@ shared_examples 'a bulk write object' do
468
618
  expect(authorized_collection.find.projection(_id: 0).to_a).to eq(expected)
469
619
  end
470
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
+
471
642
  context 'when upsert is true' do
472
643
 
473
644
  let(:operations) do
@@ -535,5 +706,26 @@ shared_examples 'a bulk write object' do
535
706
  bulk.execute
536
707
  expect(authorized_collection.find(x: { '$lte' => 3000 }).to_a.size).to eq(3000)
537
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
538
730
  end
539
731
  end