mongo 2.14.0.rc1 → 2.14.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.tar.gz.sig +1 -1
 - data/Rakefile +39 -4
 - data/lib/mongo/address.rb +1 -1
 - data/lib/mongo/collection.rb +5 -0
 - data/lib/mongo/collection/view/readable.rb +4 -0
 - data/lib/mongo/cursor.rb +15 -3
 - data/lib/mongo/database/view.rb +1 -1
 - data/lib/mongo/operation/collections_info/command.rb +5 -0
 - data/lib/mongo/operation/collections_info/result.rb +16 -1
 - data/lib/mongo/operation/find/result.rb +10 -0
 - data/lib/mongo/server/description.rb +8 -1
 - data/lib/mongo/session.rb +2 -1
 - data/lib/mongo/version.rb +1 -1
 - data/spec/README.md +7 -0
 - data/spec/integration/bson_symbol_spec.rb +4 -2
 - data/spec/integration/change_stream_spec.rb +1 -1
 - data/spec/integration/connection_pool_populator_spec.rb +1 -1
 - data/spec/integration/cursor_reaping_spec.rb +1 -1
 - data/spec/integration/fork_reconnect_spec.rb +56 -1
 - data/spec/integration/query_cache_transactions_spec.rb +29 -18
 - data/spec/integration/sdam_error_handling_spec.rb +17 -0
 - data/spec/integration/sdam_events_spec.rb +8 -5
 - data/spec/integration/transactions_examples_spec.rb +17 -7
 - data/spec/lite_spec_helper.rb +5 -3
 - data/spec/mongo/auth/user_spec.rb +1 -1
 - data/spec/mongo/bulk_write_spec.rb +2 -2
 - data/spec/mongo/client_construction_spec.rb +3 -3
 - data/spec/mongo/client_encryption_spec.rb +16 -10
 - data/spec/mongo/client_spec.rb +7 -0
 - data/spec/mongo/cluster/topology/replica_set_spec.rb +1 -1
 - data/spec/mongo/cluster/topology/sharded_spec.rb +1 -1
 - data/spec/mongo/cluster/topology/single_spec.rb +1 -1
 - data/spec/mongo/cluster/topology/unknown_spec.rb +1 -1
 - data/spec/mongo/cluster/topology_spec.rb +1 -1
 - data/spec/mongo/collection/view/change_stream_resume_spec.rb +1 -1
 - data/spec/mongo/collection/view/readable_spec.rb +36 -0
 - data/spec/mongo/collection_spec.rb +12 -0
 - data/spec/mongo/crypt/binary_spec.rb +1 -6
 - data/spec/mongo/crypt/binding/binary_spec.rb +1 -6
 - data/spec/mongo/crypt/binding/context_spec.rb +2 -7
 - data/spec/mongo/crypt/binding/helpers_spec.rb +1 -6
 - data/spec/mongo/crypt/binding/mongocrypt_spec.rb +2 -7
 - data/spec/mongo/crypt/binding/status_spec.rb +1 -6
 - data/spec/mongo/crypt/binding/version_spec.rb +1 -6
 - data/spec/mongo/crypt/data_key_context_spec.rb +1 -1
 - data/spec/mongo/crypt/status_spec.rb +1 -6
 - data/spec/mongo/database_spec.rb +64 -0
 - data/spec/mongo/monitoring/event/server_closed_spec.rb +1 -1
 - data/spec/mongo/monitoring/event/server_opening_spec.rb +1 -1
 - data/spec/mongo/monitoring/event/topology_changed_spec.rb +1 -1
 - data/spec/mongo/monitoring/event/topology_closed_spec.rb +1 -1
 - data/spec/mongo/monitoring/event/topology_opening_spec.rb +1 -1
 - data/spec/mongo/operation/delete/op_msg_spec.rb +3 -3
 - data/spec/mongo/operation/insert/command_spec.rb +2 -2
 - data/spec/mongo/operation/insert/op_msg_spec.rb +3 -3
 - data/spec/mongo/operation/read_preference_op_msg_spec.rb +1 -1
 - data/spec/mongo/operation/update/command_spec.rb +2 -2
 - data/spec/mongo/operation/update/op_msg_spec.rb +3 -3
 - data/spec/mongo/query_cache_spec.rb +1 -0
 - data/spec/mongo/server/app_metadata_shared.rb +2 -2
 - data/spec/mongo/server/connection_spec.rb +1 -1
 - data/spec/mongo/server/description_spec.rb +18 -0
 - data/spec/mongo/server_selector_spec.rb +2 -2
 - data/spec/mongo/socket/ssl_spec.rb +3 -3
 - data/spec/runners/change_streams/test.rb +1 -1
 - data/spec/runners/crud/test_base.rb +0 -19
 - data/spec/runners/server_selection.rb +1 -1
 - data/spec/runners/transactions/test.rb +2 -2
 - data/spec/shared/LICENSE +20 -0
 - data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
 - data/spec/shared/lib/mrss/constraints.rb +303 -0
 - data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
 - data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
 - data/spec/spec_helper.rb +3 -1
 - data/spec/stress/fork_reconnect_stress_spec.rb +1 -1
 - data/spec/support/constraints.rb +0 -270
 - data/spec/support/utils.rb +19 -0
 - metadata +956 -952
 - metadata.gz.sig +0 -0
 - data/spec/support/child_process_helper.rb +0 -78
 - data/spec/support/lite_constraints.rb +0 -165
 - data/spec/support/spec_organizer.rb +0 -129
 
    
        metadata.gz.sig
    CHANGED
    
    | 
         Binary file 
     | 
| 
         @@ -1,78 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # frozen_string_literal: true
         
     | 
| 
       2 
     | 
    
         
            -
            # encoding: utf-8
         
     | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       4 
     | 
    
         
            -
            autoload :ChildProcess, 'childprocess'
         
     | 
| 
       5 
     | 
    
         
            -
            autoload :Tempfile, 'tempfile'
         
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
            module ChildProcessHelper
         
     | 
| 
       8 
     | 
    
         
            -
              class SpawnError < StandardError; end
         
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
              module_function def call(cmd, env: nil, cwd: nil)
         
     | 
| 
       11 
     | 
    
         
            -
                process = ChildProcess.new(*cmd)
         
     | 
| 
       12 
     | 
    
         
            -
                process.io.inherit!
         
     | 
| 
       13 
     | 
    
         
            -
                if cwd
         
     | 
| 
       14 
     | 
    
         
            -
                  process.cwd = cwd
         
     | 
| 
       15 
     | 
    
         
            -
                end
         
     | 
| 
       16 
     | 
    
         
            -
                if env
         
     | 
| 
       17 
     | 
    
         
            -
                  env.each do |k, v|
         
     | 
| 
       18 
     | 
    
         
            -
                    process.environment[k.to_s] = v
         
     | 
| 
       19 
     | 
    
         
            -
                  end
         
     | 
| 
       20 
     | 
    
         
            -
                end
         
     | 
| 
       21 
     | 
    
         
            -
                process.start
         
     | 
| 
       22 
     | 
    
         
            -
                process.wait
         
     | 
| 
       23 
     | 
    
         
            -
                process
         
     | 
| 
       24 
     | 
    
         
            -
              end
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
              module_function def check_call(cmd, env: nil, cwd: nil)
         
     | 
| 
       27 
     | 
    
         
            -
                process = call(cmd, env: env, cwd: cwd)
         
     | 
| 
       28 
     | 
    
         
            -
                unless process.exit_code == 0
         
     | 
| 
       29 
     | 
    
         
            -
                  raise SpawnError, "Failed to execute: #{cmd}"
         
     | 
| 
       30 
     | 
    
         
            -
                end
         
     | 
| 
       31 
     | 
    
         
            -
              end
         
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
              module_function def get_output(cmd, env: nil, cwd: nil)
         
     | 
| 
       34 
     | 
    
         
            -
                process = ChildProcess.new(*cmd)
         
     | 
| 
       35 
     | 
    
         
            -
                process.io.inherit!
         
     | 
| 
       36 
     | 
    
         
            -
                if cwd
         
     | 
| 
       37 
     | 
    
         
            -
                  process.cwd = cwd
         
     | 
| 
       38 
     | 
    
         
            -
                end
         
     | 
| 
       39 
     | 
    
         
            -
                if env
         
     | 
| 
       40 
     | 
    
         
            -
                  env.each do |k, v|
         
     | 
| 
       41 
     | 
    
         
            -
                    process.environment[k.to_s] = v
         
     | 
| 
       42 
     | 
    
         
            -
                  end
         
     | 
| 
       43 
     | 
    
         
            -
                end
         
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
                output = ''
         
     | 
| 
       46 
     | 
    
         
            -
                r, w = IO.pipe
         
     | 
| 
       47 
     | 
    
         
            -
             
     | 
| 
       48 
     | 
    
         
            -
                begin
         
     | 
| 
       49 
     | 
    
         
            -
                  process.io.stdout = w
         
     | 
| 
       50 
     | 
    
         
            -
                  process.start
         
     | 
| 
       51 
     | 
    
         
            -
                  w.close
         
     | 
| 
       52 
     | 
    
         
            -
             
     | 
| 
       53 
     | 
    
         
            -
                  thread = Thread.new do
         
     | 
| 
       54 
     | 
    
         
            -
                    begin
         
     | 
| 
       55 
     | 
    
         
            -
                      loop do
         
     | 
| 
       56 
     | 
    
         
            -
                        output << r.readpartial(16384)
         
     | 
| 
       57 
     | 
    
         
            -
                      end
         
     | 
| 
       58 
     | 
    
         
            -
                    rescue EOFError
         
     | 
| 
       59 
     | 
    
         
            -
                    end
         
     | 
| 
       60 
     | 
    
         
            -
                  end
         
     | 
| 
       61 
     | 
    
         
            -
             
     | 
| 
       62 
     | 
    
         
            -
                  process.wait
         
     | 
| 
       63 
     | 
    
         
            -
                  thread.join
         
     | 
| 
       64 
     | 
    
         
            -
                ensure
         
     | 
| 
       65 
     | 
    
         
            -
                  r.close
         
     | 
| 
       66 
     | 
    
         
            -
                end
         
     | 
| 
       67 
     | 
    
         
            -
             
     | 
| 
       68 
     | 
    
         
            -
                [process, output]
         
     | 
| 
       69 
     | 
    
         
            -
              end
         
     | 
| 
       70 
     | 
    
         
            -
             
     | 
| 
       71 
     | 
    
         
            -
              module_function def check_output(*args)
         
     | 
| 
       72 
     | 
    
         
            -
                process, output = get_output(*args)
         
     | 
| 
       73 
     | 
    
         
            -
                unless process.exit_code == 0
         
     | 
| 
       74 
     | 
    
         
            -
                  raise SpawnError,"Failed to execute: #{args}"
         
     | 
| 
       75 
     | 
    
         
            -
                end
         
     | 
| 
       76 
     | 
    
         
            -
                output
         
     | 
| 
       77 
     | 
    
         
            -
              end
         
     | 
| 
       78 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,165 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            module LiteConstraints
         
     | 
| 
       2 
     | 
    
         
            -
              # Constrain tests that use TimeoutInterrupt to MRI (and Unix)
         
     | 
| 
       3 
     | 
    
         
            -
              def only_mri
         
     | 
| 
       4 
     | 
    
         
            -
                before(:all) do
         
     | 
| 
       5 
     | 
    
         
            -
                  unless SpecConfig.instance.mri?
         
     | 
| 
       6 
     | 
    
         
            -
                    skip "MRI required, we have #{SpecConfig.instance.platform}"
         
     | 
| 
       7 
     | 
    
         
            -
                  end
         
     | 
| 
       8 
     | 
    
         
            -
                end
         
     | 
| 
       9 
     | 
    
         
            -
              end
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
              def require_jruby
         
     | 
| 
       12 
     | 
    
         
            -
                before(:all) do
         
     | 
| 
       13 
     | 
    
         
            -
                  unless BSON::Environment.jruby?
         
     | 
| 
       14 
     | 
    
         
            -
                    skip "JRuby required, we have #{SpecConfig.instance.platform}"
         
     | 
| 
       15 
     | 
    
         
            -
                  end
         
     | 
| 
       16 
     | 
    
         
            -
                end
         
     | 
| 
       17 
     | 
    
         
            -
              end
         
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
              # This is for marking tests that fail on jruby that should
         
     | 
| 
       20 
     | 
    
         
            -
              # in principle work (as opposed to being fundamentally incompatible
         
     | 
| 
       21 
     | 
    
         
            -
              # with jruby).
         
     | 
| 
       22 
     | 
    
         
            -
              # Often times these failures happen only in Evergreen.
         
     | 
| 
       23 
     | 
    
         
            -
              def fails_on_jruby(version=nil)
         
     | 
| 
       24 
     | 
    
         
            -
                before(:all) do
         
     | 
| 
       25 
     | 
    
         
            -
                  if BSON::Environment.jruby?
         
     | 
| 
       26 
     | 
    
         
            -
                    if version
         
     | 
| 
       27 
     | 
    
         
            -
                      min_parts = version.split('.').map(&:to_i)
         
     | 
| 
       28 
     | 
    
         
            -
                      actual_parts = JRUBY_VERSION.split('.').map(&:to_i)[0...min_parts.length]
         
     | 
| 
       29 
     | 
    
         
            -
                      actual = actual_parts.join('.')
         
     | 
| 
       30 
     | 
    
         
            -
                      if actual <= version
         
     | 
| 
       31 
     | 
    
         
            -
                        skip "Fails on jruby through #{version}"
         
     | 
| 
       32 
     | 
    
         
            -
                      end
         
     | 
| 
       33 
     | 
    
         
            -
                    else
         
     | 
| 
       34 
     | 
    
         
            -
                      skip "Fails on jruby"
         
     | 
| 
       35 
     | 
    
         
            -
                    end
         
     | 
| 
       36 
     | 
    
         
            -
                  end
         
     | 
| 
       37 
     | 
    
         
            -
                end
         
     | 
| 
       38 
     | 
    
         
            -
              end
         
     | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
       40 
     | 
    
         
            -
              def require_external_connectivity
         
     | 
| 
       41 
     | 
    
         
            -
                before(:all) do
         
     | 
| 
       42 
     | 
    
         
            -
                  if ENV['EXTERNAL_DISABLED']
         
     | 
| 
       43 
     | 
    
         
            -
                    skip "Test requires external connectivity"
         
     | 
| 
       44 
     | 
    
         
            -
                  end
         
     | 
| 
       45 
     | 
    
         
            -
                end
         
     | 
| 
       46 
     | 
    
         
            -
              end
         
     | 
| 
       47 
     | 
    
         
            -
             
     | 
| 
       48 
     | 
    
         
            -
              def require_mongo_kerberos
         
     | 
| 
       49 
     | 
    
         
            -
                before(:all) do
         
     | 
| 
       50 
     | 
    
         
            -
                  unless %w(1 yes true).include?(ENV['MONGO_RUBY_DRIVER_KERBEROS']&.downcase)
         
     | 
| 
       51 
     | 
    
         
            -
                    skip 'Set MONGO_RUBY_DRIVER_KERBEROS=1 in environment to run Kerberos unit tests'
         
     | 
| 
       52 
     | 
    
         
            -
                  end
         
     | 
| 
       53 
     | 
    
         
            -
                  require 'mongo_kerberos'
         
     | 
| 
       54 
     | 
    
         
            -
                end
         
     | 
| 
       55 
     | 
    
         
            -
              end
         
     | 
| 
       56 
     | 
    
         
            -
             
     | 
| 
       57 
     | 
    
         
            -
              def require_linting
         
     | 
| 
       58 
     | 
    
         
            -
                before do
         
     | 
| 
       59 
     | 
    
         
            -
                  unless Mongo::Lint.enabled?
         
     | 
| 
       60 
     | 
    
         
            -
                    skip "Linting is not enabled"
         
     | 
| 
       61 
     | 
    
         
            -
                  end
         
     | 
| 
       62 
     | 
    
         
            -
                end
         
     | 
| 
       63 
     | 
    
         
            -
              end
         
     | 
| 
       64 
     | 
    
         
            -
             
     | 
| 
       65 
     | 
    
         
            -
              def require_libmongocrypt
         
     | 
| 
       66 
     | 
    
         
            -
                before(:all) do
         
     | 
| 
       67 
     | 
    
         
            -
                  unless ENV['LIBMONGOCRYPT_PATH']
         
     | 
| 
       68 
     | 
    
         
            -
                    skip 'Test requires path to libmongocrypt to be specified in LIBMONGOCRYPT_PATH env variable'
         
     | 
| 
       69 
     | 
    
         
            -
                  end
         
     | 
| 
       70 
     | 
    
         
            -
                end
         
     | 
| 
       71 
     | 
    
         
            -
              end
         
     | 
| 
       72 
     | 
    
         
            -
             
     | 
| 
       73 
     | 
    
         
            -
              def require_no_libmongocrypt
         
     | 
| 
       74 
     | 
    
         
            -
                before(:all) do
         
     | 
| 
       75 
     | 
    
         
            -
                  if ENV['LIBMONGOCRYPT_PATH']
         
     | 
| 
       76 
     | 
    
         
            -
                    skip 'Test requires libmongocrypt to not be configured'
         
     | 
| 
       77 
     | 
    
         
            -
                  end
         
     | 
| 
       78 
     | 
    
         
            -
                end
         
     | 
| 
       79 
     | 
    
         
            -
              end
         
     | 
| 
       80 
     | 
    
         
            -
             
     | 
| 
       81 
     | 
    
         
            -
              # Some tests will fail if linting is enabled:
         
     | 
| 
       82 
     | 
    
         
            -
              # 1. Tests that pass invalid options to client, etc. which the linter
         
     | 
| 
       83 
     | 
    
         
            -
              #    rejects.
         
     | 
| 
       84 
     | 
    
         
            -
              # 2. Tests that set expectations on topologies, server descriptions, etc.
         
     | 
| 
       85 
     | 
    
         
            -
              #    (since setting expectations requires mutating said objects, and when
         
     | 
| 
       86 
     | 
    
         
            -
              #    linting is on those objects are frozen).
         
     | 
| 
       87 
     | 
    
         
            -
              def skip_if_linting
         
     | 
| 
       88 
     | 
    
         
            -
                before do
         
     | 
| 
       89 
     | 
    
         
            -
                  if Mongo::Lint.enabled?
         
     | 
| 
       90 
     | 
    
         
            -
                    skip "Linting is enabled"
         
     | 
| 
       91 
     | 
    
         
            -
                  end
         
     | 
| 
       92 
     | 
    
         
            -
                end
         
     | 
| 
       93 
     | 
    
         
            -
              end
         
     | 
| 
       94 
     | 
    
         
            -
             
     | 
| 
       95 
     | 
    
         
            -
              def require_aws_auth
         
     | 
| 
       96 
     | 
    
         
            -
                before(:all) do
         
     | 
| 
       97 
     | 
    
         
            -
                  unless (ENV['AUTH'] || '') =~ /^aws/
         
     | 
| 
       98 
     | 
    
         
            -
                    skip 'This test requires AUTH=aws* and an appropriately configured runtime environment'
         
     | 
| 
       99 
     | 
    
         
            -
                  end
         
     | 
| 
       100 
     | 
    
         
            -
                end
         
     | 
| 
       101 
     | 
    
         
            -
              end
         
     | 
| 
       102 
     | 
    
         
            -
             
     | 
| 
       103 
     | 
    
         
            -
              def require_ec2_host
         
     | 
| 
       104 
     | 
    
         
            -
                before(:all) do
         
     | 
| 
       105 
     | 
    
         
            -
                  if $have_aws.nil?
         
     | 
| 
       106 
     | 
    
         
            -
                    $have_aws = begin
         
     | 
| 
       107 
     | 
    
         
            -
                      require 'open-uri'
         
     | 
| 
       108 
     | 
    
         
            -
                      begin
         
     | 
| 
       109 
     | 
    
         
            -
                        Timeout.timeout(3.81) do
         
     | 
| 
       110 
     | 
    
         
            -
                          URI.parse('http://169.254.169.254/latest/meta-data/profile').open.read
         
     | 
| 
       111 
     | 
    
         
            -
                        end
         
     | 
| 
       112 
     | 
    
         
            -
                        true
         
     | 
| 
       113 
     | 
    
         
            -
                      # When trying to use the EC2 metadata endpoint on ECS:
         
     | 
| 
       114 
     | 
    
         
            -
                      # Errno::EINVAL: Failed to open TCP connection to 169.254.169.254:80 (Invalid argument - connect(2) for "169.254.169.254" port 80)
         
     | 
| 
       115 
     | 
    
         
            -
                      rescue Timeout::Error, Errno::ETIMEDOUT, Errno::EINVAL, OpenURI::HTTPError => $aws_error
         
     | 
| 
       116 
     | 
    
         
            -
                        false
         
     | 
| 
       117 
     | 
    
         
            -
                      end
         
     | 
| 
       118 
     | 
    
         
            -
                    end
         
     | 
| 
       119 
     | 
    
         
            -
                  end
         
     | 
| 
       120 
     | 
    
         
            -
                  unless $have_aws
         
     | 
| 
       121 
     | 
    
         
            -
                    skip "EC2 instance metadata is not available - assuming not running on an EC2 instance: #{$aws_error.class}: #{$aws_error}"
         
     | 
| 
       122 
     | 
    
         
            -
                  end
         
     | 
| 
       123 
     | 
    
         
            -
                end
         
     | 
| 
       124 
     | 
    
         
            -
              end
         
     | 
| 
       125 
     | 
    
         
            -
             
     | 
| 
       126 
     | 
    
         
            -
              def require_stress
         
     | 
| 
       127 
     | 
    
         
            -
                before(:all) do
         
     | 
| 
       128 
     | 
    
         
            -
                  if !SpecConfig.instance.stress?
         
     | 
| 
       129 
     | 
    
         
            -
                    skip 'Set STRESS=1 in environment to run stress tests'
         
     | 
| 
       130 
     | 
    
         
            -
                  end
         
     | 
| 
       131 
     | 
    
         
            -
                end
         
     | 
| 
       132 
     | 
    
         
            -
              end
         
     | 
| 
       133 
     | 
    
         
            -
             
     | 
| 
       134 
     | 
    
         
            -
              def require_fork
         
     | 
| 
       135 
     | 
    
         
            -
                before(:all) do
         
     | 
| 
       136 
     | 
    
         
            -
                  if !SpecConfig.instance.fork?
         
     | 
| 
       137 
     | 
    
         
            -
                    skip 'Set FORK=1 in environment to run fork tests'
         
     | 
| 
       138 
     | 
    
         
            -
                  end
         
     | 
| 
       139 
     | 
    
         
            -
                end
         
     | 
| 
       140 
     | 
    
         
            -
              end
         
     | 
| 
       141 
     | 
    
         
            -
             
     | 
| 
       142 
     | 
    
         
            -
              def require_ocsp
         
     | 
| 
       143 
     | 
    
         
            -
                before(:all) do
         
     | 
| 
       144 
     | 
    
         
            -
                  if !SpecConfig.instance.ocsp?
         
     | 
| 
       145 
     | 
    
         
            -
                    skip 'Set OCSP=1 in environment to run OCSP tests'
         
     | 
| 
       146 
     | 
    
         
            -
                  end
         
     | 
| 
       147 
     | 
    
         
            -
                end
         
     | 
| 
       148 
     | 
    
         
            -
              end
         
     | 
| 
       149 
     | 
    
         
            -
             
     | 
| 
       150 
     | 
    
         
            -
              def require_ocsp_verifier
         
     | 
| 
       151 
     | 
    
         
            -
                before(:all) do
         
     | 
| 
       152 
     | 
    
         
            -
                  if !SpecConfig.instance.ocsp_verifier?
         
     | 
| 
       153 
     | 
    
         
            -
                    skip 'Set OCSP_VERIFIER=1 in environment to run OCSP verifier tests'
         
     | 
| 
       154 
     | 
    
         
            -
                  end
         
     | 
| 
       155 
     | 
    
         
            -
                end
         
     | 
| 
       156 
     | 
    
         
            -
              end
         
     | 
| 
       157 
     | 
    
         
            -
             
     | 
| 
       158 
     | 
    
         
            -
              def require_ocsp_connectivity
         
     | 
| 
       159 
     | 
    
         
            -
                before(:all) do
         
     | 
| 
       160 
     | 
    
         
            -
                  if !SpecConfig.instance.ocsp_connectivity?
         
     | 
| 
       161 
     | 
    
         
            -
                    skip 'Set OCSP_CONNECTIVITY=pass or OCSP_CONNECTIVITY=fail in environment to run OCSP connectivity tests'
         
     | 
| 
       162 
     | 
    
         
            -
                  end
         
     | 
| 
       163 
     | 
    
         
            -
                end
         
     | 
| 
       164 
     | 
    
         
            -
              end
         
     | 
| 
       165 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,129 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            autoload :FileUtils, 'fileutils'
         
     | 
| 
       2 
     | 
    
         
            -
            autoload :Find, 'find'
         
     | 
| 
       3 
     | 
    
         
            -
            autoload :ChildProcessHelper, 'support/child_process_helper'
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
            # Organizes and runs all of the tests in the test suite in batches.
         
     | 
| 
       6 
     | 
    
         
            -
            #
         
     | 
| 
       7 
     | 
    
         
            -
            # Organizing the tests in batches serves two purposes:
         
     | 
| 
       8 
     | 
    
         
            -
            #
         
     | 
| 
       9 
     | 
    
         
            -
            # 1. This allows running unit tests before integration tests, therefore
         
     | 
| 
       10 
     | 
    
         
            -
            #    in theory revealing failures quicker on average.
         
     | 
| 
       11 
     | 
    
         
            -
            # 2. This allows running some tests that have high intermittent failure rate
         
     | 
| 
       12 
     | 
    
         
            -
            #    in their own test process.
         
     | 
| 
       13 
     | 
    
         
            -
            #
         
     | 
| 
       14 
     | 
    
         
            -
            # This class aggregates RSpec results after the test runs.
         
     | 
| 
       15 
     | 
    
         
            -
            class SpecOrganizer
         
     | 
| 
       16 
     | 
    
         
            -
              CLASSIFIERS = [
         
     | 
| 
       17 
     | 
    
         
            -
                [%r,^mongo,, :unit],
         
     | 
| 
       18 
     | 
    
         
            -
                [%r,^kerberos,, :unit],
         
     | 
| 
       19 
     | 
    
         
            -
                [%r,^integration/sdam_error_handling,, :sdam_integration],
         
     | 
| 
       20 
     | 
    
         
            -
                [%r,^integration/cursor_reaping,, :cursor_reaping],
         
     | 
| 
       21 
     | 
    
         
            -
                [%r,^(atlas|integration),, :integration],
         
     | 
| 
       22 
     | 
    
         
            -
                [%r,^spec_tests,, :spec],
         
     | 
| 
       23 
     | 
    
         
            -
                [%r,^spec_tests/sdam_integration,, :spec_sdam_integration],
         
     | 
| 
       24 
     | 
    
         
            -
              ]
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
              RUN_PRIORITY = %i(unit
         
     | 
| 
       27 
     | 
    
         
            -
                integration sdam_integration cursor_reaping
         
     | 
| 
       28 
     | 
    
         
            -
                spec spec_sdam_integration
         
     | 
| 
       29 
     | 
    
         
            -
              )
         
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
              SPEC_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
         
     | 
| 
       32 
     | 
    
         
            -
              ROOT = File.expand_path(File.join(SPEC_ROOT, '..'))
         
     | 
| 
       33 
     | 
    
         
            -
              RSPEC_JSON_PATH = File.join(ROOT, 'tmp/rspec.json')
         
     | 
| 
       34 
     | 
    
         
            -
              RSPEC_ALL_JSON_PATH = File.join(ROOT, 'tmp/rspec-all.json')
         
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
              def run
         
     | 
| 
       37 
     | 
    
         
            -
                FileUtils.rm_f(RSPEC_ALL_JSON_PATH)
         
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
                buckets = {}
         
     | 
| 
       40 
     | 
    
         
            -
                Find.find(SPEC_ROOT) do |path|
         
     | 
| 
       41 
     | 
    
         
            -
                  next unless File.file?(path)
         
     | 
| 
       42 
     | 
    
         
            -
                  next unless path =~ /_spec\.rb\z/
         
     | 
| 
       43 
     | 
    
         
            -
                  rel_path = path[(SPEC_ROOT.length + 1)..path.length]
         
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
                  found = false
         
     | 
| 
       46 
     | 
    
         
            -
                  CLASSIFIERS.each do |(regexp, category)|
         
     | 
| 
       47 
     | 
    
         
            -
                    if regexp =~ rel_path
         
     | 
| 
       48 
     | 
    
         
            -
                      buckets[category] ||= []
         
     | 
| 
       49 
     | 
    
         
            -
                      buckets[category] << rel_path
         
     | 
| 
       50 
     | 
    
         
            -
                      found = true
         
     | 
| 
       51 
     | 
    
         
            -
                      break
         
     | 
| 
       52 
     | 
    
         
            -
                    end
         
     | 
| 
       53 
     | 
    
         
            -
                  end
         
     | 
| 
       54 
     | 
    
         
            -
             
     | 
| 
       55 
     | 
    
         
            -
                  unless found
         
     | 
| 
       56 
     | 
    
         
            -
                    buckets[nil] ||= []
         
     | 
| 
       57 
     | 
    
         
            -
                    buckets[nil] << rel_path
         
     | 
| 
       58 
     | 
    
         
            -
                  end
         
     | 
| 
       59 
     | 
    
         
            -
                end
         
     | 
| 
       60 
     | 
    
         
            -
             
     | 
| 
       61 
     | 
    
         
            -
                failed = []
         
     | 
| 
       62 
     | 
    
         
            -
             
     | 
| 
       63 
     | 
    
         
            -
                RUN_PRIORITY.each do |category|
         
     | 
| 
       64 
     | 
    
         
            -
                  if files = buckets.delete(category)
         
     | 
| 
       65 
     | 
    
         
            -
                    unless run_files(category, files)
         
     | 
| 
       66 
     | 
    
         
            -
                      failed << category
         
     | 
| 
       67 
     | 
    
         
            -
                    end
         
     | 
| 
       68 
     | 
    
         
            -
                  end
         
     | 
| 
       69 
     | 
    
         
            -
                end
         
     | 
| 
       70 
     | 
    
         
            -
                if files = buckets.delete(nil)
         
     | 
| 
       71 
     | 
    
         
            -
                  unless run_files('remaining', files)
         
     | 
| 
       72 
     | 
    
         
            -
                    failed << 'remaining'
         
     | 
| 
       73 
     | 
    
         
            -
                  end
         
     | 
| 
       74 
     | 
    
         
            -
                end
         
     | 
| 
       75 
     | 
    
         
            -
             
     | 
| 
       76 
     | 
    
         
            -
                unless buckets.empty?
         
     | 
| 
       77 
     | 
    
         
            -
                  raise "Some buckets were not executed: #{buckets.keys.map(&:to_s).join(', ')}"
         
     | 
| 
       78 
     | 
    
         
            -
                end
         
     | 
| 
       79 
     | 
    
         
            -
             
     | 
| 
       80 
     | 
    
         
            -
                if failed.any?
         
     | 
| 
       81 
     | 
    
         
            -
                  raise "The following buckets failed: #{failed.map(&:to_s).join(', ')}"
         
     | 
| 
       82 
     | 
    
         
            -
                end
         
     | 
| 
       83 
     | 
    
         
            -
              end
         
     | 
| 
       84 
     | 
    
         
            -
             
     | 
| 
       85 
     | 
    
         
            -
              def run_files(category, paths)
         
     | 
| 
       86 
     | 
    
         
            -
                paths = paths.map do |path|
         
     | 
| 
       87 
     | 
    
         
            -
                  File.join('spec', path)
         
     | 
| 
       88 
     | 
    
         
            -
                end
         
     | 
| 
       89 
     | 
    
         
            -
             
     | 
| 
       90 
     | 
    
         
            -
                puts "Running #{category.to_s.gsub('_', ' ')} tests"
         
     | 
| 
       91 
     | 
    
         
            -
                FileUtils.rm_f(RSPEC_JSON_PATH)
         
     | 
| 
       92 
     | 
    
         
            -
                cmd = %w(rspec) + paths
         
     | 
| 
       93 
     | 
    
         
            -
             
     | 
| 
       94 
     | 
    
         
            -
                begin
         
     | 
| 
       95 
     | 
    
         
            -
                  ChildProcessHelper.check_call(cmd)
         
     | 
| 
       96 
     | 
    
         
            -
                ensure
         
     | 
| 
       97 
     | 
    
         
            -
                  if File.exist?(RSPEC_JSON_PATH)
         
     | 
| 
       98 
     | 
    
         
            -
                    if File.exist?(RSPEC_ALL_JSON_PATH)
         
     | 
| 
       99 
     | 
    
         
            -
                      merge_rspec_results
         
     | 
| 
       100 
     | 
    
         
            -
                    else
         
     | 
| 
       101 
     | 
    
         
            -
                      FileUtils.cp(RSPEC_JSON_PATH, RSPEC_ALL_JSON_PATH)
         
     | 
| 
       102 
     | 
    
         
            -
                    end
         
     | 
| 
       103 
     | 
    
         
            -
                  end
         
     | 
| 
       104 
     | 
    
         
            -
                end
         
     | 
| 
       105 
     | 
    
         
            -
             
     | 
| 
       106 
     | 
    
         
            -
                true
         
     | 
| 
       107 
     | 
    
         
            -
              rescue ChildProcessHelper::SpawnError
         
     | 
| 
       108 
     | 
    
         
            -
                false
         
     | 
| 
       109 
     | 
    
         
            -
              end
         
     | 
| 
       110 
     | 
    
         
            -
             
     | 
| 
       111 
     | 
    
         
            -
              def merge_rspec_results
         
     | 
| 
       112 
     | 
    
         
            -
                all = JSON.parse(File.read(RSPEC_ALL_JSON_PATH))
         
     | 
| 
       113 
     | 
    
         
            -
                new = JSON.parse(File.read(RSPEC_JSON_PATH))
         
     | 
| 
       114 
     | 
    
         
            -
                all['examples'] += new.delete('examples')
         
     | 
| 
       115 
     | 
    
         
            -
                new.delete('summary').each do |k, v|
         
     | 
| 
       116 
     | 
    
         
            -
                  all['summary'][k] += v
         
     | 
| 
       117 
     | 
    
         
            -
                end
         
     | 
| 
       118 
     | 
    
         
            -
                new.delete('version')
         
     | 
| 
       119 
     | 
    
         
            -
                new.delete('summary_line')
         
     | 
| 
       120 
     | 
    
         
            -
                unless new.empty?
         
     | 
| 
       121 
     | 
    
         
            -
                  raise "Unhandled rspec results keys: #{new.keys.join(', ')}"
         
     | 
| 
       122 
     | 
    
         
            -
                end
         
     | 
| 
       123 
     | 
    
         
            -
                # We do not merge summary lines, delete them from aggregated results
         
     | 
| 
       124 
     | 
    
         
            -
                all.delete('summary_line')
         
     | 
| 
       125 
     | 
    
         
            -
                File.open(RSPEC_ALL_JSON_PATH, 'w') do |f|
         
     | 
| 
       126 
     | 
    
         
            -
                  f << JSON.dump(all)
         
     | 
| 
       127 
     | 
    
         
            -
                end
         
     | 
| 
       128 
     | 
    
         
            -
              end
         
     | 
| 
       129 
     | 
    
         
            -
            end
         
     |