toxiproxy 0.0.2 → 0.1.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
- checksums.yaml.gz.sig +0 -0
- data/README.md +28 -4
- data/bin/start-toxiproxy.sh +1 -1
- data/lib/toxiproxy/collection.rb +26 -2
- data/lib/toxiproxy/toxic.rb +7 -3
- data/lib/toxiproxy/toxic_collection.rb +19 -15
- data/lib/toxiproxy/version.rb +1 -1
- data/lib/toxiproxy.rb +59 -15
- data/test/fixtures/toxiproxy.json +7 -0
- data/test/toxiproxy_test.rb +112 -2
- data.tar.gz.sig +0 -0
- metadata +27 -6
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 75c5cd8a2dd3d9a8f0b932d7f50e0359c77c0fda
|
4
|
+
data.tar.gz: a6585a9edf06bc9888943292d8784c8aab61685c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 11f4d1e556c4f942838e3c7d7484e25ed6defecb77985d4609739f25ec383c51aa07c505f64313fb197cfac96611d8ab97d688f6bb8a09a2169112acdf0e763b
|
7
|
+
data.tar.gz: 87df2064d0189804a8e84820304a5a9312c767b1337bf3d7941c9ea929bdbaa25de654188ba8cdf9d0a361e0087c86ce5a096c428ec0f1d4b7d073a019f218c6
|
checksums.yaml.gz.sig
ADDED
Binary file
|
data/README.md
CHANGED
@@ -2,8 +2,9 @@
|
|
2
2
|
|
3
3
|
[Toxiproxy](https://github.com/shopify/toxiproxy) is a proxy to simulate network
|
4
4
|
and system conditions. The Ruby API aims to make it simple to write tests that
|
5
|
-
|
6
|
-
the
|
5
|
+
ensure your application behaves appropriately under harsh conditions. Before you
|
6
|
+
can use the Ruby library, you need to read the [Usage section of the Toxiproxy
|
7
|
+
README](https://githubcom/shopify/toxiproxy#Usage).
|
7
8
|
|
8
9
|
```
|
9
10
|
gem install toxiproxy
|
@@ -11,14 +12,19 @@ gem install toxiproxy
|
|
11
12
|
|
12
13
|
Make sure the Toxiproxy server is already running.
|
13
14
|
|
15
|
+
For more information about Toxiproxy and the available toxics, see the [Toxiproxy
|
16
|
+
documentation](https://github.com/shopify/toxiproxy)
|
17
|
+
|
14
18
|
## Usage
|
15
19
|
|
20
|
+
The Ruby client communicates with the Toxiproxy daemon via HTTP.
|
21
|
+
|
16
22
|
For example, to simulate 1000ms latency on a database server you can use the
|
17
23
|
`latency` toxic with the `latency` argument (see the Toxiproxy project for a
|
18
24
|
list of all toxics):
|
19
25
|
|
20
26
|
```ruby
|
21
|
-
Toxiproxy[:mysql_master].downstream(:latency, latency: 1000) do
|
27
|
+
Toxiproxy[:mysql_master].downstream(:latency, latency: 1000).apply do
|
22
28
|
Shop.first # this took at least 1s
|
23
29
|
end
|
24
30
|
```
|
@@ -44,7 +50,25 @@ If you want to simulate that your cache server is slow at incoming network
|
|
44
50
|
upstream:
|
45
51
|
|
46
52
|
```ruby
|
47
|
-
Toxiproxy[:cache].upstream(:latency, latency: 1000) do
|
53
|
+
Toxiproxy[:cache].upstream(:latency, latency: 1000).apply do
|
48
54
|
Cache.get(:omg) # will take at least a second
|
49
55
|
end
|
50
56
|
```
|
57
|
+
|
58
|
+
You can apply many toxics to many connections:
|
59
|
+
|
60
|
+
```ruby
|
61
|
+
Toxiproxy[/redis/].upstream(:slow_close, delay: 100).downstream(:latency, jitter: 300).apply do
|
62
|
+
# all redises are now slow at responding and closing
|
63
|
+
end
|
64
|
+
|
65
|
+
## Populate
|
66
|
+
|
67
|
+
To populate Toxiproxy with the proxies from `config/toxiproxy.json`:
|
68
|
+
|
69
|
+
```ruby
|
70
|
+
Toxiproxy.populate("./config/toxiproxy.json")
|
71
|
+
```
|
72
|
+
|
73
|
+
It's recommended to do this early as early in boot as possible, see the
|
74
|
+
[Toxiproxy README](https://github.com/shopify/toxiproxy#Usage)..
|
data/bin/start-toxiproxy.sh
CHANGED
data/lib/toxiproxy/collection.rb
CHANGED
@@ -28,12 +28,36 @@ class Toxiproxy
|
|
28
28
|
#
|
29
29
|
# Would simulate every Redis server being down for the duration of the
|
30
30
|
# block.
|
31
|
-
def down(
|
31
|
+
def down(&block)
|
32
32
|
@collection.inject(block) { |nested, proxy|
|
33
|
-
-> { proxy.down(
|
33
|
+
-> { proxy.down(&nested) }
|
34
34
|
}.call
|
35
35
|
end
|
36
36
|
|
37
|
+
# Set an upstream toxic.
|
38
|
+
def upstream(toxic, attrs = {})
|
39
|
+
toxics = ToxicCollection.new(@collection)
|
40
|
+
toxics.upstream(toxic, attrs)
|
41
|
+
toxics
|
42
|
+
end
|
43
|
+
|
44
|
+
# Set a downstream toxic.
|
45
|
+
def downstream(toxic, attrs = {})
|
46
|
+
toxics = ToxicCollection.new(@collection)
|
47
|
+
toxics.downstream(toxic, attrs)
|
48
|
+
toxics
|
49
|
+
end
|
50
|
+
|
51
|
+
# Disables all proxies in the collection.
|
52
|
+
def disable
|
53
|
+
@collection.each(&:disable)
|
54
|
+
end
|
55
|
+
|
56
|
+
# Enables all proxies in the collection.
|
57
|
+
def enable
|
58
|
+
@collection.each(&:enable)
|
59
|
+
end
|
60
|
+
|
37
61
|
# Destroys all toxiproxy's in the collection
|
38
62
|
def destroy
|
39
63
|
@collection.each(&:destroy)
|
data/lib/toxiproxy/toxic.rb
CHANGED
@@ -11,19 +11,23 @@ class Toxiproxy
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def enabled?
|
14
|
-
attrs[
|
14
|
+
attrs['enabled']
|
15
15
|
end
|
16
16
|
|
17
17
|
def enable
|
18
|
-
attrs[
|
18
|
+
attrs['enabled'] = true
|
19
19
|
save
|
20
20
|
end
|
21
21
|
|
22
22
|
def disable
|
23
|
-
attrs[
|
23
|
+
attrs['enabled'] = false
|
24
24
|
save
|
25
25
|
end
|
26
26
|
|
27
|
+
def [](name)
|
28
|
+
attrs[name]
|
29
|
+
end
|
30
|
+
|
27
31
|
def []=(name, value)
|
28
32
|
attrs[name] = value
|
29
33
|
end
|
@@ -3,12 +3,12 @@ class Toxiproxy
|
|
3
3
|
extend Forwardable
|
4
4
|
|
5
5
|
attr_accessor :toxics
|
6
|
-
attr_reader :
|
6
|
+
attr_reader :proxies
|
7
7
|
|
8
8
|
def_delegators :@toxics, :<<, :find
|
9
9
|
|
10
|
-
def initialize(
|
11
|
-
@
|
10
|
+
def initialize(proxies)
|
11
|
+
@proxies = proxies
|
12
12
|
@toxics = []
|
13
13
|
end
|
14
14
|
|
@@ -20,22 +20,26 @@ class Toxiproxy
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def upstream(toxic_name, attrs = {})
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
23
|
+
proxies.each do |proxy|
|
24
|
+
toxics << Toxic.new(
|
25
|
+
name: toxic_name,
|
26
|
+
proxy: proxy,
|
27
|
+
direction: :upstream,
|
28
|
+
attrs: attrs
|
29
|
+
)
|
30
|
+
end
|
29
31
|
self
|
30
32
|
end
|
31
33
|
|
32
34
|
def downstream(toxic_name, attrs = {})
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
35
|
+
proxies.each do |proxy|
|
36
|
+
toxics << Toxic.new(
|
37
|
+
name: toxic_name,
|
38
|
+
proxy: proxy,
|
39
|
+
direction: :downstream,
|
40
|
+
attrs: attrs
|
41
|
+
)
|
42
|
+
end
|
39
43
|
self
|
40
44
|
end
|
41
45
|
end
|
data/lib/toxiproxy/version.rb
CHANGED
data/lib/toxiproxy.rb
CHANGED
@@ -14,12 +14,13 @@ class Toxiproxy
|
|
14
14
|
class ProxyExists < StandardError; end
|
15
15
|
class InvalidToxic < StandardError; end
|
16
16
|
|
17
|
-
attr_reader :listen, :name
|
17
|
+
attr_reader :listen, :name, :enabled
|
18
18
|
|
19
19
|
def initialize(options)
|
20
20
|
@upstream = options[:upstream]
|
21
21
|
@listen = options[:listen] || "localhost:0"
|
22
22
|
@name = options[:name]
|
23
|
+
@enabled = options[:enabled]
|
23
24
|
end
|
24
25
|
|
25
26
|
# Forwardable doesn't support delegating class methods, so we resort to
|
@@ -33,6 +34,14 @@ class Toxiproxy
|
|
33
34
|
end
|
34
35
|
end
|
35
36
|
|
37
|
+
# Re-enables all proxies and disables all toxics.
|
38
|
+
def self.reset
|
39
|
+
request = Net::HTTP::Get.new("/reset")
|
40
|
+
response = http.request(request)
|
41
|
+
assert_response(response)
|
42
|
+
self
|
43
|
+
end
|
44
|
+
|
36
45
|
# Returns a collection of all currently active Toxiproxies.
|
37
46
|
def self.all
|
38
47
|
request = Net::HTTP::Get.new("/proxies")
|
@@ -43,7 +52,8 @@ class Toxiproxy
|
|
43
52
|
self.new({
|
44
53
|
upstream: attrs["upstream"],
|
45
54
|
listen: attrs["listen"],
|
46
|
-
name: attrs["name"]
|
55
|
+
name: attrs["name"],
|
56
|
+
enabled: attrs["enabled"]
|
47
57
|
})
|
48
58
|
}
|
49
59
|
|
@@ -57,7 +67,12 @@ class Toxiproxy
|
|
57
67
|
|
58
68
|
# Find a single proxy by name.
|
59
69
|
def self.find_by_name(name = nil, &block)
|
60
|
-
|
70
|
+
self.all.find { |p| p.name == name.to_s }
|
71
|
+
end
|
72
|
+
|
73
|
+
# Calls find_by_name and raises NotFound if not found
|
74
|
+
def self.find_by_name!(*args)
|
75
|
+
proxy = find_by_name(*args)
|
61
76
|
raise NotFound, "#{name} not found in #{self.all.map(&:name).join(', ')}" unless proxy
|
62
77
|
proxy
|
63
78
|
end
|
@@ -67,21 +82,30 @@ class Toxiproxy
|
|
67
82
|
# name.
|
68
83
|
def self.[](query)
|
69
84
|
return grep(query) if query.is_a?(Regexp)
|
70
|
-
find_by_name(query)
|
85
|
+
find_by_name!(query)
|
86
|
+
end
|
87
|
+
|
88
|
+
def self.populate(path)
|
89
|
+
proxies = JSON.parse(File.read(path), symbolize_names: true)
|
90
|
+
proxies = proxies.map { |proxy| self.new(proxy) }
|
91
|
+
|
92
|
+
proxies.each do |proxy|
|
93
|
+
proxy.create unless find_by_name(proxy.name)
|
94
|
+
end
|
71
95
|
end
|
72
96
|
|
73
97
|
# Set an upstream toxic.
|
74
98
|
def upstream(toxic = nil, attrs = {})
|
75
99
|
return @upstream unless toxic
|
76
100
|
|
77
|
-
collection = ToxicCollection.new(self)
|
101
|
+
collection = ToxicCollection.new([self])
|
78
102
|
collection.upstream(toxic, attrs)
|
79
103
|
collection
|
80
104
|
end
|
81
105
|
|
82
106
|
# Set a downstream toxic.
|
83
107
|
def downstream(toxic, attrs = {})
|
84
|
-
collection = ToxicCollection.new(self)
|
108
|
+
collection = ToxicCollection.new([self])
|
85
109
|
collection.downstream(toxic, attrs)
|
86
110
|
collection
|
87
111
|
end
|
@@ -90,25 +114,45 @@ class Toxiproxy
|
|
90
114
|
# longer accepting connections. This is useful to simulate critical system
|
91
115
|
# failure, such as a data store becoming completely unavailable.
|
92
116
|
def down(&block)
|
93
|
-
|
94
|
-
downtoxics = toxics(:downstream)
|
95
|
-
destroy
|
117
|
+
disable
|
96
118
|
begin
|
97
119
|
yield
|
98
120
|
ensure
|
99
|
-
|
100
|
-
uptoxics.each(&:save)
|
101
|
-
downtoxics.each(&:save)
|
121
|
+
enable
|
102
122
|
end
|
103
123
|
end
|
104
124
|
|
125
|
+
# Disables a Toxiproxy. This will drop all active connections and stop the proxy from listening.
|
126
|
+
def disable
|
127
|
+
request = Net::HTTP::Post.new("/proxies/#{name}")
|
128
|
+
|
129
|
+
hash = {enabled: false}
|
130
|
+
request.body = hash.to_json
|
131
|
+
|
132
|
+
response = http.request(request)
|
133
|
+
assert_response(response)
|
134
|
+
self
|
135
|
+
end
|
136
|
+
|
137
|
+
# Enables a Toxiproxy. This will cause the proxy to start listening again.
|
138
|
+
def enable
|
139
|
+
request = Net::HTTP::Post.new("/proxies/#{name}")
|
140
|
+
|
141
|
+
hash = {enabled: true}
|
142
|
+
request.body = hash.to_json
|
143
|
+
|
144
|
+
response = http.request(request)
|
145
|
+
assert_response(response)
|
146
|
+
self
|
147
|
+
end
|
148
|
+
|
105
149
|
# Create a Toxiproxy, proxying traffic from `@listen` (optional argument to
|
106
150
|
# the constructor) to `@upstream`. `#down` `#upstream` or `#downstream` can at any time alter the health
|
107
151
|
# of this connection.
|
108
152
|
def create
|
109
153
|
request = Net::HTTP::Post.new("/proxies")
|
110
154
|
|
111
|
-
hash = {upstream: upstream, name: name, listen: listen}
|
155
|
+
hash = {upstream: upstream, name: name, listen: listen, enabled: enabled}
|
112
156
|
request.body = hash.to_json
|
113
157
|
|
114
158
|
response = http.request(request)
|
@@ -128,8 +172,6 @@ class Toxiproxy
|
|
128
172
|
self
|
129
173
|
end
|
130
174
|
|
131
|
-
private
|
132
|
-
|
133
175
|
# Returns a collection of the current toxics for a direction.
|
134
176
|
def toxics(direction)
|
135
177
|
unless VALID_DIRECTIONS.include?(direction.to_sym)
|
@@ -152,6 +194,8 @@ class Toxiproxy
|
|
152
194
|
toxics
|
153
195
|
end
|
154
196
|
|
197
|
+
private
|
198
|
+
|
155
199
|
def self.http
|
156
200
|
@http ||= Net::HTTP.new(URI.host, URI.port)
|
157
201
|
end
|
data/test/toxiproxy_test.rb
CHANGED
@@ -24,6 +24,57 @@ class ToxiproxyTest < MiniTest::Unit::TestCase
|
|
24
24
|
assert_equal "test_mysql_master", proxy.name
|
25
25
|
end
|
26
26
|
|
27
|
+
def test_enable_and_disable_proxy
|
28
|
+
with_tcpserver do |port|
|
29
|
+
proxy = Toxiproxy.create(upstream: "localhost:#{port}", name: "test_rubby_server")
|
30
|
+
listen_addr = proxy.listen
|
31
|
+
|
32
|
+
Toxiproxy::Toxic.new(
|
33
|
+
name: 'latency',
|
34
|
+
proxy: proxy,
|
35
|
+
direction: :upstream,
|
36
|
+
attrs: {'latency' => 123}
|
37
|
+
).enable
|
38
|
+
|
39
|
+
proxy.disable
|
40
|
+
assert_proxy_unavailable proxy
|
41
|
+
proxy.enable
|
42
|
+
assert_proxy_available proxy
|
43
|
+
|
44
|
+
latency = proxy.toxics(:upstream).find { |toxic| toxic.name == 'latency' }
|
45
|
+
assert_equal 123, latency['latency']
|
46
|
+
assert latency.enabled?
|
47
|
+
|
48
|
+
assert_equal listen_addr, proxy.listen
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_reset
|
53
|
+
with_tcpserver do |port|
|
54
|
+
proxy = Toxiproxy.create(upstream: "localhost:#{port}", name: "test_rubby_server")
|
55
|
+
listen_addr = proxy.listen
|
56
|
+
|
57
|
+
proxy.disable
|
58
|
+
assert_proxy_unavailable proxy
|
59
|
+
|
60
|
+
Toxiproxy::Toxic.new(
|
61
|
+
name: 'latency',
|
62
|
+
proxy: proxy,
|
63
|
+
direction: :upstream,
|
64
|
+
attrs: {'latency' => 125}
|
65
|
+
).enable
|
66
|
+
|
67
|
+
Toxiproxy.reset
|
68
|
+
assert_proxy_available proxy
|
69
|
+
|
70
|
+
latency = proxy.toxics(:upstream).find { |toxic| toxic.name == 'latency' }
|
71
|
+
assert_equal 125, latency['latency']
|
72
|
+
assert !latency.enabled?
|
73
|
+
|
74
|
+
assert_equal listen_addr, proxy.listen
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
27
78
|
def test_take_endpoint_down
|
28
79
|
with_tcpserver do |port|
|
29
80
|
proxy = Toxiproxy.create(upstream: "localhost:#{port}", name: "test_rubby_server")
|
@@ -69,6 +120,26 @@ class ToxiproxyTest < MiniTest::Unit::TestCase
|
|
69
120
|
end
|
70
121
|
end
|
71
122
|
|
123
|
+
def test_disable_on_proxy_collection
|
124
|
+
with_tcpserver do |port1|
|
125
|
+
with_tcpserver do |port2|
|
126
|
+
proxy1 = Toxiproxy.create(upstream: "localhost:#{port1}", name: "test_proxy1")
|
127
|
+
proxy2 = Toxiproxy.create(upstream: "localhost:#{port2}", name: "test_proxy2")
|
128
|
+
|
129
|
+
assert_proxy_available proxy2
|
130
|
+
assert_proxy_available proxy1
|
131
|
+
|
132
|
+
Toxiproxy.all.disable
|
133
|
+
assert_proxy_unavailable proxy1
|
134
|
+
assert_proxy_unavailable proxy2
|
135
|
+
Toxiproxy.all.enable
|
136
|
+
|
137
|
+
assert_proxy_available proxy2
|
138
|
+
assert_proxy_available proxy1
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
72
143
|
def test_select_from_toxiproxy_collection
|
73
144
|
with_tcpserver do |port|
|
74
145
|
Toxiproxy.create(upstream: "localhost:#{port}", name: "test_proxy")
|
@@ -103,8 +174,6 @@ class ToxiproxyTest < MiniTest::Unit::TestCase
|
|
103
174
|
end
|
104
175
|
|
105
176
|
def test_apply_upstream_toxic
|
106
|
-
$before = Time.now
|
107
|
-
|
108
177
|
with_tcpserver(receive: true) do |port|
|
109
178
|
proxy = Toxiproxy.create(upstream: "localhost:#{port}", name: "test_proxy")
|
110
179
|
|
@@ -161,6 +230,47 @@ class ToxiproxyTest < MiniTest::Unit::TestCase
|
|
161
230
|
end
|
162
231
|
end
|
163
232
|
|
233
|
+
def test_apply_toxics_to_collection
|
234
|
+
with_tcpserver(receive: true) do |port1|
|
235
|
+
with_tcpserver(receive: true) do |port2|
|
236
|
+
proxy1 = Toxiproxy.create(upstream: "localhost:#{port1}", name: "test_proxy1")
|
237
|
+
proxy2 = Toxiproxy.create(upstream: "localhost:#{port2}", name: "test_proxy2")
|
238
|
+
|
239
|
+
Toxiproxy[/test_proxy/].upstream(:latency, latency: 100).downstream(:latency, latency: 100).apply do
|
240
|
+
before = Time.now
|
241
|
+
|
242
|
+
socket = connect_to_proxy(proxy1)
|
243
|
+
socket.write("omg\n")
|
244
|
+
socket.flush
|
245
|
+
socket.gets
|
246
|
+
|
247
|
+
passed = Time.now - before
|
248
|
+
|
249
|
+
assert_in_delta passed, 0.200, 0.01
|
250
|
+
|
251
|
+
before = Time.now
|
252
|
+
|
253
|
+
socket = connect_to_proxy(proxy2)
|
254
|
+
socket.write("omg\n")
|
255
|
+
socket.flush
|
256
|
+
socket.gets
|
257
|
+
|
258
|
+
passed = Time.now - before
|
259
|
+
|
260
|
+
assert_in_delta passed, 0.200, 0.01
|
261
|
+
end
|
262
|
+
end
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
266
|
+
def test_populate_creates_proxies
|
267
|
+
proxies = Toxiproxy.populate("./test/fixtures/toxiproxy.json")
|
268
|
+
|
269
|
+
proxies.each do |proxy|
|
270
|
+
assert_proxy_available(proxy)
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
164
274
|
private
|
165
275
|
|
166
276
|
def assert_proxy_available(proxy)
|
data.tar.gz.sig
ADDED
Binary file
|
metadata
CHANGED
@@ -1,15 +1,37 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: toxiproxy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Simon Eskildsen
|
8
8
|
- Jacob Wirth
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
|
-
cert_chain:
|
12
|
-
|
11
|
+
cert_chain:
|
12
|
+
- |
|
13
|
+
-----BEGIN CERTIFICATE-----
|
14
|
+
MIIDcDCCAligAwIBAgIBATANBgkqhkiG9w0BAQUFADA/MQ8wDQYDVQQDDAZhZG1p
|
15
|
+
bnMxFzAVBgoJkiaJk/IsZAEZFgdzaG9waWZ5MRMwEQYKCZImiZPyLGQBGRYDY29t
|
16
|
+
MB4XDTE0MDUxNTIwMzM0OFoXDTE1MDUxNTIwMzM0OFowPzEPMA0GA1UEAwwGYWRt
|
17
|
+
aW5zMRcwFQYKCZImiZPyLGQBGRYHc2hvcGlmeTETMBEGCgmSJomT8ixkARkWA2Nv
|
18
|
+
bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL0/81O3e1vh5smcwp2G
|
19
|
+
MpLQ6q0kejQLa65bPYPxdzWA1SYOKyGfw+yR9LdFzsuKpwWzKq6zX35lj1IckWS4
|
20
|
+
bNBEQzxmufUxU0XPM02haFB8fOfDJzdXsWte9Ge4IFwahwn68gpMqN+BvxL+KMYz
|
21
|
+
Iut9YmN44d4LZdsENEIO5vmybuG2vYDz7R56qB0PA+Q2P2CdhymsBad2DQs69FBo
|
22
|
+
uico9V6VMYYctL9lCYdzu9IXrOYNTt88suKIVzzAlHOKeN0Ng5qdztFoTR8sfxDr
|
23
|
+
Ydg3KHl5n47wlpgd8R0f/4b5gGxW+v9pyJCgQnLlRu7DedVSvv7+GMtj3g9r3nhJ
|
24
|
+
KqECAwEAAaN3MHUwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFI/o
|
25
|
+
maf34HXbUOQsdoLHacEKQgunMB0GA1UdEQQWMBSBEmFkbWluc0BzaG9waWZ5LmNv
|
26
|
+
bTAdBgNVHRIEFjAUgRJhZG1pbnNAc2hvcGlmeS5jb20wDQYJKoZIhvcNAQEFBQAD
|
27
|
+
ggEBADkK9aj5T0HPExsov4EoMWFnO+G7RQ28C30VAfKxnL2UxG6i4XMHVs6Xi94h
|
28
|
+
qXFw1ec9Y2eDUqaolT3bviOk9BB197+A8Vz/k7MC6ci2NE+yDDB7HAC8zU6LAx8Y
|
29
|
+
Iqvw7B/PSZ/pz4bUVFlTATif4mi1vO3lidRkdHRtM7UePSn2rUpOi0gtXBP3bLu5
|
30
|
+
YjHJN7wx5cugMEyroKITG5gL0Nxtu21qtOlHX4Hc4KdE2JqzCPOsS4zsZGhgwhPs
|
31
|
+
fl3hbtVFTqbOlwL9vy1fudXcolIE/ZTcxQ+er07ZFZdKCXayR9PPs64heamfn0fp
|
32
|
+
TConQSX2BnZdhIEYW+cKzEC/bLc=
|
33
|
+
-----END CERTIFICATE-----
|
34
|
+
date: 2015-01-07 00:00:00.000000000 Z
|
13
35
|
dependencies:
|
14
36
|
- !ruby/object:Gem::Dependency
|
15
37
|
name: bundler
|
@@ -72,6 +94,7 @@ files:
|
|
72
94
|
- lib/toxiproxy/toxic_collection.rb
|
73
95
|
- lib/toxiproxy/version.rb
|
74
96
|
- shipit.rubygems.yml
|
97
|
+
- test/fixtures/toxiproxy.json
|
75
98
|
- test/test_helper.rb
|
76
99
|
- test/toxiproxy_test.rb
|
77
100
|
- toxiproxy.gemspec
|
@@ -99,6 +122,4 @@ rubygems_version: 2.2.2
|
|
99
122
|
signing_key:
|
100
123
|
specification_version: 4
|
101
124
|
summary: Ruby library for Toxiproxy
|
102
|
-
test_files:
|
103
|
-
- test/test_helper.rb
|
104
|
-
- test/toxiproxy_test.rb
|
125
|
+
test_files: []
|
metadata.gz.sig
ADDED
Binary file
|