File: requirement.rb

package info (click to toggle)
ruby-mongo 2.21.3-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 14,764 kB
  • sloc: ruby: 108,806; makefile: 5; sh: 2
file content (139 lines) | stat: -rw-r--r-- 4,168 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# frozen_string_literal: true
# rubocop:todo all

module Mongo
  module CRUD
    class Requirement
      YAML_KEYS = %w(auth minServerVersion maxServerVersion topology topologies serverParameters serverless csfle).freeze

      def initialize(spec)
        spec = spec.dup
        # Legacy tests have the requirements mixed with other test fields
        spec.delete('data')
        spec.delete('tests')

        unless (unhandled_keys = spec.keys - YAML_KEYS).empty?
          raise "Unhandled requirement specification keys: #{unhandled_keys}"
        end

        @min_server_version = spec['minServerVersion']
        @max_server_version = spec['maxServerVersion']
        # topologies is for unified test format.
        # topology is for legacy tests.
        @topologies = if topologies = spec['topology'] || spec['topologies']
          topologies.map do |topology|
            {
              'replicaset' => :replica_set,
              'single' => :single,
              'sharded' => :sharded,
              'sharded-replicaset' => :sharded,
              'load-balanced' => :load_balanced,
            }[topology].tap do |v|
              unless v
                raise "Unknown topology #{topology}"
              end
            end
          end
        else
          nil
        end
        @server_parameters = spec['serverParameters']
        @serverless = if serverless = spec['serverless']
          case spec['serverless']
          when 'require' then :require
          when 'forbid' then :forbid
          when 'allow' then :allow
          else raise "Unknown serverless requirement: #{serverless}"
          end
        else
          nil
        end
        @auth = spec['auth']
        @csfle = !!spec['csfle'] if spec['csfle']
      end

      attr_reader :min_server_version
      attr_reader :max_server_version
      attr_reader :topologies
      attr_reader :serverless

      def short_min_server_version
        if min_server_version
          min_server_version.split('.')[0..1].join('.')
        else
          nil
        end
      end

      def short_max_server_version
        if max_server_version
          max_server_version.split('.')[0..1].join('.')
        else
          nil
        end
      end

      def satisfied?
        cc = ClusterConfig.instance
        ok = true
        if min_server_version
          ok &&= Gem::Version.new(cc.fcv_ish) >= Gem::Version.new(min_server_version)
        end
        if max_server_version
          ok &&= Gem::Version.new(cc.server_version) <= Gem::Version.new(max_server_version)
        end
        if topologies
          ok &&= topologies.include?(cc.topology)
        end
        if @server_parameters
          @server_parameters.each do |k, required_v|
            actual_v = cc.server_parameters[k]
            if actual_v.nil? && !required_v.nil?
              ok = false
            elsif actual_v != required_v
              if Numeric === actual_v && Numeric === required_v
                if actual_v.to_f != required_v.to_f
                  ok = false
                end
              else
                ok = false
              end
            end
          end
        end
        if @serverless
          if SpecConfig.instance.serverless?
            ok = ok && [:allow, :require].include?(serverless)
          else
            ok = ok && [:allow, :forbid].include?(serverless)
          end
        end
        if @auth == true
          ok &&= SpecConfig.instance.auth?
        elsif @auth == false
          ok &&= !SpecConfig.instance.auth?
        end
        if @csfle
          ok &&= !!(ENV['LIBMONGOCRYPT_PATH'] || ENV['FLE'])
          ok &&= Gem::Version.new(cc.fcv_ish) >= Gem::Version.new('4.2.0')
        end
        ok
      end

      def description
        versions = [min_server_version, max_server_version].compact
        if versions.any?
          versions = versions.join('-')
        else
          versions = nil
        end
        topologies = if self.topologies
          self.topologies.map(&:to_s).join(',')
        else
          nil
        end
        [versions, topologies].compact.join('/')
      end
    end
  end
end