toxiproxy 0.1.4 → 1.0.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/README.md +12 -3
- data/bin/start-toxiproxy.sh +4 -4
- data/lib/toxiproxy.rb +31 -24
- data/lib/toxiproxy/{collection.rb → proxy_collection.rb} +3 -3
- data/lib/toxiproxy/toxic.rb +32 -35
- data/lib/toxiproxy/toxic_collection.rb +26 -12
- data/lib/toxiproxy/version.rb +1 -1
- data/test/toxiproxy_test.rb +89 -24
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3198b51c84d89ef6d0b26c989ee633e4def9c4e9
|
4
|
+
data.tar.gz: 65dd1628c34e6e4ba4ff7b387b9f1136ff66cfa1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4c91be80c0853f0ad1a8ce5b504f757a99e2b458c61e0a809da82c6918d8f796e8f51377d6580f100cde96b27b16adbf2f686befc67e2a0167c92a28b5582875
|
7
|
+
data.tar.gz: b44f5c8d012507b5b4321c80f3ced96f19c9d33114941c6a7ef924b858ce6596324744d2c805aa494b23d049d7119e213d0928f3c100a2f944b0b38d1bd896b4
|
data/README.md
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
# toxiproxy-ruby
|
2
2
|
|
3
|
+
`toxiproxy-ruby` `1.x` (latest) is compatible with the Toxiproxy `2.x` series.
|
4
|
+
`toxiproxy-ruby` `0.x` is compatible with the Toxiproxy `1.x` series.
|
5
|
+
|
3
6
|
[Toxiproxy](https://github.com/shopify/toxiproxy) is a proxy to simulate network
|
4
7
|
and system conditions. The Ruby API aims to make it simple to write tests that
|
5
8
|
ensure your application behaves appropriately under harsh conditions. Before you
|
@@ -29,7 +32,7 @@ For example, to simulate 1000ms latency on a database server you can use the
|
|
29
32
|
list of all toxics):
|
30
33
|
|
31
34
|
```ruby
|
32
|
-
Toxiproxy[:mysql_master].
|
35
|
+
Toxiproxy[:mysql_master].toxic(:latency, latency: 1000).apply do
|
33
36
|
Shop.first # this took at least 1s
|
34
37
|
end
|
35
38
|
```
|
@@ -60,7 +63,8 @@ Toxiproxy[:cache].upstream(:latency, latency: 1000).apply do
|
|
60
63
|
end
|
61
64
|
```
|
62
65
|
|
63
|
-
|
66
|
+
By default the toxic is applied to the downstream connection, you can be
|
67
|
+
explicit and chain them:
|
64
68
|
|
65
69
|
```ruby
|
66
70
|
Toxiproxy[/redis/].upstream(:slow_close, delay: 100).downstream(:latency, jitter: 300).apply do
|
@@ -90,4 +94,9 @@ Toxiproxy.populate([{
|
|
90
94
|
This will create the proxies passed, or replace the proxies if they already exist in Toxiproxy.
|
91
95
|
It's recommended to do this early as early in boot as possible, see the
|
92
96
|
[Toxiproxy README](https://github.com/shopify/toxiproxy#Usage). If you have many
|
93
|
-
proxies, we recommend storing the Toxiproxy configs in a configuration file
|
97
|
+
proxies, we recommend storing the Toxiproxy configs in a configuration file and
|
98
|
+
deserializing it into `Toxiproxy.populate`.
|
99
|
+
|
100
|
+
If you're doing this in Rails, you may have to do this in `config/boot.rb` (as
|
101
|
+
early in boot as possible) as older versions of `ActiveRecord` establish a
|
102
|
+
database connection as soon as it's loaded.
|
data/bin/start-toxiproxy.sh
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
#!/bin/bash -e
|
2
2
|
|
3
|
-
VERSION='
|
3
|
+
VERSION='v2.0.0rc2'
|
4
4
|
TOXIPROXY_LOG_DIR=${CIRCLE_ARTIFACTS:-'/tmp'}
|
5
5
|
|
6
6
|
echo "[start toxiproxy]"
|
7
|
-
curl --silent
|
8
|
-
chmod +x ./bin/toxiproxy
|
9
|
-
nohup bash -c "./bin/toxiproxy > ${TOXIPROXY_LOG_DIR}/toxiproxy.log 2>&1 &"
|
7
|
+
curl --silent -L https://github.com/Shopify/toxiproxy/releases/download/$VERSION/toxiproxy-server-linux-amd64 -o ./bin/toxiproxy-server
|
8
|
+
chmod +x ./bin/toxiproxy-server
|
9
|
+
nohup bash -c "./bin/toxiproxy-server > ${TOXIPROXY_LOG_DIR}/toxiproxy.log 2>&1 &"
|
data/lib/toxiproxy.rb
CHANGED
@@ -3,9 +3,9 @@ require "uri"
|
|
3
3
|
require "net/http"
|
4
4
|
require "forwardable"
|
5
5
|
|
6
|
-
require "toxiproxy/collection"
|
7
6
|
require "toxiproxy/toxic"
|
8
7
|
require "toxiproxy/toxic_collection"
|
8
|
+
require "toxiproxy/proxy_collection"
|
9
9
|
|
10
10
|
class Toxiproxy
|
11
11
|
extend SingleForwardable
|
@@ -26,16 +26,25 @@ class Toxiproxy
|
|
26
26
|
@enabled = options[:enabled]
|
27
27
|
end
|
28
28
|
|
29
|
-
def_delegators :all, *
|
29
|
+
def_delegators :all, *ProxyCollection::METHODS
|
30
30
|
|
31
31
|
# Re-enables all proxies and disables all toxics.
|
32
32
|
def self.reset
|
33
|
-
request = Net::HTTP::
|
33
|
+
request = Net::HTTP::Post.new("/reset")
|
34
34
|
response = http.request(request)
|
35
35
|
assert_response(response)
|
36
36
|
self
|
37
37
|
end
|
38
38
|
|
39
|
+
def self.version
|
40
|
+
return false unless running?
|
41
|
+
|
42
|
+
request = Net::HTTP::Get.new("/version")
|
43
|
+
response = http.request(request)
|
44
|
+
assert_response(response)
|
45
|
+
response.body
|
46
|
+
end
|
47
|
+
|
39
48
|
# Returns a collection of all currently active Toxiproxies.
|
40
49
|
def self.all
|
41
50
|
request = Net::HTTP::Get.new("/proxies")
|
@@ -51,7 +60,7 @@ class Toxiproxy
|
|
51
60
|
})
|
52
61
|
}
|
53
62
|
|
54
|
-
|
63
|
+
ProxyCollection.new(proxies)
|
55
64
|
end
|
56
65
|
|
57
66
|
# Sets the toxiproxy host to use.
|
@@ -105,20 +114,22 @@ class Toxiproxy
|
|
105
114
|
end
|
106
115
|
|
107
116
|
# Set an upstream toxic.
|
108
|
-
def upstream(
|
109
|
-
return @upstream unless
|
117
|
+
def upstream(type = nil, attrs = {})
|
118
|
+
return @upstream unless type # also alias for the upstream endpoint
|
110
119
|
|
111
120
|
collection = ToxicCollection.new([self])
|
112
|
-
collection.upstream(
|
121
|
+
collection.upstream(type, attrs)
|
113
122
|
collection
|
114
123
|
end
|
115
124
|
|
116
125
|
# Set a downstream toxic.
|
117
|
-
def downstream(
|
126
|
+
def downstream(type, attrs = {})
|
118
127
|
collection = ToxicCollection.new([self])
|
119
|
-
collection.downstream(
|
128
|
+
collection.downstream(type, attrs)
|
120
129
|
collection
|
121
130
|
end
|
131
|
+
alias_method :toxic, :downstream
|
132
|
+
alias_method :toxicate, :downstream
|
122
133
|
|
123
134
|
# Simulates the endpoint is down, by closing the connection and no
|
124
135
|
# longer accepting connections. This is useful to simulate critical system
|
@@ -180,26 +191,22 @@ class Toxiproxy
|
|
180
191
|
self
|
181
192
|
end
|
182
193
|
|
183
|
-
# Returns
|
184
|
-
def toxics
|
185
|
-
|
186
|
-
raise InvalidToxic, "Toxic direction must be one of: [#{VALID_DIRECTIONS.join(', ')}], got: #{direction}"
|
187
|
-
end
|
188
|
-
|
189
|
-
request = Net::HTTP::Get.new("/proxies/#{name}/#{direction}/toxics")
|
194
|
+
# Returns an array of the current toxics for a direction.
|
195
|
+
def toxics
|
196
|
+
request = Net::HTTP::Get.new("/proxies/#{name}/toxics")
|
190
197
|
response = http.request(request)
|
191
198
|
assert_response(response)
|
192
199
|
|
193
|
-
|
194
|
-
Toxic.new(
|
195
|
-
|
200
|
+
JSON.parse(response.body).map { |attrs|
|
201
|
+
Toxic.new(
|
202
|
+
type: attrs['type'],
|
203
|
+
name: attrs['name'],
|
196
204
|
proxy: self,
|
197
|
-
|
198
|
-
|
199
|
-
|
205
|
+
stream: attrs['stream'],
|
206
|
+
toxicity: attrs['toxicity'],
|
207
|
+
attributes: attrs['attributes'],
|
208
|
+
)
|
200
209
|
}
|
201
|
-
|
202
|
-
toxics
|
203
210
|
end
|
204
211
|
|
205
212
|
private
|
@@ -7,7 +7,7 @@ class Toxiproxy
|
|
7
7
|
# Collection instead of an Array (see MRI). Instead, we delegate methods where
|
8
8
|
# it doesn't matter and only allow the filtering methods that really make
|
9
9
|
# sense on a proxy collection.
|
10
|
-
class
|
10
|
+
class ProxyCollection
|
11
11
|
extend Forwardable
|
12
12
|
|
13
13
|
DELEGATED_METHODS = [:length, :size, :count, :find, :each, :map]
|
@@ -45,13 +45,13 @@ class Toxiproxy
|
|
45
45
|
toxics.downstream(toxic, attrs)
|
46
46
|
toxics
|
47
47
|
end
|
48
|
+
alias_method :toxicate, :downstream
|
49
|
+
alias_method :toxic, :downstream
|
48
50
|
|
49
|
-
# Disables all proxies in the collection.
|
50
51
|
def disable
|
51
52
|
@collection.each(&:disable)
|
52
53
|
end
|
53
54
|
|
54
|
-
# Enables all proxies in the collection.
|
55
55
|
def enable
|
56
56
|
@collection.each(&:enable)
|
57
57
|
end
|
data/lib/toxiproxy/toxic.rb
CHANGED
@@ -1,51 +1,48 @@
|
|
1
1
|
class Toxiproxy
|
2
2
|
class Toxic
|
3
|
-
attr_reader :name, :
|
4
|
-
|
5
|
-
|
6
|
-
def initialize(
|
7
|
-
|
8
|
-
@
|
9
|
-
@
|
10
|
-
@
|
3
|
+
attr_reader :name, :type, :attributes, :stream, :proxy
|
4
|
+
attr_accessor :attributes, :toxicity
|
5
|
+
|
6
|
+
def initialize(attrs)
|
7
|
+
raise "Toxic type is required" unless attrs[:type]
|
8
|
+
@type = attrs[:type]
|
9
|
+
@stream = attrs[:stream] || 'downstream'
|
10
|
+
@name = attrs[:name] || "#{@type}_#{@stream}"
|
11
|
+
@proxy = attrs[:proxy]
|
12
|
+
@toxicity = attrs[:toxicity] || 1.0
|
13
|
+
@attributes = attrs[:attributes] || {}
|
11
14
|
end
|
12
15
|
|
13
|
-
def
|
14
|
-
|
15
|
-
end
|
16
|
+
def save
|
17
|
+
request = Net::HTTP::Post.new("/proxies/#{proxy.name}/toxics")
|
16
18
|
|
17
|
-
|
18
|
-
attrs['enabled'] = true
|
19
|
-
save
|
20
|
-
end
|
19
|
+
request.body = as_json
|
21
20
|
|
22
|
-
|
23
|
-
|
24
|
-
save
|
25
|
-
end
|
21
|
+
response = Toxiproxy.http.request(request)
|
22
|
+
Toxiproxy.assert_response(response)
|
26
23
|
|
27
|
-
|
28
|
-
|
29
|
-
|
24
|
+
json = JSON.parse(response.body)
|
25
|
+
@attributes = json['attributes']
|
26
|
+
@toxicity = json['toxicity']
|
30
27
|
|
31
|
-
|
32
|
-
attrs[name] = value
|
28
|
+
self
|
33
29
|
end
|
34
30
|
|
35
|
-
def
|
36
|
-
|
37
|
-
raise InvalidToxic, "Toxic direction must be one of: [#{VALID_DIRECTIONS.join(', ')}], got: #{direction}"
|
38
|
-
end
|
39
|
-
request = Net::HTTP::Post.new("/proxies/#{proxy.name}/#{direction}/toxics/#{name}")
|
40
|
-
|
41
|
-
request.body = attrs.to_json
|
42
|
-
|
31
|
+
def destroy
|
32
|
+
request = Net::HTTP::Delete.new("/proxies/#{proxy.name}/toxics/#{name}")
|
43
33
|
response = Toxiproxy.http.request(request)
|
44
34
|
Toxiproxy.assert_response(response)
|
45
|
-
|
46
|
-
@attrs = JSON.parse(response.body)
|
47
|
-
|
48
35
|
self
|
49
36
|
end
|
37
|
+
|
38
|
+
def as_json
|
39
|
+
{
|
40
|
+
name: name,
|
41
|
+
type: type,
|
42
|
+
stream: stream,
|
43
|
+
toxicity: toxicity,
|
44
|
+
attributes: attributes,
|
45
|
+
}.to_json
|
46
|
+
end
|
50
47
|
end
|
51
48
|
end
|
@@ -13,34 +13,48 @@ class Toxiproxy
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def apply(&block)
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
16
|
+
names = toxics.group_by { |t| [t.name, t.proxy.name] }
|
17
|
+
dups = names.values.select { |toxics| toxics.length > 1 }
|
18
|
+
if !dups.empty?
|
19
|
+
raise ArgumentError, "There are two toxics with the name #{dups.first[0]} for proxy #{dups.first[1]}, please override the default name (<type>_<direction>)"
|
20
|
+
end
|
21
|
+
|
22
|
+
begin
|
23
|
+
@toxics.each(&:save)
|
24
|
+
yield
|
25
|
+
ensure
|
26
|
+
@toxics.each(&:destroy)
|
27
|
+
end
|
20
28
|
end
|
21
29
|
|
22
|
-
def upstream(
|
30
|
+
def upstream(type, attrs = {})
|
23
31
|
proxies.each do |proxy|
|
24
32
|
toxics << Toxic.new(
|
25
|
-
name:
|
33
|
+
name: attrs.delete('name') || attrs.delete(:name),
|
34
|
+
type: type,
|
26
35
|
proxy: proxy,
|
27
|
-
|
28
|
-
|
36
|
+
stream: :upstream,
|
37
|
+
toxicity: attrs.delete('toxicitiy') || attrs.delete(:toxicity),
|
38
|
+
attributes: attrs
|
29
39
|
)
|
30
40
|
end
|
31
41
|
self
|
32
42
|
end
|
33
43
|
|
34
|
-
def downstream(
|
44
|
+
def downstream(type, attrs = {})
|
35
45
|
proxies.each do |proxy|
|
36
46
|
toxics << Toxic.new(
|
37
|
-
name:
|
47
|
+
name: attrs.delete('name') || attrs.delete(:name),
|
48
|
+
type: type,
|
38
49
|
proxy: proxy,
|
39
|
-
|
40
|
-
|
50
|
+
stream: :downstream,
|
51
|
+
toxicity: attrs.delete('toxicitiy') || attrs.delete(:toxicity),
|
52
|
+
attributes: attrs
|
41
53
|
)
|
42
54
|
end
|
43
55
|
self
|
44
56
|
end
|
57
|
+
alias_method :toxic, :downstream
|
58
|
+
alias_method :toxicate, :downstream
|
45
59
|
end
|
46
60
|
end
|
data/lib/toxiproxy/version.rb
CHANGED
data/test/toxiproxy_test.rb
CHANGED
@@ -31,27 +31,40 @@ class ToxiproxyTest < MiniTest::Unit::TestCase
|
|
31
31
|
Toxiproxy.host = Toxiproxy::DEFAULT_URI
|
32
32
|
end
|
33
33
|
|
34
|
-
def
|
34
|
+
def test_enable_and_disable_proxy_with_toxic
|
35
35
|
with_tcpserver do |port|
|
36
36
|
proxy = Toxiproxy.create(upstream: "localhost:#{port}", name: "test_rubby_server")
|
37
37
|
listen_addr = proxy.listen
|
38
38
|
|
39
|
-
Toxiproxy::Toxic.new(
|
40
|
-
name: 'latency',
|
41
|
-
proxy: proxy,
|
42
|
-
direction: :upstream,
|
43
|
-
attrs: {'latency' => 123}
|
44
|
-
).enable
|
39
|
+
Toxiproxy::Toxic.new(type: 'latency', attributes: { latency: 123 }, proxy: proxy).save
|
45
40
|
|
46
41
|
proxy.disable
|
47
42
|
assert_proxy_unavailable proxy
|
48
43
|
proxy.enable
|
49
44
|
assert_proxy_available proxy
|
50
45
|
|
51
|
-
latency = proxy.toxics
|
52
|
-
assert_equal 123, latency['latency']
|
53
|
-
assert latency.enabled?
|
46
|
+
latency = proxy.toxics.find { |toxic| toxic.name == 'latency_downstream' }
|
54
47
|
|
48
|
+
assert_equal 123, latency.attributes['latency']
|
49
|
+
assert_equal listen_addr, proxy.listen
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_delete_toxic
|
54
|
+
with_tcpserver do |port|
|
55
|
+
proxy = Toxiproxy.create(upstream: "localhost:#{port}", name: "test_rubby_server")
|
56
|
+
listen_addr = proxy.listen
|
57
|
+
|
58
|
+
latency = Toxiproxy::Toxic.new(type: 'latency', attributes: { latency: 123 }, proxy: proxy).save
|
59
|
+
|
60
|
+
assert_proxy_available proxy
|
61
|
+
|
62
|
+
latency = proxy.toxics.find { |toxic| toxic.name == 'latency_downstream' }
|
63
|
+
assert_equal 123, latency.attributes['latency']
|
64
|
+
|
65
|
+
latency.destroy
|
66
|
+
|
67
|
+
assert proxy.toxics.empty?
|
55
68
|
assert_equal listen_addr, proxy.listen
|
56
69
|
end
|
57
70
|
end
|
@@ -64,20 +77,12 @@ class ToxiproxyTest < MiniTest::Unit::TestCase
|
|
64
77
|
proxy.disable
|
65
78
|
assert_proxy_unavailable proxy
|
66
79
|
|
67
|
-
Toxiproxy::Toxic.new(
|
68
|
-
name: 'latency',
|
69
|
-
proxy: proxy,
|
70
|
-
direction: :upstream,
|
71
|
-
attrs: {'latency' => 125}
|
72
|
-
).enable
|
80
|
+
Toxiproxy::Toxic.new(type: 'latency', attributes: { latency: 123 }, proxy: proxy).save
|
73
81
|
|
74
82
|
Toxiproxy.reset
|
75
83
|
assert_proxy_available proxy
|
76
84
|
|
77
|
-
|
78
|
-
assert_equal 125, latency['latency']
|
79
|
-
assert !latency.enabled?
|
80
|
-
|
85
|
+
assert proxy.toxics.empty?
|
81
86
|
assert_equal listen_addr, proxy.listen
|
82
87
|
end
|
83
88
|
end
|
@@ -104,7 +109,7 @@ class ToxiproxyTest < MiniTest::Unit::TestCase
|
|
104
109
|
end
|
105
110
|
|
106
111
|
def test_proxies_all_returns_proxy_collection
|
107
|
-
assert_instance_of Toxiproxy::
|
112
|
+
assert_instance_of Toxiproxy::ProxyCollection, Toxiproxy.all
|
108
113
|
end
|
109
114
|
|
110
115
|
def test_down_on_proxy_collection_disables_entire_collection
|
@@ -154,7 +159,7 @@ class ToxiproxyTest < MiniTest::Unit::TestCase
|
|
154
159
|
proxies = Toxiproxy.select { |p| p.upstream == "localhost:#{port}" }
|
155
160
|
|
156
161
|
assert_equal 1, proxies.size
|
157
|
-
assert_instance_of Toxiproxy::
|
162
|
+
assert_instance_of Toxiproxy::ProxyCollection, proxies
|
158
163
|
end
|
159
164
|
end
|
160
165
|
|
@@ -165,7 +170,7 @@ class ToxiproxyTest < MiniTest::Unit::TestCase
|
|
165
170
|
proxies = Toxiproxy.grep(/\Atest/)
|
166
171
|
|
167
172
|
assert_equal 1, proxies.size
|
168
|
-
assert_instance_of Toxiproxy::
|
173
|
+
assert_instance_of Toxiproxy::ProxyCollection, proxies
|
169
174
|
end
|
170
175
|
end
|
171
176
|
|
@@ -176,7 +181,7 @@ class ToxiproxyTest < MiniTest::Unit::TestCase
|
|
176
181
|
proxies = Toxiproxy[/\Atest/]
|
177
182
|
|
178
183
|
assert_equal 1, proxies.size
|
179
|
-
assert_instance_of Toxiproxy::
|
184
|
+
assert_instance_of Toxiproxy::ProxyCollection, proxies
|
180
185
|
end
|
181
186
|
end
|
182
187
|
|
@@ -218,6 +223,24 @@ class ToxiproxyTest < MiniTest::Unit::TestCase
|
|
218
223
|
end
|
219
224
|
end
|
220
225
|
|
226
|
+
def test_toxic_applies_a_downstream_toxic
|
227
|
+
with_tcpserver(receive: true) do |port|
|
228
|
+
proxy = Toxiproxy.create(upstream: "localhost:#{port}", name: "test_proxy")
|
229
|
+
|
230
|
+
proxy.toxic(:latency, latency: 100).apply do
|
231
|
+
latency = proxy.toxics.find { |toxic| toxic.name == 'latency_downstream' }
|
232
|
+
|
233
|
+
assert_equal 100, latency.attributes['latency']
|
234
|
+
assert_equal 'downstream', latency.stream
|
235
|
+
end
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
def test_toxic_default_name_is_type_and_stream
|
240
|
+
toxic = Toxiproxy::Toxic.new(type: "latency", stream: "downstream")
|
241
|
+
assert_equal "latency_downstream", toxic.name
|
242
|
+
end
|
243
|
+
|
221
244
|
def test_apply_prolong_toxics
|
222
245
|
with_tcpserver(receive: true) do |port|
|
223
246
|
proxy = Toxiproxy.create(upstream: "localhost:#{port}", name: "test_proxy")
|
@@ -361,6 +384,48 @@ class ToxiproxyTest < MiniTest::Unit::TestCase
|
|
361
384
|
assert_equal true, Toxiproxy.running?
|
362
385
|
end
|
363
386
|
|
387
|
+
def test_version
|
388
|
+
assert_instance_of String, Toxiproxy.version
|
389
|
+
end
|
390
|
+
|
391
|
+
def test_multiple_of_same_toxic_type
|
392
|
+
with_tcpserver(receive: true) do |port|
|
393
|
+
proxy = Toxiproxy.create(upstream: "localhost:#{port}", name: "test_proxy")
|
394
|
+
proxy.toxic(:latency, latency: 100).toxic(:latency, latency: 100, name: "second_latency_downstream").apply do
|
395
|
+
before = Time.now
|
396
|
+
|
397
|
+
socket = connect_to_proxy(proxy)
|
398
|
+
socket.write("omg\n")
|
399
|
+
socket.flush
|
400
|
+
socket.gets
|
401
|
+
|
402
|
+
passed = Time.now - before
|
403
|
+
|
404
|
+
assert_in_delta passed, 0.200, 0.01
|
405
|
+
end
|
406
|
+
end
|
407
|
+
end
|
408
|
+
|
409
|
+
def test_multiple_of_same_toxic_type_with_same_name
|
410
|
+
with_tcpserver(receive: true) do |port|
|
411
|
+
proxy = Toxiproxy.create(upstream: "localhost:#{port}", name: "test_proxy")
|
412
|
+
|
413
|
+
assert_raises ArgumentError do
|
414
|
+
proxy.toxic(:latency, latency: 100).toxic(:latency, latency: 100).apply { }
|
415
|
+
end
|
416
|
+
end
|
417
|
+
end
|
418
|
+
|
419
|
+
def test_invalid_direction
|
420
|
+
with_tcpserver(receive: true) do |port|
|
421
|
+
proxy = Toxiproxy.create(upstream: "localhost:#{port}", name: "test_rubby_server")
|
422
|
+
|
423
|
+
assert_raises Toxiproxy::InvalidToxic do
|
424
|
+
Toxiproxy::Toxic.new(type: 'latency', attributes: { latency: 123 }, proxy: proxy, stream: 'lolstream').save
|
425
|
+
end
|
426
|
+
end
|
427
|
+
end
|
428
|
+
|
364
429
|
private
|
365
430
|
|
366
431
|
def assert_proxy_available(proxy)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: toxiproxy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Simon Eskildsen
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-
|
12
|
+
date: 2016-04-25 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -67,7 +67,7 @@ files:
|
|
67
67
|
- bin/start-toxiproxy.sh
|
68
68
|
- circle.yml
|
69
69
|
- lib/toxiproxy.rb
|
70
|
-
- lib/toxiproxy/
|
70
|
+
- lib/toxiproxy/proxy_collection.rb
|
71
71
|
- lib/toxiproxy/toxic.rb
|
72
72
|
- lib/toxiproxy/toxic_collection.rb
|
73
73
|
- lib/toxiproxy/version.rb
|