nonnative 1.41.0 → 1.46.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 +4 -4
- data/CHANGELOG.md +46 -0
- data/Gemfile.lock +10 -10
- data/README.md +175 -30
- data/lib/nonnative.rb +12 -7
- data/lib/nonnative/before.rb +0 -2
- data/lib/nonnative/close_all_socket_pair.rb +0 -1
- data/lib/nonnative/configuration.rb +87 -58
- data/lib/nonnative/configuration_process.rb +1 -1
- data/lib/nonnative/configuration_runner.rb +19 -0
- data/lib/nonnative/configuration_server.rb +1 -1
- data/lib/nonnative/configuration_service.rb +1 -14
- data/lib/nonnative/cucumber.rb +31 -0
- data/lib/nonnative/fault_injection_proxy.rb +2 -2
- data/lib/nonnative/not_found_error.rb +6 -0
- data/lib/nonnative/pool.rb +23 -8
- data/lib/nonnative/process.rb +1 -1
- data/lib/nonnative/runner.rb +29 -0
- data/lib/nonnative/server.rb +1 -3
- data/lib/nonnative/service.rb +5 -21
- data/lib/nonnative/version.rb +1 -1
- data/nonnative.gemspec +2 -2
- metadata +9 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5ab3f3907cd50fe1984cc57c28da9a17612beba23d73e8e82111ab133569a082
|
|
4
|
+
data.tar.gz: 71601b678ec6a2dbf53a1a2347955c691619dcf7310224d974d0b84bdc4de922
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 0bcee6e1dfcba57e0a6be43cff1be649f9fcff7c1ec94a26cca48e47b1ae0d734a279ff61464acdca5e531ba4abfb79479a9f473bd893f63d97efa575b7387e4
|
|
7
|
+
data.tar.gz: 91d0a695d1d2efc013af95e4a10db2637c8d47dfa21ab49a0765098f7f69c34520e514598aadca2652d69610b7baeea76822388c6030f33b3f0c78c33ec039ea
|
data/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,52 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
4
4
|
|
|
5
|
+
## [1.46.0](https://github.com/alexfalkowski/nonnative/compare/v1.45.0...v1.46.0) (2021-05-10)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
* add loading config through configure ([#87](https://github.com/alexfalkowski/nonnative/issues/87)) ([a95e8b6](https://github.com/alexfalkowski/nonnative/commit/a95e8b6817380afd732d0aefb170726f905548cb))
|
|
11
|
+
|
|
12
|
+
## [1.45.0](https://github.com/alexfalkowski/nonnative/compare/v1.44.1...v1.45.0) (2021-05-10)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
### Features
|
|
16
|
+
|
|
17
|
+
* add loading go command through config ([#86](https://github.com/alexfalkowski/nonnative/issues/86)) ([2f500d3](https://github.com/alexfalkowski/nonnative/commit/2f500d34ef6eb536b223651f84213f4f3d10c496))
|
|
18
|
+
|
|
19
|
+
### [1.44.1](https://github.com/alexfalkowski/nonnative/compare/v1.44.0...v1.44.1) (2021-05-06)
|
|
20
|
+
|
|
21
|
+
## [1.44.0](https://github.com/alexfalkowski/nonnative/compare/v1.43.0...v1.44.0) (2021-05-01)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
### Features
|
|
25
|
+
|
|
26
|
+
* move to reusable steps ([#84](https://github.com/alexfalkowski/nonnative/issues/84)) ([37b6175](https://github.com/alexfalkowski/nonnative/commit/37b6175e920dfb70f3d6f13226240dd045c2db3d))
|
|
27
|
+
|
|
28
|
+
## [1.43.0](https://github.com/alexfalkowski/nonnative/compare/v1.42.2...v1.43.0) (2021-04-30)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
### Features
|
|
32
|
+
|
|
33
|
+
* release version 1.43.0 ([#83](https://github.com/alexfalkowski/nonnative/issues/83)) ([b51526d](https://github.com/alexfalkowski/nonnative/commit/b51526d99d24522a26f534d28769cc8cdee4af04))
|
|
34
|
+
|
|
35
|
+
### [1.42.2](https://github.com/alexfalkowski/nonnative/compare/v1.42.1...v1.42.2) (2021-04-30)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
### Bug Fixes
|
|
39
|
+
|
|
40
|
+
* make sure we parse services config ([#82](https://github.com/alexfalkowski/nonnative/issues/82)) ([2a52af7](https://github.com/alexfalkowski/nonnative/commit/2a52af74b75443674a2235c424d69f15516ab60f))
|
|
41
|
+
|
|
42
|
+
### [1.42.1](https://github.com/alexfalkowski/nonnative/compare/v1.42.0...v1.42.1) (2021-04-30)
|
|
43
|
+
|
|
44
|
+
## [1.42.0](https://github.com/alexfalkowski/nonnative/compare/v1.41.0...v1.42.0) (2021-04-30)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
### Features
|
|
48
|
+
|
|
49
|
+
* add services ([#80](https://github.com/alexfalkowski/nonnative/issues/80)) ([454980e](https://github.com/alexfalkowski/nonnative/commit/454980e1eb141995c96203fcf9254bfe2cb0133e))
|
|
50
|
+
|
|
5
51
|
## [1.41.0](https://github.com/alexfalkowski/nonnative/compare/v1.40.2...v1.41.0) (2021-04-30)
|
|
6
52
|
|
|
7
53
|
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
nonnative (1.
|
|
4
|
+
nonnative (1.46.0)
|
|
5
5
|
concurrent-ruby (~> 1.0, >= 1.0.5)
|
|
6
6
|
cucumber (>= 6, < 7)
|
|
7
7
|
grpc (>= 1, < 2)
|
|
@@ -15,7 +15,7 @@ PATH
|
|
|
15
15
|
GEM
|
|
16
16
|
remote: https://rubygems.org/
|
|
17
17
|
specs:
|
|
18
|
-
activesupport (6.1.3.
|
|
18
|
+
activesupport (6.1.3.2)
|
|
19
19
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
|
20
20
|
i18n (>= 1.6, < 2)
|
|
21
21
|
minitest (>= 5.1)
|
|
@@ -73,7 +73,7 @@ GEM
|
|
|
73
73
|
unf (>= 0.0.5, < 1.0.0)
|
|
74
74
|
e2mmap (0.1.0)
|
|
75
75
|
ffi (1.15.0)
|
|
76
|
-
google-protobuf (3.
|
|
76
|
+
google-protobuf (3.16.0)
|
|
77
77
|
googleapis-common-protos-types (1.0.6)
|
|
78
78
|
google-protobuf (~> 3.14)
|
|
79
79
|
grpc (1.37.1)
|
|
@@ -106,14 +106,14 @@ GEM
|
|
|
106
106
|
mini_portile2 (~> 2.5.0)
|
|
107
107
|
racc (~> 1.4)
|
|
108
108
|
parallel (1.20.1)
|
|
109
|
-
parser (3.0.1.
|
|
109
|
+
parser (3.0.1.1)
|
|
110
110
|
ast (~> 2.4.1)
|
|
111
111
|
protobuf-cucumber (3.10.8)
|
|
112
112
|
activesupport (>= 3.2)
|
|
113
113
|
middleware
|
|
114
114
|
thor
|
|
115
115
|
thread_safe
|
|
116
|
-
puma (5.
|
|
116
|
+
puma (5.3.0)
|
|
117
117
|
nio4r (~> 2.0)
|
|
118
118
|
racc (1.5.2)
|
|
119
119
|
rack (2.2.3)
|
|
@@ -147,17 +147,17 @@ GEM
|
|
|
147
147
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
148
148
|
rspec-support (~> 3.10.0)
|
|
149
149
|
rspec-support (3.10.2)
|
|
150
|
-
rubocop (1.
|
|
150
|
+
rubocop (1.14.0)
|
|
151
151
|
parallel (~> 1.10)
|
|
152
152
|
parser (>= 3.0.0.0)
|
|
153
153
|
rainbow (>= 2.2.2, < 4.0)
|
|
154
154
|
regexp_parser (>= 1.8, < 3.0)
|
|
155
155
|
rexml
|
|
156
|
-
rubocop-ast (>= 1.
|
|
156
|
+
rubocop-ast (>= 1.5.0, < 2.0)
|
|
157
157
|
ruby-progressbar (~> 1.7)
|
|
158
158
|
unicode-display_width (>= 1.4.0, < 3.0)
|
|
159
|
-
rubocop-ast (1.
|
|
160
|
-
parser (>=
|
|
159
|
+
rubocop-ast (1.5.0)
|
|
160
|
+
parser (>= 3.0.1.1)
|
|
161
161
|
ruby-progressbar (1.11.0)
|
|
162
162
|
ruby2_keywords (0.0.4)
|
|
163
163
|
simplecov (0.16.1)
|
|
@@ -210,7 +210,7 @@ DEPENDENCIES
|
|
|
210
210
|
bundler (~> 2.1, >= 2.1.4)
|
|
211
211
|
coveralls (~> 0.8.23)
|
|
212
212
|
nonnative!
|
|
213
|
-
rubocop (~> 1.
|
|
213
|
+
rubocop (~> 1.14)
|
|
214
214
|
solargraph (~> 0.40.4)
|
|
215
215
|
|
|
216
216
|
BUNDLED WITH
|
data/README.md
CHANGED
|
@@ -33,12 +33,12 @@ Or install it yourself as:
|
|
|
33
33
|
|
|
34
34
|
Configure nonnative with the following:
|
|
35
35
|
|
|
36
|
-
- Process
|
|
36
|
+
- Process, Server or Service that you want to start.
|
|
37
37
|
- A timeout value.
|
|
38
38
|
- Port to verify.
|
|
39
39
|
- The class for servers.
|
|
40
40
|
- The log for servers/processes
|
|
41
|
-
- The strategy for processes
|
|
41
|
+
- The strategy for processes, servers and services.
|
|
42
42
|
|
|
43
43
|
### Strategy
|
|
44
44
|
|
|
@@ -53,6 +53,8 @@ This can be overridden by the following environment variables:
|
|
|
53
53
|
|
|
54
54
|
### Processes
|
|
55
55
|
|
|
56
|
+
A process is some sort of command that you would run locally.
|
|
57
|
+
|
|
56
58
|
Setup it up programmatically:
|
|
57
59
|
|
|
58
60
|
```ruby
|
|
@@ -84,7 +86,7 @@ Setup it up through configuration:
|
|
|
84
86
|
|
|
85
87
|
```yaml
|
|
86
88
|
version: 1.0
|
|
87
|
-
strategy:
|
|
89
|
+
strategy: startup
|
|
88
90
|
processes:
|
|
89
91
|
-
|
|
90
92
|
name: start_1
|
|
@@ -106,11 +108,15 @@ Then load the file with
|
|
|
106
108
|
```ruby
|
|
107
109
|
require 'nonnative'
|
|
108
110
|
|
|
109
|
-
Nonnative.
|
|
111
|
+
Nonnative.configure do |config|
|
|
112
|
+
config.load_file('configuration.yml')
|
|
113
|
+
end
|
|
110
114
|
```
|
|
111
115
|
|
|
112
116
|
### Servers
|
|
113
117
|
|
|
118
|
+
A server is a dependency to some external API.
|
|
119
|
+
|
|
114
120
|
Define your server:
|
|
115
121
|
|
|
116
122
|
```ruby
|
|
@@ -140,7 +146,7 @@ Setup it up programmatically:
|
|
|
140
146
|
require 'nonnative'
|
|
141
147
|
|
|
142
148
|
Nonnative.configure do |config|
|
|
143
|
-
config.strategy = :
|
|
149
|
+
config.strategy = :startup
|
|
144
150
|
|
|
145
151
|
config.server do |s|
|
|
146
152
|
s.name = 'server_1'
|
|
@@ -164,17 +170,17 @@ Setup it up through configuration:
|
|
|
164
170
|
|
|
165
171
|
```yaml
|
|
166
172
|
version: 1.0
|
|
167
|
-
strategy:
|
|
173
|
+
strategy: startup
|
|
168
174
|
servers:
|
|
169
175
|
-
|
|
170
176
|
name: server_1
|
|
171
|
-
|
|
177
|
+
class: Nonnative::EchoServer
|
|
172
178
|
timeout: 1
|
|
173
179
|
port: 12323
|
|
174
180
|
log: features/logs/server_1.log
|
|
175
181
|
-
|
|
176
182
|
name: server_2
|
|
177
|
-
|
|
183
|
+
class: Nonnative::EchoServer
|
|
178
184
|
timeout: 1
|
|
179
185
|
port: 12324
|
|
180
186
|
log: features/logs/server_2.log
|
|
@@ -185,7 +191,9 @@ Then load the file with:
|
|
|
185
191
|
```ruby
|
|
186
192
|
require 'nonnative'
|
|
187
193
|
|
|
188
|
-
Nonnative.
|
|
194
|
+
Nonnative.configure do |config|
|
|
195
|
+
config.load_file('configuration.yml')
|
|
196
|
+
end
|
|
189
197
|
```
|
|
190
198
|
|
|
191
199
|
#### HTTP
|
|
@@ -220,7 +228,7 @@ Setup it up programmatically:
|
|
|
220
228
|
require 'nonnative'
|
|
221
229
|
|
|
222
230
|
Nonnative.configure do |config|
|
|
223
|
-
config.strategy = :
|
|
231
|
+
config.strategy = :startup
|
|
224
232
|
|
|
225
233
|
config.server do |s|
|
|
226
234
|
s.name = 'http_server_1'
|
|
@@ -236,11 +244,11 @@ Setup it up through configuration:
|
|
|
236
244
|
|
|
237
245
|
```yaml
|
|
238
246
|
version: 1.0
|
|
239
|
-
strategy:
|
|
247
|
+
strategy: startup
|
|
240
248
|
servers:
|
|
241
249
|
-
|
|
242
250
|
name: http_server_1
|
|
243
|
-
|
|
251
|
+
class: Nonnative::Features::HTTPServer
|
|
244
252
|
timeout: 1
|
|
245
253
|
port: 4567
|
|
246
254
|
log: features/logs/http_server_1.log
|
|
@@ -251,7 +259,9 @@ Then load the file with:
|
|
|
251
259
|
```ruby
|
|
252
260
|
require 'nonnative'
|
|
253
261
|
|
|
254
|
-
Nonnative.
|
|
262
|
+
Nonnative.configure do |config|
|
|
263
|
+
config.load_file('configuration.yml')
|
|
264
|
+
end
|
|
255
265
|
```
|
|
256
266
|
|
|
257
267
|
#### gRPC
|
|
@@ -282,7 +292,7 @@ Setup it up programmatically:
|
|
|
282
292
|
require 'nonnative'
|
|
283
293
|
|
|
284
294
|
Nonnative.configure do |config|
|
|
285
|
-
config.strategy = :
|
|
295
|
+
config.strategy = :startup
|
|
286
296
|
|
|
287
297
|
config.server do |s|
|
|
288
298
|
s.name = 'grpc_server_1'
|
|
@@ -298,11 +308,11 @@ Setup it up through configuration:
|
|
|
298
308
|
|
|
299
309
|
```yaml
|
|
300
310
|
version: 1.0
|
|
301
|
-
strategy:
|
|
311
|
+
strategy: startup
|
|
302
312
|
servers:
|
|
303
313
|
-
|
|
304
314
|
name: grpc_server_1
|
|
305
|
-
|
|
315
|
+
class: Nonnative::Features::GRPCServer
|
|
306
316
|
timeout: 1
|
|
307
317
|
port: 9002
|
|
308
318
|
log: features/logs/grpc_server_1.log
|
|
@@ -313,8 +323,59 @@ Then load the file with:
|
|
|
313
323
|
```ruby
|
|
314
324
|
require 'nonnative'
|
|
315
325
|
|
|
316
|
-
Nonnative.
|
|
326
|
+
Nonnative.configure do |config|
|
|
327
|
+
config.load_file('configuration.yml')
|
|
328
|
+
end
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
### Services
|
|
332
|
+
|
|
333
|
+
A service is an external dependency to your system. This is usually an expensive process to start like a DB and you would prefer to be managed externally. Services are not really exciting by themselves, it's when we add proxies that they allow us to do some extra work.
|
|
334
|
+
|
|
335
|
+
Setup it up programmatically:
|
|
336
|
+
|
|
337
|
+
```ruby
|
|
338
|
+
require 'nonnative'
|
|
339
|
+
|
|
340
|
+
Nonnative.configure do |config|
|
|
341
|
+
config.strategy = :startup
|
|
342
|
+
|
|
343
|
+
config.service do |s|
|
|
344
|
+
s.name = 'postgres'
|
|
345
|
+
p.port = 5432
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
config.service do |s|
|
|
349
|
+
s.name = 'redis'
|
|
350
|
+
s.port = 6379
|
|
351
|
+
end
|
|
352
|
+
end
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
Setup it up through configuration:
|
|
356
|
+
|
|
357
|
+
```yaml
|
|
358
|
+
version: 1.0
|
|
359
|
+
strategy: startup
|
|
360
|
+
processes:
|
|
361
|
+
-
|
|
362
|
+
name: postgres
|
|
363
|
+
port: 5432
|
|
364
|
+
-
|
|
365
|
+
name: redis
|
|
366
|
+
port: 6379
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
Then load the file with
|
|
370
|
+
|
|
371
|
+
```ruby
|
|
372
|
+
require 'nonnative'
|
|
373
|
+
|
|
374
|
+
Nonnative.configure do |config|
|
|
375
|
+
config.load_file('configuration.yml')
|
|
376
|
+
end
|
|
317
377
|
```
|
|
378
|
+
|
|
318
379
|
#### Proxies
|
|
319
380
|
|
|
320
381
|
We allow different proxies to be configured. These proxies can be used to simulate all kind of situations. The proxies that can be configured are:
|
|
@@ -329,7 +390,7 @@ Setup it up programmatically:
|
|
|
329
390
|
require 'nonnative'
|
|
330
391
|
|
|
331
392
|
Nonnative.configure do |config|
|
|
332
|
-
config.strategy = :
|
|
393
|
+
config.strategy = :startup
|
|
333
394
|
|
|
334
395
|
config.process do |p|
|
|
335
396
|
p.proxy = {
|
|
@@ -348,7 +409,7 @@ Setup it up through configuration:
|
|
|
348
409
|
|
|
349
410
|
```yaml
|
|
350
411
|
version: 1.0
|
|
351
|
-
strategy:
|
|
412
|
+
strategy: startup
|
|
352
413
|
processes:
|
|
353
414
|
-
|
|
354
415
|
proxy:
|
|
@@ -367,7 +428,7 @@ Setup it up programmatically:
|
|
|
367
428
|
require 'nonnative'
|
|
368
429
|
|
|
369
430
|
Nonnative.configure do |config|
|
|
370
|
-
config.strategy = :
|
|
431
|
+
config.strategy = :startup
|
|
371
432
|
|
|
372
433
|
config.server do |s|
|
|
373
434
|
s.proxy = {
|
|
@@ -386,7 +447,7 @@ Setup it up through configuration:
|
|
|
386
447
|
|
|
387
448
|
```yaml
|
|
388
449
|
version: 1.0
|
|
389
|
-
strategy:
|
|
450
|
+
strategy: startup
|
|
390
451
|
servers:
|
|
391
452
|
-
|
|
392
453
|
proxy:
|
|
@@ -397,6 +458,44 @@ servers:
|
|
|
397
458
|
delay: 5
|
|
398
459
|
```
|
|
399
460
|
|
|
461
|
+
##### Services
|
|
462
|
+
|
|
463
|
+
Setup it up programmatically:
|
|
464
|
+
|
|
465
|
+
```ruby
|
|
466
|
+
require 'nonnative'
|
|
467
|
+
|
|
468
|
+
Nonnative.configure do |config|
|
|
469
|
+
config.strategy = :startup
|
|
470
|
+
|
|
471
|
+
config.service do |s|
|
|
472
|
+
s.proxy = {
|
|
473
|
+
type: 'fault_injection',
|
|
474
|
+
port: 20_000,
|
|
475
|
+
log: 'features/logs/proxy_server.log',
|
|
476
|
+
options: {
|
|
477
|
+
delay: 5
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
end
|
|
481
|
+
end
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
Setup it up through configuration:
|
|
485
|
+
|
|
486
|
+
```yaml
|
|
487
|
+
version: 1.0
|
|
488
|
+
strategy: startup
|
|
489
|
+
services:
|
|
490
|
+
-
|
|
491
|
+
proxy:
|
|
492
|
+
type: fault_injection
|
|
493
|
+
port: 20000
|
|
494
|
+
log: features/logs/proxy_server.log
|
|
495
|
+
options:
|
|
496
|
+
delay: 5
|
|
497
|
+
```
|
|
498
|
+
|
|
400
499
|
##### Fault Injection
|
|
401
500
|
|
|
402
501
|
The `fault_injection` proxy allows you to simulate failures by injecting them. We currently support the following:
|
|
@@ -416,6 +515,13 @@ server.proxy.close_all # To use close_all.
|
|
|
416
515
|
server.proxy.reset # To reset it back to a good state.
|
|
417
516
|
```
|
|
418
517
|
|
|
518
|
+
With cucumber:
|
|
519
|
+
|
|
520
|
+
```cucumber
|
|
521
|
+
Given I set the proxy for process 'process_1' to 'close_all'
|
|
522
|
+
Then And I should reset the proxy for process 'process_1'
|
|
523
|
+
```
|
|
524
|
+
|
|
419
525
|
###### Servers
|
|
420
526
|
|
|
421
527
|
Setup it up programmatically:
|
|
@@ -428,6 +534,32 @@ server.proxy.close_all # To use close_all.
|
|
|
428
534
|
server.proxy.reset # To reset it back to a good state.
|
|
429
535
|
```
|
|
430
536
|
|
|
537
|
+
With cucumber:
|
|
538
|
+
|
|
539
|
+
```cucumber
|
|
540
|
+
Given I set the proxy for server 'server_1' to 'close_all'
|
|
541
|
+
Then And I should reset the proxy for server 'server_1'
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
###### Services
|
|
545
|
+
|
|
546
|
+
Setup it up programmatically:
|
|
547
|
+
|
|
548
|
+
```ruby
|
|
549
|
+
name = 'name of service in configuration'
|
|
550
|
+
service = Nonnative.pool.service_by_name(name)
|
|
551
|
+
|
|
552
|
+
service.proxy.close_all # To use close_all.
|
|
553
|
+
service.proxy.reset # To reset it back to a good state.
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
With cucumber:
|
|
557
|
+
|
|
558
|
+
```cucumber
|
|
559
|
+
Given I set the proxy for service 'service_1' to 'close_all'
|
|
560
|
+
Then And I should reset the proxy for service 'service_1'
|
|
561
|
+
```
|
|
562
|
+
|
|
431
563
|
### Go
|
|
432
564
|
|
|
433
565
|
As we love using go as a language for services we have added support to start binaries with defined parameters. This expects that you build your services in the format of `command sub_command --params`
|
|
@@ -439,16 +571,10 @@ To get this to work you will need to create a `main_test.go` file with these con
|
|
|
439
571
|
|
|
440
572
|
package main
|
|
441
573
|
|
|
442
|
-
import
|
|
443
|
-
"testing"
|
|
444
|
-
|
|
445
|
-
"github.com/your_location/cmd"
|
|
446
|
-
)
|
|
574
|
+
import "testing"
|
|
447
575
|
|
|
448
576
|
func TestFeatures(t *testing.T) {
|
|
449
|
-
|
|
450
|
-
t.Fatal(err.Error())
|
|
451
|
-
}
|
|
577
|
+
main()
|
|
452
578
|
}
|
|
453
579
|
```
|
|
454
580
|
|
|
@@ -458,8 +584,27 @@ Then to compile this binary you will need to do the following:
|
|
|
458
584
|
go test -mod vendor -c -tags features -covermode=count -o your_binary -coverpkg=./... github.com/your_location
|
|
459
585
|
```
|
|
460
586
|
|
|
461
|
-
|
|
587
|
+
Setup it up programmatically:
|
|
462
588
|
|
|
463
589
|
```ruby
|
|
464
590
|
Nonnative.go_executable('reports', 'your_binary', 'sub_command', '--config config.yaml')
|
|
465
591
|
```
|
|
592
|
+
|
|
593
|
+
Setup it up through configuration:
|
|
594
|
+
|
|
595
|
+
```yaml
|
|
596
|
+
version: 1.0
|
|
597
|
+
strategy: startup
|
|
598
|
+
processes:
|
|
599
|
+
-
|
|
600
|
+
name: go
|
|
601
|
+
go:
|
|
602
|
+
output: reports
|
|
603
|
+
executable: your_binary
|
|
604
|
+
command: sub_command
|
|
605
|
+
parameters:
|
|
606
|
+
- --config config.yaml
|
|
607
|
+
timeout: 5
|
|
608
|
+
port: 8000
|
|
609
|
+
log: features/logs/go.log
|
|
610
|
+
```
|
data/lib/nonnative.rb
CHANGED
|
@@ -11,22 +11,26 @@ require 'rest-client'
|
|
|
11
11
|
require 'puma'
|
|
12
12
|
require 'puma/server'
|
|
13
13
|
require 'concurrent'
|
|
14
|
+
require 'cucumber'
|
|
14
15
|
|
|
15
16
|
require 'nonnative/version'
|
|
16
17
|
require 'nonnative/error'
|
|
17
18
|
require 'nonnative/start_error'
|
|
18
19
|
require 'nonnative/stop_error'
|
|
20
|
+
require 'nonnative/not_found_error'
|
|
19
21
|
require 'nonnative/timeout'
|
|
20
22
|
require 'nonnative/port'
|
|
21
23
|
require 'nonnative/configuration'
|
|
22
|
-
require 'nonnative/
|
|
24
|
+
require 'nonnative/configuration_runner'
|
|
23
25
|
require 'nonnative/configuration_process'
|
|
24
26
|
require 'nonnative/configuration_server'
|
|
27
|
+
require 'nonnative/configuration_service'
|
|
25
28
|
require 'nonnative/configuration_proxy'
|
|
26
|
-
require 'nonnative/
|
|
29
|
+
require 'nonnative/runner'
|
|
27
30
|
require 'nonnative/process'
|
|
28
|
-
require 'nonnative/pool'
|
|
29
31
|
require 'nonnative/server'
|
|
32
|
+
require 'nonnative/service'
|
|
33
|
+
require 'nonnative/pool'
|
|
30
34
|
require 'nonnative/http_client'
|
|
31
35
|
require 'nonnative/http_server'
|
|
32
36
|
require 'nonnative/grpc_server'
|
|
@@ -42,17 +46,18 @@ require 'nonnative/invalid_data_socket_pair'
|
|
|
42
46
|
require 'nonnative/socket_pair_factory'
|
|
43
47
|
require 'nonnative/strategy'
|
|
44
48
|
require 'nonnative/go_command'
|
|
49
|
+
require 'nonnative/cucumber'
|
|
45
50
|
|
|
46
51
|
module Nonnative
|
|
47
52
|
class << self
|
|
48
53
|
attr_reader :pool
|
|
49
54
|
|
|
50
|
-
def
|
|
51
|
-
|
|
55
|
+
def log_lines(path, predicate)
|
|
56
|
+
File.readlines(path).select { |l| predicate.call(l) }
|
|
52
57
|
end
|
|
53
58
|
|
|
54
|
-
def
|
|
55
|
-
|
|
59
|
+
def go_executable(output, exec, cmd, *params)
|
|
60
|
+
Nonnative::GoCommand.new(exec, output).executable(cmd, params)
|
|
56
61
|
end
|
|
57
62
|
|
|
58
63
|
def configuration
|
data/lib/nonnative/before.rb
CHANGED
|
@@ -2,72 +2,26 @@
|
|
|
2
2
|
|
|
3
3
|
module Nonnative
|
|
4
4
|
class Configuration
|
|
5
|
-
class << self
|
|
6
|
-
def load_file(path)
|
|
7
|
-
file = YAML.load_file(path)
|
|
8
|
-
|
|
9
|
-
new.tap do |c|
|
|
10
|
-
c.strategy = file['strategy']
|
|
11
|
-
|
|
12
|
-
processes(file, c)
|
|
13
|
-
servers(file, c)
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
private
|
|
18
|
-
|
|
19
|
-
def processes(file, config)
|
|
20
|
-
processes = file['processes'] || []
|
|
21
|
-
processes.each do |fd|
|
|
22
|
-
config.process do |d|
|
|
23
|
-
d.name = fd['name']
|
|
24
|
-
d.command = fd['command']
|
|
25
|
-
d.timeout = fd['timeout']
|
|
26
|
-
d.port = fd['port']
|
|
27
|
-
d.log = fd['log']
|
|
28
|
-
d.signal = fd['signal']
|
|
29
|
-
|
|
30
|
-
proxy d, fd['proxy']
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def servers(file, config)
|
|
36
|
-
servers = file['servers'] || []
|
|
37
|
-
servers.each do |fd|
|
|
38
|
-
config.server do |s|
|
|
39
|
-
s.name = fd['name']
|
|
40
|
-
s.klass = Object.const_get(fd['klass'])
|
|
41
|
-
s.timeout = fd['timeout']
|
|
42
|
-
s.port = fd['port']
|
|
43
|
-
s.log = fd['log']
|
|
44
|
-
|
|
45
|
-
proxy s, fd['proxy']
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
def proxy(server, proxy)
|
|
51
|
-
return unless proxy
|
|
52
|
-
|
|
53
|
-
server.proxy = {
|
|
54
|
-
type: proxy['type'],
|
|
55
|
-
port: proxy['port'],
|
|
56
|
-
log: proxy['log'],
|
|
57
|
-
options: proxy['options']
|
|
58
|
-
}
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
|
|
62
5
|
def initialize
|
|
63
6
|
@strategy = Strategy.new
|
|
64
7
|
@processes = []
|
|
65
8
|
@servers = []
|
|
9
|
+
@services = []
|
|
66
10
|
end
|
|
67
11
|
|
|
68
|
-
attr_accessor :processes, :servers
|
|
12
|
+
attr_accessor :processes, :servers, :services
|
|
69
13
|
attr_reader :strategy
|
|
70
14
|
|
|
15
|
+
def load_file(path)
|
|
16
|
+
file = YAML.load_file(path)
|
|
17
|
+
|
|
18
|
+
self.strategy = file['strategy']
|
|
19
|
+
|
|
20
|
+
add_processes(file)
|
|
21
|
+
add_servers(file)
|
|
22
|
+
add_services(file)
|
|
23
|
+
end
|
|
24
|
+
|
|
71
25
|
def strategy=(value)
|
|
72
26
|
@strategy = Strategy.new(value)
|
|
73
27
|
end
|
|
@@ -85,5 +39,80 @@ module Nonnative
|
|
|
85
39
|
|
|
86
40
|
servers << server
|
|
87
41
|
end
|
|
42
|
+
|
|
43
|
+
def service
|
|
44
|
+
service = Nonnative::ConfigurationService.new
|
|
45
|
+
yield service
|
|
46
|
+
|
|
47
|
+
services << service
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
private
|
|
51
|
+
|
|
52
|
+
def add_processes(file)
|
|
53
|
+
processes = file['processes'] || []
|
|
54
|
+
processes.each do |fd|
|
|
55
|
+
process do |d|
|
|
56
|
+
d.name = fd['name']
|
|
57
|
+
d.command = command(fd)
|
|
58
|
+
d.timeout = fd['timeout']
|
|
59
|
+
d.port = fd['port']
|
|
60
|
+
d.log = fd['log']
|
|
61
|
+
d.signal = fd['signal']
|
|
62
|
+
|
|
63
|
+
proxy d, fd['proxy']
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def command(process)
|
|
69
|
+
go = process['go']
|
|
70
|
+
if go
|
|
71
|
+
params = go['parameters'] || []
|
|
72
|
+
Nonnative.go_executable(go['output'], go['executable'], go['command'], *params)
|
|
73
|
+
else
|
|
74
|
+
process['command']
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def add_servers(file)
|
|
79
|
+
servers = file['servers'] || []
|
|
80
|
+
servers.each do |fd|
|
|
81
|
+
server do |s|
|
|
82
|
+
s.name = fd['name']
|
|
83
|
+
s.klass = Object.const_get(fd['class'])
|
|
84
|
+
s.timeout = fd['timeout']
|
|
85
|
+
s.port = fd['port']
|
|
86
|
+
s.log = fd['log']
|
|
87
|
+
|
|
88
|
+
proxy s, fd['proxy']
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def add_services(file)
|
|
94
|
+
services = file['services'] || []
|
|
95
|
+
services.each do |fd|
|
|
96
|
+
service do |s|
|
|
97
|
+
s.name = fd['name']
|
|
98
|
+
s.timeout = fd['timeout']
|
|
99
|
+
s.port = fd['port']
|
|
100
|
+
s.log = fd['log']
|
|
101
|
+
|
|
102
|
+
proxy s, fd['proxy']
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def proxy(runner, proxy)
|
|
108
|
+
return unless proxy
|
|
109
|
+
|
|
110
|
+
runner.proxy = {
|
|
111
|
+
type: proxy['type'],
|
|
112
|
+
port: proxy['port'],
|
|
113
|
+
log: proxy['log'],
|
|
114
|
+
options: proxy['options']
|
|
115
|
+
}
|
|
116
|
+
end
|
|
88
117
|
end
|
|
89
118
|
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Nonnative
|
|
4
|
+
class ConfigurationRunner
|
|
5
|
+
attr_accessor :name, :timeout, :port, :log
|
|
6
|
+
attr_reader :proxy
|
|
7
|
+
|
|
8
|
+
def initialize
|
|
9
|
+
@proxy = Nonnative::ConfigurationProxy.new
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def proxy=(value)
|
|
13
|
+
proxy.type = value[:type]
|
|
14
|
+
proxy.port = value[:port]
|
|
15
|
+
proxy.log = value[:log]
|
|
16
|
+
proxy.options = value[:options]
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -1,19 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
module Nonnative
|
|
4
|
-
class ConfigurationService
|
|
5
|
-
attr_accessor :name, :timeout, :port, :log
|
|
6
|
-
attr_reader :proxy
|
|
7
|
-
|
|
8
|
-
def initialize
|
|
9
|
-
@proxy = Nonnative::ConfigurationProxy.new
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def proxy=(value)
|
|
13
|
-
proxy.type = value[:type]
|
|
14
|
-
proxy.port = value[:port]
|
|
15
|
-
proxy.log = value[:log]
|
|
16
|
-
proxy.options = value[:options]
|
|
17
|
-
end
|
|
4
|
+
class ConfigurationService < ConfigurationRunner
|
|
18
5
|
end
|
|
19
6
|
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Given('I set the proxy for process {string} to {string}') do |name, operation|
|
|
4
|
+
server = Nonnative.pool.process_by_name(name)
|
|
5
|
+
server.proxy.send(operation)
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
Given('I set the proxy for server {string} to {string}') do |name, operation|
|
|
9
|
+
server = Nonnative.pool.server_by_name(name)
|
|
10
|
+
server.proxy.send(operation)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
Given('I set the proxy for service {string} to {string}') do |name, operation|
|
|
14
|
+
service = Nonnative.pool.service_by_name(name)
|
|
15
|
+
service.proxy.send(operation)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
Then('I should reset the proxy for process {string}') do |name|
|
|
19
|
+
server = Nonnative.pool.process_by_name(name)
|
|
20
|
+
server.proxy.reset
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
Then('I should reset the proxy for server {string}') do |name|
|
|
24
|
+
server = Nonnative.pool.server_by_name(name)
|
|
25
|
+
server.proxy.reset
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
Then('I should reset the proxy for service {string}') do |name|
|
|
29
|
+
service = Nonnative.pool.service_by_name(name)
|
|
30
|
+
service.proxy.reset
|
|
31
|
+
end
|
data/lib/nonnative/pool.rb
CHANGED
|
@@ -7,39 +7,54 @@ module Nonnative
|
|
|
7
7
|
end
|
|
8
8
|
|
|
9
9
|
def start(&block)
|
|
10
|
+
services.each(&:start)
|
|
10
11
|
[servers, processes].each { |t| process(t, :start, :open?, &block) }
|
|
11
12
|
end
|
|
12
13
|
|
|
13
14
|
def stop(&block)
|
|
14
15
|
[processes, servers].each { |t| process(t, :stop, :closed?, &block) }
|
|
16
|
+
services.each(&:stop)
|
|
15
17
|
end
|
|
16
18
|
|
|
17
19
|
def process_by_name(name)
|
|
18
|
-
|
|
19
|
-
processes[index].first
|
|
20
|
+
processes[runner_index(configuration.processes, name)].first
|
|
20
21
|
end
|
|
21
22
|
|
|
22
23
|
def server_by_name(name)
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
servers[runner_index(configuration.servers, name)].first
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def service_by_name(name)
|
|
28
|
+
services[runner_index(configuration.services, name)]
|
|
25
29
|
end
|
|
26
30
|
|
|
27
31
|
private
|
|
28
32
|
|
|
29
33
|
attr_reader :configuration
|
|
30
34
|
|
|
35
|
+
def runner_index(runners, name)
|
|
36
|
+
index = runners.find_index { |s| s.name == name }
|
|
37
|
+
raise NotFoundError, "Could not find runner with name '#{name}'" if index.nil?
|
|
38
|
+
|
|
39
|
+
index
|
|
40
|
+
end
|
|
41
|
+
|
|
31
42
|
def processes
|
|
32
|
-
@processes ||= configuration.processes.map do |
|
|
33
|
-
[Nonnative::Process.new(
|
|
43
|
+
@processes ||= configuration.processes.map do |p|
|
|
44
|
+
[Nonnative::Process.new(p), Nonnative::Port.new(p)]
|
|
34
45
|
end
|
|
35
46
|
end
|
|
36
47
|
|
|
37
48
|
def servers
|
|
38
|
-
@servers ||= configuration.servers.map do |
|
|
39
|
-
[
|
|
49
|
+
@servers ||= configuration.servers.map do |s|
|
|
50
|
+
[s.klass.new(s), Nonnative::Port.new(s)]
|
|
40
51
|
end
|
|
41
52
|
end
|
|
42
53
|
|
|
54
|
+
def services
|
|
55
|
+
@services ||= configuration.services.map { |s| Nonnative::Service.new(s) }
|
|
56
|
+
end
|
|
57
|
+
|
|
43
58
|
def process(all, type_method, port_method, &block)
|
|
44
59
|
types = []
|
|
45
60
|
pids = []
|
data/lib/nonnative/process.rb
CHANGED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Nonnative
|
|
4
|
+
class Runner
|
|
5
|
+
attr_reader :proxy
|
|
6
|
+
|
|
7
|
+
def initialize(service)
|
|
8
|
+
@service = service
|
|
9
|
+
@timeout = Nonnative::Timeout.new(service.timeout)
|
|
10
|
+
@proxy = Nonnative::ProxyFactory.create(service)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def name
|
|
14
|
+
service.name
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
protected
|
|
18
|
+
|
|
19
|
+
attr_reader :service, :timeout
|
|
20
|
+
|
|
21
|
+
def wait_start
|
|
22
|
+
sleep 0.1
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def wait_stop
|
|
26
|
+
sleep 0.1
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
data/lib/nonnative/server.rb
CHANGED
data/lib/nonnative/service.rb
CHANGED
|
@@ -1,29 +1,13 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
module Nonnative
|
|
4
|
-
class Service
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
def initialize(service)
|
|
8
|
-
@service = service
|
|
9
|
-
@timeout = Nonnative::Timeout.new(service.timeout)
|
|
10
|
-
@proxy = Nonnative::ProxyFactory.create(service)
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def name
|
|
14
|
-
service.name
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
protected
|
|
18
|
-
|
|
19
|
-
attr_reader :service, :timeout
|
|
20
|
-
|
|
21
|
-
def wait_start
|
|
22
|
-
sleep 0.1
|
|
4
|
+
class Service < Runner
|
|
5
|
+
def start
|
|
6
|
+
proxy.start
|
|
23
7
|
end
|
|
24
8
|
|
|
25
|
-
def
|
|
26
|
-
|
|
9
|
+
def stop
|
|
10
|
+
proxy.stop
|
|
27
11
|
end
|
|
28
12
|
end
|
|
29
13
|
end
|
data/lib/nonnative/version.rb
CHANGED
data/nonnative.gemspec
CHANGED
|
@@ -8,7 +8,7 @@ require 'nonnative/version'
|
|
|
8
8
|
Gem::Specification.new do |spec|
|
|
9
9
|
spec.name = 'nonnative'
|
|
10
10
|
spec.version = Nonnative::VERSION
|
|
11
|
-
spec.authors = ['
|
|
11
|
+
spec.authors = ['Alejandro Falkowski']
|
|
12
12
|
spec.email = ['alexrfalkowski@gmail.com']
|
|
13
13
|
|
|
14
14
|
spec.summary = 'Allows you to keep using the power of ruby to test other systems'
|
|
@@ -35,6 +35,6 @@ Gem::Specification.new do |spec|
|
|
|
35
35
|
|
|
36
36
|
spec.add_development_dependency 'bundler', '~> 2.1', '>= 2.1.4'
|
|
37
37
|
spec.add_development_dependency 'coveralls', '~> 0.8.23'
|
|
38
|
-
spec.add_development_dependency 'rubocop', '~> 1.
|
|
38
|
+
spec.add_development_dependency 'rubocop', '~> 1.14'
|
|
39
39
|
spec.add_development_dependency 'solargraph', '~> 0.40.4'
|
|
40
40
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: nonnative
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.46.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
|
-
-
|
|
7
|
+
- Alejandro Falkowski
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2021-
|
|
11
|
+
date: 2021-05-10 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: concurrent-ruby
|
|
@@ -212,14 +212,14 @@ dependencies:
|
|
|
212
212
|
requirements:
|
|
213
213
|
- - "~>"
|
|
214
214
|
- !ruby/object:Gem::Version
|
|
215
|
-
version: '1.
|
|
215
|
+
version: '1.14'
|
|
216
216
|
type: :development
|
|
217
217
|
prerelease: false
|
|
218
218
|
version_requirements: !ruby/object:Gem::Requirement
|
|
219
219
|
requirements:
|
|
220
220
|
- - "~>"
|
|
221
221
|
- !ruby/object:Gem::Version
|
|
222
|
-
version: '1.
|
|
222
|
+
version: '1.14'
|
|
223
223
|
- !ruby/object:Gem::Dependency
|
|
224
224
|
name: solargraph
|
|
225
225
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -262,8 +262,10 @@ files:
|
|
|
262
262
|
- lib/nonnative/configuration.rb
|
|
263
263
|
- lib/nonnative/configuration_process.rb
|
|
264
264
|
- lib/nonnative/configuration_proxy.rb
|
|
265
|
+
- lib/nonnative/configuration_runner.rb
|
|
265
266
|
- lib/nonnative/configuration_server.rb
|
|
266
267
|
- lib/nonnative/configuration_service.rb
|
|
268
|
+
- lib/nonnative/cucumber.rb
|
|
267
269
|
- lib/nonnative/delay_socket_pair.rb
|
|
268
270
|
- lib/nonnative/error.rb
|
|
269
271
|
- lib/nonnative/fault_injection_proxy.rb
|
|
@@ -274,12 +276,14 @@ files:
|
|
|
274
276
|
- lib/nonnative/invalid_data_socket_pair.rb
|
|
275
277
|
- lib/nonnative/manual.rb
|
|
276
278
|
- lib/nonnative/no_proxy.rb
|
|
279
|
+
- lib/nonnative/not_found_error.rb
|
|
277
280
|
- lib/nonnative/observability.rb
|
|
278
281
|
- lib/nonnative/pool.rb
|
|
279
282
|
- lib/nonnative/port.rb
|
|
280
283
|
- lib/nonnative/process.rb
|
|
281
284
|
- lib/nonnative/proxy.rb
|
|
282
285
|
- lib/nonnative/proxy_factory.rb
|
|
286
|
+
- lib/nonnative/runner.rb
|
|
283
287
|
- lib/nonnative/server.rb
|
|
284
288
|
- lib/nonnative/service.rb
|
|
285
289
|
- lib/nonnative/socket_pair.rb
|