cosmos 3.0.0 → 3.0.1
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/.travis.yml +2 -0
- data/CONTRIBUTING.txt +50 -0
- data/Gemfile +1 -0
- data/Manifest.txt +2 -0
- data/README.md +66 -1
- data/cosmos.gemspec +2 -3
- data/data/crc.txt +2 -2
- data/demo/Gemfile +1 -0
- data/ext/cosmos/ext/platform/platform.c +1 -2
- data/ext/mkrf_conf.rb +40 -0
- data/install/Gemfile +1 -0
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +1 -0
- data/lib/cosmos/version.rb +4 -4
- data/spec/core_ext/io_spec.rb +1 -1
- data/spec/core_ext/math_spec.rb +2 -2
- data/spec/interfaces/interface_spec.rb +3 -0
- data/spec/interfaces/udp_interface_spec.rb +2 -0
- data/spec/io/json_drb_object_spec.rb +6 -0
- data/spec/io/json_drb_spec.rb +18 -0
- data/spec/io/tcpip_server_spec.rb +28 -12
- data/spec/packet_logs/packet_log_writer_spec.rb +25 -11
- data/spec/script/script_spec.rb +8 -4
- data/spec/spec_helper.rb +11 -1
- data/spec/tools/cmd_tlm_server/api_spec.rb +33 -10
- data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +9 -10
- data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +5 -0
- data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +16 -19
- data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +38 -49
- data/spec/tools/cmd_tlm_server/interfaces_spec.rb +17 -7
- data/spec/tools/cmd_tlm_server/router_thread_spec.rb +9 -12
- data/spec/tools/cmd_tlm_server/routers_spec.rb +17 -5
- data/spec/top_level/top_level_spec.rb +4 -3
- metadata +7 -18
@@ -35,13 +35,13 @@ module Cosmos
|
|
35
35
|
tf.close
|
36
36
|
config = CmdTlmServerConfig.new(tf.path)
|
37
37
|
bt = BackgroundTasks.new(config)
|
38
|
-
num_threads = Thread.list.length
|
39
38
|
bt.start
|
40
39
|
sleep 0.1
|
41
|
-
|
40
|
+
# 2 because the RSpec main thread plus the background task
|
41
|
+
Thread.list.length.should eql(2)
|
42
42
|
bt.stop
|
43
|
-
sleep 0.
|
44
|
-
Thread.list.length.should eql
|
43
|
+
sleep 0.2
|
44
|
+
Thread.list.length.should eql(1)
|
45
45
|
|
46
46
|
tf.unlink
|
47
47
|
File.delete(File.join(Cosmos::USERPATH,'lib','my_bg_task1.rb'))
|
@@ -61,14 +61,14 @@ module Cosmos
|
|
61
61
|
end
|
62
62
|
config = CmdTlmServerConfig.new(tf.path)
|
63
63
|
bt = BackgroundTasks.new(config)
|
64
|
-
num_threads = Thread.list.length
|
65
64
|
bt.start
|
66
|
-
|
65
|
+
# 2 because the RSpec main thread plus the background task
|
66
|
+
Thread.list.length.should eql(2)
|
67
67
|
sleep 1.1 # Allow the thread to crash
|
68
|
-
Thread.list.length.should eql
|
68
|
+
Thread.list.length.should eql(1)
|
69
69
|
bt.stop
|
70
|
-
sleep 0.
|
71
|
-
Thread.list.length.should eql
|
70
|
+
sleep 0.2
|
71
|
+
Thread.list.length.should eql(1)
|
72
72
|
|
73
73
|
stdout.string.should match "Background Task thread unexpectedly died"
|
74
74
|
end
|
@@ -79,4 +79,3 @@ module Cosmos
|
|
79
79
|
|
80
80
|
end
|
81
81
|
end
|
82
|
-
|
@@ -109,6 +109,11 @@ module Cosmos
|
|
109
109
|
config.packet_log_writer_pairs["DEFAULT"].cmd_log_writer.logging_enabled.should be_truthy
|
110
110
|
config.packet_log_writer_pairs["MY_WRITER"].cmd_log_writer.logging_enabled.should be_falsey
|
111
111
|
tf.unlink
|
112
|
+
config.packet_log_writer_pairs.each do |name, plwp|
|
113
|
+
plwp.cmd_log_writer.shutdown
|
114
|
+
plwp.tlm_log_writer.shutdown
|
115
|
+
end
|
116
|
+
sleep(0.2)
|
112
117
|
end
|
113
118
|
end
|
114
119
|
|
@@ -21,13 +21,10 @@ module Cosmos
|
|
21
21
|
File.open(cts,'w') do |file|
|
22
22
|
file.puts 'INTERFACE INT interface.rb'
|
23
23
|
end
|
24
|
-
|
25
|
-
@start_threads = Thread.list.length
|
26
24
|
end
|
27
25
|
|
28
26
|
after(:all) do
|
29
27
|
clean_config()
|
30
|
-
Thread.list.length.should eql @start_threads
|
31
28
|
end
|
32
29
|
|
33
30
|
before(:each) do
|
@@ -52,7 +49,7 @@ module Cosmos
|
|
52
49
|
# Verify we can't start another CTS
|
53
50
|
expect { CmdTlmServer.new }.to raise_error(FatalError, /Error starting JsonDRb on port 7777/)
|
54
51
|
cts.stop
|
55
|
-
sleep 0.
|
52
|
+
sleep 0.2
|
56
53
|
end
|
57
54
|
|
58
55
|
it "should create the CTS in production mode" do
|
@@ -65,7 +62,7 @@ module Cosmos
|
|
65
62
|
CmdTlmServer.json_drb.method_whitelist.should_not include('stop_cmd_log')
|
66
63
|
CmdTlmServer.json_drb.method_whitelist.should_not include('stop_tlm_log')
|
67
64
|
cts.stop
|
68
|
-
sleep 0.
|
65
|
+
sleep 0.2
|
69
66
|
end
|
70
67
|
end
|
71
68
|
|
@@ -81,7 +78,7 @@ module Cosmos
|
|
81
78
|
cts.start # Call start again ... it should do nothing
|
82
79
|
Thread.list.length.should eql threads
|
83
80
|
cts.stop
|
84
|
-
sleep 0.
|
81
|
+
sleep 0.2
|
85
82
|
|
86
83
|
expect_any_instance_of(PacketLogging).to receive(:start)
|
87
84
|
# Now start the server in production mode
|
@@ -92,7 +89,7 @@ module Cosmos
|
|
92
89
|
CmdTlmServer.json_drb.method_whitelist.should_not include('stop_cmd_log')
|
93
90
|
CmdTlmServer.json_drb.method_whitelist.should_not include('stop_tlm_log')
|
94
91
|
cts.stop
|
95
|
-
sleep 0.
|
92
|
+
sleep 0.2
|
96
93
|
end
|
97
94
|
|
98
95
|
it "should monitor the staleness thread" do
|
@@ -104,7 +101,7 @@ module Cosmos
|
|
104
101
|
cts = CmdTlmServer.new
|
105
102
|
sleep 0.1
|
106
103
|
cts.stop
|
107
|
-
sleep 0.
|
104
|
+
sleep 0.2
|
108
105
|
|
109
106
|
stdout.string.should match "Staleness Monitor thread unexpectedly died"
|
110
107
|
end
|
@@ -137,7 +134,7 @@ module Cosmos
|
|
137
134
|
stdout.string.should match "<R>TGT PKT TEST = 100 is RED"
|
138
135
|
|
139
136
|
cts.stop
|
140
|
-
sleep 0.
|
137
|
+
sleep 0.2
|
141
138
|
end
|
142
139
|
end
|
143
140
|
|
@@ -159,7 +156,7 @@ module Cosmos
|
|
159
156
|
cts.limits_change_callback(pkt, pi, :YELLOW, 100, true)
|
160
157
|
sleep 0.1
|
161
158
|
cts.stop
|
162
|
-
sleep 0.
|
159
|
+
sleep 0.2
|
163
160
|
end
|
164
161
|
|
165
162
|
it "should log limits response errors" do
|
@@ -177,7 +174,7 @@ module Cosmos
|
|
177
174
|
|
178
175
|
stdout.string.should match "TGT PKT TEST Limits Response Exception!"
|
179
176
|
cts.stop
|
180
|
-
sleep 0.
|
177
|
+
sleep 0.2
|
181
178
|
end
|
182
179
|
end
|
183
180
|
end
|
@@ -216,7 +213,7 @@ module Cosmos
|
|
216
213
|
state.should eql :YELLOW
|
217
214
|
|
218
215
|
cts.stop
|
219
|
-
sleep 0.
|
216
|
+
sleep 0.2
|
220
217
|
end
|
221
218
|
|
222
219
|
it "should delete queues after the max events is reached" do
|
@@ -242,7 +239,7 @@ module Cosmos
|
|
242
239
|
expect { CmdTlmServer.get_limits_event(id) }.to raise_error("Limits event queue with id #{id} not found")
|
243
240
|
|
244
241
|
cts.stop
|
245
|
-
sleep 0.
|
242
|
+
sleep 0.2
|
246
243
|
end
|
247
244
|
end
|
248
245
|
|
@@ -267,7 +264,7 @@ module Cosmos
|
|
267
264
|
expect { CmdTlmServer.get_limits_event(id) }.to raise_error("Limits event queue with id #{id} not found")
|
268
265
|
|
269
266
|
cts.stop
|
270
|
-
sleep 0.
|
267
|
+
sleep 0.2
|
271
268
|
end
|
272
269
|
end
|
273
270
|
|
@@ -313,7 +310,7 @@ module Cosmos
|
|
313
310
|
end
|
314
311
|
|
315
312
|
cts.stop
|
316
|
-
sleep 0.
|
313
|
+
sleep 0.2
|
317
314
|
end
|
318
315
|
|
319
316
|
it "should delete queues after the max packets is reached" do
|
@@ -348,7 +345,7 @@ module Cosmos
|
|
348
345
|
expect { CmdTlmServer.get_packet_data(id) }.to raise_error("Packet data queue with id #{id} not found")
|
349
346
|
|
350
347
|
cts.stop
|
351
|
-
sleep 0.
|
348
|
+
sleep 0.2
|
352
349
|
end
|
353
350
|
end
|
354
351
|
|
@@ -382,7 +379,7 @@ module Cosmos
|
|
382
379
|
expect { CmdTlmServer.get_packet_data(id) }.to raise_error("Packet data queue with id #{id} not found")
|
383
380
|
|
384
381
|
cts.stop
|
385
|
-
sleep 0.
|
382
|
+
sleep 0.2
|
386
383
|
end
|
387
384
|
end
|
388
385
|
|
@@ -393,7 +390,7 @@ module Cosmos
|
|
393
390
|
|
394
391
|
expect { CmdTlmServer.get_packet_data(id, true) }.to raise_error(ThreadError)
|
395
392
|
cts.stop
|
396
|
-
sleep 0.
|
393
|
+
sleep 0.2
|
397
394
|
end
|
398
395
|
end
|
399
396
|
|
@@ -409,7 +406,7 @@ module Cosmos
|
|
409
406
|
|
410
407
|
CmdTlmServer.json_drb.request_count.should eql 0
|
411
408
|
cts.stop
|
412
|
-
sleep 0.
|
409
|
+
sleep 0.2
|
413
410
|
end
|
414
411
|
end
|
415
412
|
|
@@ -57,13 +57,12 @@ module Cosmos
|
|
57
57
|
allow(@interface).to receive(:connected?).and_return(false)
|
58
58
|
allow(@interface).to receive(:connect) { raise "ConnectError" }
|
59
59
|
thread = InterfaceThread.new(@interface)
|
60
|
-
threads = Thread.list.length
|
61
60
|
thread.start
|
62
61
|
sleep 0.1
|
63
|
-
Thread.list.length.should eql
|
62
|
+
Thread.list.length.should eql(2)
|
64
63
|
thread.stop
|
65
|
-
sleep 0.
|
66
|
-
Thread.list.length.should eql
|
64
|
+
sleep 0.2
|
65
|
+
Thread.list.length.should eql(1)
|
67
66
|
|
68
67
|
stdout.string.should match "Connection Failed: ConnectError"
|
69
68
|
end
|
@@ -83,13 +82,12 @@ module Cosmos
|
|
83
82
|
error.message.should eql "ConnectError"
|
84
83
|
error_count += 1
|
85
84
|
end
|
86
|
-
threads = Thread.list.length
|
87
85
|
thread.start
|
88
86
|
sleep 0.1
|
89
|
-
Thread.list.length.should eql
|
87
|
+
Thread.list.length.should eql(2)
|
90
88
|
thread.stop
|
91
|
-
sleep 0.
|
92
|
-
Thread.list.length.should eql
|
89
|
+
sleep 0.2
|
90
|
+
Thread.list.length.should eql(1)
|
93
91
|
error_count.should eql 2
|
94
92
|
|
95
93
|
stdout.string.should_not match "Connection Failed: ConnectError"
|
@@ -99,13 +97,12 @@ module Cosmos
|
|
99
97
|
it "should log the connection" do
|
100
98
|
capture_io do |stdout|
|
101
99
|
thread = InterfaceThread.new(@interface)
|
102
|
-
threads = Thread.list.length
|
103
100
|
thread.start
|
104
101
|
sleep 0.1
|
105
|
-
Thread.list.length.should eql
|
102
|
+
Thread.list.length.should eql(2)
|
106
103
|
thread.stop
|
107
|
-
sleep 0.
|
108
|
-
Thread.list.length.should eql
|
104
|
+
sleep 0.2
|
105
|
+
Thread.list.length.should eql(1)
|
109
106
|
|
110
107
|
stdout.string.should match "Connection Success"
|
111
108
|
end
|
@@ -118,13 +115,12 @@ module Cosmos
|
|
118
115
|
thread.connection_success_callback = Proc.new do
|
119
116
|
callback_called = true
|
120
117
|
end
|
121
|
-
threads = Thread.list.length
|
122
118
|
thread.start
|
123
119
|
sleep 0.1
|
124
|
-
Thread.list.length.should eql
|
120
|
+
Thread.list.length.should eql(2)
|
125
121
|
thread.stop
|
126
|
-
sleep 0.
|
127
|
-
Thread.list.length.should eql
|
122
|
+
sleep 0.2
|
123
|
+
Thread.list.length.should eql(1)
|
128
124
|
callback_called.should be_truthy
|
129
125
|
|
130
126
|
stdout.string.should_not match "Connection Success"
|
@@ -139,13 +135,12 @@ module Cosmos
|
|
139
135
|
# create see the error twice.
|
140
136
|
@interface.reconnect_delay = 0.06
|
141
137
|
thread = InterfaceThread.new(@interface)
|
142
|
-
threads = Thread.list.length
|
143
138
|
thread.start
|
144
139
|
sleep 0.1
|
145
|
-
Thread.list.length.should eql
|
140
|
+
Thread.list.length.should eql(2)
|
146
141
|
thread.stop
|
147
|
-
sleep 0.
|
148
|
-
Thread.list.length.should eql
|
142
|
+
sleep 0.2
|
143
|
+
Thread.list.length.should eql(1)
|
149
144
|
|
150
145
|
stdout.string.should match "Connection Lost"
|
151
146
|
end
|
@@ -160,15 +155,14 @@ module Cosmos
|
|
160
155
|
thread.connection_lost_callback = Proc.new do
|
161
156
|
callback_called = true
|
162
157
|
end
|
163
|
-
threads = Thread.list.length
|
164
158
|
thread.start
|
165
159
|
sleep 0.1
|
166
160
|
# Since we set auto_reconnect to false we shouldn't see the interface
|
167
161
|
# thread because it will be killed
|
168
|
-
Thread.list.length.should eql
|
162
|
+
Thread.list.length.should eql(1)
|
169
163
|
thread.stop
|
170
|
-
sleep 0.
|
171
|
-
Thread.list.length.should eql
|
164
|
+
sleep 0.2
|
165
|
+
Thread.list.length.should eql(1)
|
172
166
|
callback_called.should be_truthy
|
173
167
|
|
174
168
|
stdout.string.should_not match "Connection Lost"
|
@@ -179,13 +173,12 @@ module Cosmos
|
|
179
173
|
capture_io do |stdout|
|
180
174
|
allow(@interface).to receive(:read) { raise "ReadError" }
|
181
175
|
thread = InterfaceThread.new(@interface)
|
182
|
-
threads = Thread.list.length
|
183
176
|
thread.start
|
184
177
|
sleep 0.1
|
185
|
-
Thread.list.length.should eql
|
178
|
+
Thread.list.length.should eql(2)
|
186
179
|
thread.stop
|
187
|
-
sleep 0.
|
188
|
-
Thread.list.length.should eql
|
180
|
+
sleep 0.2
|
181
|
+
Thread.list.length.should eql(1)
|
189
182
|
|
190
183
|
stdout.string.should match "ReadError"
|
191
184
|
end
|
@@ -199,13 +192,12 @@ module Cosmos
|
|
199
192
|
# create see the error twice.
|
200
193
|
@interface.reconnect_delay = 0.06
|
201
194
|
thread = InterfaceThread.new(@interface)
|
202
|
-
threads = Thread.list.length
|
203
195
|
thread.start
|
204
196
|
sleep 0.1
|
205
|
-
Thread.list.length.should eql
|
197
|
+
Thread.list.length.should eql(2)
|
206
198
|
thread.stop
|
207
|
-
sleep 0.
|
208
|
-
Thread.list.length.should eql
|
199
|
+
sleep 0.2
|
200
|
+
Thread.list.length.should eql(1)
|
209
201
|
|
210
202
|
stdout.string.should match "ECONNRESET"
|
211
203
|
end
|
@@ -218,7 +210,7 @@ module Cosmos
|
|
218
210
|
thread.start
|
219
211
|
sleep 0.1
|
220
212
|
thread.stop
|
221
|
-
sleep 0.
|
213
|
+
sleep 0.2
|
222
214
|
|
223
215
|
stdout.string.should match "Packet reading thread unexpectedly died"
|
224
216
|
end
|
@@ -236,7 +228,7 @@ module Cosmos
|
|
236
228
|
thread.start
|
237
229
|
sleep 0.1
|
238
230
|
thread.stop
|
239
|
-
sleep 0.
|
231
|
+
sleep 0.2
|
240
232
|
callback_called.should be_truthy
|
241
233
|
|
242
234
|
stdout.string.should_not match "Packet reading thread unexpectedly died"
|
@@ -247,13 +239,12 @@ module Cosmos
|
|
247
239
|
capture_io do |stdout|
|
248
240
|
@packet = Packet.new(nil,nil)
|
249
241
|
thread = InterfaceThread.new(@interface)
|
250
|
-
threads = Thread.list.length
|
251
242
|
thread.start
|
252
243
|
sleep 0.1
|
253
|
-
Thread.list.length.should eql
|
244
|
+
Thread.list.length.should eql(2)
|
254
245
|
thread.stop
|
255
|
-
sleep 0.
|
256
|
-
Thread.list.length.should eql
|
246
|
+
sleep 0.2
|
247
|
+
Thread.list.length.should eql(1)
|
257
248
|
|
258
249
|
stdout.string.should match "Unknown 2 byte packet"
|
259
250
|
end
|
@@ -265,13 +256,12 @@ module Cosmos
|
|
265
256
|
@packet.packet_name = 'SMITH'
|
266
257
|
allow(System).to receive_message_chain(:telemetry,:update!).and_raise(RuntimeError)
|
267
258
|
thread = InterfaceThread.new(@interface)
|
268
|
-
threads = Thread.list.length
|
269
259
|
thread.start
|
270
260
|
sleep 0.1
|
271
|
-
Thread.list.length.should eql
|
261
|
+
Thread.list.length.should eql(2)
|
272
262
|
thread.stop
|
273
|
-
sleep 0.
|
274
|
-
Thread.list.length.should eql
|
263
|
+
sleep 0.2
|
264
|
+
Thread.list.length.should eql(1)
|
275
265
|
stdout.string.should match "Received unknown identified telemetry: BOB SMITH"
|
276
266
|
end
|
277
267
|
end
|
@@ -285,13 +275,12 @@ module Cosmos
|
|
285
275
|
allow(router).to receive(:write) { raise "RouterWriteError" }
|
286
276
|
@interface.routers = [router]
|
287
277
|
thread = InterfaceThread.new(@interface)
|
288
|
-
threads = Thread.list.length
|
289
278
|
thread.start
|
290
279
|
sleep 0.1
|
291
|
-
Thread.list.length.should eql
|
280
|
+
Thread.list.length.should eql(2)
|
292
281
|
thread.stop
|
293
|
-
sleep 0.
|
294
|
-
Thread.list.length.should eql
|
282
|
+
sleep 0.2
|
283
|
+
Thread.list.length.should eql(1)
|
295
284
|
|
296
285
|
stdout.string.should match "Problem writing to router"
|
297
286
|
end
|
@@ -305,10 +294,10 @@ module Cosmos
|
|
305
294
|
threads = Thread.list.length
|
306
295
|
thread.start
|
307
296
|
sleep 0.1
|
308
|
-
Thread.list.length.should eql
|
297
|
+
Thread.list.length.should eql(2)
|
309
298
|
thread.stop
|
310
|
-
sleep 0.
|
311
|
-
Thread.list.length.should eql
|
299
|
+
sleep 0.2
|
300
|
+
Thread.list.length.should eql(1)
|
312
301
|
end
|
313
302
|
|
314
303
|
end
|
@@ -160,10 +160,12 @@ module Cosmos
|
|
160
160
|
tf.puts 'ROUTE DEST2'
|
161
161
|
tf.close
|
162
162
|
capture_io do |stdout|
|
163
|
-
server = TCPServer.new(8888)
|
164
|
-
|
165
|
-
|
166
|
-
|
163
|
+
server = TCPServer.new('127.0.0.1', 8888)
|
164
|
+
clients = []
|
165
|
+
server_thread = Thread.new do
|
166
|
+
loop do
|
167
|
+
clients << server.accept
|
168
|
+
end
|
167
169
|
end
|
168
170
|
|
169
171
|
config = CmdTlmServerConfig.new(tf.path)
|
@@ -171,18 +173,26 @@ module Cosmos
|
|
171
173
|
config.interfaces['DEST1'].routers[0].name.should eql "MY_ROUTER"
|
172
174
|
config.interfaces['DEST2'].routers[0].name.should eql "MY_ROUTER"
|
173
175
|
interfaces.connect("DEST1")
|
174
|
-
sleep 0.
|
176
|
+
sleep 0.2
|
175
177
|
stdout.string.should match "Connecting to DEST1"
|
176
178
|
interfaces.disconnect("DEST1")
|
177
|
-
interfaces.connect("DEST1",'localhost',
|
178
|
-
sleep 0.
|
179
|
+
interfaces.connect("DEST1",'localhost',8888,8888,6,6,'length')
|
180
|
+
sleep 0.2
|
179
181
|
config.interfaces['DEST1'].routers[0].name.should eql "MY_ROUTER"
|
180
182
|
config.interfaces['DEST2'].routers[0].name.should eql "MY_ROUTER"
|
181
183
|
stdout.string.should match "Disconnected from interface DEST1"
|
182
184
|
stdout.string.should match "Connecting to DEST1"
|
183
185
|
interfaces.disconnect("DEST1")
|
186
|
+
interfaces.stop
|
187
|
+
|
188
|
+
server_thread.kill
|
189
|
+
server.close
|
190
|
+
clients.each do |c|
|
191
|
+
c.close
|
192
|
+
end
|
184
193
|
end
|
185
194
|
tf.unlink
|
195
|
+
sleep(0.2)
|
186
196
|
end
|
187
197
|
end
|
188
198
|
|