mongo 2.0.6 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,228 @@
1
+ # Copyright (C) 2014-2015 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ RSpec::Matchers.define :have_hosts do |test|
16
+
17
+ match do |client|
18
+
19
+ def find_server(client, host)
20
+ client.cluster.instance_variable_get(:@servers).detect do |s|
21
+ s.address.host == host.host
22
+ end
23
+ end
24
+
25
+ def match_host?(server, host)
26
+ server.address.host == host.host
27
+ end
28
+
29
+ def match_port?(server, host)
30
+ server.address.port == host.port || !host.port
31
+ end
32
+
33
+ def match_address_family?(server, host)
34
+ address_family(server) == host.address_family
35
+ end
36
+
37
+ def address_family(server)
38
+ server.address.socket(2)
39
+ server.address.instance_variable_get(:@resolver).class
40
+ end
41
+
42
+ test.hosts.all? do |host|
43
+ server = find_server(client, host)
44
+ match_host?(server, host) &&
45
+ match_port?(server, host) if server #&&
46
+ #match_address_family?(server, host) if server
47
+ end
48
+
49
+ failure_message do |client|
50
+ "With URI: #{test.uri_string}\n" +
51
+ "Expected that test hosts: #{test.hosts} would match " +
52
+ "client hosts: #{client.cluster.instance_variable_get(:@servers)}"
53
+ end
54
+ end
55
+ end
56
+
57
+ RSpec::Matchers.define :match_auth do |test|
58
+
59
+ def match_database?(client, auth)
60
+ client.options[:database] == auth.database || !auth.database
61
+ end
62
+
63
+ def match_password?(client, auth)
64
+ client.options[:password] == auth.password ||
65
+ client.options[:password].nil? && auth.password == ''
66
+ end
67
+
68
+ match do |client|
69
+ auth = test.auth
70
+ return true unless auth
71
+ client.options[:user] == auth.username &&
72
+ match_password?(client, auth) &&
73
+ match_database?(client, auth)
74
+ end
75
+
76
+ failure_message do |client|
77
+ "With URI: #{test.uri_string}\n" +
78
+ "Expected that test auth: #{test.auth} would match client auth: #{client.options}"
79
+ end
80
+ end
81
+
82
+ RSpec::Matchers.define :match_options do |test|
83
+
84
+ match do |client|
85
+ options = test.options
86
+ return true unless options
87
+ options.match?(client.options)
88
+ end
89
+
90
+ failure_message do |client|
91
+ "With URI: #{test.uri_string}\n" +
92
+ "Expected that test options: #{test.options.options} would match client options: #{client.options}"
93
+ end
94
+ end
95
+
96
+ module Mongo
97
+ module ConnectionString
98
+
99
+ class Spec
100
+
101
+ attr_reader :description
102
+
103
+ # Instantiate the new spec.
104
+ #
105
+ # @example Create the spec.
106
+ # Spec.new(file)
107
+ #
108
+ # @param [ String ] file The name of the file.
109
+ #
110
+ # @since 2.0.0
111
+ def initialize(file)
112
+ file = File.new(file)
113
+ @spec = YAML.load(ERB.new(file.read).result)
114
+ file.close
115
+ @description = File.basename(file)
116
+ end
117
+
118
+ def tests
119
+ @tests ||= @spec['tests'].collect do |spec|
120
+ Test.new(spec)
121
+ end
122
+ end
123
+ end
124
+
125
+ class Test
126
+
127
+ attr_reader :description
128
+ attr_reader :uri_string
129
+
130
+ def initialize(spec)
131
+ @spec = spec
132
+ @description = @spec['description']
133
+ @uri_string = @spec['uri']
134
+ end
135
+
136
+ def valid?
137
+ @spec['valid']
138
+ end
139
+
140
+ def warn?
141
+ @spec['warning']
142
+ end
143
+
144
+ def hosts
145
+ @hosts ||= @spec['hosts'].collect do |host|
146
+ Host.new(host)
147
+ end
148
+ end
149
+
150
+ def options
151
+ @options ||= Options.new(@spec['options']) if @spec['options']
152
+ end
153
+
154
+ def client
155
+ @client ||= Mongo::Client.new(@spec['uri'])
156
+ end
157
+
158
+ def uri
159
+ @uri ||= Mongo::URI.new(@spec['uri'])
160
+ end
161
+
162
+ def auth
163
+ @auth ||= Auth.new(@spec['auth']) if @spec['auth']
164
+ end
165
+ end
166
+
167
+ class Host
168
+
169
+ MAPPING = {
170
+ 'ipv4' => Mongo::Address::IPv4,
171
+ 'ipv6' => Mongo::Address::IPv6,
172
+ 'unix' => Mongo::Address::Unix
173
+ }
174
+
175
+ attr_reader :host
176
+ attr_reader :port
177
+
178
+ def initialize(spec)
179
+ @spec = spec
180
+ @host = @spec['host']
181
+ @port = @spec['port']
182
+ end
183
+
184
+ def address_family
185
+ MAPPING[@spec['type']]
186
+ end
187
+ end
188
+
189
+ class Auth
190
+
191
+ attr_reader :username
192
+ attr_reader :password
193
+ attr_reader :database
194
+
195
+ def initialize(spec)
196
+ @spec = spec
197
+ @username = @spec['username']
198
+ @password = @spec['password']
199
+ @database = @spec['db']
200
+ end
201
+
202
+ def to_s
203
+ "username: #{username}, password: #{password}, database: #{database}"
204
+ end
205
+ end
206
+
207
+ class Options
208
+
209
+ MAPPINGS = {
210
+ 'replicaset' => :replica_set,
211
+ 'authmechanism' => :auth_mech
212
+ }
213
+
214
+ attr_reader :options
215
+
216
+ def initialize(options)
217
+ @options = options
218
+ end
219
+
220
+ def match?(opts)
221
+ @options.keys.all? do |k|
222
+ opts[MAPPINGS[k]] == @options[k] ||
223
+ Mongo::URI::AUTH_MECH_MAP[@options[k]] == opts[MAPPINGS[k]]
224
+ end
225
+ end
226
+ end
227
+ end
228
+ end
@@ -0,0 +1,193 @@
1
+ tests:
2
+ -
3
+ description: "Empty string"
4
+ uri: ""
5
+ valid: false
6
+ warning: ~
7
+ hosts: ~
8
+ auth: ~
9
+ options: ~
10
+ -
11
+ description: "Invalid scheme"
12
+ uri: "mongo://localhost:27017"
13
+ valid: false
14
+ warning: ~
15
+ hosts: ~
16
+ auth: ~
17
+ options: ~
18
+ -
19
+ description: "Missing host"
20
+ uri: "mongodb://"
21
+ valid: false
22
+ warning: ~
23
+ hosts: ~
24
+ auth: ~
25
+ options: ~
26
+ -
27
+ description: "Double colon in host identifier"
28
+ uri: "mongodb://localhost::27017"
29
+ valid: false
30
+ warning: ~
31
+ hosts: ~
32
+ auth: ~
33
+ options: ~
34
+ -
35
+ description: "Double colon in host identifier and trailing slash"
36
+ uri: "mongodb://localhost::27017/"
37
+ valid: false
38
+ warning: ~
39
+ hosts: ~
40
+ auth: ~
41
+ options: ~
42
+ -
43
+ description: "Double colon in host identifier with missing host and port"
44
+ uri: "mongodb://::"
45
+ valid: false
46
+ warning: ~
47
+ hosts: ~
48
+ auth: ~
49
+ options: ~
50
+ -
51
+ description: "Double colon in host identifier with missing port"
52
+ uri: "mongodb://localhost,localhost::"
53
+ valid: false
54
+ warning: ~
55
+ hosts: ~
56
+ auth: ~
57
+ options: ~
58
+ -
59
+ description: "Double colon in host identifier and second host"
60
+ uri: "mongodb://localhost::27017,abc"
61
+ valid: false
62
+ warning: ~
63
+ hosts: ~
64
+ auth: ~
65
+ options: ~
66
+ -
67
+ description: "Invalid port (negative number) with hostname"
68
+ uri: "mongodb://localhost:-1"
69
+ valid: false
70
+ warning: ~
71
+ hosts: ~
72
+ auth: ~
73
+ options: ~
74
+ -
75
+ description: "Invalid port (zero) with hostname"
76
+ uri: "mongodb://localhost:0/"
77
+ valid: false
78
+ warning: ~
79
+ hosts: ~
80
+ auth: ~
81
+ options: ~
82
+ -
83
+ description: "Invalid port (positive number) with hostname"
84
+ uri: "mongodb://localhost:65536"
85
+ valid: false
86
+ warning: ~
87
+ hosts: ~
88
+ auth: ~
89
+ options: ~
90
+ -
91
+ description: "Invalid port (positive number) with hostname and trailing slash"
92
+ uri: "mongodb://localhost:65536/"
93
+ valid: false
94
+ warning: ~
95
+ hosts: ~
96
+ auth: ~
97
+ options: ~
98
+ -
99
+ description: "Invalid port (non-numeric string) with hostname"
100
+ uri: "mongodb://localhost:foo"
101
+ valid: false
102
+ warning: ~
103
+ hosts: ~
104
+ auth: ~
105
+ options: ~
106
+ -
107
+ description: "Invalid port (negative number) with IP literal"
108
+ uri: "mongodb://[::1]:-1"
109
+ valid: false
110
+ warning: ~
111
+ hosts: ~
112
+ auth: ~
113
+ options: ~
114
+ -
115
+ description: "Invalid port (zero) with IP literal"
116
+ uri: "mongodb://[::1]:0/"
117
+ valid: false
118
+ warning: ~
119
+ hosts: ~
120
+ auth: ~
121
+ options: ~
122
+ -
123
+ description: "Invalid port (positive number) with IP literal"
124
+ uri: "mongodb://[::1]:65536"
125
+ valid: false
126
+ warning: ~
127
+ hosts: ~
128
+ auth: ~
129
+ options: ~
130
+ -
131
+ description: "Invalid port (positive number) with IP literal and trailing slash"
132
+ uri: "mongodb://[::1]:65536/"
133
+ valid: false
134
+ warning: ~
135
+ hosts: ~
136
+ auth: ~
137
+ options: ~
138
+ -
139
+ description: "Invalid port (non-numeric string) with IP literal"
140
+ uri: "mongodb://[::1]:foo"
141
+ valid: false
142
+ warning: ~
143
+ hosts: ~
144
+ auth: ~
145
+ options: ~
146
+ -
147
+ description: "Missing delimiting slash between hosts and options"
148
+ uri: "mongodb://example.com?w=1"
149
+ valid: false
150
+ warning: ~
151
+ hosts: ~
152
+ auth: ~
153
+ options: ~
154
+ -
155
+ description: "Incomplete key value pair for option"
156
+ uri: "mongodb://example.com/?w"
157
+ valid: false
158
+ warning: ~
159
+ hosts: ~
160
+ auth: ~
161
+ options: ~
162
+ -
163
+ description: "Username with password containing an unescaped colon"
164
+ uri: "mongodb://alice:foo:bar@127.0.0.1"
165
+ valid: false
166
+ warning: ~
167
+ hosts: ~
168
+ auth: ~
169
+ options: ~
170
+ -
171
+ description: "Username containing an unescaped at-sign"
172
+ uri: "mongodb://alice@@127.0.0.1"
173
+ valid: false
174
+ warning: ~
175
+ hosts: ~
176
+ auth: ~
177
+ options: ~
178
+ -
179
+ description: "Username with password containing an unescaped at-sign"
180
+ uri: "mongodb://alice@foo:bar@127.0.0.1"
181
+ valid: false
182
+ warning: ~
183
+ hosts: ~
184
+ auth: ~
185
+ options: ~
186
+ -
187
+ description: "Host with unescaped slash"
188
+ uri: "mongodb:///tmp/mongodb-27017.sock/"
189
+ valid: false
190
+ warning: ~
191
+ hosts: ~
192
+ auth: ~
193
+ options: ~
@@ -0,0 +1,256 @@
1
+ tests:
2
+ -
3
+ description: "User info for single IPv4 host without database"
4
+ uri: "mongodb://alice:foo@127.0.0.1"
5
+ valid: true
6
+ warning: false
7
+ hosts:
8
+ -
9
+ type: "ipv4"
10
+ host: "127.0.0.1"
11
+ port: ~
12
+ auth:
13
+ username: "alice"
14
+ password: "foo"
15
+ db: ~
16
+ options: ~
17
+ -
18
+ description: "User info for single IPv4 host with database"
19
+ uri: "mongodb://alice:foo@127.0.0.1/test"
20
+ valid: true
21
+ warning: false
22
+ hosts:
23
+ -
24
+ type: "ipv4"
25
+ host: "127.0.0.1"
26
+ port: ~
27
+ auth:
28
+ username: "alice"
29
+ password: "foo"
30
+ db: "test"
31
+ options: ~
32
+ -
33
+ description: "User info for single IPv4 host with database (escaped null bytes)"
34
+ uri: "mongodb://a%00lice:f%00oo@127.0.0.1/t%00est"
35
+ valid: true
36
+ warning: false
37
+ hosts:
38
+ -
39
+ type: "ipv4"
40
+ host: "127.0.0.1"
41
+ port: ~
42
+ auth:
43
+ username: "a\0lice"
44
+ password: "f\0oo"
45
+ db: "t\0est"
46
+ options: ~
47
+ -
48
+ description: "User info for single IP literal host without database"
49
+ uri: "mongodb://bob:bar@[::1]:27018"
50
+ valid: true
51
+ warning: false
52
+ hosts:
53
+ -
54
+ type: "ip_literal"
55
+ host: "::1"
56
+ port: 27018
57
+ auth:
58
+ username: "bob"
59
+ password: "bar"
60
+ db: ~
61
+ options: ~
62
+ -
63
+ description: "User info for single IP literal host with database"
64
+ uri: "mongodb://bob:bar@[::1]:27018/admin"
65
+ valid: true
66
+ warning: false
67
+ hosts:
68
+ -
69
+ type: "ip_literal"
70
+ host: "::1"
71
+ port: 27018
72
+ auth:
73
+ username: "bob"
74
+ password: "bar"
75
+ db: "admin"
76
+ options: ~
77
+ -
78
+ description: "User info for single hostname without database"
79
+ uri: "mongodb://eve:baz@example.com"
80
+ valid: true
81
+ warning: false
82
+ hosts:
83
+ -
84
+ type: "hostname"
85
+ host: "example.com"
86
+ port: ~
87
+ auth:
88
+ username: "eve"
89
+ password: "baz"
90
+ db: ~
91
+ options: ~
92
+ -
93
+ description: "User info for single hostname with database"
94
+ uri: "mongodb://eve:baz@example.com/db2"
95
+ valid: true
96
+ warning: false
97
+ hosts:
98
+ -
99
+ type: "hostname"
100
+ host: "example.com"
101
+ port: ~
102
+ auth:
103
+ username: "eve"
104
+ password: "baz"
105
+ db: "db2"
106
+ options: ~
107
+ -
108
+ description: "User info for multiple hosts without database"
109
+ uri: "mongodb://alice:secret@127.0.0.1,example.com:27018"
110
+ valid: true
111
+ warning: false
112
+ hosts:
113
+ -
114
+ type: "ipv4"
115
+ host: "127.0.0.1"
116
+ port: ~
117
+ -
118
+ type: "hostname"
119
+ host: "example.com"
120
+ port: 27018
121
+ auth:
122
+ username: "alice"
123
+ password: "secret"
124
+ db: ~
125
+ options: ~
126
+ -
127
+ description: "User info for multiple hosts with database"
128
+ uri: "mongodb://alice:secret@example.com,[::1]:27019/admin"
129
+ valid: true
130
+ warning: false
131
+ hosts:
132
+ -
133
+ type: "hostname"
134
+ host: "example.com"
135
+ port: ~
136
+ -
137
+ type: "ip_literal"
138
+ host: "::1"
139
+ port: 27019
140
+ auth:
141
+ username: "alice"
142
+ password: "secret"
143
+ db: "admin"
144
+ options: ~
145
+ -
146
+ description: "Username without password"
147
+ uri: "mongodb://alice@127.0.0.1"
148
+ valid: true
149
+ warning: false
150
+ hosts:
151
+ -
152
+ type: "ipv4"
153
+ host: "127.0.0.1"
154
+ port: ~
155
+ auth:
156
+ username: "alice"
157
+ password: ~
158
+ db: ~
159
+ options: ~
160
+ -
161
+ description: "Username with empty password"
162
+ uri: "mongodb://alice:@127.0.0.1"
163
+ valid: true
164
+ warning: false
165
+ hosts:
166
+ -
167
+ type: "ipv4"
168
+ host: "127.0.0.1"
169
+ port: ~
170
+ auth:
171
+ username: "alice"
172
+ password: ""
173
+ db: ~
174
+ options: ~
175
+ -
176
+ description: "Escaped username and database without password"
177
+ uri: "mongodb://%40l%3Ace@example.com/my%3Ddb"
178
+ valid: true
179
+ warning: false
180
+ hosts:
181
+ -
182
+ type: "hostname"
183
+ host: "example.com"
184
+ port: ~
185
+ auth:
186
+ username: "@l:ce"
187
+ password: ~
188
+ db: "my=db"
189
+ options: ~
190
+ -
191
+ description: "Escaped user info and database (MONGODB-CR)"
192
+ uri: "mongodb://%24am:f%3Azzb%40zz@127.0.0.1/admin%3F?authMechanism=MONGODB-CR"
193
+ valid: true
194
+ warning: false
195
+ hosts:
196
+ -
197
+ type: "ipv4"
198
+ host: "127.0.0.1"
199
+ port: ~
200
+ auth:
201
+ username: "$am"
202
+ password: "f:zzb@zz"
203
+ db: "admin?"
204
+ options:
205
+ authmechanism: "MONGODB-CR"
206
+ -
207
+ description: "Escaped username (MONGODB-X509)"
208
+ uri: "mongodb://CN%3DmyName%2COU%3DmyOrgUnit%2CO%3DmyOrg%2CL%3DmyLocality%2CST%3DmyState%2CC%3DmyCountry@localhost/?authMechanism=MONGODB-X509"
209
+ valid: true
210
+ warning: false
211
+ hosts:
212
+ -
213
+ type: "hostname"
214
+ host: "localhost"
215
+ port: ~
216
+ auth:
217
+ username: "CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=myState,C=myCountry"
218
+ password: ~
219
+ db: ~
220
+ options:
221
+ authmechanism: "MONGODB-X509"
222
+ -
223
+ description: "Escaped username (GSSAPI)"
224
+ uri: "mongodb://user%40EXAMPLE.COM:secret@localhost/?authMechanismProperties=SERVICE_NAME:other,CANONICALIZE_HOST_NAME:true&authMechanism=GSSAPI"
225
+ valid: true
226
+ warning: false
227
+ hosts:
228
+ -
229
+ type: "hostname"
230
+ host: "localhost"
231
+ port: ~
232
+ auth:
233
+ username: "user@EXAMPLE.COM"
234
+ password: "secret"
235
+ db: ~
236
+ options:
237
+ authmechanism: "GSSAPI"
238
+ authmechanismproperties:
239
+ SERVICE_NAME: "other"
240
+ CANONICALIZE_HOST_NAME: true
241
+ -
242
+ description: "At-signs in options aren't part of the userinfo"
243
+ uri: "mongodb://alice:secret@example.com/admin?replicaset=my@replicaset"
244
+ valid: true
245
+ warning: false
246
+ hosts:
247
+ -
248
+ type: "hostname"
249
+ host: "example.com"
250
+ port: ~
251
+ auth:
252
+ username: "alice"
253
+ password: "secret"
254
+ db: "admin"
255
+ options:
256
+ replicaset: "my@replicaset"