rbsim 0.0.3
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 +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,55 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "TCPN model" do
|
4
|
+
|
5
|
+
describe "page 'add route'" do
|
6
|
+
|
7
|
+
let :data_token do
|
8
|
+
data = RBSim::Tokens::DataToken.new(34523, :node01, :sender, to: :worker1, size: 345, type: :req, content: :anything)
|
9
|
+
data.fragments = 1
|
10
|
+
data.dst_node = :node02
|
11
|
+
data
|
12
|
+
end
|
13
|
+
|
14
|
+
let :correct_route do
|
15
|
+
RBSim::HLModel::Route.new :node01, :node02, [ :net01, :net02 ]
|
16
|
+
end
|
17
|
+
|
18
|
+
let :incorrect_route1 do
|
19
|
+
RBSim::HLModel::Route.new :node05, :node02, [ :net04, :net03 ]
|
20
|
+
end
|
21
|
+
|
22
|
+
let :incorrect_route2 do
|
23
|
+
RBSim::HLModel::Route.new :node01, :node05, [ :net02, :net05 ]
|
24
|
+
end
|
25
|
+
|
26
|
+
let :routes_token do
|
27
|
+
routes = RBSim::Tokens::RoutesToken.new
|
28
|
+
routes << incorrect_route1
|
29
|
+
routes << correct_route
|
30
|
+
routes << incorrect_route2
|
31
|
+
routes
|
32
|
+
end
|
33
|
+
|
34
|
+
let :tcpn do
|
35
|
+
tcpn = FastTCPN.read 'tcpn/model/add_route.rb'
|
36
|
+
|
37
|
+
tcpn.add_marking_for 'data for network', data_token
|
38
|
+
tcpn.add_marking_for 'routes', routes_token
|
39
|
+
tcpn.add_marking_for 'data to receive', RBSim::Tokens::DataQueueToken.new(:worker1)
|
40
|
+
tcpn
|
41
|
+
end
|
42
|
+
|
43
|
+
it "adds correct route to data" do
|
44
|
+
tcpn.sim
|
45
|
+
|
46
|
+
new_data = tcpn.marking_for('data with route').first[:val]
|
47
|
+
expect(new_data.route.src).to eq data_token.src_node
|
48
|
+
expect(new_data.route.dst).to eq data_token.dst_node
|
49
|
+
expect(tcpn.marking_for('data to receive')).not_to be_empty
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "TCPN model" do
|
4
|
+
|
5
|
+
describe "page 'cpu'" do
|
6
|
+
|
7
|
+
let(:node) { :node01 }
|
8
|
+
|
9
|
+
let(:times) { [ 100, 200, 300, 400 ] }
|
10
|
+
|
11
|
+
let :cpu_block do
|
12
|
+
i = 0
|
13
|
+
proc do |cpu|
|
14
|
+
time = times[i]
|
15
|
+
i += 1
|
16
|
+
i %= times.length
|
17
|
+
time
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
let :process_token do
|
22
|
+
process = RBSim::Tokens::ProcessToken.new(:test_process)
|
23
|
+
process.node = node
|
24
|
+
process.enqueue_event :cpu, block: cpu_block
|
25
|
+
process
|
26
|
+
end
|
27
|
+
|
28
|
+
let :cpu_token do
|
29
|
+
RBSim::Tokens::CPUToken.new(1, node)
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
let :tcpn do
|
34
|
+
tcpn = FastTCPN.read 'tcpn/model/cpu.rb'
|
35
|
+
|
36
|
+
tcpn.add_marking_for 'process', process_token
|
37
|
+
tcpn.add_marking_for 'CPU', cpu_token
|
38
|
+
tcpn
|
39
|
+
end
|
40
|
+
|
41
|
+
it "sets correct timestamps for cpu and process tokens" do
|
42
|
+
tcpn.sim
|
43
|
+
|
44
|
+
process_timestamp = tcpn.marking_for('process').first[:ts]
|
45
|
+
expect(process_timestamp).to eq times.first
|
46
|
+
|
47
|
+
cpu_timestamp = tcpn.marking_for('CPU').first[:ts]
|
48
|
+
expect(cpu_timestamp).to eq times.first
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "TCPN model" do
|
4
|
+
|
5
|
+
describe "page 'map data'" do
|
6
|
+
|
7
|
+
let :data_token do
|
8
|
+
RBSim::Tokens::DataToken.new(6754, :node01, :sender, to: :worker1, size: 345, type: :req, content: :anything)
|
9
|
+
end
|
10
|
+
|
11
|
+
let :mapping_token do
|
12
|
+
{ ts: 0, val: { child: :laptop, worker1: :node10, client: :old_comp } }
|
13
|
+
end
|
14
|
+
|
15
|
+
let :tcpn do
|
16
|
+
tcpn = FastTCPN.read 'tcpn/model/map_data.rb'
|
17
|
+
|
18
|
+
tcpn.add_marking_for 'data to send', data_token
|
19
|
+
tcpn.add_marking_for 'mapping', mapping_token
|
20
|
+
tcpn
|
21
|
+
end
|
22
|
+
|
23
|
+
it "maps data to correct node and does not touch mapping" do
|
24
|
+
tcpn.sim
|
25
|
+
data = tcpn.marking_for('data for network').first[:val]
|
26
|
+
expect(data.dst_node).to eq(:node10)
|
27
|
+
|
28
|
+
new_mapping = tcpn.marking_for('mapping').first[:val]
|
29
|
+
# check subsequent keys with values since #== is redefined!
|
30
|
+
mapping_token[:val].each do |k, v|
|
31
|
+
expect(new_mapping[k]).to eq v
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
@@ -0,0 +1,163 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "TCPN model" do
|
4
|
+
|
5
|
+
describe "page 'network'" do
|
6
|
+
|
7
|
+
let :route do
|
8
|
+
RBSim::HLModel::Route.new :node01, :node02, [ :net01, :net02, :net03 ]
|
9
|
+
end
|
10
|
+
|
11
|
+
let :data_token do
|
12
|
+
data = RBSim::Tokens::DataToken.new(6756453, :node01, :sender, to: :worker1, size: 4000, type: :req, content: :anything)
|
13
|
+
data.fragments = 1
|
14
|
+
data.dst_node = :node02
|
15
|
+
data.route = route
|
16
|
+
data
|
17
|
+
end
|
18
|
+
|
19
|
+
let :tcpn do
|
20
|
+
tcpn = FastTCPN.read 'tcpn/model/network.rb'
|
21
|
+
|
22
|
+
tcpn.add_marking_for 'data to receive', RBSim::Tokens::DataQueueToken.new(:worker1)
|
23
|
+
tcpn.add_marking_for 'data with route', data_token
|
24
|
+
bw = 50
|
25
|
+
[ :net01, :net02, :net03, :net04, :net05 ].each do |name|
|
26
|
+
tcpn.add_marking_for 'net', RBSim::Tokens::NetToken.new(name, bw)
|
27
|
+
bw *= 2
|
28
|
+
end
|
29
|
+
|
30
|
+
tcpn
|
31
|
+
end
|
32
|
+
|
33
|
+
it "finishes simulation with correct clock value" do
|
34
|
+
tcpn.sim
|
35
|
+
time = 7.0*data_token.size/200
|
36
|
+
expect(tcpn.clock).to eq time
|
37
|
+
end
|
38
|
+
|
39
|
+
it "finishes simulation with data token in 'data to receive' place" do
|
40
|
+
tcpn.sim
|
41
|
+
expect(tcpn.marking_for('data to receive').first[:val].get).to eq data_token
|
42
|
+
end
|
43
|
+
|
44
|
+
it "fires net transition correct number of times" do
|
45
|
+
count = 0
|
46
|
+
tcpn.cb_for :transition, :before do |t, e|
|
47
|
+
if e.transition == 'net'
|
48
|
+
d = e.binding['data with route'].value
|
49
|
+
count += 1
|
50
|
+
end
|
51
|
+
end
|
52
|
+
tcpn.sim
|
53
|
+
|
54
|
+
expect(count).to eq(route.via.length)
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
it "correctly updates timestamps of net tokens" do
|
59
|
+
tcpn.sim
|
60
|
+
time = 0
|
61
|
+
[:net01, :net02, :net03].each do |net_name|
|
62
|
+
net = tcpn.marking_for('net').select { |net| net[:val].name == net_name }.first
|
63
|
+
expect(net[:ts]).to eq(data_token.size/net[:val].bw + time)
|
64
|
+
time = net[:ts]
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe "for fragmented data" do
|
69
|
+
let :data_token do
|
70
|
+
data = RBSim::Tokens::DataToken.new(6756453, :node01, :sender, to: :worker1, size: 4000, type: :req, content: :anything)
|
71
|
+
data.fragments = 10
|
72
|
+
data.dst_node = :node02
|
73
|
+
data.route = route
|
74
|
+
data
|
75
|
+
end
|
76
|
+
|
77
|
+
it "correctly updates timestamps of net tokens respecting number of fragments" do
|
78
|
+
tcpn.sim
|
79
|
+
time = 0
|
80
|
+
[:net01, :net02, :net03].each do |net_name|
|
81
|
+
net = tcpn.marking_for('net').select { |net| net[:val].name == net_name }.first
|
82
|
+
expect(net[:ts]).to eq(data_token.size/net[:val].bw/data_token.fragments + time)
|
83
|
+
time = net[:ts]
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe "dropping packages" do
|
89
|
+
|
90
|
+
let :route do
|
91
|
+
RBSim::HLModel::Route.new :node01, :node02, [ :net01 ]
|
92
|
+
end
|
93
|
+
|
94
|
+
let :data_token do
|
95
|
+
data = RBSim::Tokens::DataToken.new(354232, :node01, :sender, to: :worker1, size: 4000, type: :req, content: :anything)
|
96
|
+
data.fragments = 1
|
97
|
+
data.dst_node = :node02
|
98
|
+
data.route = route
|
99
|
+
data
|
100
|
+
end
|
101
|
+
|
102
|
+
let :tcpn do
|
103
|
+
tcpn = FastTCPN.read 'tcpn/model/network.rb'
|
104
|
+
|
105
|
+
tcpn.add_marking_for 'data to receive', RBSim::Tokens::DataQueueToken.new(:worker1)
|
106
|
+
tcpn.add_marking_for 'data with route', data_token
|
107
|
+
tcpn.add_marking_for 'net', RBSim::Tokens::NetToken.new(:net01, 50, 0, drop)
|
108
|
+
tcpn
|
109
|
+
end
|
110
|
+
|
111
|
+
describe "when #drop? returns false" do
|
112
|
+
let(:drop) { ->{ false } }
|
113
|
+
|
114
|
+
it "does not drop package" do
|
115
|
+
tcpn.sim
|
116
|
+
expect(tcpn.marking_for('data to receive').first[:val].get).to eq data_token
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
describe "when #drop? returns true" do
|
121
|
+
let(:drop) { ->{ true } }
|
122
|
+
|
123
|
+
it "drops package" do
|
124
|
+
tcpn.sim
|
125
|
+
expect(tcpn.marking_for('data to receive').first[:val]).to be_empty
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
describe "when #drop? returns false then true" do
|
130
|
+
let :data_token do
|
131
|
+
data1 = RBSim::Tokens::DataToken.new(6755, :node01, :sender, to: :worker1, size: 4000, type: :req, content: :anything)
|
132
|
+
data1.fragments = 1
|
133
|
+
data1.dst_node = :node02
|
134
|
+
data1.route = route
|
135
|
+
|
136
|
+
data2 = RBSim::Tokens::DataToken.new(9876, :node01, :sender, to: :worker1, size: 4000, type: :req, content: :anything)
|
137
|
+
data2.fragments = 1
|
138
|
+
data2.dst_node = :node02
|
139
|
+
data2.route = route
|
140
|
+
|
141
|
+
[ data1, data2 ]
|
142
|
+
end
|
143
|
+
|
144
|
+
let(:drop) do
|
145
|
+
values = [ false, true ]
|
146
|
+
lambda do
|
147
|
+
values.shift
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
it "drops one package and lets one package go" do
|
152
|
+
tcpn.sim
|
153
|
+
expect(tcpn.marking_for('data to receive').first[:val].length).to be 1
|
154
|
+
end
|
155
|
+
|
156
|
+
end
|
157
|
+
|
158
|
+
end
|
159
|
+
|
160
|
+
end
|
161
|
+
|
162
|
+
end
|
163
|
+
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "TCPN model" do
|
4
|
+
|
5
|
+
describe "page 'register event'" do
|
6
|
+
|
7
|
+
let :process_token do
|
8
|
+
process = RBSim::Tokens::ProcessToken.new(:test_process)
|
9
|
+
process.node = :node01
|
10
|
+
process.enqueue_event :register_event, { event: :data, delay: 10, event_args: 1024 }
|
11
|
+
process.on_event :data do
|
12
|
+
end
|
13
|
+
process
|
14
|
+
end
|
15
|
+
|
16
|
+
let :tcpn do
|
17
|
+
tcpn = FastTCPN.read 'tcpn/model/register_event.rb'
|
18
|
+
|
19
|
+
tcpn.add_marking_for 'process', process_token
|
20
|
+
tcpn
|
21
|
+
end
|
22
|
+
|
23
|
+
it "enqueues event in specified time" do
|
24
|
+
register_event_fired = false
|
25
|
+
enqueue_event_fired = false
|
26
|
+
tcpn.cb_for :transition, :after do |t, e|
|
27
|
+
if e.transition == 'event::register_event'
|
28
|
+
register_event_fired = true
|
29
|
+
elsif e.transition == 'event::enqueue_event'
|
30
|
+
enqueue_event_fired = true
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
tcpn.sim
|
35
|
+
|
36
|
+
expect(register_event_fired).to be true
|
37
|
+
expect(enqueue_event_fired).to be true
|
38
|
+
|
39
|
+
process_timestamp = tcpn.marking_for('process').first[:ts]
|
40
|
+
expect(process_timestamp).to eq(10)
|
41
|
+
|
42
|
+
process = tcpn.marking_for('process').first[:val]
|
43
|
+
expect(process.has_event? :data).to be true
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "TCPN model" do
|
4
|
+
|
5
|
+
describe "page 'add route'" do
|
6
|
+
|
7
|
+
context "route from node to self" do
|
8
|
+
let :data_token do
|
9
|
+
data = RBSim::Tokens::DataToken.new(6756454, :node01, :sender, to: :worker1, size: 345, type: :req, content: :anything)
|
10
|
+
data.fragments = 1
|
11
|
+
data.dst_node = :node01
|
12
|
+
data
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
let :incorrect_route1 do
|
17
|
+
RBSim::HLModel::Route.new :node05, :node02, [ :net04, :net03 ]
|
18
|
+
end
|
19
|
+
|
20
|
+
let :incorrect_route2 do
|
21
|
+
RBSim::HLModel::Route.new :node01, :node05, [ :net02, :net05 ]
|
22
|
+
end
|
23
|
+
|
24
|
+
let :routes_token do
|
25
|
+
routes = RBSim::Tokens::RoutesToken.new
|
26
|
+
routes << incorrect_route1
|
27
|
+
routes << incorrect_route2
|
28
|
+
routes
|
29
|
+
end
|
30
|
+
|
31
|
+
let :tcpn do
|
32
|
+
tcpn = FastTCPN.read 'tcpn/model/add_route.rb'
|
33
|
+
|
34
|
+
tcpn.add_marking_for 'data for network', data_token
|
35
|
+
tcpn.add_marking_for 'routes', routes_token
|
36
|
+
tcpn.add_marking_for 'data to receive', RBSim::Tokens::DataQueueToken.new(:worker1)
|
37
|
+
tcpn
|
38
|
+
end
|
39
|
+
|
40
|
+
it "adds correct route to data" do
|
41
|
+
tcpn.sim
|
42
|
+
|
43
|
+
expect(tcpn.marking_for('data with route')).to eq([])
|
44
|
+
expect(tcpn.marking_for('data to receive').first[:val].get).to eq(data_token)
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "TCPN model" do
|
4
|
+
|
5
|
+
describe "page 'stats'" do
|
6
|
+
|
7
|
+
let :process_token do
|
8
|
+
process = RBSim::Tokens::ProcessToken.new(:test_process)
|
9
|
+
process.node = :node01
|
10
|
+
process.enqueue_event stats_event, event_params
|
11
|
+
process
|
12
|
+
end
|
13
|
+
|
14
|
+
let(:event_params) { { tag: stats_tag, group_name: stats_group_name } }
|
15
|
+
|
16
|
+
let :tcpn do
|
17
|
+
tcpn = FastTCPN.read 'tcpn/model/stats.rb'
|
18
|
+
|
19
|
+
tcpn.add_marking_for 'process', process_token
|
20
|
+
tcpn
|
21
|
+
end
|
22
|
+
|
23
|
+
let(:stats_group_name) { 'apache' }
|
24
|
+
|
25
|
+
shared_examples "is served" do
|
26
|
+
it "is served" do
|
27
|
+
served = false
|
28
|
+
args = nil
|
29
|
+
tcpn.cb_for :transition, :after do |t, e|
|
30
|
+
if e.transition == 'event::stats'
|
31
|
+
served = true if e.binding['process'].value.has_event?(stats_event)
|
32
|
+
args = e.binding['process'].value.serve_system_event(stats_event)[:args]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
tcpn.sim
|
37
|
+
|
38
|
+
expect(served).to be true
|
39
|
+
expect(args).to eql(event_params)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe ":stats event" do
|
44
|
+
let(:stats_event) { :stats }
|
45
|
+
let(:stats_tag) { :work }
|
46
|
+
|
47
|
+
include_examples 'is served'
|
48
|
+
end
|
49
|
+
|
50
|
+
describe ":stats_start event" do
|
51
|
+
let(:stats_event) { :stats_start }
|
52
|
+
let(:stats_tag) { :doing }
|
53
|
+
|
54
|
+
include_examples 'is served'
|
55
|
+
end
|
56
|
+
|
57
|
+
describe ":stats_stop event" do
|
58
|
+
let(:stats_event) { :stats_stop }
|
59
|
+
let(:stats_tag) { :doing }
|
60
|
+
|
61
|
+
include_examples 'is served'
|
62
|
+
end
|
63
|
+
|
64
|
+
describe ":stats_save event" do
|
65
|
+
let(:stats_event) { :stats_save }
|
66
|
+
let(:stats_tag) { :doing }
|
67
|
+
let(:event_value) { 2345 }
|
68
|
+
let(:event_params) { { value: event_value, tag: stats_tag, group_name: stats_group_name } }
|
69
|
+
|
70
|
+
include_examples 'is served'
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
|