mongo 1.12.5 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CONTRIBUTING.md +64 -0
- data/LICENSE +1 -1
- data/README.md +21 -126
- data/Rakefile +39 -21
- data/bin/mongo_console +6 -38
- data/lib/mongo/address/ipv4.rb +85 -0
- data/lib/mongo/address/ipv6.rb +85 -0
- data/lib/mongo/address/unix.rb +76 -0
- data/lib/mongo/address.rb +111 -0
- data/lib/mongo/auth/cr/conversation.rb +119 -0
- data/lib/mongo/auth/cr.rb +44 -0
- data/lib/mongo/auth/executable.rb +52 -0
- data/lib/mongo/auth/ldap/conversation.rb +92 -0
- data/lib/mongo/auth/ldap.rb +48 -0
- data/lib/mongo/auth/roles.rb +104 -0
- data/lib/mongo/auth/scram/conversation.rb +450 -0
- data/lib/mongo/auth/scram.rb +53 -0
- data/lib/mongo/auth/user/view.rb +102 -0
- data/lib/mongo/auth/user.rb +159 -0
- data/lib/mongo/auth/x509/conversation.rb +92 -0
- data/lib/mongo/auth/x509.rb +48 -0
- data/lib/mongo/auth.rb +108 -0
- data/lib/mongo/bulk_write/bulk_writable.rb +191 -0
- data/lib/mongo/bulk_write/deletable.rb +60 -0
- data/lib/mongo/bulk_write/insertable.rb +52 -0
- data/lib/mongo/bulk_write/ordered_bulk_write.rb +48 -0
- data/lib/mongo/bulk_write/replacable.rb +57 -0
- data/lib/mongo/bulk_write/unordered_bulk_write.rb +46 -0
- data/lib/mongo/bulk_write/updatable.rb +68 -0
- data/lib/mongo/bulk_write.rb +52 -0
- data/lib/mongo/client.rb +246 -0
- data/lib/mongo/cluster/topology/replica_set.rb +160 -0
- data/lib/mongo/cluster/topology/sharded.rb +132 -0
- data/lib/mongo/cluster/topology/standalone.rb +132 -0
- data/lib/mongo/cluster/topology/unknown.rb +155 -0
- data/lib/mongo/cluster/topology.rb +60 -0
- data/lib/mongo/cluster.rb +203 -0
- data/lib/mongo/collection/view/aggregation.rb +108 -0
- data/lib/mongo/collection/view/explainable.rb +49 -0
- data/lib/mongo/collection/view/immutable.rb +43 -0
- data/lib/mongo/collection/view/iterable.rb +48 -0
- data/lib/mongo/collection/view/map_reduce.rb +191 -0
- data/lib/mongo/collection/view/readable.rb +363 -0
- data/lib/mongo/collection/view/writable.rb +185 -0
- data/lib/mongo/collection/view.rb +169 -0
- data/lib/mongo/collection.rb +130 -1101
- data/lib/mongo/cursor.rb +78 -681
- data/lib/mongo/database/view.rb +101 -0
- data/lib/mongo/database.rb +224 -0
- data/lib/mongo/error/bulk_write_error.rb +41 -0
- data/lib/mongo/error/invalid_bulk_operation.rb +36 -0
- data/lib/mongo/error/invalid_bulk_operation_type.rb +36 -0
- data/lib/mongo/error/invalid_collection_name.rb +39 -0
- data/lib/mongo/error/invalid_database_name.rb +39 -0
- data/{test/replica_set/ssl_test.rb → lib/mongo/error/invalid_document.rb} +21 -14
- data/lib/mongo/error/invalid_file.rb +38 -0
- data/lib/mongo/error/invalid_nonce.rb +46 -0
- data/lib/mongo/error/invalid_replacement_document.rb +39 -0
- data/lib/mongo/error/invalid_signature.rb +47 -0
- data/{test/functional/ssl_test.rb → lib/mongo/error/invalid_update_document.rb} +22 -12
- data/lib/mongo/error/max_bson_size.rb +40 -0
- data/lib/mongo/error/max_message_size.rb +42 -0
- data/{test/functional/db_connection_test.rb → lib/mongo/error/multi_index_drop.rb} +17 -8
- data/lib/mongo/{utils.rb → error/need_primary_server.rb} +10 -6
- data/lib/mongo/{connection.rb → error/operation_failure.rb} +10 -6
- data/lib/mongo/error/parser.rb +77 -0
- data/lib/mongo/{connection/socket.rb → error/socket_error.rb} +10 -5
- data/lib/mongo/error/socket_timeout_error.rb +23 -0
- data/lib/mongo/error/unsupported_features.rb +43 -0
- data/lib/mongo/error.rb +82 -0
- data/lib/mongo/event/listeners.rb +63 -0
- data/lib/mongo/event/primary_elected.rb +53 -0
- data/lib/mongo/event/publisher.rb +42 -0
- data/lib/mongo/event/server_added.rb +53 -0
- data/lib/mongo/event/server_removed.rb +53 -0
- data/lib/mongo/event/subscriber.rb +41 -0
- data/lib/mongo/event.rb +40 -0
- data/lib/mongo/grid/file/chunk.rb +184 -0
- data/lib/mongo/grid/file/metadata.rb +229 -0
- data/lib/mongo/grid/file.rb +106 -0
- data/lib/mongo/grid/fs.rb +149 -0
- data/lib/mongo/{gridfs.rb → grid.rb} +3 -5
- data/lib/mongo/index/view.rb +261 -0
- data/lib/mongo/index.rb +64 -0
- data/lib/mongo/loggable.rb +126 -0
- data/lib/mongo/logger.rb +132 -0
- data/lib/mongo/operation/aggregate/result.rb +88 -0
- data/lib/mongo/operation/aggregate.rb +100 -0
- data/lib/mongo/operation/command.rb +62 -0
- data/lib/mongo/operation/executable.rb +105 -0
- data/lib/mongo/operation/kill_cursors.rb +39 -0
- data/lib/mongo/operation/limited.rb +37 -0
- data/lib/mongo/operation/list_collections/result.rb +114 -0
- data/lib/mongo/operation/list_indexes/result.rb +118 -0
- data/lib/mongo/operation/map_reduce/result.rb +122 -0
- data/lib/mongo/operation/map_reduce.rb +96 -0
- data/lib/mongo/operation/read/collections_info.rb +67 -0
- data/lib/mongo/operation/read/get_more.rb +71 -0
- data/lib/mongo/operation/read/indexes.rb +68 -0
- data/lib/mongo/operation/read/list_collections.rb +75 -0
- data/lib/mongo/operation/read/list_indexes.rb +77 -0
- data/lib/mongo/operation/read/query.rb +71 -0
- data/lib/mongo/{functional.rb → operation/read.rb} +7 -7
- data/lib/mongo/operation/read_preferrable.rb +34 -0
- data/lib/mongo/operation/result.rb +259 -0
- data/lib/mongo/operation/specifiable.rb +397 -0
- data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +75 -0
- data/lib/mongo/operation/write/bulk/bulk_delete.rb +144 -0
- data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +68 -0
- data/lib/mongo/operation/write/bulk/bulk_insert.rb +129 -0
- data/lib/mongo/operation/write/bulk/bulk_mergable.rb +67 -0
- data/lib/mongo/operation/write/bulk/bulk_update/result.rb +162 -0
- data/lib/mongo/operation/write/bulk/bulk_update.rb +153 -0
- data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +83 -0
- data/lib/mongo/operation/write/bulk.rb +17 -0
- data/lib/mongo/operation/write/command/create_index.rb +50 -0
- data/lib/mongo/operation/write/command/create_user.rb +43 -0
- data/lib/mongo/operation/write/command/delete.rb +56 -0
- data/lib/mongo/operation/write/command/drop_index.rb +51 -0
- data/lib/mongo/operation/write/command/insert.rb +55 -0
- data/lib/mongo/operation/write/command/remove_user.rb +42 -0
- data/lib/mongo/operation/write/command/update.rb +60 -0
- data/lib/mongo/operation/write/command/writable.rb +61 -0
- data/lib/mongo/operation/write/command.rb +22 -0
- data/lib/mongo/operation/write/create_index.rb +89 -0
- data/lib/mongo/operation/write/create_user.rb +75 -0
- data/lib/mongo/operation/write/delete/result.rb +40 -0
- data/lib/mongo/operation/write/delete.rb +93 -0
- data/lib/mongo/operation/write/drop_index.rb +62 -0
- data/lib/mongo/{utils/thread_local_variable_manager.rb → operation/write/insert/result.rb} +15 -8
- data/lib/mongo/operation/write/insert.rb +90 -0
- data/lib/mongo/operation/write/remove_user.rb +70 -0
- data/lib/mongo/operation/write/update/result.rb +160 -0
- data/lib/mongo/operation/write/update.rb +103 -0
- data/lib/mongo/{connection/socket/socket_util.rb → operation/write.rb} +10 -24
- data/lib/mongo/operation.rb +25 -0
- data/lib/mongo/options/mapper.rb +78 -0
- data/lib/mongo/options.rb +15 -0
- data/lib/mongo/protocol/bit_vector.rb +61 -0
- data/lib/mongo/protocol/delete.rb +94 -0
- data/lib/mongo/protocol/get_more.rb +99 -0
- data/lib/mongo/protocol/insert.rb +99 -0
- data/lib/mongo/protocol/kill_cursors.rb +74 -0
- data/lib/mongo/protocol/message.rb +252 -0
- data/lib/mongo/protocol/query.rb +147 -0
- data/lib/mongo/protocol/reply.rb +72 -0
- data/lib/mongo/protocol/serializers.rb +180 -0
- data/lib/mongo/protocol/update.rb +111 -0
- data/lib/mongo/protocol.rb +15 -0
- data/lib/mongo/server/connectable.rb +110 -0
- data/lib/mongo/server/connection.rb +134 -0
- data/lib/mongo/server/connection_pool/queue.rb +182 -0
- data/lib/mongo/server/connection_pool.rb +141 -0
- data/lib/mongo/server/context.rb +66 -0
- data/lib/mongo/server/description/features.rb +85 -0
- data/lib/mongo/server/description/inspector/primary_elected.rb +58 -0
- data/lib/mongo/server/description/inspector/server_added.rb +59 -0
- data/lib/mongo/server/description/inspector/server_removed.rb +59 -0
- data/lib/mongo/server/description/inspector.rb +79 -0
- data/lib/mongo/server/description.rb +450 -0
- data/lib/mongo/server/monitor/connection.rb +89 -0
- data/lib/mongo/server/monitor.rb +176 -0
- data/lib/mongo/server.rb +163 -0
- data/lib/mongo/server_selector/nearest.rb +94 -0
- data/lib/mongo/server_selector/primary.rb +88 -0
- data/lib/mongo/server_selector/primary_preferred.rb +94 -0
- data/lib/mongo/server_selector/secondary.rb +91 -0
- data/lib/mongo/server_selector/secondary_preferred.rb +96 -0
- data/lib/mongo/server_selector/selectable.rb +209 -0
- data/lib/mongo/server_selector.rb +81 -0
- data/lib/mongo/socket/ssl.rb +130 -0
- data/lib/mongo/socket/tcp.rb +69 -0
- data/lib/mongo/socket/unix.rb +64 -0
- data/lib/mongo/socket.rb +179 -0
- data/lib/mongo/uri.rb +504 -0
- data/lib/mongo/version.rb +21 -0
- data/lib/mongo/write_concern/acknowledged.rb +52 -0
- data/lib/mongo/write_concern/normalizable.rb +51 -0
- data/lib/mongo/write_concern/unacknowledged.rb +55 -0
- data/lib/mongo/write_concern.rb +99 -0
- data/lib/mongo.rb +24 -82
- data/mongo.gemspec +17 -14
- data/spec/certificates/ca.pem +17 -0
- data/spec/certificates/client.pem +101 -0
- data/spec/certificates/crl.pem +10 -0
- data/spec/certificates/crl_client_revoked.pem +12 -0
- data/spec/certificates/password_protected.pem +51 -0
- data/spec/certificates/server.pem +34 -0
- data/spec/mongo/address/ipv4_spec.rb +74 -0
- data/spec/mongo/address/ipv6_spec.rb +74 -0
- data/spec/mongo/address/unix_spec.rb +30 -0
- data/spec/mongo/address_spec.rb +206 -0
- data/spec/mongo/auth/cr_spec.rb +59 -0
- data/spec/mongo/auth/ldap_spec.rb +40 -0
- data/spec/mongo/auth/scram/conversation_spec.rb +197 -0
- data/spec/mongo/auth/scram_spec.rb +55 -0
- data/spec/mongo/auth/user/view_spec.rb +76 -0
- data/spec/mongo/auth/user_spec.rb +190 -0
- data/spec/mongo/auth/x509_spec.rb +40 -0
- data/spec/mongo/auth_spec.rb +65 -0
- data/spec/mongo/bulk/bulk_write_spec.rb +262 -0
- data/spec/mongo/client_spec.rb +564 -0
- data/spec/mongo/cluster/topology/replica_set_spec.rb +101 -0
- data/spec/mongo/cluster/topology/sharded_spec.rb +74 -0
- data/spec/mongo/cluster/topology/standalone_spec.rb +79 -0
- data/spec/mongo/cluster/topology_spec.rb +65 -0
- data/spec/mongo/cluster_spec.rb +129 -0
- data/spec/mongo/collection/view/aggregation_spec.rb +148 -0
- data/spec/mongo/collection/view/explainable_spec.rb +32 -0
- data/spec/mongo/collection/view/map_reduce_spec.rb +242 -0
- data/spec/mongo/collection/view/readable_spec.rb +603 -0
- data/spec/mongo/collection/view/writable_spec.rb +679 -0
- data/spec/mongo/collection/view_spec.rb +530 -0
- data/spec/mongo/collection_spec.rb +362 -0
- data/spec/mongo/crud_spec.rb +42 -0
- data/spec/mongo/cursor_spec.rb +295 -0
- data/spec/mongo/database_spec.rb +302 -0
- data/spec/mongo/error/parser_spec.rb +119 -0
- data/spec/mongo/event/publisher_spec.rb +50 -0
- data/spec/mongo/event/subscriber_spec.rb +34 -0
- data/spec/mongo/grid/file/chunk_spec.rb +226 -0
- data/spec/mongo/grid/file/metadata_spec.rb +92 -0
- data/spec/mongo/grid/file_spec.rb +172 -0
- data/spec/mongo/grid/fs_spec.rb +129 -0
- data/spec/mongo/index/view_spec.rb +330 -0
- data/spec/mongo/loggable_spec.rb +62 -0
- data/spec/mongo/logger_spec.rb +97 -0
- data/spec/mongo/operation/aggregate/result_spec.rb +80 -0
- data/spec/mongo/operation/aggregate_spec.rb +127 -0
- data/spec/mongo/operation/command_spec.rb +98 -0
- data/spec/mongo/operation/kill_cursors_spec.rb +66 -0
- data/spec/mongo/operation/limited_spec.rb +50 -0
- data/spec/mongo/operation/map_reduce_spec.rb +143 -0
- data/spec/mongo/operation/read/collections_info_spec.rb +40 -0
- data/spec/mongo/operation/read/get_more_spec.rb +81 -0
- data/spec/mongo/operation/read/indexes_spec.rb +31 -0
- data/spec/mongo/operation/read/query_spec.rb +84 -0
- data/spec/mongo/operation/result_spec.rb +275 -0
- data/spec/mongo/operation/specifiable_spec.rb +53 -0
- data/spec/mongo/operation/write/bulk_delete_spec.rb +235 -0
- data/spec/mongo/operation/write/bulk_insert_spec.rb +235 -0
- data/spec/mongo/operation/write/bulk_update_spec.rb +236 -0
- data/spec/mongo/operation/write/command/delete_spec.rb +103 -0
- data/spec/mongo/operation/write/command/insert_spec.rb +103 -0
- data/spec/mongo/operation/write/command/update_spec.rb +109 -0
- data/spec/mongo/operation/write/create_index_spec.rb +63 -0
- data/spec/mongo/operation/write/create_user_spec.rb +44 -0
- data/spec/mongo/operation/write/delete_spec.rb +186 -0
- data/spec/mongo/operation/write/drop_index_spec.rb +51 -0
- data/spec/mongo/operation/write/insert_spec.rb +244 -0
- data/spec/mongo/operation/write/remove_user_spec.rb +46 -0
- data/spec/mongo/operation/write/response_spec.rb +85 -0
- data/spec/mongo/operation/write/update_spec.rb +228 -0
- data/spec/mongo/protocol/delete_spec.rb +167 -0
- data/spec/mongo/protocol/get_more_spec.rb +146 -0
- data/spec/mongo/protocol/insert_spec.rb +161 -0
- data/spec/mongo/protocol/kill_cursors_spec.rb +101 -0
- data/spec/mongo/protocol/query_spec.rb +285 -0
- data/spec/mongo/protocol/reply_spec.rb +157 -0
- data/spec/mongo/protocol/update_spec.rb +186 -0
- data/spec/mongo/server/connection_pool/queue_spec.rb +170 -0
- data/spec/mongo/server/connection_pool_spec.rb +120 -0
- data/spec/mongo/server/connection_spec.rb +312 -0
- data/spec/mongo/server/description/features_spec.rb +138 -0
- data/spec/mongo/server/description/inspector/primary_elected_spec.rb +94 -0
- data/spec/mongo/server/description/inspector/server_added_spec.rb +92 -0
- data/spec/mongo/server/description/inspector/server_removed_spec.rb +95 -0
- data/spec/mongo/server/description_spec.rb +510 -0
- data/spec/mongo/server/monitor_spec.rb +144 -0
- data/spec/mongo/server_discovery_and_monitoring_spec.rb +103 -0
- data/spec/mongo/server_selection_rtt_spec.rb +104 -0
- data/spec/mongo/server_selection_spec.rb +89 -0
- data/spec/mongo/server_selector/nearest_spec.rb +250 -0
- data/spec/mongo/server_selector/primary_preferred_spec.rb +290 -0
- data/spec/mongo/server_selector/primary_spec.rb +114 -0
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +252 -0
- data/spec/mongo/server_selector/secondary_spec.rb +196 -0
- data/spec/mongo/server_selector_spec.rb +101 -0
- data/spec/mongo/server_spec.rb +131 -0
- data/spec/mongo/uri_spec.rb +517 -0
- data/spec/mongo/write_concern/acknowledged_spec.rb +44 -0
- data/spec/mongo/write_concern/unacknowledged_spec.rb +15 -0
- data/spec/spec_helper.rb +133 -0
- data/spec/support/authorization.rb +247 -0
- data/spec/support/crud/read.rb +144 -0
- data/spec/support/crud/write.rb +214 -0
- data/spec/support/crud.rb +203 -0
- data/spec/support/crud_tests/read/aggregate.yml +43 -0
- data/spec/support/crud_tests/read/count.yml +37 -0
- data/spec/support/crud_tests/read/distinct.yml +33 -0
- data/spec/support/crud_tests/read/find.yml +50 -0
- data/spec/support/crud_tests/write/deleteMany.yml +36 -0
- data/spec/support/crud_tests/write/deleteOne.yml +49 -0
- data/spec/support/crud_tests/write/findOneAndDelete.yml +54 -0
- data/spec/support/crud_tests/write/findOneAndReplace.yml +153 -0
- data/spec/support/crud_tests/write/findOneAndUpdate.yml +161 -0
- data/spec/support/crud_tests/write/insertMany.yml +24 -0
- data/spec/support/crud_tests/write/insertOne.yml +19 -0
- data/spec/support/crud_tests/write/replaceOne.yml +96 -0
- data/spec/support/crud_tests/write/updateMany.yml +83 -0
- data/spec/support/crud_tests/write/updateOne.yml +80 -0
- data/spec/support/helpers.rb +140 -0
- data/spec/support/matchers.rb +37 -0
- data/spec/support/sdam/rs/discover_arbiters.yml +41 -0
- data/spec/support/sdam/rs/discover_passives.yml +41 -0
- data/spec/support/sdam/rs/discover_primary.yml +40 -0
- data/spec/support/sdam/rs/discover_secondary.yml +41 -0
- data/spec/support/sdam/rs/discovery.yml +195 -0
- data/spec/support/sdam/rs/ghost_discovered.yml +39 -0
- data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +34 -0
- data/spec/support/sdam/rs/member_reconfig.yml +68 -0
- data/spec/support/sdam/rs/member_standalone.yml +60 -0
- data/spec/support/sdam/rs/new_primary.yml +74 -0
- data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +71 -0
- data/spec/support/sdam/rs/non_rs_member.yml +31 -0
- data/spec/support/sdam/rs/normalize_case.yml +49 -0
- data/spec/support/sdam/rs/primary_becomes_standalone.yml +52 -0
- data/spec/support/sdam/rs/primary_changes_set_name.yml +57 -0
- data/spec/support/sdam/rs/primary_disconnect.yml +56 -0
- data/spec/support/sdam/rs/primary_wrong_set_name.yml +27 -0
- data/spec/support/sdam/rs/response_from_removed.yml +63 -0
- data/spec/support/sdam/rs/rsother_discovered.yml +41 -0
- data/spec/support/sdam/rs/sec_not_auth.yml +49 -0
- data/spec/support/sdam/rs/secondary_wrong_set_name.yml +28 -0
- data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +69 -0
- data/spec/support/sdam/rs/unexpected_mongos.yml +26 -0
- data/spec/support/sdam/rs/wrong_set_name.yml +35 -0
- data/spec/support/sdam/sharded/multiple_mongoses.yml +46 -0
- data/spec/support/sdam/sharded/non_mongos_removed.yml +41 -0
- data/spec/support/sdam/sharded/normalize_uri_case.yml +32 -0
- data/spec/support/sdam/single/direct_connection_external_ip.yml +34 -0
- data/spec/support/sdam/single/direct_connection_mongos.yml +33 -0
- data/spec/support/sdam/single/direct_connection_rsarbiter.yml +35 -0
- data/spec/support/sdam/single/direct_connection_rsprimary.yml +34 -0
- data/spec/support/sdam/single/direct_connection_rssecondary.yml +35 -0
- data/spec/support/sdam/single/direct_connection_slave.yml +32 -0
- data/spec/support/sdam/single/direct_connection_standalone.yml +32 -0
- data/spec/support/sdam/single/not_ok_response.yml +39 -0
- data/spec/support/sdam/single/standalone_removed.yml +32 -0
- data/spec/support/sdam/single/unavailable_seed.yml +28 -0
- data/spec/support/server_discovery_and_monitoring.rb +167 -0
- data/spec/support/server_selection/rtt/first_value.yml +4 -0
- data/spec/support/server_selection/rtt/first_value_zero.yml +4 -0
- data/spec/support/server_selection/rtt/value_test_1.yml +4 -0
- data/spec/support/server_selection/rtt/value_test_2.yml +4 -0
- data/spec/support/server_selection/rtt/value_test_3.yml +4 -0
- data/spec/support/server_selection/rtt/value_test_4.yml +4 -0
- data/spec/support/server_selection/rtt/value_test_5.yml +4 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest.yml +26 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +21 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Primary.yml +21 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +26 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +21 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary.yml +26 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +26 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +21 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +21 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest.yml +33 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +26 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Primary.yml +29 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +29 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +29 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary.yml +31 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred.yml +31 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.yml +29 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary_non_matching.yml +26 -0
- data/spec/support/server_selection/selection/Sharded/read/SecondaryPreferred.yml +26 -0
- data/spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml +19 -0
- data/spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml +11 -0
- data/spec/support/server_selection.rb +157 -0
- data/spec/support/server_selection_rtt.rb +41 -0
- data/spec/support/shared/bulk_write.rb +535 -0
- data/spec/support/shared/cursor.rb +38 -0
- data/spec/support/shared/operation.rb +77 -0
- data/spec/support/shared/protocol.rb +31 -0
- data/spec/support/shared/server_selector.rb +111 -0
- data/spec/support/shared/socket.rb +82 -0
- data/spec/support/travis.rb +14 -0
- data.tar.gz.sig +2 -3
- metadata +583 -186
- metadata.gz.sig +0 -0
- data/VERSION +0 -1
- data/lib/mongo/bulk_write_collection_view.rb +0 -387
- data/lib/mongo/collection_writer.rb +0 -364
- data/lib/mongo/connection/node.rb +0 -249
- data/lib/mongo/connection/pool.rb +0 -340
- data/lib/mongo/connection/pool_manager.rb +0 -320
- data/lib/mongo/connection/sharding_pool_manager.rb +0 -67
- data/lib/mongo/connection/socket/ssl_socket.rb +0 -95
- data/lib/mongo/connection/socket/tcp_socket.rb +0 -87
- data/lib/mongo/connection/socket/unix_socket.rb +0 -39
- data/lib/mongo/db.rb +0 -808
- data/lib/mongo/exception.rb +0 -145
- data/lib/mongo/functional/authentication.rb +0 -455
- data/lib/mongo/functional/logging.rb +0 -85
- data/lib/mongo/functional/read_preference.rb +0 -183
- data/lib/mongo/functional/scram.rb +0 -556
- data/lib/mongo/functional/uri_parser.rb +0 -409
- data/lib/mongo/functional/write_concern.rb +0 -66
- data/lib/mongo/gridfs/grid.rb +0 -112
- data/lib/mongo/gridfs/grid_ext.rb +0 -53
- data/lib/mongo/gridfs/grid_file_system.rb +0 -163
- data/lib/mongo/gridfs/grid_io.rb +0 -484
- data/lib/mongo/legacy.rb +0 -140
- data/lib/mongo/mongo_client.rb +0 -697
- data/lib/mongo/mongo_replica_set_client.rb +0 -535
- data/lib/mongo/mongo_sharded_client.rb +0 -159
- data/lib/mongo/networking.rb +0 -372
- data/lib/mongo/utils/conversions.rb +0 -110
- data/lib/mongo/utils/core_ext.rb +0 -70
- data/lib/mongo/utils/server_version.rb +0 -69
- data/lib/mongo/utils/support.rb +0 -80
- data/test/functional/authentication_test.rb +0 -39
- data/test/functional/bulk_api_stress_test.rb +0 -133
- data/test/functional/bulk_write_collection_view_test.rb +0 -1198
- data/test/functional/client_test.rb +0 -627
- data/test/functional/collection_test.rb +0 -2175
- data/test/functional/collection_writer_test.rb +0 -83
- data/test/functional/conversions_test.rb +0 -163
- data/test/functional/cursor_fail_test.rb +0 -57
- data/test/functional/cursor_message_test.rb +0 -56
- data/test/functional/cursor_test.rb +0 -683
- data/test/functional/db_api_test.rb +0 -835
- data/test/functional/db_test.rb +0 -348
- data/test/functional/grid_file_system_test.rb +0 -285
- data/test/functional/grid_io_test.rb +0 -252
- data/test/functional/grid_test.rb +0 -273
- data/test/functional/pool_test.rb +0 -136
- data/test/functional/safe_test.rb +0 -98
- data/test/functional/support_test.rb +0 -62
- data/test/functional/timeout_test.rb +0 -60
- data/test/functional/uri_test.rb +0 -446
- data/test/functional/write_concern_test.rb +0 -118
- data/test/helpers/general.rb +0 -50
- data/test/helpers/test_unit.rb +0 -476
- data/test/replica_set/authentication_test.rb +0 -37
- data/test/replica_set/basic_test.rb +0 -189
- data/test/replica_set/client_test.rb +0 -393
- data/test/replica_set/connection_test.rb +0 -138
- data/test/replica_set/count_test.rb +0 -66
- data/test/replica_set/cursor_test.rb +0 -220
- data/test/replica_set/insert_test.rb +0 -157
- data/test/replica_set/max_values_test.rb +0 -151
- data/test/replica_set/pinning_test.rb +0 -105
- data/test/replica_set/query_test.rb +0 -73
- data/test/replica_set/read_preference_test.rb +0 -219
- data/test/replica_set/refresh_test.rb +0 -211
- data/test/replica_set/replication_ack_test.rb +0 -95
- data/test/sharded_cluster/basic_test.rb +0 -203
- data/test/shared/authentication/basic_auth_shared.rb +0 -260
- data/test/shared/authentication/bulk_api_auth_shared.rb +0 -249
- data/test/shared/authentication/gssapi_shared.rb +0 -176
- data/test/shared/authentication/sasl_plain_shared.rb +0 -96
- data/test/shared/authentication/scram_shared.rb +0 -92
- data/test/shared/ssl_shared.rb +0 -235
- data/test/test_helper.rb +0 -61
- data/test/threading/basic_test.rb +0 -120
- data/test/tools/mongo_config.rb +0 -708
- data/test/tools/mongo_config_test.rb +0 -160
- data/test/unit/client_test.rb +0 -381
- data/test/unit/collection_test.rb +0 -166
- data/test/unit/connection_test.rb +0 -335
- data/test/unit/cursor_test.rb +0 -307
- data/test/unit/db_test.rb +0 -136
- data/test/unit/grid_test.rb +0 -76
- data/test/unit/mongo_sharded_client_test.rb +0 -48
- data/test/unit/node_test.rb +0 -93
- data/test/unit/pool_manager_test.rb +0 -111
- data/test/unit/read_pref_test.rb +0 -406
- data/test/unit/read_test.rb +0 -159
- data/test/unit/safe_test.rb +0 -158
- data/test/unit/sharding_pool_manager_test.rb +0 -84
- data/test/unit/write_concern_test.rb +0 -175
@@ -1,118 +0,0 @@
|
|
1
|
-
# Copyright (C) 2009-2013 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
|
-
require 'test_helper'
|
16
|
-
include Mongo
|
17
|
-
|
18
|
-
class WriteConcernTest < Test::Unit::TestCase
|
19
|
-
context "Write concern propogation: " do
|
20
|
-
setup do
|
21
|
-
@con = standard_connection
|
22
|
-
@db = @con[TEST_DB]
|
23
|
-
@col = @db['test-safe']
|
24
|
-
@col.create_index([[:a, 1]], :unique => true)
|
25
|
-
@col.remove
|
26
|
-
end
|
27
|
-
|
28
|
-
#TODO: add write concern tests for remove
|
29
|
-
|
30
|
-
should "propogate write concern options on insert" do
|
31
|
-
@col.insert({:a => 1})
|
32
|
-
|
33
|
-
assert_raise_error(OperationFailure, "duplicate key") do
|
34
|
-
@col.insert({:a => 1})
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
should "allow write concern override on insert" do
|
39
|
-
@col.insert({:a => 1})
|
40
|
-
@col.insert({:a => 1}, :w => 0)
|
41
|
-
end
|
42
|
-
|
43
|
-
should "propogate write concern option on update" do
|
44
|
-
@col.insert({:a => 1})
|
45
|
-
@col.insert({:a => 2})
|
46
|
-
|
47
|
-
assert_raise_error(OperationFailure, "duplicate key") do
|
48
|
-
@col.update({:a => 2}, {:a => 1})
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
should "allow write concern override on update" do
|
53
|
-
@col.insert({:a => 1})
|
54
|
-
@col.insert({:a => 2})
|
55
|
-
@col.update({:a => 2}, {:a => 1}, :w => 0)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
context "Write concern error objects" do
|
60
|
-
setup do
|
61
|
-
@con = standard_connection
|
62
|
-
@db = @con[TEST_DB]
|
63
|
-
@col = @db['test']
|
64
|
-
@col.remove
|
65
|
-
@col.insert({:a => 1})
|
66
|
-
@col.insert({:a => 1})
|
67
|
-
@col.insert({:a => 1})
|
68
|
-
end
|
69
|
-
|
70
|
-
should "return object on update" do
|
71
|
-
response = @col.update({:a => 1}, {"$set" => {:a => 2}},
|
72
|
-
:multi => true)
|
73
|
-
|
74
|
-
assert(response['updatedExisting'] || @db.connection.wire_version_feature?(Mongo::MongoClient::BATCH_COMMANDS)) # TODO - review new write command return values
|
75
|
-
assert(response['n'] == 3 || @db.connection.wire_version_feature?(Mongo::MongoClient::BATCH_COMMANDS)) # TODO - update command top pending
|
76
|
-
end
|
77
|
-
|
78
|
-
should "return object on remove" do
|
79
|
-
response = @col.remove({})
|
80
|
-
assert_equal 3, response['n']
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
context "Write concern in gridfs" do
|
85
|
-
setup do
|
86
|
-
@db = standard_connection.db(TEST_DB)
|
87
|
-
@grid = Mongo::GridFileSystem.new(@db)
|
88
|
-
@filename = 'sample'
|
89
|
-
end
|
90
|
-
|
91
|
-
teardown do
|
92
|
-
@grid.delete(@filename)
|
93
|
-
end
|
94
|
-
|
95
|
-
should "should acknowledge writes by default using md5" do
|
96
|
-
file = @grid.open(@filename, 'w')
|
97
|
-
file.write "Hello world!"
|
98
|
-
file.close
|
99
|
-
assert_equal file.client_md5, file.server_md5
|
100
|
-
end
|
101
|
-
|
102
|
-
should "should allow for unacknowledged writes" do
|
103
|
-
file = @grid.open(@filename, 'w', {:w => 0} )
|
104
|
-
file.write "Hello world!"
|
105
|
-
file.close
|
106
|
-
assert_nil file.client_md5, file.server_md5
|
107
|
-
end
|
108
|
-
|
109
|
-
should "should support legacy write concern api" do
|
110
|
-
file = @grid.open(@filename, 'w', {:safe => false} )
|
111
|
-
file.write "Hello world!"
|
112
|
-
file.close
|
113
|
-
assert_nil file.client_md5, file.server_md5
|
114
|
-
end
|
115
|
-
|
116
|
-
end
|
117
|
-
|
118
|
-
end
|
data/test/helpers/general.rb
DELETED
@@ -1,50 +0,0 @@
|
|
1
|
-
# Copyright (C) 2009-2013 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
|
-
# Redirects output while yielding a given block of code.
|
16
|
-
#
|
17
|
-
# @return [Object] The result of the block.
|
18
|
-
def silently
|
19
|
-
warn_level = $VERBOSE
|
20
|
-
$VERBOSE = nil
|
21
|
-
begin
|
22
|
-
result = yield
|
23
|
-
ensure
|
24
|
-
$VERBOSE = warn_level
|
25
|
-
end
|
26
|
-
result
|
27
|
-
end
|
28
|
-
|
29
|
-
class Hash
|
30
|
-
def stringify_keys
|
31
|
-
dup.stringify_keys!
|
32
|
-
end
|
33
|
-
|
34
|
-
def stringify_keys!
|
35
|
-
keys.each do |key|
|
36
|
-
self[key.to_s] = delete(key)
|
37
|
-
end
|
38
|
-
self
|
39
|
-
end
|
40
|
-
|
41
|
-
def except(*keys)
|
42
|
-
dup.except!(*keys)
|
43
|
-
end
|
44
|
-
|
45
|
-
# Replaces the hash without the given keys.
|
46
|
-
def except!(*keys)
|
47
|
-
keys.each { |key| delete(key) }
|
48
|
-
self
|
49
|
-
end
|
50
|
-
end
|
data/test/helpers/test_unit.rb
DELETED
@@ -1,476 +0,0 @@
|
|
1
|
-
# Copyright (C) 2009-2013 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
|
-
TEST_HOST = ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost' unless defined? TEST_HOST
|
16
|
-
TEST_DATA = File.join(File.dirname(__FILE__), 'fixtures/data')
|
17
|
-
TEST_OP_TIMEOUT = 40
|
18
|
-
TEST_BASE = Test::Unit::TestCase
|
19
|
-
|
20
|
-
unless defined? TEST_PORT
|
21
|
-
TEST_PORT = if ENV['MONGO_RUBY_DRIVER_PORT']
|
22
|
-
ENV['MONGO_RUBY_DRIVER_PORT'].to_i
|
23
|
-
else
|
24
|
-
Mongo::MongoClient::DEFAULT_PORT
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
class Test::Unit::TestCase
|
29
|
-
include Mongo
|
30
|
-
include BSON
|
31
|
-
|
32
|
-
# Handles creating a pre-defined MongoDB cluster for integration testing.
|
33
|
-
#
|
34
|
-
# @param kind=nil [Symbol] Type of cluster (:rs or :sc).
|
35
|
-
# @param opts={} [Hash] Options to be passed through to the cluster manager.
|
36
|
-
#
|
37
|
-
# @return [ClusterManager] The cluster manager instance being used.
|
38
|
-
def ensure_cluster(kind=nil, opts={})
|
39
|
-
cluster_instance = nil
|
40
|
-
class_vars = TEST_BASE.class_eval { class_variables }
|
41
|
-
if class_vars.include?("@@cluster_#{kind}") || class_vars.include?("@@cluster_#{kind}".to_sym)
|
42
|
-
cluster_instance = TEST_BASE.class_eval { class_variable_get("@@cluster_#{kind}") }
|
43
|
-
end
|
44
|
-
|
45
|
-
unless cluster_instance
|
46
|
-
if kind == :rs
|
47
|
-
cluster_opts = Config::DEFAULT_REPLICA_SET.dup
|
48
|
-
else
|
49
|
-
cluster_opts = Config::DEFAULT_SHARDED_SIMPLE.dup
|
50
|
-
end
|
51
|
-
|
52
|
-
cluster_opts.merge!(opts)
|
53
|
-
cluster_opts.merge!(:dbpath => ENV['MONGO_DBPATH'] || 'data')
|
54
|
-
config = Config.cluster(cluster_opts)
|
55
|
-
|
56
|
-
cluster_instance = Config::ClusterManager.new(config)
|
57
|
-
TEST_BASE.class_eval { class_variable_set("@@cluster_#{kind}", cluster_instance) }
|
58
|
-
end
|
59
|
-
|
60
|
-
cluster_instance.start
|
61
|
-
instance_variable_set("@#{kind}", cluster_instance)
|
62
|
-
|
63
|
-
uri = "mongodb://#{TEST_USER}:#{TEST_USER_PWD}@" +
|
64
|
-
"#{cluster_instance.members_uri}"
|
65
|
-
uri += "?replicaset=#{@rs.repl_set_name}&sockettimeoutms=60000" if cluster_instance.replica_set?
|
66
|
-
instance_variable_set("@uri", uri)
|
67
|
-
end
|
68
|
-
|
69
|
-
# Generic helper to rescue and retry from a connection failure.
|
70
|
-
#
|
71
|
-
# @param max_retries=30 [Integer] The number of times to attempt a retry.
|
72
|
-
#
|
73
|
-
# @return [Object] The block result.
|
74
|
-
def rescue_connection_failure(max_retries=30)
|
75
|
-
retries = 0
|
76
|
-
begin
|
77
|
-
yield
|
78
|
-
rescue Mongo::ConnectionFailure => ex
|
79
|
-
retries += 1
|
80
|
-
raise ex if retries > max_retries
|
81
|
-
sleep(2)
|
82
|
-
retry
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
# Creates and connects a standard, pre-defined MongoClient instance.
|
87
|
-
#
|
88
|
-
# @param options={} [Hash] Options to be passed to the client instance.
|
89
|
-
# @param legacy=false [Boolean] When true, uses deprecated Mongo::Connection.
|
90
|
-
#
|
91
|
-
# @return [MongoClient] The client instance.
|
92
|
-
def self.standard_connection(options={}, legacy=false)
|
93
|
-
opts = options[:op_timeout] ? options : options.merge(:op_timeout => TEST_OP_TIMEOUT)
|
94
|
-
if legacy
|
95
|
-
silently do
|
96
|
-
# We have to create the Connection object directly here instead of using TEST_URI
|
97
|
-
# because Connection#from_uri ends up creating a MongoClient object.
|
98
|
-
conn = Connection.new(TEST_HOST, TEST_PORT, opts)
|
99
|
-
conn[TEST_DB].authenticate(TEST_USER, TEST_USER_PWD)
|
100
|
-
conn
|
101
|
-
end
|
102
|
-
else
|
103
|
-
MongoClient.from_uri(TEST_URI, opts)
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
# Creates and connects a standard, pre-defined MongoClient instance.
|
108
|
-
#
|
109
|
-
# @param options={} [Hash] Options to be passed to the client instance.
|
110
|
-
# @param legacy=false [Boolean] When true, uses deprecated Mongo::Connection.
|
111
|
-
#
|
112
|
-
# @return [MongoClient] The client instance.
|
113
|
-
def standard_connection(options={}, legacy=false)
|
114
|
-
self.class.standard_connection(options, legacy)
|
115
|
-
end
|
116
|
-
|
117
|
-
def self.host_port
|
118
|
-
"#{mongo_host}:#{mongo_port}"
|
119
|
-
end
|
120
|
-
|
121
|
-
def self.mongo_host
|
122
|
-
TEST_HOST
|
123
|
-
end
|
124
|
-
|
125
|
-
def self.mongo_port
|
126
|
-
TEST_PORT
|
127
|
-
end
|
128
|
-
|
129
|
-
def host_port
|
130
|
-
self.class.host_port
|
131
|
-
end
|
132
|
-
|
133
|
-
def mongo_host
|
134
|
-
self.class.mongo_host
|
135
|
-
end
|
136
|
-
|
137
|
-
def mongo_port
|
138
|
-
self.class.mongo_port
|
139
|
-
end
|
140
|
-
|
141
|
-
def method_name
|
142
|
-
caller[0]=~/`(.*?)'/
|
143
|
-
$1
|
144
|
-
end
|
145
|
-
|
146
|
-
def perform_step_down(member)
|
147
|
-
start = Time.now
|
148
|
-
timeout = 20 # seconds
|
149
|
-
begin
|
150
|
-
step_down_command = BSON::OrderedHash.new
|
151
|
-
step_down_command[:replSetStepDown] = 30
|
152
|
-
step_down_command[:force] = true
|
153
|
-
member['admin'].command(step_down_command)
|
154
|
-
rescue Mongo::OperationFailure => e
|
155
|
-
retry unless (Time.now - start) > timeout
|
156
|
-
raise e
|
157
|
-
end
|
158
|
-
end
|
159
|
-
|
160
|
-
def new_mock_socket(host='localhost', port=27017)
|
161
|
-
socket = Object.new
|
162
|
-
socket.stubs(:setsockopt).with(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
|
163
|
-
socket.stubs(:close)
|
164
|
-
socket.stubs(:closed?)
|
165
|
-
socket.stubs(:checkin)
|
166
|
-
socket.stubs(:pool)
|
167
|
-
socket.stubs(:pid)
|
168
|
-
socket
|
169
|
-
end
|
170
|
-
|
171
|
-
def new_mock_unix_socket(sockfile='/tmp/mongod.sock')
|
172
|
-
socket = Object.new
|
173
|
-
socket.stubs(:setsockopt).with(Socket::IPPROTO_TCP)
|
174
|
-
socket.stubs(:close)
|
175
|
-
socket.stubs(:closed?)
|
176
|
-
socket
|
177
|
-
end
|
178
|
-
|
179
|
-
def new_mock_db
|
180
|
-
Object.new
|
181
|
-
end
|
182
|
-
|
183
|
-
def mock_pool(tags={}, ping_time=15)
|
184
|
-
mock('pool').tap do |pool|
|
185
|
-
pool.stubs(:tags).returns(tags)
|
186
|
-
pool.stubs(:ping_time).returns(ping_time)
|
187
|
-
end
|
188
|
-
end
|
189
|
-
|
190
|
-
def assert_raise_error(klass, message=nil)
|
191
|
-
begin
|
192
|
-
yield
|
193
|
-
rescue => e
|
194
|
-
if klass.to_s != e.class.to_s
|
195
|
-
flunk "Expected exception class #{klass} but got #{e.class}.\n #{e.backtrace}"
|
196
|
-
end
|
197
|
-
|
198
|
-
if message && !e.message.include?(message)
|
199
|
-
p e.backtrace
|
200
|
-
flunk "#{e.message} does not include #{message}.\n#{e.backtrace}"
|
201
|
-
end
|
202
|
-
else
|
203
|
-
flunk "Expected assertion #{klass} but none was raised."
|
204
|
-
end
|
205
|
-
end
|
206
|
-
|
207
|
-
def match_document(key, expected, actual) # special cases for Regexp match, BSON::ObjectId, Range
|
208
|
-
if expected.is_a?(Hash) && actual.is_a?(Hash)
|
209
|
-
expected_keys = expected.keys.sort
|
210
|
-
actual_keys = actual.keys.sort
|
211
|
-
#currently allow extra fields in actual as the following check for equality of keys is commented out
|
212
|
-
#raise "field:#{key.inspect} - Hash keys expected:#{expected_keys.inspect} actual:#{actual_keys.inspect}" if expected_keys != actual_keys
|
213
|
-
expected_keys.each{|k| match_document(k, expected[k], actual[k])}
|
214
|
-
elsif expected.is_a?(Array) && actual.is_a?(Array)
|
215
|
-
raise "field:#{key.inspect} - Array size expected:#{expected.size} actual:#{actual.size}" if expected.size != actual.size
|
216
|
-
(0...expected.size).each{|i| match_document(i, expected[i], actual[i])}
|
217
|
-
elsif expected.is_a?(Regexp) && actual.is_a?(String)
|
218
|
-
raise "field:#{key.inspect} - Regexp expected:#{expected.inspect} actual:#{actual.inspect}" if expected !~ actual
|
219
|
-
elsif expected.is_a?(BSON::ObjectId) && actual.is_a?(BSON::ObjectId)
|
220
|
-
# match type but not value
|
221
|
-
elsif expected.is_a?(Range)
|
222
|
-
raise "field:#{key.inspect} - Range expected:#{expected.inspect} actual:#{actual.inspect}" if !expected.include?(actual)
|
223
|
-
elsif expected.is_a?(Set)
|
224
|
-
raise "field:#{key.inspect} - Set expected:#{expected.inspect} actual:#{actual.inspect}" if !expected.include?(actual)
|
225
|
-
else
|
226
|
-
raise "field:#{key.inspect} - expected:#{expected.inspect} actual:#{actual.inspect}" if expected != actual
|
227
|
-
end
|
228
|
-
true
|
229
|
-
end
|
230
|
-
|
231
|
-
def assert_match_document(expected, actual, message = '')
|
232
|
-
match = begin
|
233
|
-
match_document('', expected, actual)
|
234
|
-
rescue => ex
|
235
|
-
message = ex.message + ' - ' + message
|
236
|
-
false
|
237
|
-
end
|
238
|
-
assert(match, message)
|
239
|
-
end
|
240
|
-
|
241
|
-
def with_forced_timeout(client, &block)
|
242
|
-
authenticate_client(client)
|
243
|
-
cmd_line_args = client['admin'].command({ :getCmdLineOpts => 1 })['argv']
|
244
|
-
if cmd_line_args.include?('enableTestCommands=1') && client.server_version >= "2.5.3"
|
245
|
-
begin
|
246
|
-
#Force any query or command with valid non-zero max time to fail (SERVER-10650)
|
247
|
-
fail_point_cmd = OrderedHash.new
|
248
|
-
fail_point_cmd[:configureFailPoint] = 'maxTimeAlwaysTimeOut'
|
249
|
-
fail_point_cmd[:mode] = 'alwaysOn'
|
250
|
-
client['admin'].command(fail_point_cmd)
|
251
|
-
yield
|
252
|
-
fail_point_cmd[:mode] = 'off'
|
253
|
-
client['admin'].command(fail_point_cmd)
|
254
|
-
end
|
255
|
-
end
|
256
|
-
end
|
257
|
-
|
258
|
-
def with_default_journaling(client, &block)
|
259
|
-
authenticate_client(client)
|
260
|
-
cmd_line_args = client['admin'].command({ :getCmdLineOpts => 1 })['parsed']
|
261
|
-
unless client.server_version < "2.0" || cmd_line_args.include?('nojournal') ||
|
262
|
-
using_heap1_storage_engine?(cmd_line_args)
|
263
|
-
yield
|
264
|
-
end
|
265
|
-
end
|
266
|
-
|
267
|
-
def using_heap1_storage_engine?(cmd_line_args)
|
268
|
-
cmd_line_args.include?('storage') &&
|
269
|
-
cmd_line_args['storage']['engine'] == 'heap1'
|
270
|
-
end
|
271
|
-
|
272
|
-
def with_no_replication(client, &block)
|
273
|
-
if client.class == MongoClient
|
274
|
-
yield
|
275
|
-
end
|
276
|
-
end
|
277
|
-
|
278
|
-
def with_no_journaling(client, &block)
|
279
|
-
authenticate_client(client)
|
280
|
-
cmd_line_args = client['admin'].command({ :getCmdLineOpts => 1 })['parsed']
|
281
|
-
unless client.server_version < "2.0" || !cmd_line_args.include?('nojournal')
|
282
|
-
yield
|
283
|
-
end
|
284
|
-
end
|
285
|
-
|
286
|
-
def with_ipv6_enabled(client, &block)
|
287
|
-
authenticate_client(client)
|
288
|
-
cmd_line_args = client['admin'].command({ :getCmdLineOpts => 1 })['parsed']
|
289
|
-
if cmd_line_args.include?('ipv6')
|
290
|
-
yield
|
291
|
-
end
|
292
|
-
end
|
293
|
-
|
294
|
-
def with_write_commands(client, &block)
|
295
|
-
wire_version = Mongo::MongoClient::BATCH_COMMANDS
|
296
|
-
if client.primary_wire_version_feature?(wire_version)
|
297
|
-
yield wire_version
|
298
|
-
end
|
299
|
-
end
|
300
|
-
|
301
|
-
def with_preserved_env_uri(new_uri=nil, &block)
|
302
|
-
old_mongodb_uri = ENV['MONGODB_URI']
|
303
|
-
begin
|
304
|
-
ENV['MONGODB_URI'] = new_uri
|
305
|
-
yield
|
306
|
-
ensure
|
307
|
-
ENV['MONGODB_URI'] = old_mongodb_uri
|
308
|
-
end
|
309
|
-
end
|
310
|
-
|
311
|
-
def with_write_operations(client, &block)
|
312
|
-
wire_version = Mongo::MongoClient::RELEASE_2_4_AND_BEFORE
|
313
|
-
if client.primary_wire_version_feature?(wire_version)
|
314
|
-
client.class.class_eval(%Q{
|
315
|
-
alias :old_use_write_command? :use_write_command?
|
316
|
-
def use_write_command?(write_concern)
|
317
|
-
false
|
318
|
-
end
|
319
|
-
})
|
320
|
-
yield wire_version
|
321
|
-
client.class.class_eval(%Q{
|
322
|
-
alias :use_write_command? :old_use_write_command?
|
323
|
-
})
|
324
|
-
end
|
325
|
-
end
|
326
|
-
|
327
|
-
def with_write_commands_and_operations(client, &block)
|
328
|
-
with_write_commands(client, &block)
|
329
|
-
with_write_operations(client, &block)
|
330
|
-
end
|
331
|
-
|
332
|
-
def batch_commands?(wire_version)
|
333
|
-
wire_version >= Mongo::MongoClient::BATCH_COMMANDS
|
334
|
-
end
|
335
|
-
|
336
|
-
def subject_to_server_4754?(client)
|
337
|
-
# Until SERVER-4754 is resolved, profiling info is not collected
|
338
|
-
# when mongod is started with --auth in versions < 2.2
|
339
|
-
authenticate_client(client)
|
340
|
-
cmd_line_args = client['admin'].command({ :getCmdLineOpts => 1 })['parsed']
|
341
|
-
client.server_version < '2.2' && cmd_line_args.include?('auth')
|
342
|
-
end
|
343
|
-
|
344
|
-
# When testing under narrowed localhost exception, the admin user must have
|
345
|
-
# special permissions to run the db_eval command.
|
346
|
-
def grant_admin_user_eval_role(client)
|
347
|
-
if auth_enabled?(client) && client.server_version >= "2.6"
|
348
|
-
# we need to have anyAction on anyResource to run db_eval()
|
349
|
-
admin = client['admin']
|
350
|
-
any_priv = BSON::OrderedHash.new
|
351
|
-
any_priv[:resource] = { :anyResource => true }
|
352
|
-
any_priv[:actions] = ['anyAction']
|
353
|
-
|
354
|
-
create_role = BSON::OrderedHash.new
|
355
|
-
create_role[:createRole] = 'db_eval'
|
356
|
-
create_role[:privileges] = [any_priv]
|
357
|
-
create_role[:roles] = []
|
358
|
-
|
359
|
-
begin
|
360
|
-
admin.command(create_role)
|
361
|
-
rescue Mongo::OperationFailure => ex
|
362
|
-
# role already exists
|
363
|
-
end
|
364
|
-
|
365
|
-
grant_role = BSON::OrderedHash.new
|
366
|
-
grant_role[:grantRolesToUser] = TEST_USER
|
367
|
-
grant_role[:roles] = ['db_eval']
|
368
|
-
admin.command(grant_role)
|
369
|
-
end
|
370
|
-
end
|
371
|
-
|
372
|
-
# Return true if auth is enabled, false otherwise.
|
373
|
-
def auth_enabled?(client)
|
374
|
-
begin
|
375
|
-
cmd_line_args = client['admin'].command({ :getCmdLineOpts => 1 })['parsed']
|
376
|
-
return true if cmd_line_args.include?('auth') || cmd_line_args.include?('keyFile')
|
377
|
-
if security = cmd_line_args["security"]
|
378
|
-
return true if security["authorization"] == "enabled"
|
379
|
-
end
|
380
|
-
rescue OperationFailure => ex
|
381
|
-
# under narrowed localhost exception in > 2.7.1, getCmdLineOpts is not allowed
|
382
|
-
# unless you're authenticated.
|
383
|
-
return true if ex.message.include?("authorized") ||
|
384
|
-
(client.server_version >= "2.7.1" &&
|
385
|
-
ex.error_code == Mongo::ErrorCode::UNAUTHORIZED)
|
386
|
-
end
|
387
|
-
end
|
388
|
-
|
389
|
-
def with_auth(client, &block)
|
390
|
-
yield if auth_enabled?(client)
|
391
|
-
end
|
392
|
-
|
393
|
-
def authenticate_client(client)
|
394
|
-
client[TEST_DB].authenticate(TEST_USER, TEST_USER_PWD) unless client.auths.any? {|a| a[:source] == TEST_DB}
|
395
|
-
client
|
396
|
-
end
|
397
|
-
|
398
|
-
def self.ensure_admin_user
|
399
|
-
10.times do
|
400
|
-
begin
|
401
|
-
client = Mongo::MongoClient.new(TEST_HOST, TEST_PORT)
|
402
|
-
db = client[TEST_DB]
|
403
|
-
begin
|
404
|
-
db.authenticate(TEST_USER, TEST_USER_PWD, nil, 'admin')
|
405
|
-
rescue Mongo::AuthenticationError => ex
|
406
|
-
roles = [ 'dbAdminAnyDatabase',
|
407
|
-
'userAdminAnyDatabase',
|
408
|
-
'readWriteAnyDatabase',
|
409
|
-
'clusterAdmin' ]
|
410
|
-
db.add_user(TEST_USER, TEST_USER_PWD, nil, :roles => roles)
|
411
|
-
end
|
412
|
-
TEST_BASE.class_eval { class_variable_set("@@connected_single_mongod", true) }
|
413
|
-
break
|
414
|
-
rescue Mongo::ConnectionFailure
|
415
|
-
# mongod not available yet, wait a second and try again
|
416
|
-
sleep(1)
|
417
|
-
end
|
418
|
-
#puts "Not connected to a MongoD" unless client.connected?
|
419
|
-
end
|
420
|
-
end
|
421
|
-
|
422
|
-
def self.cleanup_users_and_dbs
|
423
|
-
not_cluster = TEST_BASE.class_eval { class_variables }.none? { |v| v =~ /@@cluster_/ }
|
424
|
-
|
425
|
-
if @@connected_single_mongod && not_cluster
|
426
|
-
client = Mongo::MongoClient.from_uri(TEST_URI, :op_timeout => TEST_OP_TIMEOUT)
|
427
|
-
db = client[TEST_DB]
|
428
|
-
begin
|
429
|
-
begin
|
430
|
-
db.authenticate(TEST_USER, TEST_USER_PWD)
|
431
|
-
|
432
|
-
rescue Mongo::ConnectionFailure, Mongo::MongoArgumentError
|
433
|
-
rescue Mongo::AuthenticationError
|
434
|
-
Test::Unit::TestCase.ensure_admin_user
|
435
|
-
db.authenticate(TEST_USER, TEST_USER_PWD)
|
436
|
-
end
|
437
|
-
|
438
|
-
client.database_names.each do |db_name|
|
439
|
-
if db_name =~ /^ruby_test*/
|
440
|
-
puts "[CLEAN-UP] Dropping '#{db_name}'..."
|
441
|
-
client.drop_database(db_name)
|
442
|
-
end
|
443
|
-
end
|
444
|
-
|
445
|
-
if client.server_version < '2.5'
|
446
|
-
db['system.users'].remove
|
447
|
-
else
|
448
|
-
db.command(:dropAllUsersFromDatabase => 1)
|
449
|
-
end
|
450
|
-
|
451
|
-
rescue Mongo::ConnectionFailure
|
452
|
-
# Nothing we can do about the mongod not being available
|
453
|
-
end
|
454
|
-
end
|
455
|
-
end
|
456
|
-
end
|
457
|
-
|
458
|
-
|
459
|
-
Test::Unit.at_start do
|
460
|
-
TEST_DB = ENV['TEST_DB'] || 'admin'
|
461
|
-
TEST_USER = ENV['TEST_USER'] || 'admin_user'
|
462
|
-
TEST_USER_PWD = ENV['TEST_USER_PWD'] || 'password'
|
463
|
-
TEST_URI = ENV['TEST_URI'] ||
|
464
|
-
"mongodb://#{TEST_USER}:#{TEST_USER_PWD}@#{TEST_HOST}:#{TEST_PORT}/#{TEST_DB}"
|
465
|
-
TEST_BASE.class_eval { class_variable_set("@@connected_single_mongod", false) }
|
466
|
-
Test::Unit::TestCase.ensure_admin_user
|
467
|
-
end
|
468
|
-
|
469
|
-
# Before and after hooks for the entire test run
|
470
|
-
# handles mop up after the cluster manager is done.
|
471
|
-
Test::Unit.at_exit do
|
472
|
-
Test::Unit::TestCase.cleanup_users_and_dbs
|
473
|
-
TEST_BASE.class_eval { class_variables }.select { |v| v =~ /@@cluster_/ }.each do |cluster|
|
474
|
-
TEST_BASE.class_eval { class_variable_get(cluster) }.stop
|
475
|
-
end
|
476
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
# Copyright (C) 2009-2013 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
|
-
require 'test_helper'
|
16
|
-
require 'shared/authentication/basic_auth_shared'
|
17
|
-
require 'shared/authentication/sasl_plain_shared'
|
18
|
-
require 'shared/authentication/bulk_api_auth_shared'
|
19
|
-
require 'shared/authentication/gssapi_shared'
|
20
|
-
|
21
|
-
class ReplicaSetAuthenticationTest < Test::Unit::TestCase
|
22
|
-
include Mongo
|
23
|
-
|
24
|
-
include BasicAuthTests
|
25
|
-
include SASLPlainTests
|
26
|
-
include BulkAPIAuthTests
|
27
|
-
include GSSAPITests
|
28
|
-
|
29
|
-
def setup
|
30
|
-
ensure_cluster(:rs)
|
31
|
-
@client = MongoReplicaSetClient.from_uri(@uri, :op_timeout => TEST_OP_TIMEOUT)
|
32
|
-
@admin = @client['admin']
|
33
|
-
@version = @client.server_version
|
34
|
-
@db = @client['ruby-test']
|
35
|
-
@host_info = @rs.repl_set_seeds.join(',')
|
36
|
-
end
|
37
|
-
end
|