wsdirector-core 1.0.2 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9f1fd8da87e97c9a82a6f0505a8d4a7ef28a9dabb0a75809ee60b1739481e08c
4
- data.tar.gz: 77f4c9ab2836f8f1e407c6376ee1b2d73b07ed1963770f5d38837bd24c5a598c
3
+ metadata.gz: d062f547a78c242ffc0b863fc7cd0e9405fc8b4621791ca2bb30f077a6778885
4
+ data.tar.gz: c75f03818f180eb0ee202402272189ec23a2d53ad2dd28cc9657971b9abde523
5
5
  SHA512:
6
- metadata.gz: 935e69a837cf42cb0bb3121a8f3f9b415534c492245b350549cf2f0f6a839f382a9e8167179c7db00c0157e4312d0a7efc6480fa9e5bac65076a3a20d9a26cd9
7
- data.tar.gz: 61b7ee833e4a236167ef4ede04354b46d44bbc29cdc56b6caa05d3d28f5f0588131c933f3f5ab59833b1d74dfaca509b6a30f1b0bc3280591784b7cd211a448e
6
+ metadata.gz: a276cdde656fd94d4e019aa398d1bbce8509e57561bc318e9af681871d3647137f367db714c70eaaeea1b1722c81f19881c6fccb57db123885b4b6c04618ebe7
7
+ data.tar.gz: d735cf99e4c64f826ce23cf82bd66fbb2469066c3c660d05e30ed4c31610cff3498ea5d58b98558ce60ef007c34a1717326677f2457ac132a8bb43a7af401bc1
data/CHANGELOG.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 1.0.3 (2023-10-03)
6
+
7
+ - Add `timeout` option to receive to limit the amount of time we wait for the expected message. ([@palkan][])
8
+
9
+ - Add `loop` action to multiply several actions. ([@palkan][])
10
+
5
11
  ## 1.0.2 (2023-01-12)
6
12
 
7
13
  - Fix adding transpiled files to releases. ([@palkan][])
@@ -99,6 +99,9 @@ module WSDirector
99
99
 
100
100
  # Base protocol describes basic actions
101
101
  class Base
102
+ class ReceiveTimeoutError < StandardError
103
+ end
104
+
102
105
  include WSDirector::Utils
103
106
 
104
107
  def initialize(task, scale: 1, logger: nil, id: nil, color: nil)
@@ -155,9 +158,11 @@ module WSDirector
155
158
  def receive(step)
156
159
  expected = step["data"] || PartialMatcher.new(step["data>"])
157
160
  ordered = step["ordered"]
161
+ timeout = step.fetch("timeout", 5).to_f
158
162
 
159
- log { "Receive a message: #{expected.truncate(50)}" }
163
+ log { "Receive a message in #{timeout}s: #{expected.truncate(100)}" }
160
164
 
165
+ start = Time.now.to_f
161
166
  received = nil
162
167
 
163
168
  client.each_message do |msg, id|
@@ -170,10 +175,14 @@ module WSDirector
170
175
  if ordered
171
176
  raise UnmatchedExpectationError, prepare_receive_error(expected, received)
172
177
  end
178
+
179
+ if Time.now.to_f - start > timeout
180
+ raise ReceiveTimeoutError
181
+ end
173
182
  end
174
183
 
175
- log(:done) { "Received a message: #{received&.truncate(50)}" }
176
- rescue ThreadError
184
+ log(:done) { "Received a message: #{received&.truncate(100)}" }
185
+ rescue ThreadError, ReceiveTimeoutError
177
186
  if received
178
187
  raise UnmatchedExpectationError, prepare_receive_error(expected, received)
179
188
  else
@@ -92,7 +92,12 @@ module WSDirector
92
92
  data["sample"] = [1, parse_multiplier(data["sample"])].max if data["sample"]
93
93
 
94
94
  multiplier = parse_multiplier(data.delete("multiplier") || "1")
95
- Array.new(multiplier) { {"type" => type, "id" => id}.merge(data) }
95
+
96
+ if type == "loop"
97
+ handle_steps(data.fetch("actions")) * multiplier
98
+ else
99
+ Array.new(multiplier) { {"type" => type, "id" => id}.merge(data) }
100
+ end
96
101
  else
97
102
  {"type" => step, "id" => id}
98
103
  end
@@ -99,6 +99,9 @@ module WSDirector
99
99
 
100
100
  # Base protocol describes basic actions
101
101
  class Base
102
+ class ReceiveTimeoutError < StandardError
103
+ end
104
+
102
105
  include WSDirector::Utils
103
106
 
104
107
  def initialize(task, scale: 1, logger: nil, id: nil, color: nil)
@@ -155,9 +158,11 @@ module WSDirector
155
158
  def receive(step)
156
159
  expected = step["data"] || PartialMatcher.new(step["data>"])
157
160
  ordered = step["ordered"]
161
+ timeout = step.fetch("timeout", 5).to_f
158
162
 
159
- log { "Receive a message: #{expected.truncate(50)}" }
163
+ log { "Receive a message in #{timeout}s: #{expected.truncate(100)}" }
160
164
 
165
+ start = Time.now.to_f
161
166
  received = nil
162
167
 
163
168
  client.each_message do |msg, id|
@@ -170,10 +175,14 @@ module WSDirector
170
175
  if ordered
171
176
  raise UnmatchedExpectationError, prepare_receive_error(expected, received)
172
177
  end
178
+
179
+ if Time.now.to_f - start > timeout
180
+ raise ReceiveTimeoutError
181
+ end
173
182
  end
174
183
 
175
- log(:done) { "Received a message: #{received&.truncate(50)}" }
176
- rescue ThreadError
184
+ log(:done) { "Received a message: #{received&.truncate(100)}" }
185
+ rescue ThreadError, ReceiveTimeoutError
177
186
  if received
178
187
  raise UnmatchedExpectationError, prepare_receive_error(expected, received)
179
188
  else
@@ -92,7 +92,12 @@ module WSDirector
92
92
  data["sample"] = [1, parse_multiplier(data["sample"])].max if data["sample"]
93
93
 
94
94
  multiplier = parse_multiplier(data.delete("multiplier") || "1")
95
- Array.new(multiplier) { {"type" => type, "id" => id}.merge(data) }
95
+
96
+ if type == "loop"
97
+ handle_steps(data.fetch("actions")) * multiplier
98
+ else
99
+ Array.new(multiplier) { {"type" => type, "id" => id}.merge(data) }
100
+ end
96
101
  else
97
102
  {"type" => step, "id" => id}
98
103
  end
@@ -99,6 +99,9 @@ module WSDirector
99
99
 
100
100
  # Base protocol describes basic actions
101
101
  class Base
102
+ class ReceiveTimeoutError < StandardError
103
+ end
104
+
102
105
  include WSDirector::Utils
103
106
 
104
107
  def initialize(task, scale: 1, logger: nil, id: nil, color: nil)
@@ -155,9 +158,11 @@ module WSDirector
155
158
  def receive(step)
156
159
  expected = step["data"] || PartialMatcher.new(step["data>"])
157
160
  ordered = step["ordered"]
161
+ timeout = step.fetch("timeout", 5).to_f
158
162
 
159
- log { "Receive a message: #{expected.truncate(50)}" }
163
+ log { "Receive a message in #{timeout}s: #{expected.truncate(100)}" }
160
164
 
165
+ start = Time.now.to_f
161
166
  received = nil
162
167
 
163
168
  client.each_message do |msg, id|
@@ -170,10 +175,14 @@ module WSDirector
170
175
  if ordered
171
176
  raise UnmatchedExpectationError, prepare_receive_error(expected, received)
172
177
  end
178
+
179
+ if Time.now.to_f - start > timeout
180
+ raise ReceiveTimeoutError
181
+ end
173
182
  end
174
183
 
175
- log(:done) { "Received a message: #{received&.truncate(50)}" }
176
- rescue ThreadError
184
+ log(:done) { "Received a message: #{received&.truncate(100)}" }
185
+ rescue ThreadError, ReceiveTimeoutError
177
186
  if received
178
187
  raise UnmatchedExpectationError, prepare_receive_error(expected, received)
179
188
  else
@@ -92,7 +92,12 @@ module WSDirector
92
92
  data["sample"] = [1, parse_multiplier(data["sample"])].max if data["sample"]
93
93
 
94
94
  multiplier = parse_multiplier(data.delete("multiplier") || "1")
95
- Array.new(multiplier) { {"type" => type, "id" => id}.merge(data) }
95
+
96
+ if type == "loop"
97
+ handle_steps(data.fetch("actions")) * multiplier
98
+ else
99
+ Array.new(multiplier) { {"type" => type, "id" => id}.merge(data) }
100
+ end
96
101
  else
97
102
  {"type" => step, "id" => id}
98
103
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module WSDirector
4
- VERSION = "1.0.2"
4
+ VERSION = "1.0.3"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wsdirector-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vladimir Dementyev
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2023-01-12 00:00:00.000000000 Z
13
+ date: 2023-10-03 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: websocket-client-simple
@@ -245,7 +245,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
245
245
  - !ruby/object:Gem::Version
246
246
  version: '0'
247
247
  requirements: []
248
- rubygems_version: 3.3.11
248
+ rubygems_version: 3.4.8
249
249
  signing_key:
250
250
  specification_version: 4
251
251
  summary: Scenario-based WebSocket black-box testing