nonnative 1.16.0 → 1.21.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 06c156ebea189af501939979653772a2f87dcb6c262f373134d061bd0f07a48c
4
- data.tar.gz: 6d41fd8ac177d6565517423c73b031c0c4e03512f2406e7be6f12e2611dfe87d
3
+ metadata.gz: f32a99fc33eb1c0fd62360648c9b1de943c500ae674ae713b7c2ec56693ff165
4
+ data.tar.gz: c46a33b6451b3f69c4ae226106eaf58d2f54683627cde12217859179a396bc0e
5
5
  SHA512:
6
- metadata.gz: a34000c945bc7902645dd32a381311160353193efce3fcc9fbdc563a9e191b192b5e14b72bb4c1efa9d87a821558b801ba002d213e5aad7dceeef1f1ebf12e92
7
- data.tar.gz: 9d31997089ebaf6e01b4394b4b13d916791e8d5366acb0fd78e09db3cc662609202d1ac0d6ed605dda35796eae84201f607e5255cf6a25e8e2dedd01ef87e43d
6
+ metadata.gz: 965c0c84a1be47fd5d9cf05cf887ec9572dbdddf5ec579a29519800891b68727152d0f4559bb90e20870beaa7b27f3052ee2ea3edf2e31e40db6d04b46c6ef98
7
+ data.tar.gz: 583c38fafc5eb0d6b2762b9a23f83319ade0d381c5ab262825e78b1cf9a3b777e1828baf1f1e696bc8f2b2564ce291328c0bce515b92368404c634f776f93d3a
@@ -6,10 +6,10 @@ Layout/LineLength:
6
6
  Max: 120
7
7
 
8
8
  Metrics/MethodLength:
9
- Max: 15
9
+ Max: 20
10
10
 
11
11
  Metrics/BlockLength:
12
- Max: 35
12
+ Max: 60
13
13
 
14
14
  Metrics/AbcSize:
15
15
  Max: 20
@@ -58,3 +58,12 @@ Style/RedundantRegexpEscape:
58
58
 
59
59
  Style/RedundantFetchBlock:
60
60
  Enabled: true
61
+
62
+ Style/AccessorGrouping:
63
+ Enabled: true
64
+
65
+ Style/BisectedAttrAccessor:
66
+ Enabled: true
67
+
68
+ Style/RedundantAssignment:
69
+ Enabled: true
@@ -1,9 +1,10 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- nonnative (1.16.0)
4
+ nonnative (1.21.0)
5
+ concurrent-ruby (~> 1.0, >= 1.0.5)
5
6
  cucumber (~> 3.1, >= 3.1.2)
6
- grpc (~> 1.28)
7
+ grpc (>= 1, < 2)
7
8
  puma (~> 4.3, >= 4.3.3)
8
9
  rest-client (~> 2.1)
9
10
  rspec-benchmark (~> 0.6.0)
@@ -57,10 +58,10 @@ GEM
57
58
  google-protobuf (3.12.2)
58
59
  googleapis-common-protos-types (1.0.5)
59
60
  google-protobuf (~> 3.11)
60
- grpc (1.28.0)
61
- google-protobuf (~> 3.11)
61
+ grpc (1.30.1)
62
+ google-protobuf (~> 3.12)
62
63
  googleapis-common-protos-types (~> 1.0)
63
- grpc-tools (1.28.0)
64
+ grpc-tools (1.30.1)
64
65
  http-accept (1.7.0)
65
66
  http-cookie (1.0.3)
66
67
  domain_name (~> 0.5)
@@ -81,7 +82,7 @@ GEM
81
82
  ruby2_keywords (~> 0.0.1)
82
83
  netrc (0.11.0)
83
84
  nio4r (2.5.2)
84
- nokogiri (1.10.9)
85
+ nokogiri (1.10.10)
85
86
  mini_portile2 (~> 2.4.0)
86
87
  parallel (1.19.2)
87
88
  parser (2.7.1.4)
@@ -125,13 +126,13 @@ GEM
125
126
  diff-lcs (>= 1.2.0, < 2.0)
126
127
  rspec-support (~> 3.9.0)
127
128
  rspec-support (3.9.3)
128
- rubocop (0.86.0)
129
+ rubocop (0.87.1)
129
130
  parallel (~> 1.10)
130
- parser (>= 2.7.0.1)
131
+ parser (>= 2.7.1.1)
131
132
  rainbow (>= 2.2.2, < 4.0)
132
133
  regexp_parser (>= 1.7)
133
134
  rexml
134
- rubocop-ast (>= 0.0.3, < 1.0)
135
+ rubocop-ast (>= 0.1.0, < 1.0)
135
136
  ruby-progressbar (~> 1.7)
136
137
  unicode-display_width (>= 1.4.0, < 2.0)
137
138
  rubocop-ast (0.1.0)
@@ -187,12 +188,12 @@ PLATFORMS
187
188
  DEPENDENCIES
188
189
  bundler (~> 2.1, >= 2.1.4)
189
190
  chutney (~> 2.0, >= 2.0.3.1)
190
- grpc-tools (~> 1.28)
191
+ grpc-tools (>= 1, < 2)
191
192
  nonnative!
192
193
  rake (~> 13.0, >= 13.0.1)
193
- rubocop (~> 0.86.0)
194
+ rubocop (~> 0.87.1)
194
195
  simplecov (~> 0.17.1)
195
- solargraph (~> 0.39.7)
196
+ solargraph (~> 0.39.11)
196
197
 
197
198
  BUNDLED WITH
198
199
  2.1.4
data/Makefile CHANGED
@@ -7,7 +7,7 @@ outdated-dependencies:
7
7
  bundle outdated --only-explicit
8
8
 
9
9
  features: clean
10
- bundle exec cucumber --profile report $(feature)
10
+ bundle exec cucumber --profile report --fail-fast $(feature)
11
11
 
12
12
  analysis:
13
13
  bundle exec rubocop
data/README.md CHANGED
@@ -249,8 +249,8 @@ module Nonnative
249
249
  end
250
250
 
251
251
  class GRPCServer < Nonnative::GRPCServer
252
- def configure(grpc)
253
- grpc.handle(GreeterService.new)
252
+ def svc
253
+ GreeterService.new
254
254
  end
255
255
  end
256
256
  end
@@ -309,8 +309,10 @@ Nonnative.configure do |config|
309
309
  config.strategy = :manual
310
310
 
311
311
  config.server do |d|
312
- d.proxy.type = 'chaos'
313
- d.proxy.port = 20_000
312
+ d.proxy = {
313
+ type: 'chaos',
314
+ port: 20_000
315
+ }
314
316
  end
315
317
  end
316
318
  ```
@@ -10,6 +10,7 @@ require 'sinatra'
10
10
  require 'rest-client'
11
11
  require 'puma'
12
12
  require 'puma/server'
13
+ require 'concurrent'
13
14
 
14
15
  require 'nonnative/version'
15
16
  require 'nonnative/error'
@@ -35,10 +36,10 @@ require 'nonnative/proxy'
35
36
  require 'nonnative/no_proxy'
36
37
  require 'nonnative/chaos_proxy'
37
38
 
38
- Thread.abort_on_exception = true
39
-
40
39
  module Nonnative
41
40
  class << self
41
+ attr_reader :pool
42
+
42
43
  def load_configuration(path)
43
44
  @configuration ||= Nonnative::Configuration.load_file(path) # rubocop:disable Naming/MemoizedInstanceVariableName
44
45
  end
@@ -2,6 +2,14 @@
2
2
 
3
3
  module Nonnative
4
4
  class ChaosProxy < Nonnative::Proxy
5
+ def initialize(service)
6
+ @connections = Concurrent::Hash.new
7
+ @mutex = Mutex.new
8
+ @state = :none
9
+
10
+ super service
11
+ end
12
+
5
13
  def start
6
14
  @tcp_server = ::TCPServer.new('0.0.0.0', service.port)
7
15
  @thread = Thread.new { perform_start }
@@ -12,21 +20,32 @@ module Nonnative
12
20
  tcp_server.close
13
21
  end
14
22
 
23
+ def close_all
24
+ apply_state :close_all
25
+ end
26
+
27
+ def reset
28
+ apply_state :none
29
+ end
30
+
15
31
  def port
16
32
  service.proxy.port
17
33
  end
18
34
 
19
35
  private
20
36
 
21
- attr_reader :tcp_server, :thread
37
+ attr_reader :tcp_server, :thread, :connections, :mutex, :state
22
38
 
23
39
  def perform_start
24
40
  loop do
25
- Thread.start(tcp_server.accept) { |local_socket| connect(local_socket) }
41
+ thread = Thread.start(tcp_server.accept) { |local_socket| connect(local_socket) }
42
+ connections[thread.object_id] = thread
26
43
  end
27
44
  end
28
45
 
29
46
  def connect(local_socket)
47
+ return local_socket.close if state?(:close_all)
48
+
30
49
  remote_socket = create_remote_socket
31
50
  return unless remote_socket
32
51
 
@@ -36,9 +55,12 @@ module Nonnative
36
55
  break if write(ready, local_socket, remote_socket)
37
56
  break if write(ready, remote_socket, local_socket)
38
57
  end
58
+ rescue Errno::ECONNRESET
59
+ # Just ignore it.
39
60
  ensure
40
61
  local_socket.close
41
62
  remote_socket&.close
63
+ connections.delete(Thread.current.object_id)
42
64
  end
43
65
 
44
66
  def create_remote_socket
@@ -60,5 +82,13 @@ module Nonnative
60
82
 
61
83
  false
62
84
  end
85
+
86
+ def apply_state(state)
87
+ mutex.synchronize { @state = state }
88
+ end
89
+
90
+ def state?(state)
91
+ mutex.synchronize { @state == state }
92
+ end
63
93
  end
64
94
  end
@@ -42,8 +42,10 @@ module Nonnative
42
42
  proxy = fd['proxy']
43
43
 
44
44
  if proxy
45
- s.proxy.type = proxy['type']
46
- s.proxy.port = proxy['port']
45
+ s.proxy = {
46
+ type: proxy['type'],
47
+ port: proxy['port']
48
+ }
47
49
  end
48
50
  end
49
51
  end
@@ -56,9 +58,7 @@ module Nonnative
56
58
  self.servers = []
57
59
  end
58
60
 
59
- attr_accessor :strategy
60
- attr_accessor :processes
61
- attr_accessor :servers
61
+ attr_accessor :strategy, :processes, :servers
62
62
 
63
63
  def process
64
64
  process = Nonnative::ConfigurationProcess.new
@@ -2,11 +2,6 @@
2
2
 
3
3
  module Nonnative
4
4
  class ConfigurationProcess
5
- attr_accessor :name
6
- attr_accessor :command
7
- attr_accessor :timeout
8
- attr_accessor :port
9
- attr_accessor :file
10
- attr_accessor :signal
5
+ attr_accessor :name, :command, :timeout, :port, :file, :signal
11
6
  end
12
7
  end
@@ -2,8 +2,7 @@
2
2
 
3
3
  module Nonnative
4
4
  class ConfigurationProxy
5
- attr_accessor :type
6
- attr_accessor :port
5
+ attr_accessor :type, :port
7
6
 
8
7
  def initialize
9
8
  self.type = 'none'
@@ -2,14 +2,17 @@
2
2
 
3
3
  module Nonnative
4
4
  class ConfigurationServer
5
- attr_accessor :name
6
- attr_accessor :klass
7
- attr_accessor :timeout
8
- attr_accessor :port
9
- attr_accessor :proxy
5
+ attr_accessor :name, :klass, :timeout, :port
6
+
7
+ attr_reader :proxy
10
8
 
11
9
  def initialize
12
- self.proxy = Nonnative::ConfigurationProxy.new
10
+ @proxy = Nonnative::ConfigurationProxy.new
11
+ end
12
+
13
+ def proxy=(value)
14
+ proxy.type = value[:type]
15
+ proxy.port = value[:port]
13
16
  end
14
17
  end
15
18
  end
@@ -4,20 +4,15 @@ module Nonnative
4
4
  class GRPCServer < Nonnative::Server
5
5
  def initialize(service)
6
6
  @server = GRPC::RpcServer.new
7
+ server.handle(svc)
7
8
 
8
9
  super service
9
10
  end
10
11
 
11
- def configure(server)
12
- # Classes will add configuration
13
- end
14
-
15
12
  protected
16
13
 
17
14
  def perform_start
18
15
  server.add_http2_port("0.0.0.0:#{proxy.port}", :this_port_is_insecure)
19
- configure server
20
-
21
16
  server.run
22
17
  end
23
18
 
@@ -7,13 +7,16 @@ module Nonnative
7
7
  end
8
8
 
9
9
  def start(&block)
10
- all = processes + servers
11
- process_all(all, :start, :open?, &block)
10
+ [servers, processes].each { |t| process(t, :start, :open?, &block) }
12
11
  end
13
12
 
14
13
  def stop(&block)
15
- all = processes + servers
16
- process_all(all, :stop, :closed?, &block)
14
+ [processes, servers].each { |t| process(t, :stop, :closed?, &block) }
15
+ end
16
+
17
+ def server_by_name(name)
18
+ index = configuration.servers.find_index { |s| s.name == name }
19
+ servers[index].first
17
20
  end
18
21
 
19
22
  private
@@ -32,7 +35,7 @@ module Nonnative
32
35
  end
33
36
  end
34
37
 
35
- def process_all(all, type_method, port_method, &block)
38
+ def process(all, type_method, port_method, &block)
36
39
  types = []
37
40
  pids = []
38
41
  threads = []
@@ -2,8 +2,9 @@
2
2
 
3
3
  module Nonnative
4
4
  class Server < Nonnative::Service
5
+ attr_reader :proxy
6
+
5
7
  def initialize(service)
6
- @id = SecureRandom.hex(5)
7
8
  @proxy = Nonnative::ProxyFactory.create(service)
8
9
 
9
10
  super service
@@ -17,7 +18,7 @@ module Nonnative
17
18
  wait_start
18
19
  end
19
20
 
20
- id
21
+ object_id
21
22
  end
22
23
 
23
24
  def stop
@@ -30,15 +31,11 @@ module Nonnative
30
31
  wait_stop
31
32
  end
32
33
 
33
- id
34
+ object_id
34
35
  end
35
36
 
36
- protected
37
-
38
- attr_reader :id
39
-
40
37
  private
41
38
 
42
- attr_reader :proxy, :thread
39
+ attr_reader :thread
43
40
  end
44
41
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Nonnative
4
- VERSION = '1.16.0'
4
+ VERSION = '1.21.0'
5
5
  end
@@ -24,8 +24,9 @@ Gem::Specification.new do |spec|
24
24
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
25
25
  spec.require_paths = ['lib']
26
26
 
27
+ spec.add_dependency 'concurrent-ruby', '~> 1.0', '>= 1.0.5'
27
28
  spec.add_dependency 'cucumber', '~> 3.1', '>= 3.1.2'
28
- spec.add_dependency 'grpc', '~> 1.28'
29
+ spec.add_dependency 'grpc', ['>= 1', '< 2']
29
30
  spec.add_dependency 'puma', '~> 4.3', '>= 4.3.3'
30
31
  spec.add_dependency 'rest-client', '~> 2.1'
31
32
  spec.add_dependency 'rspec-benchmark', '~> 0.6.0'
@@ -34,9 +35,9 @@ Gem::Specification.new do |spec|
34
35
 
35
36
  spec.add_development_dependency 'bundler', '~> 2.1', '>= 2.1.4'
36
37
  spec.add_development_dependency 'chutney', '~> 2.0', '>= 2.0.3.1'
37
- spec.add_development_dependency 'grpc-tools', '~> 1.28'
38
+ spec.add_development_dependency 'grpc-tools', ['>= 1', '< 2']
38
39
  spec.add_development_dependency 'rake', '~> 13.0', '>= 13.0.1'
39
- spec.add_development_dependency 'rubocop', '~> 0.86.0'
40
+ spec.add_development_dependency 'rubocop', '~> 0.87.1'
40
41
  spec.add_development_dependency 'simplecov', '~> 0.17.1'
41
- spec.add_development_dependency 'solargraph', '~> 0.39.7'
42
+ spec.add_development_dependency 'solargraph', '~> 0.39.11'
42
43
  end
metadata CHANGED
@@ -1,15 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nonnative
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.16.0
4
+ version: 1.21.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Falkowski
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-07-03 00:00:00.000000000 Z
11
+ date: 2020-07-09 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: concurrent-ruby
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.0.5
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1.0'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.0.5
13
33
  - !ruby/object:Gem::Dependency
14
34
  name: cucumber
15
35
  requirement: !ruby/object:Gem::Requirement
@@ -34,16 +54,22 @@ dependencies:
34
54
  name: grpc
35
55
  requirement: !ruby/object:Gem::Requirement
36
56
  requirements:
37
- - - "~>"
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '1'
60
+ - - "<"
38
61
  - !ruby/object:Gem::Version
39
- version: '1.28'
62
+ version: '2'
40
63
  type: :runtime
41
64
  prerelease: false
42
65
  version_requirements: !ruby/object:Gem::Requirement
43
66
  requirements:
44
- - - "~>"
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '1'
70
+ - - "<"
45
71
  - !ruby/object:Gem::Version
46
- version: '1.28'
72
+ version: '2'
47
73
  - !ruby/object:Gem::Dependency
48
74
  name: puma
49
75
  requirement: !ruby/object:Gem::Requirement
@@ -176,16 +202,22 @@ dependencies:
176
202
  name: grpc-tools
177
203
  requirement: !ruby/object:Gem::Requirement
178
204
  requirements:
179
- - - "~>"
205
+ - - ">="
206
+ - !ruby/object:Gem::Version
207
+ version: '1'
208
+ - - "<"
180
209
  - !ruby/object:Gem::Version
181
- version: '1.28'
210
+ version: '2'
182
211
  type: :development
183
212
  prerelease: false
184
213
  version_requirements: !ruby/object:Gem::Requirement
185
214
  requirements:
186
- - - "~>"
215
+ - - ">="
216
+ - !ruby/object:Gem::Version
217
+ version: '1'
218
+ - - "<"
187
219
  - !ruby/object:Gem::Version
188
- version: '1.28'
220
+ version: '2'
189
221
  - !ruby/object:Gem::Dependency
190
222
  name: rake
191
223
  requirement: !ruby/object:Gem::Requirement
@@ -212,14 +244,14 @@ dependencies:
212
244
  requirements:
213
245
  - - "~>"
214
246
  - !ruby/object:Gem::Version
215
- version: 0.86.0
247
+ version: 0.87.1
216
248
  type: :development
217
249
  prerelease: false
218
250
  version_requirements: !ruby/object:Gem::Requirement
219
251
  requirements:
220
252
  - - "~>"
221
253
  - !ruby/object:Gem::Version
222
- version: 0.86.0
254
+ version: 0.87.1
223
255
  - !ruby/object:Gem::Dependency
224
256
  name: simplecov
225
257
  requirement: !ruby/object:Gem::Requirement
@@ -240,14 +272,14 @@ dependencies:
240
272
  requirements:
241
273
  - - "~>"
242
274
  - !ruby/object:Gem::Version
243
- version: 0.39.7
275
+ version: 0.39.11
244
276
  type: :development
245
277
  prerelease: false
246
278
  version_requirements: !ruby/object:Gem::Requirement
247
279
  requirements:
248
280
  - - "~>"
249
281
  - !ruby/object:Gem::Version
250
- version: 0.39.7
282
+ version: 0.39.11
251
283
  description: Allows you to keep using the power of ruby to test other systems
252
284
  email:
253
285
  - alexrfalkowski@gmail.com
@@ -301,7 +333,7 @@ homepage: https://github.com/alexfalkowski/nonnative
301
333
  licenses:
302
334
  - Unlicense
303
335
  metadata: {}
304
- post_install_message:
336
+ post_install_message:
305
337
  rdoc_options: []
306
338
  require_paths:
307
339
  - lib
@@ -316,8 +348,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
316
348
  - !ruby/object:Gem::Version
317
349
  version: '0'
318
350
  requirements: []
319
- rubygems_version: 3.0.8
320
- signing_key:
351
+ rubygems_version: 3.0.3
352
+ signing_key:
321
353
  specification_version: 4
322
354
  summary: Allows you to keep using the power of ruby to test other systems
323
355
  test_files: []