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
@@ -6,66 +6,125 @@ describe Mongo::ServerSelector do
6
6
 
7
7
  describe '.get' do
8
8
 
9
- let(:read_pref) do
10
- described_class.get({ :mode => name })
9
+ let(:selector) do
10
+ described_class.get(:mode => name, :tag_sets => tag_sets)
11
11
  end
12
12
 
13
- let(:name) { :secondary }
14
- let(:tag_sets) { [{ 'test' => 'tag' }] }
15
-
16
13
  context 'when the mode is primary' do
17
- let(:name) { :primary }
14
+
15
+ let(:name) do
16
+ :primary
17
+ end
18
18
 
19
19
  it 'returns a read preference of class Primary' do
20
- expect(read_pref).to be_a(Mongo::ServerSelector::Primary)
20
+ expect(selector).to be_a(Mongo::ServerSelector::Primary)
21
21
  end
22
22
  end
23
23
 
24
24
  context 'when the mode is primary_preferred' do
25
- let(:name) { :primary_preferred }
25
+ let(:name) do
26
+ :primary_preferred
27
+ end
26
28
 
27
29
  it 'returns a read preference of class PrimaryPreferred' do
28
- expect(read_pref).to be_a(Mongo::ServerSelector::PrimaryPreferred)
30
+ expect(selector).to be_a(Mongo::ServerSelector::PrimaryPreferred)
29
31
  end
30
32
  end
31
33
 
32
34
  context 'when the mode is secondary' do
33
- let(:name) { :secondary }
35
+ let(:name) do
36
+ :secondary
37
+ end
34
38
 
35
39
  it 'returns a read preference of class Secondary' do
36
- expect(read_pref).to be_a(Mongo::ServerSelector::Secondary)
40
+ expect(selector).to be_a(Mongo::ServerSelector::Secondary)
37
41
  end
38
42
  end
39
43
 
40
44
  context 'when the mode is secondary_preferred' do
41
- let(:name) { :secondary_preferred }
45
+ let(:name) do
46
+ :secondary_preferred
47
+ end
42
48
 
43
49
  it 'returns a read preference of class SecondaryPreferred' do
44
- expect(read_pref).to be_a(Mongo::ServerSelector::SecondaryPreferred)
50
+ expect(selector).to be_a(Mongo::ServerSelector::SecondaryPreferred)
45
51
  end
46
52
  end
47
53
 
48
54
  context 'when the mode is nearest' do
49
- let(:name) { :nearest }
55
+ let(:name) do
56
+ :nearest
57
+ end
50
58
 
51
59
  it 'returns a read preference of class Nearest' do
52
- expect(read_pref).to be_a(Mongo::ServerSelector::Nearest)
60
+ expect(selector).to be_a(Mongo::ServerSelector::Nearest)
53
61
  end
54
62
  end
55
63
 
56
64
  context 'when a mode is not provided' do
57
- let(:read_pref) { described_class.get }
65
+ let(:selector) { described_class.get }
58
66
 
59
67
  it 'returns a read preference of class Primary' do
60
- expect(read_pref).to be_a(Mongo::ServerSelector::Primary)
68
+ expect(selector).to be_a(Mongo::ServerSelector::Primary)
61
69
  end
62
70
  end
63
71
 
64
- context 'when tag sets provided' do
65
- let(:read_pref) { described_class.get(:mode => name, :tag_sets => tag_sets) }
72
+ context 'when tag sets are provided' do
73
+
74
+ let(:selector) do
75
+ described_class.get(:mode => :secondary, :tag_sets => tag_sets)
76
+ end
77
+
78
+ let(:tag_sets) do
79
+ [{ 'test' => 'tag' }]
80
+ end
66
81
 
67
82
  it 'sets tag sets on the read preference object' do
68
- expect(read_pref.tag_sets).to eq(tag_sets)
83
+ expect(selector.tag_sets).to eq(tag_sets)
84
+ end
85
+ end
86
+
87
+ context 'when server_selection_timeout is specified' do
88
+
89
+ let(:selector) do
90
+ described_class.get(:mode => :secondary, :server_selection_timeout => 1)
91
+ end
92
+
93
+ it 'sets server selection timeout on the read preference object' do
94
+ expect(selector.server_selection_timeout).to eq(1)
95
+ end
96
+ end
97
+
98
+ context 'when server_selection_timeout is not specified' do
99
+
100
+ let(:selector) do
101
+ described_class.get(:mode => :secondary)
102
+ end
103
+
104
+ it 'sets server selection timeout to the default' do
105
+ expect(selector.server_selection_timeout).to eq(Mongo::ServerSelector::SERVER_SELECTION_TIMEOUT)
106
+ end
107
+ end
108
+
109
+ context 'when local_threshold is specified' do
110
+
111
+ let(:selector) do
112
+ described_class.get(:mode => :secondary, :local_threshold => 0.010)
113
+ end
114
+
115
+ it 'sets local_threshold on the read preference object' do
116
+ expect(selector.local_threshold).to eq(0.010)
117
+ end
118
+ end
119
+
120
+ context 'when local_threshold is not specified' do
121
+
122
+ let(:selector) do
123
+ described_class.get(:mode => :secondary)
124
+ end
125
+
126
+ it 'sets local threshold to the default' do
127
+ expect(selector.local_threshold).to eq(Mongo::ServerSelector::LOCAL_THRESHOLD)
69
128
  end
70
129
  end
71
130
  end
@@ -74,7 +133,9 @@ describe Mongo::ServerSelector do
74
133
 
75
134
  context 'when #select returns a list of nils' do
76
135
 
77
- let(:servers) { [ server(:primary) ] }
136
+ let(:servers) do
137
+ [ server(:primary) ]
138
+ end
78
139
 
79
140
  let(:cluster) do
80
141
  double('cluster').tap do |c|
@@ -86,7 +147,7 @@ describe Mongo::ServerSelector do
86
147
  end
87
148
 
88
149
  let(:read_pref) do
89
- described_class.get({ mode: :primary }, server_selection_timeout: 1).tap do |pref|
150
+ described_class.get(mode: :primary, server_selection_timeout: 0.1).tap do |pref|
90
151
  allow(pref).to receive(:select).and_return([ nil, nil ])
91
152
  end
92
153
  end
@@ -103,7 +164,9 @@ describe Mongo::ServerSelector do
103
164
 
104
165
  context 'when cluster#servers is empty' do
105
166
 
106
- let(:servers) { [] }
167
+ let(:servers) do
168
+ []
169
+ end
107
170
 
108
171
  let(:cluster) do
109
172
  double('cluster').tap do |c|
@@ -115,7 +178,7 @@ describe Mongo::ServerSelector do
115
178
  end
116
179
 
117
180
  let(:read_pref) do
118
- described_class.get({ mode: :primary }, server_selection_timeout: 1)
181
+ described_class.get(mode: :primary, server_selection_timeout: 0.1)
119
182
  end
120
183
 
121
184
  it 'raises a NoServerAvailable error' do
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongo::Socket::Unix do
4
+
5
+ let(:socket) do
6
+ described_class.new("/tmp/mongodb-27017.sock", 5)
7
+ end
8
+
9
+ describe '#connect!' do
10
+
11
+ before do
12
+ socket.connect!
13
+ end
14
+
15
+ after do
16
+ socket.close
17
+ end
18
+
19
+ it 'connects to the server' do
20
+ expect(socket).to be_alive
21
+ end
22
+ end
23
+
24
+ describe '#alive?' do
25
+
26
+ context 'when the socket is connected' do
27
+
28
+ before do
29
+ socket.connect!
30
+ end
31
+
32
+ after do
33
+ socket.close
34
+ end
35
+
36
+ it 'returns true' do
37
+ expect(socket).to be_alive
38
+ end
39
+ end
40
+
41
+ context 'when the socket is not connected' do
42
+
43
+ before do
44
+ socket.close
45
+ end
46
+
47
+ it 'raises error' do
48
+ expect { socket.alive? }.to raise_error(IOError)
49
+ end
50
+ end
51
+ end
52
+ end
@@ -4,6 +4,217 @@ describe Mongo::URI do
4
4
  let(:scheme) { 'mongodb://' }
5
5
  let(:uri) { described_class.new(string) }
6
6
 
7
+ describe 'invalid uris' do
8
+
9
+ context 'string is not uri' do
10
+
11
+ let(:string) { 'tyler' }
12
+
13
+ it 'raises an error' do
14
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
15
+ end
16
+ end
17
+
18
+ context 'empty string' do
19
+
20
+ let(:string) { '' }
21
+
22
+ it 'raises an error' do
23
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
24
+ end
25
+ end
26
+
27
+ context 'mongo://localhost:27017' do
28
+
29
+ let(:string) { 'mongo://localhost:27017' }
30
+
31
+ it 'raises an error' do
32
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
33
+ end
34
+ end
35
+
36
+ context 'mongodb://' do
37
+
38
+ let(:string) { 'mongodb://' }
39
+
40
+ it 'raises an error' do
41
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
42
+ end
43
+ end
44
+
45
+ context 'mongodb://localhost::27017' do
46
+
47
+ let(:string) { 'mongodb://localhost::27017' }
48
+
49
+ it 'raises an error' do
50
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
51
+ end
52
+ end
53
+
54
+ context 'mongodb://localhost::27017/' do
55
+
56
+ let(:string) { 'mongodb://localhost::27017/' }
57
+
58
+ it 'raises an error' do
59
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
60
+ end
61
+ end
62
+
63
+ context 'mongodb://::' do
64
+
65
+ let(:string) { 'mongodb://::' }
66
+
67
+ it 'raises an error' do
68
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
69
+ end
70
+ end
71
+
72
+ context 'mongodb://localhost,localhost::' do
73
+
74
+ let(:string) { 'mongodb://localhost,localhost::' }
75
+
76
+ it 'raises an error' do
77
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
78
+ end
79
+ end
80
+
81
+ context 'mongodb://localhost::27017,abc' do
82
+
83
+ let(:string) { 'mongodb://localhost::27017,abc' }
84
+
85
+ it 'raises an error' do
86
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
87
+ end
88
+ end
89
+
90
+ context 'mongodb://localhost:-1' do
91
+
92
+ let(:string) { 'mongodb://localhost:-1' }
93
+
94
+ it 'raises an error' do
95
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
96
+ end
97
+ end
98
+
99
+ context 'mongodb://localhost:0/' do
100
+
101
+ let(:string) { 'mongodb://localhost:0/' }
102
+
103
+ it 'raises an error' do
104
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
105
+ end
106
+ end
107
+
108
+ context 'mongodb://localhost:65536' do
109
+
110
+ let(:string) { 'mongodb://localhost:65536' }
111
+
112
+ it 'raises an error' do
113
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
114
+ end
115
+ end
116
+
117
+ context 'mongodb://localhost:foo' do
118
+
119
+ let(:string) { 'mongodb://localhost:foo' }
120
+
121
+ it 'raises an error' do
122
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
123
+ end
124
+ end
125
+
126
+ context 'mongodb://[::1]:-1' do
127
+
128
+ let(:string) { 'mongodb://[::1]:-1' }
129
+
130
+ it 'raises an error' do
131
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
132
+ end
133
+ end
134
+
135
+ context 'mongodb://[::1]:0/' do
136
+
137
+ let(:string) { 'mongodb://[::1]:0/' }
138
+
139
+ it 'raises an error' do
140
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
141
+ end
142
+ end
143
+
144
+ context 'mongodb://[::1]:65536' do
145
+
146
+ let(:string) { 'mongodb://[::1]:65536' }
147
+
148
+ it 'raises an error' do
149
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
150
+ end
151
+ end
152
+
153
+ context 'mongodb://[::1]:65536/' do
154
+
155
+ let(:string) { 'mongodb://[::1]:65536/' }
156
+
157
+ it 'raises an error' do
158
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
159
+ end
160
+ end
161
+
162
+ context 'mongodb://[::1]:foo' do
163
+
164
+ let(:string) { 'mongodb://[::1]:foo' }
165
+
166
+ it 'raises an error' do
167
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
168
+ end
169
+ end
170
+
171
+ context 'mongodb://example.com?w=1' do
172
+
173
+ let(:string) { 'mongodb://example.com?w=1' }
174
+
175
+ it 'raises an error' do
176
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
177
+ end
178
+ end
179
+
180
+ context 'mongodb://example.com/?w' do
181
+
182
+ let(:string) { 'mongodb://example.com/?w' }
183
+
184
+ it 'raises an error' do
185
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
186
+ end
187
+ end
188
+
189
+ context 'mongodb://alice:foo:bar@127.0.0.1' do
190
+
191
+ let(:string) { 'mongodb://alice:foo:bar@127.0.0.1' }
192
+
193
+ it 'raises an error' do
194
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
195
+ end
196
+ end
197
+
198
+ context 'mongodb://alice@@127.0.0.1' do
199
+
200
+ let(:string) { 'mongodb://alice@@127.0.0.1' }
201
+
202
+ it 'raises an error' do
203
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
204
+ end
205
+ end
206
+
207
+ context 'mongodb://alice@foo:bar@127.0.0.1' do
208
+
209
+ let(:string) { 'mongodb://alice@foo:bar@127.0.0.1' }
210
+
211
+ it 'raises an error' do
212
+ expect { uri }.to raise_error(Mongo::Error::InvalidURI)
213
+ end
214
+ end
215
+
216
+ end
217
+
7
218
  describe '#initialize' do
8
219
  context 'string is not uri' do
9
220
  let(:string) { 'tyler' }
@@ -49,7 +260,7 @@ describe Mongo::URI do
49
260
  end
50
261
 
51
262
  context 'unix socket server' do
52
- let(:servers) { '/tmp/mongodb-27017.sock' }
263
+ let(:servers) { '%2Ftmp%2Fmongodb-27017.sock' }
53
264
 
54
265
  it 'returns an array with the parsed server' do
55
266
  expect(uri.servers).to eq([servers])
@@ -138,7 +349,7 @@ describe Mongo::URI do
138
349
  end
139
350
  end
140
351
 
141
- describe '#options' do
352
+ describe '#uri_options' do
142
353
  let(:servers) { 'localhost' }
143
354
  let(:string) { "#{scheme}#{servers}/?#{options}" }
144
355
 
@@ -146,7 +357,7 @@ describe Mongo::URI do
146
357
  let(:string) { "#{scheme}#{servers}" }
147
358
 
148
359
  it 'returns an empty hash' do
149
- expect(uri.options).to be_empty
360
+ expect(uri.uri_options).to be_empty
150
361
  end
151
362
  end
152
363
 
@@ -157,7 +368,7 @@ describe Mongo::URI do
157
368
  let(:concern) { { :w => 1 } }
158
369
 
159
370
  it 'sets the write concern options' do
160
- expect(uri.options[:write]).to eq(concern)
371
+ expect(uri.uri_options[:write]).to eq(concern)
161
372
  end
162
373
  end
163
374
 
@@ -166,7 +377,7 @@ describe Mongo::URI do
166
377
  let(:concern) { { :w => :majority } }
167
378
 
168
379
  it 'sets the write concern options' do
169
- expect(uri.options[:write]).to eq(concern)
380
+ expect(uri.uri_options[:write]).to eq(concern)
170
381
  end
171
382
  end
172
383
 
@@ -175,7 +386,7 @@ describe Mongo::URI do
175
386
  let(:concern) { { :j => true } }
176
387
 
177
388
  it 'sets the write concern options' do
178
- expect(uri.options[:write]).to eq(concern)
389
+ expect(uri.uri_options[:write]).to eq(concern)
179
390
  end
180
391
  end
181
392
 
@@ -184,7 +395,7 @@ describe Mongo::URI do
184
395
  let(:concern) { { :fsync => true } }
185
396
 
186
397
  it 'sets the write concern options' do
187
- expect(uri.options[:write]).to eq(concern)
398
+ expect(uri.uri_options[:write]).to eq(concern)
188
399
  end
189
400
  end
190
401
 
@@ -194,7 +405,7 @@ describe Mongo::URI do
194
405
  let(:concern) { { :w => 2, :timeout => timeout } }
195
406
 
196
407
  it 'sets the write concern options' do
197
- expect(uri.options[:write]).to eq(concern)
408
+ expect(uri.uri_options[:write]).to eq(concern)
198
409
  end
199
410
  end
200
411
  end
@@ -207,7 +418,7 @@ describe Mongo::URI do
207
418
  let(:read) { { :mode => :primary } }
208
419
 
209
420
  it 'sets the read preference' do
210
- expect(uri.options[:read]).to eq(read)
421
+ expect(uri.uri_options[:read]).to eq(read)
211
422
  end
212
423
  end
213
424
 
@@ -216,7 +427,7 @@ describe Mongo::URI do
216
427
  let(:read) { { :mode => :primary_preferred } }
217
428
 
218
429
  it 'sets the read preference' do
219
- expect(uri.options[:read]).to eq(read)
430
+ expect(uri.uri_options[:read]).to eq(read)
220
431
  end
221
432
  end
222
433
 
@@ -225,7 +436,7 @@ describe Mongo::URI do
225
436
  let(:read) { { :mode => :secondary } }
226
437
 
227
438
  it 'sets the read preference' do
228
- expect(uri.options[:read]).to eq(read)
439
+ expect(uri.uri_options[:read]).to eq(read)
229
440
  end
230
441
  end
231
442
 
@@ -234,7 +445,7 @@ describe Mongo::URI do
234
445
  let(:read) { { :mode => :secondary_preferred } }
235
446
 
236
447
  it 'sets the read preference' do
237
- expect(uri.options[:read]).to eq(read)
448
+ expect(uri.uri_options[:read]).to eq(read)
238
449
  end
239
450
  end
240
451
 
@@ -243,7 +454,7 @@ describe Mongo::URI do
243
454
  let(:read) { { :mode => :nearest } }
244
455
 
245
456
  it 'sets the read preference' do
246
- expect(uri.options[:read]).to eq(read)
457
+ expect(uri.uri_options[:read]).to eq(read)
247
458
  end
248
459
  end
249
460
  end
@@ -260,7 +471,7 @@ describe Mongo::URI do
260
471
  end
261
472
 
262
473
  it 'sets the read preference tag set' do
263
- expect(uri.options[:read]).to eq(read)
474
+ expect(uri.uri_options[:read]).to eq(read)
264
475
  end
265
476
  end
266
477
 
@@ -274,7 +485,7 @@ describe Mongo::URI do
274
485
  end
275
486
 
276
487
  it 'sets the read preference tag sets' do
277
- expect(uri.options[:read]).to eq(read)
488
+ expect(uri.uri_options[:read]).to eq(read)
278
489
  end
279
490
  end
280
491
  end
@@ -284,7 +495,7 @@ describe Mongo::URI do
284
495
  let(:options) { "replicaSet=#{rs_name}" }
285
496
 
286
497
  it 'sets the replica set option' do
287
- expect(uri.options[:replica_set]).to eq(rs_name)
498
+ expect(uri.uri_options[:replica_set]).to eq(rs_name)
288
499
  end
289
500
  end
290
501
 
@@ -293,28 +504,29 @@ describe Mongo::URI do
293
504
 
294
505
  context 'plain' do
295
506
  let(:mechanism) { 'PLAIN' }
296
- let(:auth) { { :mechanism => :plain } }
507
+ let(:expected) { :plain }
297
508
 
298
509
  it 'sets the auth mechanism to :plain' do
299
- expect(uri.options[:auth]).to eq(auth)
510
+ expect(uri.uri_options[:auth_mech]).to eq(expected)
300
511
  end
301
512
  end
302
513
 
303
514
  context 'mongodb-cr' do
304
515
  let(:mechanism) { 'MONGODB-CR' }
305
- let(:auth) { { :mechanism => :mongodb_cr } }
516
+ let(:expected) { :mongodb_cr }
306
517
 
307
518
  it 'sets the auth mechanism to :mongodb_cr' do
308
- expect(uri.options[:auth]).to eq(auth)
519
+ expect(uri.uri_options[:auth_mech]).to eq(expected)
309
520
  end
310
521
  end
311
522
 
312
523
  context 'gssapi' do
313
524
  let(:mechanism) { 'GSSAPI' }
314
- let(:auth) { { :mechanism => :gssapi } }
525
+ let(:expected) { :gssapi }
526
+
315
527
 
316
528
  it 'sets the auth mechanism to :gssapi' do
317
- expect(uri.options[:auth]).to eq(auth)
529
+ expect(uri.uri_options[:auth_mech]).to eq(expected)
318
530
  end
319
531
  end
320
532
  end
@@ -327,7 +539,7 @@ describe Mongo::URI do
327
539
  let(:auth) { { :source => 'foo' } }
328
540
 
329
541
  it 'sets the auth source to the database' do
330
- expect(uri.options[:auth]).to eq(auth)
542
+ expect(uri.uri_options[:auth]).to eq(auth)
331
543
  end
332
544
  end
333
545
 
@@ -336,7 +548,7 @@ describe Mongo::URI do
336
548
  let(:auth) { { :source => :external } }
337
549
 
338
550
  it 'sets the auth source to :external' do
339
- expect(uri.options[:auth]).to eq(auth)
551
+ expect(uri.uri_options[:auth]).to eq(auth)
340
552
  end
341
553
  end
342
554
  end
@@ -354,7 +566,7 @@ describe Mongo::URI do
354
566
  end
355
567
 
356
568
  it 'sets the auth mechanism properties' do
357
- expect(uri.options[:auth]).to eq(auth)
569
+ expect(uri.uri_options[:auth]).to eq(auth)
358
570
  end
359
571
  end
360
572
 
@@ -369,7 +581,7 @@ describe Mongo::URI do
369
581
  end
370
582
 
371
583
  it 'sets the auth mechanism properties' do
372
- expect(uri.options[:auth]).to eq(auth)
584
+ expect(uri.uri_options[:auth]).to eq(auth)
373
585
  end
374
586
  end
375
587
 
@@ -384,7 +596,7 @@ describe Mongo::URI do
384
596
  end
385
597
 
386
598
  it 'sets the auth mechanism properties' do
387
- expect(uri.options[:auth]).to eq(auth)
599
+ expect(uri.uri_options[:auth]).to eq(auth)
388
600
  end
389
601
  end
390
602
 
@@ -406,7 +618,7 @@ describe Mongo::URI do
406
618
  end
407
619
 
408
620
  it 'sets the auth mechanism properties' do
409
- expect(uri.options[:auth]).to eq(auth)
621
+ expect(uri.uri_options[:auth]).to eq(auth)
410
622
  end
411
623
  end
412
624
  end
@@ -415,7 +627,7 @@ describe Mongo::URI do
415
627
  let(:options) { "connectTimeoutMS=4567" }
416
628
 
417
629
  it 'sets the the connect timeout' do
418
- expect(uri.options[:connect_timeout]).to eq(4.567)
630
+ expect(uri.uri_options[:connect_timeout]).to eq(4.567)
419
631
  end
420
632
  end
421
633
 
@@ -423,7 +635,7 @@ describe Mongo::URI do
423
635
  let(:options) { "socketTimeoutMS=8910" }
424
636
 
425
637
  it 'sets the socket timeout' do
426
- expect(uri.options[:socket_timeout]).to eq(8.910)
638
+ expect(uri.uri_options[:socket_timeout]).to eq(8.910)
427
639
  end
428
640
  end
429
641
 
@@ -432,7 +644,7 @@ describe Mongo::URI do
432
644
  let(:options) { "serverSelectionTimeoutMS=3561" }
433
645
 
434
646
  it 'sets the the connect timeout' do
435
- expect(uri.options[:server_selection_timeout]).to eq(3.561)
647
+ expect(uri.uri_options[:server_selection_timeout]).to eq(3.561)
436
648
  end
437
649
  end
438
650
 
@@ -441,7 +653,7 @@ describe Mongo::URI do
441
653
  let(:options) { "localThresholdMS=3561" }
442
654
 
443
655
  it 'sets the the connect timeout' do
444
- expect(uri.options[:local_threshold]).to eq(3.561)
656
+ expect(uri.uri_options[:local_threshold]).to eq(3.561)
445
657
  end
446
658
  end
447
659
 
@@ -451,7 +663,7 @@ describe Mongo::URI do
451
663
  let(:options) { "maxPoolSize=#{max_pool_size}" }
452
664
 
453
665
  it 'sets the max pool size option' do
454
- expect(uri.options[:max_pool_size]).to eq(max_pool_size)
666
+ expect(uri.uri_options[:max_pool_size]).to eq(max_pool_size)
455
667
  end
456
668
  end
457
669
 
@@ -461,7 +673,7 @@ describe Mongo::URI do
461
673
  let(:options) { "minPoolSize=#{min_pool_size}" }
462
674
 
463
675
  it 'sets the min pool size option' do
464
- expect(uri.options[:min_pool_size]).to eq(min_pool_size)
676
+ expect(uri.uri_options[:min_pool_size]).to eq(min_pool_size)
465
677
  end
466
678
  end
467
679
 
@@ -471,7 +683,7 @@ describe Mongo::URI do
471
683
  let(:options) { "waitQueueTimeoutMS=#{wait_queue_timeout}" }
472
684
 
473
685
  it 'sets the wait queue timeout option' do
474
- expect(uri.options[:wait_queue_timeout]).to eq(0.5)
686
+ expect(uri.uri_options[:wait_queue_timeout]).to eq(0.5)
475
687
  end
476
688
  end
477
689
 
@@ -482,7 +694,7 @@ describe Mongo::URI do
482
694
  let(:ssl) { true }
483
695
 
484
696
  it 'sets the ssl option to true' do
485
- expect(uri.options[:ssl]).to be true
697
+ expect(uri.uri_options[:ssl]).to be true
486
698
  end
487
699
  end
488
700
 
@@ -490,7 +702,7 @@ describe Mongo::URI do
490
702
  let(:ssl) { false }
491
703
 
492
704
  it 'sets the ssl option to false' do
493
- expect(uri.options[:ssl]).to be false
705
+ expect(uri.uri_options[:ssl]).to be false
494
706
  end
495
707
  end
496
708
  end
@@ -499,7 +711,7 @@ describe Mongo::URI do
499
711
  let(:options) { 'w=1&ssl=true' }
500
712
 
501
713
  it 'do not overshadow top level options' do
502
- expect(uri.options).not_to be_empty
714
+ expect(uri.uri_options).not_to be_empty
503
715
  end
504
716
  end
505
717
 
@@ -508,7 +720,7 @@ describe Mongo::URI do
508
720
  let(:options) { 'invalidOption=10' }
509
721
 
510
722
  let(:uri_options) do
511
- uri.options
723
+ uri.uri_options
512
724
  end
513
725
 
514
726
  it 'does not raise an exception' do