rbsim 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.hgignore +6 -0
- data/.rspec +2 -0
- data/Gemfile +12 -0
- data/Gemfile.lock +66 -0
- data/LICENSE.txt +674 -0
- data/README.md +960 -0
- data/TODO +28 -0
- data/basic_sim.rb +62 -0
- data/fast-tcpn.rb +3 -0
- data/lib/rbsim.rb +14 -0
- data/lib/rbsim/dsl.rb +30 -0
- data/lib/rbsim/dsl/infrastructure.rb +48 -0
- data/lib/rbsim/dsl/mapping.rb +32 -0
- data/lib/rbsim/dsl/process.rb +129 -0
- data/lib/rbsim/dsl/program.rb +10 -0
- data/lib/rbsim/experiment.rb +110 -0
- data/lib/rbsim/hlmodel.rb +25 -0
- data/lib/rbsim/hlmodel/infrastructure.rb +116 -0
- data/lib/rbsim/hlmodel/mapping.rb +5 -0
- data/lib/rbsim/hlmodel/process.rb +152 -0
- data/lib/rbsim/numeric_units.rb +107 -0
- data/lib/rbsim/simulator.rb +184 -0
- data/lib/rbsim/statistics.rb +77 -0
- data/lib/rbsim/tokens.rb +146 -0
- data/lib/rbsim/version.rb +3 -0
- data/new_process.rb +49 -0
- data/rbsim.gemspec +42 -0
- data/show_readme.rb +15 -0
- data/sim.rb +142 -0
- data/sim_bamboo.rb +251 -0
- data/sim_process.rb +83 -0
- data/sim_process_dsl.rb +58 -0
- data/spec/dsl/infrastructure_nets_spec.rb +39 -0
- data/spec/dsl/infrastructure_nodes_spec.rb +72 -0
- data/spec/dsl/infrastructure_routes_spec.rb +44 -0
- data/spec/dsl/mapping_spec.rb +70 -0
- data/spec/dsl/process_spec.rb +56 -0
- data/spec/dsl/program_spec.rb +36 -0
- data/spec/dsl_and_hlmodel/new_process_spec.rb +235 -0
- data/spec/hlmodel/net_spec.rb +112 -0
- data/spec/hlmodel/process_spec.rb +242 -0
- data/spec/hlmodel/route_spec.rb +47 -0
- data/spec/hlmodel/routes_spec.rb +44 -0
- data/spec/integration/basic_simulation_spec.rb +104 -0
- data/spec/integration/net_spec.rb +44 -0
- data/spec/integration/process_spec.rb +117 -0
- data/spec/integration/rbsim_spec.rb +40 -0
- data/spec/simulator/logger_spec.rb +35 -0
- data/spec/simulator/stats_spec.rb +93 -0
- data/spec/spec_helper.rb +26 -0
- data/spec/statistics_spec.rb +300 -0
- data/spec/tcpn/add_route_spec.rb +55 -0
- data/spec/tcpn/cpu_spec.rb +53 -0
- data/spec/tcpn/map_data_spec.rb +37 -0
- data/spec/tcpn/network_spec.rb +163 -0
- data/spec/tcpn/register_event_spec.rb +48 -0
- data/spec/tcpn/route_to_self_spec.rb +53 -0
- data/spec/tcpn/stats_spec.rb +77 -0
- data/spec/tokens/data_queue_obsolete.rb +121 -0
- data/spec/tokens/data_queue_spec.rb +111 -0
- data/spec/units_spec.rb +48 -0
- data/tcpn/model.rb +6 -0
- data/tcpn/model/add_route.rb +78 -0
- data/tcpn/model/application.rb +250 -0
- data/tcpn/model/cpu.rb +75 -0
- data/tcpn/model/map_data.rb +42 -0
- data/tcpn/model/network.rb +108 -0
- data/tcpn/model/register_event.rb +89 -0
- data/tcpn/model/stats.rb +46 -0
- metadata +221 -0
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "RBSim#dsl" do
|
4
|
+
context "model with routes" do
|
5
|
+
|
6
|
+
let :model do
|
7
|
+
RBSim.dsl do
|
8
|
+
|
9
|
+
route from: :node01, to: :node02, via: [ :net01, :net02 ]
|
10
|
+
route from: :node04, to: :node05, via: [ :net07, :net01 ], twoway: true
|
11
|
+
route from: :node06, to: :node07, via: [ :net07, :net01 ], twoway: :true
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
subject { model.routes }
|
17
|
+
|
18
|
+
it "has route from :node01 to :node02" do
|
19
|
+
expect(subject.find :node01, :node02).not_to be nil
|
20
|
+
end
|
21
|
+
|
22
|
+
it "has no route from :node02 to :node01" do
|
23
|
+
expect(subject.find :node02, :node01).to be nil
|
24
|
+
end
|
25
|
+
|
26
|
+
it "has route from :node04 to :node05" do
|
27
|
+
expect(subject.find :node04, :node05).not_to be nil
|
28
|
+
end
|
29
|
+
|
30
|
+
it "has route from :node05 to :node04" do
|
31
|
+
expect(subject.find :node05, :node04).not_to be nil
|
32
|
+
end
|
33
|
+
|
34
|
+
it "has route from :node06 to :node07" do
|
35
|
+
expect(subject.find :node06, :node07).not_to be nil
|
36
|
+
end
|
37
|
+
|
38
|
+
it "has route from :node07 to :node06" do
|
39
|
+
expect(subject.find :node07, :node06).not_to be nil
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'spec_helper.rb'
|
2
|
+
|
3
|
+
describe 'RBSim#dsl' do
|
4
|
+
|
5
|
+
context "with mapping" do
|
6
|
+
|
7
|
+
let(:model) do
|
8
|
+
RBSim.dsl do
|
9
|
+
|
10
|
+
put :client, on: :node01
|
11
|
+
put process: :worker1, on: :node01
|
12
|
+
put on: :node02, process: :worker2
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
it "has :client on :node01" do
|
18
|
+
expect(model.mapping[:client]).to eq :node01
|
19
|
+
end
|
20
|
+
|
21
|
+
it "has :worker1 on :node01" do
|
22
|
+
expect(model.mapping[:worker1]).to eq :node01
|
23
|
+
end
|
24
|
+
|
25
|
+
it "has :worker2 on :node02" do
|
26
|
+
expect(model.mapping[:worker2]).to eq :node02
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
context "with mapping without node" do
|
32
|
+
it "raises error" do
|
33
|
+
expect do
|
34
|
+
RBSim.dsl do
|
35
|
+
put :client
|
36
|
+
end
|
37
|
+
end.to raise_error RuntimeError
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context "with mapping without process" do
|
42
|
+
it "raises error" do
|
43
|
+
expect do
|
44
|
+
RBSim.dsl do
|
45
|
+
put nil, on: :node01
|
46
|
+
end
|
47
|
+
end.to raise_error RuntimeError
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context "with mapping defined by Hash without process" do
|
52
|
+
it "raises error" do
|
53
|
+
expect do
|
54
|
+
RBSim.dsl do
|
55
|
+
put on: :node01
|
56
|
+
end
|
57
|
+
end.to raise_error RuntimeError
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context "with mapping defined by Hash without node" do
|
62
|
+
it "raises error" do
|
63
|
+
expect do
|
64
|
+
RBSim.dsl do
|
65
|
+
put process: :client
|
66
|
+
end
|
67
|
+
end.to raise_error RuntimeError
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'spec_helper.rb'
|
2
|
+
|
3
|
+
describe 'RBSim#dsl' do
|
4
|
+
|
5
|
+
shared_examples 'process defined' do
|
6
|
+
|
7
|
+
it "has one process" do
|
8
|
+
expect(model.processes.size).to eq(1)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "has process :sender1" do
|
12
|
+
expect(model.processes[:sender1]).not_to be_nil
|
13
|
+
end
|
14
|
+
|
15
|
+
it "has 2 events in event_queue" do
|
16
|
+
expect(model.processes[:sender1].event_queue_size).to eq(2)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context "with processes defined by block" do
|
21
|
+
|
22
|
+
let(:model) do
|
23
|
+
RBSim.dsl do
|
24
|
+
|
25
|
+
new_process :sender1 do
|
26
|
+
delay_for time: 100
|
27
|
+
cpu do |cpu|
|
28
|
+
10000/cpu.performance
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
include_examples 'process defined'
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
context "with processes defined by program" do
|
40
|
+
let(:model) do
|
41
|
+
RBSim.dsl do
|
42
|
+
program :sender1_prg do |args|
|
43
|
+
delay_for time: args[:time]
|
44
|
+
cpu do |cpu|
|
45
|
+
args[:volume]/cpu.performance
|
46
|
+
end
|
47
|
+
end
|
48
|
+
new_process :sender1, program: :sender1_prg, args: { time: 100, volume: 10000 }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
include_examples 'process defined'
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper.rb'
|
2
|
+
|
3
|
+
describe 'RBSim#dsl' do
|
4
|
+
|
5
|
+
context "with two programs" do
|
6
|
+
|
7
|
+
let(:model) do
|
8
|
+
RBSim.dsl do
|
9
|
+
|
10
|
+
program :waiter do |time|
|
11
|
+
delay_for time: time
|
12
|
+
end
|
13
|
+
|
14
|
+
program :worker do |volume|
|
15
|
+
cpu do |cpu|
|
16
|
+
volume * volume / cpu.performance
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
it "has two programs" do
|
24
|
+
expect(model.programs.size).to eq(2)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "has program called :waiter" do
|
28
|
+
expect(model.programs[:waiter]).not_to be_nil
|
29
|
+
end
|
30
|
+
|
31
|
+
it "has program called :volume" do
|
32
|
+
expect(model.programs[:worker]).not_to be_nil
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,235 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pry'
|
3
|
+
|
4
|
+
# Test behavior of HLModel::Process created with
|
5
|
+
# DSL new_process statement
|
6
|
+
describe "HLModel::Process created with DSL#new_process" do
|
7
|
+
|
8
|
+
let :model do
|
9
|
+
RBSim.dsl do
|
10
|
+
new_process :worker do
|
11
|
+
stats_start tag: :work, group_name: 'worker1'
|
12
|
+
on_event :data do |volume|
|
13
|
+
delay_for 200
|
14
|
+
cpu do |c|
|
15
|
+
20/c.performance
|
16
|
+
end
|
17
|
+
end
|
18
|
+
delay_for 100
|
19
|
+
stats_stop tag: :work, group_name: 'worker1'
|
20
|
+
stats tag: :doing_something, group_name: 'worker1'
|
21
|
+
cpu do |cpu|
|
22
|
+
100/cpu.performance
|
23
|
+
end
|
24
|
+
new_process :child do
|
25
|
+
delay_for 400
|
26
|
+
end
|
27
|
+
register_event :data, args: 1000
|
28
|
+
send_data to: :child, size: 1024, type: :hello, content: "Hello!"
|
29
|
+
log "finished main, will serve events"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
let :process do
|
35
|
+
p = model.processes[:worker]
|
36
|
+
p.node = :node01
|
37
|
+
p
|
38
|
+
end
|
39
|
+
|
40
|
+
module NewProcessSpec
|
41
|
+
class CPU
|
42
|
+
def performance
|
43
|
+
20
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
it "has correct behavior" do
|
49
|
+
expect(model.processes.size).to eq(1)
|
50
|
+
|
51
|
+
event = process.serve_system_event :stats_start
|
52
|
+
expect(event).to eq({name: :stats_start, args: { tag: :work, group_name: 'worker1'} })
|
53
|
+
|
54
|
+
event = process.serve_system_event :delay_for
|
55
|
+
expect(event).to eq({name: :delay_for, args: { time: 100 }})
|
56
|
+
|
57
|
+
event = process.serve_system_event :stats_stop
|
58
|
+
expect(event).to eq({name: :stats_stop, args: { tag: :work, group_name: 'worker1' } })
|
59
|
+
|
60
|
+
event = process.serve_system_event :stats
|
61
|
+
expect(event).to eq({name: :stats, args: { tag: :doing_something, group_name: 'worker1' } })
|
62
|
+
|
63
|
+
event = process.serve_system_event :cpu
|
64
|
+
expect(event[:name]).to eq(:cpu)
|
65
|
+
# CPU time computed for specified CPU
|
66
|
+
expect(event[:args][:block].call NewProcessSpec::CPU.new).to eq(5)
|
67
|
+
|
68
|
+
# new process
|
69
|
+
event = process.serve_system_event :new_process
|
70
|
+
new_process = event[:args][:constructor].call event[:args][:constructor_args]
|
71
|
+
expect(model.processes.size).to eq(2)
|
72
|
+
expect(model.processes[:child]).not_to be_nil
|
73
|
+
expect(model.processes[:child]).to eq(new_process)
|
74
|
+
# serve event of the new process
|
75
|
+
event = new_process.serve_system_event :delay_for
|
76
|
+
expect(event).to eq({name: :delay_for, args: { time: 400 }})
|
77
|
+
|
78
|
+
|
79
|
+
# old process again
|
80
|
+
# user register_event
|
81
|
+
expect {
|
82
|
+
e = process.serve_system_event :register_event
|
83
|
+
event = e[:args][:event]
|
84
|
+
delay = e[:args][:delay]
|
85
|
+
args = e[:args][:event_args]
|
86
|
+
expect(e[:name]).to eq(:register_event)
|
87
|
+
expect(event).to eq(:data)
|
88
|
+
expect(delay).to eq(0)
|
89
|
+
expect(args).to eq(1000)
|
90
|
+
process.enqueue_event(event, args)
|
91
|
+
#expect(process.event_queue_size).to eq(4)
|
92
|
+
}.not_to change(process, :event_queue_size) # register_event dequeued, new event enqueued
|
93
|
+
|
94
|
+
|
95
|
+
# send_data
|
96
|
+
event = process.serve_system_event :send_data
|
97
|
+
expect(event[:name]).to eq(:send_data)
|
98
|
+
# CPU time computed for specified CPU
|
99
|
+
expect(event[:args]).to eq(to: :child, size: 1024, type: :hello, content: "Hello!")
|
100
|
+
|
101
|
+
# log
|
102
|
+
event = process.serve_system_event :log
|
103
|
+
expect(event[:name]).to eq(:log)
|
104
|
+
expect(event[:args]).to eq("finished main, will serve events")
|
105
|
+
|
106
|
+
|
107
|
+
|
108
|
+
# user event :data registered by :register_event, its handler will be run
|
109
|
+
# in the future when time comes
|
110
|
+
p = process.serve_user_event
|
111
|
+
expect(p).to eq(process) # returns modified process
|
112
|
+
|
113
|
+
# Events created by serving the the :data user event above follow:
|
114
|
+
event = process.serve_system_event :delay_for
|
115
|
+
expect(event).to eq({name: :delay_for, args: { time: 200 }})
|
116
|
+
|
117
|
+
event = process.serve_system_event :cpu
|
118
|
+
expect(event[:name]).to eq(:cpu)
|
119
|
+
# CPU time computed for specified CPU
|
120
|
+
expect(event[:args][:block].call NewProcessSpec::CPU.new).to eq(1)
|
121
|
+
|
122
|
+
|
123
|
+
end
|
124
|
+
|
125
|
+
describe "#event_time" do
|
126
|
+
let :model do
|
127
|
+
RBSim.dsl do
|
128
|
+
new_process :worker do
|
129
|
+
|
130
|
+
on_event :start do
|
131
|
+
start_time = event_time
|
132
|
+
register_event :next_one, delay: 100.seconds
|
133
|
+
end
|
134
|
+
|
135
|
+
on_event :next_one do
|
136
|
+
next_time = event_time
|
137
|
+
end
|
138
|
+
|
139
|
+
register_event :start
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
it "returns time reported by simulator" do
|
145
|
+
simulator = double("simulator")
|
146
|
+
expect(simulator).to receive(:clock).twice
|
147
|
+
model.simulator = simulator
|
148
|
+
|
149
|
+
e = process.serve_system_event :register_event
|
150
|
+
process.enqueue_event e[:args][:event], e[:args][:event_args]
|
151
|
+
|
152
|
+
process.serve_user_event # :start
|
153
|
+
|
154
|
+
process.serve_system_event :register_event
|
155
|
+
process.enqueue_event e[:args][:event], e[:args][:event_args]
|
156
|
+
|
157
|
+
process.serve_user_event # :next_one
|
158
|
+
end
|
159
|
+
|
160
|
+
end
|
161
|
+
|
162
|
+
describe "#function statement" do
|
163
|
+
describe "defines function with access to variable values in correct context" do
|
164
|
+
let :model do
|
165
|
+
RBSim.dsl do
|
166
|
+
new_process :worker do
|
167
|
+
@variable = :initial_value
|
168
|
+
|
169
|
+
function :do_something do
|
170
|
+
log @variable
|
171
|
+
end
|
172
|
+
|
173
|
+
on_event :start do
|
174
|
+
do_something
|
175
|
+
end
|
176
|
+
|
177
|
+
register_event :start
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
it "function reads correct values from variables" do
|
183
|
+
e = process.serve_system_event :register_event
|
184
|
+
process.enqueue_event e[:args][:event], e[:args][:event_args]
|
185
|
+
|
186
|
+
# :start
|
187
|
+
process.serve_user_event
|
188
|
+
|
189
|
+
# value of variable logged by the function
|
190
|
+
e = process.serve_system_event :log
|
191
|
+
|
192
|
+
expect(e[:name]).to eq :log
|
193
|
+
expect(e[:args]).to eq :initial_value
|
194
|
+
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
describe "defines function with access to correct 'self'" do
|
199
|
+
let :model do
|
200
|
+
RBSim.dsl do
|
201
|
+
new_process :worker do
|
202
|
+
|
203
|
+
function :do_something do
|
204
|
+
self
|
205
|
+
end
|
206
|
+
|
207
|
+
on_event :start do
|
208
|
+
log self
|
209
|
+
log do_something
|
210
|
+
end
|
211
|
+
|
212
|
+
register_event :start
|
213
|
+
end
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
it "'self' in function equals to 'self' in calling block" do
|
218
|
+
e = process.serve_system_event :register_event
|
219
|
+
process.enqueue_event e[:args][:event], e[:args][:event_args]
|
220
|
+
|
221
|
+
# :start
|
222
|
+
process.serve_user_event
|
223
|
+
|
224
|
+
# values of variables 'self'
|
225
|
+
# logged by the function...
|
226
|
+
log_function = process.serve_system_event :log
|
227
|
+
# ...and logged by the action handler block
|
228
|
+
log_block = process.serve_system_event :log
|
229
|
+
|
230
|
+
expect(log_function[:args].object_id).to eq log_block[:args].object_id
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
end
|
235
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RBSim::HLModel::Net do
|
4
|
+
describe "drop decision" do
|
5
|
+
it "is always the same for two clones of the same net" do
|
6
|
+
net = RBSim::HLModel::Net.new :net01, 1024, 10, 0.5
|
7
|
+
equal_times = 1000.times.reduce(0) do |a,v|
|
8
|
+
net_clone = net.clone
|
9
|
+
if net.drop? == net_clone.drop?
|
10
|
+
a + 1
|
11
|
+
else
|
12
|
+
a
|
13
|
+
end
|
14
|
+
end
|
15
|
+
expect(equal_times).to eq 1000
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "drop probability" do
|
20
|
+
|
21
|
+
it "defaults to 0" do
|
22
|
+
net = RBSim::HLModel::Net.new :net01, 1024, 10
|
23
|
+
expect(net.drop).to eq 0
|
24
|
+
end
|
25
|
+
|
26
|
+
it "can be 0" do
|
27
|
+
expect {
|
28
|
+
RBSim::HLModel::Net.new :net01, 1024, 10, 0
|
29
|
+
}.not_to raise_error
|
30
|
+
end
|
31
|
+
|
32
|
+
it "can be 1" do
|
33
|
+
expect {
|
34
|
+
RBSim::HLModel::Net.new :net01, 1024, 10, 1
|
35
|
+
}.not_to raise_error
|
36
|
+
end
|
37
|
+
|
38
|
+
it "can be 0.5" do
|
39
|
+
expect {
|
40
|
+
RBSim::HLModel::Net.new :net01, 1024, 10, 0.5
|
41
|
+
}.not_to raise_error
|
42
|
+
end
|
43
|
+
|
44
|
+
it "can be 0.3" do
|
45
|
+
expect {
|
46
|
+
RBSim::HLModel::Net.new :net01, 1024, 10, 0.3
|
47
|
+
}.not_to raise_error
|
48
|
+
end
|
49
|
+
|
50
|
+
it "cannot be 1.3" do
|
51
|
+
expect {
|
52
|
+
RBSim::HLModel::Net.new :net01, 1024, 10, 1.3
|
53
|
+
}.to raise_error
|
54
|
+
end
|
55
|
+
|
56
|
+
it "cannot be -1" do
|
57
|
+
expect {
|
58
|
+
RBSim::HLModel::Net.new :net01, 1024, 10, -1
|
59
|
+
}.to raise_error
|
60
|
+
end
|
61
|
+
|
62
|
+
it "can be a lambda" do
|
63
|
+
expect {
|
64
|
+
RBSim::HLModel::Net.new :net01, 1024, 10, -> { true }
|
65
|
+
}.not_to raise_error
|
66
|
+
end
|
67
|
+
|
68
|
+
it "can be a Proc" do
|
69
|
+
expect {
|
70
|
+
RBSim::HLModel::Net.new :net01, 1024, 10, Proc.new { true }
|
71
|
+
}.not_to raise_error
|
72
|
+
end
|
73
|
+
|
74
|
+
describe "given as float" do
|
75
|
+
it "drops all packets if euqlas 1" do
|
76
|
+
net = RBSim::HLModel::Net.new :net01, 1024, 10, 1
|
77
|
+
dropped = 100.times.reduce(0) { |a, v| net.drop? ? a + 1 : a }
|
78
|
+
expect(dropped).to eq 100
|
79
|
+
end
|
80
|
+
|
81
|
+
it "drops no packets if euqlas 1" do
|
82
|
+
net = RBSim::HLModel::Net.new :net01, 1024, 10, 0
|
83
|
+
dropped = 100.times.reduce(0) { |a, v| net.drop? ? a + 1 : a }
|
84
|
+
expect(dropped).to eq 0
|
85
|
+
end
|
86
|
+
|
87
|
+
it "drops half of the packets if euqlas 0.5" do
|
88
|
+
net = RBSim::HLModel::Net.new :net01, 1024, 10, 0.5
|
89
|
+
dropped = 1000.times.reduce(0) { |a, v| net.drop? ? a + 1 : a }
|
90
|
+
expect(dropped).to be_within(100).of(500)
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
|
95
|
+
describe "given as lambda" do
|
96
|
+
describe "if true" do
|
97
|
+
it "drops packet" do
|
98
|
+
net = RBSim::HLModel::Net.new :net01, 1024, 10, -> { true }
|
99
|
+
expect(net.drop?).to be true
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
describe "if false" do
|
104
|
+
it "does not drop packet" do
|
105
|
+
net = RBSim::HLModel::Net.new :net01, 1024, 10, -> { false }
|
106
|
+
expect(net.drop?).to be false
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|