1# frozen_string_literal: true
2
3require "simplecov"
4SimpleCov.start do
5 add_filter "/test/"
6 enable_coverage :branch
7 command_name ENV.fetch("COVERAGE_NAME", "tests")
8end
9
10require "minitest/autorun"
11require "webmock/minitest"
12
13MMS_PROXY = "https://proxy.test.example.com/"
14
15_saved_argv = ARGV.dup
16
17ARGV[0] = "component"
18ARGV[6] = MMS_PROXY
19
20require_relative "../sgx-bwmsgsv2"
21ARGV.replace(_saved_argv)
22
23def SGXbwmsgsv2.write_to_stream(s)
24 @written ||= []
25 @written << s
26end
27
28def reset_stanzas!
29 SGXbwmsgsv2.instance_variable_set(:@written, [])
30end
31
32def reset_redis!
33 REDIS.reset!
34 REDIS.set("catapult_jid-", "HERE")
35 REDIS.set("catapult_jid-+15550000000", "test@example.com")
36 REDIS.set("catapult_cred-test@example.com", [
37 'account', 'user', 'password', '+15550000000'
38 ])
39end
40
41def written
42 SGXbwmsgsv2.instance_variable_get(:@written)
43end
44
45begin
46 require "pry-byebug"
47
48 module Minitest
49 class Test
50 alias old_capture_exceptions capture_exceptions
51 def capture_exceptions
52 old_capture_exceptions do
53 yield
54 rescue Minitest::Skip => e
55 failures << e
56 end
57 end
58 end
59 end
60rescue LoadError, NameError
61 # Just helpers for dev, no big deal if missing
62 nil
63end
64
65
66$VERBOSE = nil
67
68class FakeRedis
69 def initialize(values={})
70 @values = values
71 end
72
73 def reset!(values={})
74 @values = values
75 end
76
77 def set(key, value, *)
78 @values[key] = value
79 EMPromise.resolve("OK")
80 end
81
82 def setex(key, _expiry, value)
83 set(key, value)
84 end
85
86 def del(*keys)
87 keys.each { |key| @values.delete(key) }
88 end
89
90 def mget(*keys)
91 EMPromise.all(keys.map(&method(:get)))
92 end
93
94 def get(key)
95 EMPromise.resolve(@values[key])
96 end
97
98 def getbit(key, bit)
99 get(key).then { |v| v.to_i.to_s(2)[bit].to_i }
100 end
101
102 def bitfield(key, *ops)
103 get(key).then do |v|
104 bits = v.to_i.to_s(2)
105 ops.each_slice(3).map do |(op, encoding, offset)|
106 raise "unsupported bitfield op" unless op == "GET"
107 raise "unsupported bitfield op" unless encoding == "u1"
108
109 bits[offset].to_i
110 end
111 end
112 end
113
114 def hget(key, field)
115 @values.dig(key, field)
116 end
117
118 def hincrby(key, field, incrby)
119 @values[key] ||= {}
120 @values[key][field] ||= 0
121 @values[key][field] += incrby
122 end
123
124 def sadd(key, member)
125 @values[key] ||= Set.new
126 @values[key] << member
127 end
128
129 def srem(key, member)
130 @values[key].delete(member)
131 end
132
133 def scard(key)
134 @values[key]&.size || 0
135 end
136
137 def expire(_, _); end
138
139 def exists(*keys)
140 EMPromise.resolve(
141 @values.select { |k, _| keys.include? k }.size.to_s
142 )
143 end
144
145 def lindex(key, index)
146 get(key).then { |v| v&.fetch(index) }
147 end
148
149 def lrange(key, sindex, eindex)
150 get(key).then { |v| v ? v[sindex..eindex] : [] }
151 end
152
153 def rpush(key, *values)
154 @values[key] ||= []
155 values.each { |v| @values[key].push(v) }
156 end
157
158 def multi
159 end
160
161 def exec
162 end
163
164 def discard
165 end
166
167 def xadd(stream, id, *args)
168 @values[stream] ||= []
169 entry_id = id == "*" ? "#{Time.now.to_i}-0" : id
170 fields = Hash[*args]
171 @values[stream] << { id: entry_id, fields: fields }
172 EMPromise.resolve(entry_id)
173 end
174
175 def stream_entries(stream)
176 EMPromise.resolve(@values[stream] || [])
177 end
178end
179
180REDIS = FakeRedis.new
181
182module Minitest
183 class Test
184 def with_stubs(stubs, &block)
185 if stubs.empty?
186 block.call
187 else
188 obj, method, value = stubs.first
189 obj.stub(method, value) do
190 with_stubs(stubs[1..], &block)
191 end
192 end
193 end
194
195 def self.em(m)
196 alias_method "raw_#{m}", m
197 define_method(m) do
198 $panic = nil
199 e = nil
200 EM.run do
201 Fiber.new {
202 ARGV[0] = "component"
203 ARGV[6] = MMS_PROXY
204 begin
205 send("raw_#{m}")
206 rescue
207 e = $!
208 ensure
209 EM.stop
210 end
211 }.resume
212 end
213 raise e if e
214 end
215 end
216 end
217end