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.
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
+