rbsim 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +7 -0
  2. data/.hgignore +6 -0
  3. data/.rspec +2 -0
  4. data/Gemfile +12 -0
  5. data/Gemfile.lock +66 -0
  6. data/LICENSE.txt +674 -0
  7. data/README.md +960 -0
  8. data/TODO +28 -0
  9. data/basic_sim.rb +62 -0
  10. data/fast-tcpn.rb +3 -0
  11. data/lib/rbsim.rb +14 -0
  12. data/lib/rbsim/dsl.rb +30 -0
  13. data/lib/rbsim/dsl/infrastructure.rb +48 -0
  14. data/lib/rbsim/dsl/mapping.rb +32 -0
  15. data/lib/rbsim/dsl/process.rb +129 -0
  16. data/lib/rbsim/dsl/program.rb +10 -0
  17. data/lib/rbsim/experiment.rb +110 -0
  18. data/lib/rbsim/hlmodel.rb +25 -0
  19. data/lib/rbsim/hlmodel/infrastructure.rb +116 -0
  20. data/lib/rbsim/hlmodel/mapping.rb +5 -0
  21. data/lib/rbsim/hlmodel/process.rb +152 -0
  22. data/lib/rbsim/numeric_units.rb +107 -0
  23. data/lib/rbsim/simulator.rb +184 -0
  24. data/lib/rbsim/statistics.rb +77 -0
  25. data/lib/rbsim/tokens.rb +146 -0
  26. data/lib/rbsim/version.rb +3 -0
  27. data/new_process.rb +49 -0
  28. data/rbsim.gemspec +42 -0
  29. data/show_readme.rb +15 -0
  30. data/sim.rb +142 -0
  31. data/sim_bamboo.rb +251 -0
  32. data/sim_process.rb +83 -0
  33. data/sim_process_dsl.rb +58 -0
  34. data/spec/dsl/infrastructure_nets_spec.rb +39 -0
  35. data/spec/dsl/infrastructure_nodes_spec.rb +72 -0
  36. data/spec/dsl/infrastructure_routes_spec.rb +44 -0
  37. data/spec/dsl/mapping_spec.rb +70 -0
  38. data/spec/dsl/process_spec.rb +56 -0
  39. data/spec/dsl/program_spec.rb +36 -0
  40. data/spec/dsl_and_hlmodel/new_process_spec.rb +235 -0
  41. data/spec/hlmodel/net_spec.rb +112 -0
  42. data/spec/hlmodel/process_spec.rb +242 -0
  43. data/spec/hlmodel/route_spec.rb +47 -0
  44. data/spec/hlmodel/routes_spec.rb +44 -0
  45. data/spec/integration/basic_simulation_spec.rb +104 -0
  46. data/spec/integration/net_spec.rb +44 -0
  47. data/spec/integration/process_spec.rb +117 -0
  48. data/spec/integration/rbsim_spec.rb +40 -0
  49. data/spec/simulator/logger_spec.rb +35 -0
  50. data/spec/simulator/stats_spec.rb +93 -0
  51. data/spec/spec_helper.rb +26 -0
  52. data/spec/statistics_spec.rb +300 -0
  53. data/spec/tcpn/add_route_spec.rb +55 -0
  54. data/spec/tcpn/cpu_spec.rb +53 -0
  55. data/spec/tcpn/map_data_spec.rb +37 -0
  56. data/spec/tcpn/network_spec.rb +163 -0
  57. data/spec/tcpn/register_event_spec.rb +48 -0
  58. data/spec/tcpn/route_to_self_spec.rb +53 -0
  59. data/spec/tcpn/stats_spec.rb +77 -0
  60. data/spec/tokens/data_queue_obsolete.rb +121 -0
  61. data/spec/tokens/data_queue_spec.rb +111 -0
  62. data/spec/units_spec.rb +48 -0
  63. data/tcpn/model.rb +6 -0
  64. data/tcpn/model/add_route.rb +78 -0
  65. data/tcpn/model/application.rb +250 -0
  66. data/tcpn/model/cpu.rb +75 -0
  67. data/tcpn/model/map_data.rb +42 -0
  68. data/tcpn/model/network.rb +108 -0
  69. data/tcpn/model/register_event.rb +89 -0
  70. data/tcpn/model/stats.rb +46 -0
  71. 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
+