wsdirector-core 1.0.2 → 1.0.3

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 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