cosmos 4.0.3-java → 4.1.0-java
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 +5 -5
- data/Manifest.txt +11 -1
- data/README.md +3 -2
- data/Rakefile +18 -4
- data/appveyor.yml +19 -0
- data/cosmos.gemspec +12 -3
- data/data/config/cmd_tlm_server.yaml +3 -0
- data/data/crc.txt +63 -60
- data/demo/config/targets/INST/cmd_tlm_server.txt +1 -0
- data/demo/config/targets/INST/cmd_tlm_server2.txt +7 -0
- data/demo/config/tools/cmd_sequence/cmd_sequence.txt +2 -0
- data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +8 -12
- data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +7 -9
- data/demo/lib/cmd_sequence_exporter.rb +52 -0
- data/demo/lib/example_background_task.rb +1 -0
- data/demo/procedures/replay_test.rb +32 -0
- data/ext/cosmos/ext/structure/structure.c +39 -3
- data/install/config/tools/cmd_tlm_server/cmd_tlm_server.txt +1 -0
- data/install/config/tools/launcher/launcher.txt +2 -0
- data/lib/cosmos/config/config_parser.rb +2 -0
- data/lib/cosmos/core_ext/io.rb +89 -60
- data/lib/cosmos/gui/qt.rb +5 -8
- data/lib/cosmos/gui/qt_tool.rb +8 -8
- data/lib/cosmos/gui/text/ruby_editor.rb +12 -12
- data/lib/cosmos/gui/utilities/script_module_gui.rb +9 -9
- data/lib/cosmos/gui/widgets/realtime_button_bar.rb +18 -17
- data/lib/cosmos/interfaces/protocols/fixed_protocol.rb +2 -2
- data/lib/cosmos/interfaces/protocols/template_protocol.rb +3 -0
- data/lib/cosmos/interfaces/udp_interface.rb +27 -14
- data/lib/cosmos/io/buffered_file.rb +0 -1
- data/lib/cosmos/io/json_drb.rb +134 -214
- data/lib/cosmos/io/json_drb_object.rb +22 -61
- data/lib/cosmos/io/json_drb_rack.rb +79 -0
- data/lib/cosmos/io/json_rpc.rb +27 -0
- data/lib/cosmos/io/udp_sockets.rb +102 -58
- data/lib/cosmos/packets/commands.rb +1 -1
- data/lib/cosmos/packets/structure.rb +1 -1
- data/lib/cosmos/packets/structure_item.rb +37 -5
- data/lib/cosmos/script/cmd_tlm_server.rb +76 -2
- data/lib/cosmos/script/replay.rb +60 -0
- data/lib/cosmos/script/script.rb +20 -2
- data/lib/cosmos/script/scripting.rb +9 -9
- data/lib/cosmos/script/tools.rb +14 -0
- data/lib/cosmos/system/system.rb +185 -92
- data/lib/cosmos/system/target.rb +1 -1
- data/lib/cosmos/tools/cmd_sequence/cmd_sequence.rb +44 -4
- data/lib/cosmos/tools/cmd_sequence/sequence_item.rb +4 -0
- data/lib/cosmos/tools/cmd_sequence/sequence_list.rb +7 -0
- data/lib/cosmos/tools/cmd_tlm_server/api.rb +347 -20
- data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +3 -0
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +329 -111
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +13 -0
- data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +261 -95
- data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +46 -35
- data/lib/cosmos/tools/cmd_tlm_server/gui/logging_tab.rb +18 -8
- data/lib/cosmos/tools/cmd_tlm_server/gui/packets_tab.rb +39 -28
- data/lib/cosmos/tools/cmd_tlm_server/gui/replay_tab.rb +242 -0
- data/lib/cosmos/tools/cmd_tlm_server/gui/status_tab.rb +24 -8
- data/lib/cosmos/tools/cmd_tlm_server/gui/targets_tab.rb +18 -6
- data/lib/cosmos/tools/cmd_tlm_server/limits_groups_background_task.rb +5 -4
- data/lib/cosmos/tools/cmd_tlm_server/replay_backend.rb +375 -0
- data/lib/cosmos/tools/cmd_tlm_server/routers.rb +10 -2
- data/lib/cosmos/tools/data_viewer/data_viewer.rb +40 -5
- data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +18 -20
- data/lib/cosmos/tools/launcher/launcher_config.rb +5 -16
- data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +65 -39
- data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +19 -0
- data/lib/cosmos/tools/replay/replay.rb +5 -505
- data/lib/cosmos/tools/script_runner/script_audit.rb +1 -0
- data/lib/cosmos/tools/script_runner/script_runner.rb +3 -4
- data/lib/cosmos/tools/script_runner/script_runner_config.rb +3 -4
- data/lib/cosmos/tools/script_runner/script_runner_frame.rb +44 -23
- data/lib/cosmos/tools/test_runner/results_writer.rb +4 -0
- data/lib/cosmos/tools/test_runner/test_runner.rb +0 -3
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +6 -2
- data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +26 -1
- data/lib/cosmos/tools/tlm_viewer/screen.rb +24 -1
- data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +25 -0
- data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +24 -14
- data/lib/cosmos/top_level.rb +34 -24
- data/lib/cosmos/utilities/csv.rb +60 -8
- data/lib/cosmos/version.rb +5 -5
- data/spec/config/config_parser_spec.rb +10 -1
- data/spec/core_ext/socket_spec.rb +4 -2
- data/spec/gui/utilities/script_module_gui_spec.rb +102 -0
- data/spec/install/config/data/data.txt +1 -0
- data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +2 -0
- data/spec/interfaces/cmd_tlm_server_interface_spec.rb +1 -2
- data/spec/interfaces/protocols/template_protocol_spec.rb +72 -2
- data/spec/interfaces/serial_interface_spec.rb +1 -1
- data/spec/interfaces/udp_interface_spec.rb +14 -0
- data/spec/io/buffered_file_spec.rb +37 -0
- data/spec/io/json_drb_object_spec.rb +2 -15
- data/spec/io/json_drb_spec.rb +61 -121
- data/spec/io/udp_sockets_spec.rb +42 -2
- data/spec/packet_logs/packet_log_reader_spec.rb +5 -2
- data/spec/packets/binary_accessor_spec.rb +1 -1
- data/spec/packets/packet_item_spec.rb +1 -1
- data/spec/packets/structure_item_spec.rb +5 -6
- data/spec/script/cmd_tlm_server_spec.rb +39 -4
- data/spec/script/commands_disconnect_spec.rb +1 -1
- data/spec/script/commands_spec.rb +2 -1
- data/spec/script/scripting_spec.rb +18 -3
- data/spec/script/telemetry_spec.rb +5 -0
- data/spec/spec_helper.rb +43 -26
- data/spec/streams/tcpip_socket_stream_spec.rb +2 -2
- data/spec/system/system_spec.rb +11 -9
- data/spec/system/target_spec.rb +3 -0
- data/spec/tools/cmd_tlm_server/api_spec.rb +543 -29
- data/spec/tools/cmd_tlm_server/background_task_spec.rb +2 -2
- data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +31 -75
- data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +199 -66
- data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +85 -9
- data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +29 -127
- data/spec/tools/cmd_tlm_server/router_thread_spec.rb +10 -50
- data/spec/tools/launcher/launcher_config_spec.rb +1 -1
- data/spec/tools/table_manager/table_item_spec.rb +1 -1
- data/spec/tools/table_manager/tablemanager_core_spec.rb +4 -4
- data/spec/top_level/top_level_spec.rb +151 -3
- data/spec/utilities/csv_spec.rb +24 -5
- metadata +61 -9
- data/lib/cosmos/tools/replay/replay_server.rb +0 -91
|
@@ -180,7 +180,10 @@ module Cosmos
|
|
|
180
180
|
|
|
181
181
|
# Corrupt the second config
|
|
182
182
|
second_config_path = System.instance.send(:find_configuration, second_config_name)
|
|
183
|
-
|
|
183
|
+
md5 = File.basename(second_config_path, '.*')
|
|
184
|
+
Zip::File.open(second_config_path) do |zip|
|
|
185
|
+
zip.file.rename(File.join(md5, 'system.txt'), File.join(md5, 'system2.txt'))
|
|
186
|
+
end
|
|
184
187
|
|
|
185
188
|
# Return to original config
|
|
186
189
|
System.load_configuration
|
|
@@ -195,7 +198,7 @@ module Cosmos
|
|
|
195
198
|
FileUtils.mv File.join(Cosmos::USERPATH, 'system.txt'),
|
|
196
199
|
File.join(Cosmos::USERPATH,'config','system')
|
|
197
200
|
|
|
198
|
-
|
|
201
|
+
FileUtils.rm_f(File.join(@config_targets,'SYSTEM','cmd_tlm','test1_tlm.txt'))
|
|
199
202
|
end
|
|
200
203
|
end
|
|
201
204
|
|
|
@@ -975,7 +975,7 @@ module Cosmos
|
|
|
975
975
|
it "complains about writing a frozen buffer" do
|
|
976
976
|
buffer = "BLANK WORLD".freeze
|
|
977
977
|
string = "HELLO"
|
|
978
|
-
expect {BinaryAccessor.write(string, 0, string.length*8, :STRING, buffer, :BIG_ENDIAN, :ERROR) }.to raise_error(RuntimeError,
|
|
978
|
+
expect {BinaryAccessor.write(string, 0, string.length*8, :STRING, buffer, :BIG_ENDIAN, :ERROR) }.to raise_error(RuntimeError, /can't modify frozen String/)
|
|
979
979
|
end
|
|
980
980
|
|
|
981
981
|
it "writes aligned 8-bit unsigned integers" do
|
|
@@ -149,8 +149,8 @@ module Cosmos
|
|
|
149
149
|
expect(si1 > si2).to be false
|
|
150
150
|
|
|
151
151
|
si2 = StructureItem.new("si2", 0, 8, :UINT, :BIG_ENDIAN, nil)
|
|
152
|
-
expect(si1 < si2).to be
|
|
153
|
-
expect(si1 == si2).to be
|
|
152
|
+
expect(si1 < si2).to be true
|
|
153
|
+
expect(si1 == si2).to be false
|
|
154
154
|
expect(si1 > si2).to be false
|
|
155
155
|
end
|
|
156
156
|
|
|
@@ -170,9 +170,8 @@ module Cosmos
|
|
|
170
170
|
expect(si1 > si2).to be true
|
|
171
171
|
|
|
172
172
|
si2 = StructureItem.new("si2", -8, 8, :UINT, :BIG_ENDIAN, nil)
|
|
173
|
-
expect(si1 < si2).to be
|
|
174
|
-
|
|
175
|
-
expect(si1 == si2).to be true
|
|
173
|
+
expect(si1 < si2).to be true
|
|
174
|
+
expect(si1 == si2).to be false
|
|
176
175
|
expect(si1 > si2).to be false
|
|
177
176
|
end
|
|
178
177
|
|
|
@@ -189,7 +188,7 @@ module Cosmos
|
|
|
189
188
|
it "duplicates the entire structure item " do
|
|
190
189
|
si1 = StructureItem.new("si1", -8, 1, :UINT, :LITTLE_ENDIAN, nil)
|
|
191
190
|
si2 = si1.clone
|
|
192
|
-
expect(si1
|
|
191
|
+
expect(si1 < si2).to be true
|
|
193
192
|
end
|
|
194
193
|
end
|
|
195
194
|
|
|
@@ -70,7 +70,7 @@ module Cosmos
|
|
|
70
70
|
end
|
|
71
71
|
end
|
|
72
72
|
|
|
73
|
-
describe "get_interface_info" do
|
|
73
|
+
describe "get_interface_info" do
|
|
74
74
|
it "returns interface info" do
|
|
75
75
|
state, clients, tx_q_size, rx_q_size, bytes_tx, bytes_rx, cmd_cnt, tlm_cnt = get_interface_info("INST_INT")
|
|
76
76
|
connect_interface("INST_INT")
|
|
@@ -86,7 +86,7 @@ module Cosmos
|
|
|
86
86
|
end
|
|
87
87
|
end
|
|
88
88
|
|
|
89
|
-
describe "get_router_info" do
|
|
89
|
+
describe "get_router_info" do
|
|
90
90
|
it "returns router info" do
|
|
91
91
|
connect_router("PREIDENTIFIED_ROUTER")
|
|
92
92
|
state, clients, tx_q_size, rx_q_size, bytes_tx, bytes_rx, pkts_rcvd, pkts_sent = get_router_info("PREIDENTIFIED_ROUTER")
|
|
@@ -110,6 +110,20 @@ module Cosmos
|
|
|
110
110
|
end
|
|
111
111
|
end
|
|
112
112
|
|
|
113
|
+
describe "get_target_ignored_parameters" do
|
|
114
|
+
it "returns ignored parameters" do
|
|
115
|
+
params = get_target_ignored_parameters("INST")
|
|
116
|
+
expect(params.length).to be >= 0
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
describe "get_target_ignored_items" do
|
|
121
|
+
it "returns ignored items" do
|
|
122
|
+
items = get_target_ignored_items("INST")
|
|
123
|
+
expect(items.length).to be >= 0
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
113
127
|
describe "get_cmd_cnt" do
|
|
114
128
|
it "returns cmd count" do
|
|
115
129
|
expect(get_cmd_cnt("INST", "COLLECT")).to be >= 0
|
|
@@ -122,9 +136,16 @@ module Cosmos
|
|
|
122
136
|
end
|
|
123
137
|
end
|
|
124
138
|
|
|
139
|
+
describe "get_packet_loggers" do
|
|
140
|
+
it "returns all the packet logger names" do
|
|
141
|
+
loggers = get_packet_loggers()
|
|
142
|
+
expect(loggers).to include("DEFAULT")
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
|
125
146
|
describe "get_packet_logger_info" do
|
|
126
147
|
it "returns packet logger info" do
|
|
127
|
-
interfaces, cmd_logging, cmd_q_size, cmd_filename, cmd_file_size,
|
|
148
|
+
interfaces, cmd_logging, cmd_q_size, cmd_filename, cmd_file_size,
|
|
128
149
|
tlm_logging, tlm_q_size, tlm_filename, tlm_file_size, = get_packet_logger_info("DEFAULT")
|
|
129
150
|
expect(interfaces).to include("INST_INT")
|
|
130
151
|
expect(cmd_logging).to eql true
|
|
@@ -171,6 +192,20 @@ module Cosmos
|
|
|
171
192
|
end
|
|
172
193
|
end
|
|
173
194
|
|
|
195
|
+
describe "subscribe_server_messages, get_server_message, unsubscribe_server_messages" do
|
|
196
|
+
it "raises an error if non_block and the queue is empty" do
|
|
197
|
+
id = subscribe_server_messages
|
|
198
|
+
expect { get_server_message(id, true) }.to raise_error(ThreadError, "queue empty")
|
|
199
|
+
unsubscribe_server_messages(id)
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
it "subscribes and gets server messages" do
|
|
203
|
+
id = subscribe_server_messages
|
|
204
|
+
CmdTlmServer.instance.post_server_message("This is a test")
|
|
205
|
+
result = get_server_message(id, true)
|
|
206
|
+
expect(result).to eql "This is a test"
|
|
207
|
+
unsubscribe_server_messages(id)
|
|
208
|
+
end
|
|
209
|
+
end
|
|
174
210
|
end
|
|
175
211
|
end
|
|
176
|
-
|
|
@@ -254,7 +254,7 @@ module Cosmos
|
|
|
254
254
|
describe "get_cmd_param_list" do
|
|
255
255
|
it "returns all the parameters for a command" do
|
|
256
256
|
list = get_cmd_param_list("INST", "COLLECT")
|
|
257
|
-
expect(list).to include(["TYPE", 0, {"NORMAL"=>0, "SPECIAL"=>1}, "Collect type", nil, nil, true])
|
|
257
|
+
expect(list).to include(["TYPE", 0, {"NORMAL"=>0, "SPECIAL"=>1}, "Collect type", nil, nil, true, "UINT"])
|
|
258
258
|
end
|
|
259
259
|
end
|
|
260
260
|
|
|
@@ -272,7 +272,8 @@ module Cosmos
|
|
|
272
272
|
describe "get_cmd_param_list" do
|
|
273
273
|
it "returns all the parameters for a command" do
|
|
274
274
|
list = get_cmd_param_list("INST", "COLLECT")
|
|
275
|
-
|
|
275
|
+
#puts list
|
|
276
|
+
expect(list).to include(["TYPE", 0, {"NORMAL"=>0, "SPECIAL"=>1}, "Collect type", nil, nil, true, "UINT"])
|
|
276
277
|
end
|
|
277
278
|
end
|
|
278
279
|
|
|
@@ -79,21 +79,37 @@ module Cosmos
|
|
|
79
79
|
it "gets file listings" do
|
|
80
80
|
capture_io do |stdout|
|
|
81
81
|
expect(self).to receive(:gets) { 'file' }
|
|
82
|
-
expect(save_file_dialog(
|
|
82
|
+
expect(save_file_dialog()).to eql 'file'
|
|
83
|
+
expect(stdout.string).to include "Save File"
|
|
84
|
+
stdout.rewind
|
|
85
|
+
expect(self).to receive(:gets) { 'file' }
|
|
86
|
+
expect(save_file_dialog(Dir.pwd, "Save Something!!!", "*.txt")).to eql 'file'
|
|
83
87
|
expect(stdout.string).to include "Save Something!!!"
|
|
84
88
|
stdout.rewind
|
|
85
89
|
expect(self).to receive(:gets) { 'file' }
|
|
86
|
-
expect(open_file_dialog(
|
|
90
|
+
expect(open_file_dialog()).to eql 'file'
|
|
87
91
|
expect(stdout.string).to include "Open File"
|
|
88
92
|
stdout.rewind
|
|
89
93
|
expect(self).to receive(:gets) { 'file' }
|
|
94
|
+
expect(open_file_dialog(Dir.pwd, "Test Open", "*.txt")).to eql 'file'
|
|
95
|
+
expect(stdout.string).to include "Test Open"
|
|
96
|
+
stdout.rewind
|
|
97
|
+
expect(self).to receive(:gets) { 'file' }
|
|
90
98
|
expect(open_files_dialog()).to eql 'file'
|
|
91
99
|
expect(stdout.string).to include "Open File(s)"
|
|
92
100
|
stdout.rewind
|
|
101
|
+
expect(self).to receive(:gets) { 'file' }
|
|
102
|
+
expect(open_files_dialog(Dir.pwd, "Test Open Files")).to eql 'file'
|
|
103
|
+
expect(stdout.string).to include "Test Open Files"
|
|
104
|
+
stdout.rewind
|
|
93
105
|
expect(self).to receive(:gets) { 'dir' }
|
|
94
106
|
expect(open_directory_dialog()).to eql 'dir'
|
|
95
107
|
expect(stdout.string).to include "Open Directory"
|
|
96
108
|
stdout.rewind
|
|
109
|
+
expect(self).to receive(:gets) { 'dir' }
|
|
110
|
+
expect(open_directory_dialog(Dir.pwd, "Test Dir")).to eql 'dir'
|
|
111
|
+
expect(stdout.string).to include "Test Dir"
|
|
112
|
+
stdout.rewind
|
|
97
113
|
end
|
|
98
114
|
end
|
|
99
115
|
end
|
|
@@ -742,4 +758,3 @@ module Cosmos
|
|
|
742
758
|
|
|
743
759
|
end
|
|
744
760
|
end
|
|
745
|
-
|
|
@@ -168,6 +168,11 @@ module Cosmos
|
|
|
168
168
|
expect(packet.target_name).to eql "SYSTEM"
|
|
169
169
|
expect(packet.packet_name).to eql "META"
|
|
170
170
|
expect(packet.received_time).to be_within(1).of Time.now
|
|
171
|
+
expect(packet.received_count).to eql 0
|
|
172
|
+
packet = get_packet(id)
|
|
173
|
+
expect(packet.target_name).to eql "SYSTEM"
|
|
174
|
+
expect(packet.packet_name).to eql "META"
|
|
175
|
+
expect(packet.received_time).to be_within(1).of Time.now
|
|
171
176
|
expect(packet.received_count).to eql 1
|
|
172
177
|
unsubscribe_packet_data(id)
|
|
173
178
|
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -20,13 +20,12 @@ def load(file, wrap = false)
|
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
# NOTE: You MUST require simplecov before anything else!
|
|
23
|
-
if
|
|
23
|
+
if !ENV['COSMOS_NO_SIMPLECOV']
|
|
24
24
|
require 'simplecov'
|
|
25
|
-
require '
|
|
26
|
-
Coveralls.wear!
|
|
25
|
+
require 'codecov'
|
|
27
26
|
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
|
|
28
27
|
SimpleCov::Formatter::HTMLFormatter,
|
|
29
|
-
|
|
28
|
+
SimpleCov::Formatter::Codecov,
|
|
30
29
|
])
|
|
31
30
|
SimpleCov.start do
|
|
32
31
|
merge_timeout 12 * 60 * 60 # merge the last 12 hours of results
|
|
@@ -87,32 +86,16 @@ RSpec.configure do |config|
|
|
|
87
86
|
Cosmos.disable_warnings do
|
|
88
87
|
Object.const_set(:STDOUT, $saved_stdout_const)
|
|
89
88
|
end
|
|
90
|
-
|
|
91
|
-
# Kill any leftover threads
|
|
92
|
-
if Thread.list.length > 1
|
|
93
|
-
Thread.list.each do |t|
|
|
94
|
-
t.kill if t != Thread.current
|
|
95
|
-
end
|
|
96
|
-
sleep(0.2)
|
|
97
|
-
end
|
|
98
|
-
else
|
|
99
|
-
# Kill any leftover threads
|
|
100
|
-
if Thread.list.length > 2
|
|
101
|
-
Thread.list[2..-1].each do |t|
|
|
102
|
-
t.kill if t != Thread.current
|
|
103
|
-
end
|
|
104
|
-
sleep(0.2)
|
|
105
|
-
end
|
|
106
|
-
end
|
|
89
|
+
kill_leftover_threads()
|
|
107
90
|
end
|
|
108
91
|
|
|
109
92
|
config.after(:each) do
|
|
110
93
|
# Make sure we didn't leave any lingering threads
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
end
|
|
94
|
+
threads = running_threads()
|
|
95
|
+
thread_count = threads.size()
|
|
96
|
+
running_threads_str = threads.join("\n")
|
|
97
|
+
|
|
98
|
+
expect(thread_count).to eql(1), "At end of test expect 1 remaining thread but found #{thread_count}.\nEnsure you kill all spawned threads before the test finishes.\nThreads:\n#{running_threads_str}"
|
|
116
99
|
end
|
|
117
100
|
end
|
|
118
101
|
|
|
@@ -152,6 +135,40 @@ def capture_io
|
|
|
152
135
|
$stdout = STDOUT
|
|
153
136
|
end
|
|
154
137
|
|
|
138
|
+
# Get a list of running threads, ignoring jruby system threads if necessary.
|
|
139
|
+
def running_threads
|
|
140
|
+
threads = []
|
|
141
|
+
Thread.list.each do |t|
|
|
142
|
+
if RUBY_ENGINE == 'jruby'
|
|
143
|
+
thread_name = JRuby.reference(t).native_thread.get_name
|
|
144
|
+
threads << t.inspect unless thread_name == "Finalizer" or thread_name.include?("JRubyWorker")
|
|
145
|
+
else
|
|
146
|
+
threads << t.inspect
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
return threads
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# Kill threads that are not "main", ignoring jruby system threads if necessary.
|
|
153
|
+
def kill_leftover_threads
|
|
154
|
+
if RUBY_ENGINE == 'jruby'
|
|
155
|
+
if Thread.list.length > 2
|
|
156
|
+
Thread.list.each do |t|
|
|
157
|
+
thread_name = JRuby.reference(t).native_thread.get_name
|
|
158
|
+
t.kill if t != Thread.current and thread_name != "Finalizer" and !thread_name.include?("JRubyWorker")
|
|
159
|
+
end
|
|
160
|
+
sleep(0.2)
|
|
161
|
+
end
|
|
162
|
+
else
|
|
163
|
+
if Thread.list.length > 1
|
|
164
|
+
Thread.list.each do |t|
|
|
165
|
+
t.kill if t != Thread.current
|
|
166
|
+
end
|
|
167
|
+
sleep(0.2)
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
|
|
155
172
|
RSpec.configure do |c|
|
|
156
173
|
if ENV.key?("PROFILE")
|
|
157
174
|
c.before(:suite) do
|
|
@@ -164,7 +164,7 @@ module Cosmos
|
|
|
164
164
|
4
|
|
165
165
|
end
|
|
166
166
|
end
|
|
167
|
-
expect(IO).to receive(:
|
|
167
|
+
expect(IO).to receive(:fast_select).at_least(:once).and_return([])
|
|
168
168
|
$index = 1
|
|
169
169
|
ss = TcpipSocketStream.new(write,nil,nil,nil)
|
|
170
170
|
ss.connect
|
|
@@ -174,7 +174,7 @@ module Cosmos
|
|
|
174
174
|
it "handles socket timeouts" do
|
|
175
175
|
write = double("write_socket")
|
|
176
176
|
allow(write).to receive(:write_nonblock).and_raise(Errno::EWOULDBLOCK)
|
|
177
|
-
expect(IO).to receive(:
|
|
177
|
+
expect(IO).to receive(:fast_select).at_least(:once).and_return(nil)
|
|
178
178
|
ss = TcpipSocketStream.new(write,nil,nil,nil)
|
|
179
179
|
ss.connect
|
|
180
180
|
expect { ss.write('test') }.to raise_error(Timeout::Error)
|
data/spec/system/system_spec.rb
CHANGED
|
@@ -44,7 +44,7 @@ module Cosmos
|
|
|
44
44
|
describe "instance" do
|
|
45
45
|
it "creates default ports" do
|
|
46
46
|
# Don't check the actual port numbers but just that they exist
|
|
47
|
-
expect(System.ports.keys).to eql %w(CTS_API TLMVIEWER_API CTS_PREIDENTIFIED CTS_CMD_ROUTER)
|
|
47
|
+
expect(System.ports.keys).to eql %w(CTS_API TLMVIEWER_API CTS_PREIDENTIFIED CTS_CMD_ROUTER REPLAY_API REPLAY_PREIDENTIFIED REPLAY_CMD_ROUTER)
|
|
48
48
|
end
|
|
49
49
|
|
|
50
50
|
it "creates default paths" do
|
|
@@ -201,7 +201,7 @@ module Cosmos
|
|
|
201
201
|
# Force a reload of the configuration
|
|
202
202
|
System.class_eval('@@instance = nil')
|
|
203
203
|
capture_io do |stdout|
|
|
204
|
-
allow(
|
|
204
|
+
allow(Zip::File).to receive(:open) { raise "Error" }
|
|
205
205
|
System.commands
|
|
206
206
|
expect(stdout.string).to match "Problem saving configuration"
|
|
207
207
|
end
|
|
@@ -290,8 +290,10 @@ module Cosmos
|
|
|
290
290
|
|
|
291
291
|
describe "load_configuration" do
|
|
292
292
|
after(:all) do
|
|
293
|
-
File.
|
|
294
|
-
|
|
293
|
+
test1 = File.join(@config_targets,'SYSTEM','cmd_tlm','test1_tlm.txt')
|
|
294
|
+
FileUtils.rm_f(test1) if File.exist?(test1)
|
|
295
|
+
test2 = File.join(@config_targets,'SYSTEM','cmd_tlm','test2_tlm.txt')
|
|
296
|
+
FileUtils.rm_f(test2) if File.exist?(test2)
|
|
295
297
|
end
|
|
296
298
|
|
|
297
299
|
it "loads the initial configuration" do
|
|
@@ -352,11 +354,11 @@ module Cosmos
|
|
|
352
354
|
expect(System.telemetry.packets('SYSTEM').keys).not_to include "TEST2"
|
|
353
355
|
|
|
354
356
|
# Now remove system.txt from the third configuration and try to load it again to cause an error
|
|
355
|
-
third_config_path = System.instance.send(:find_configuration, third_config_name)
|
|
356
|
-
FileUtils.mv File.join(third_config_path, 'system.txt'), File.join(third_config_path, 'system2.txt')
|
|
357
|
-
result, err = System.load_configuration(third_config_name)
|
|
358
|
-
expect(result).to eql original_config_name
|
|
359
|
-
expect(err).to_not be_nil
|
|
357
|
+
#third_config_path = System.instance.send(:find_configuration, third_config_name)
|
|
358
|
+
#FileUtils.mv File.join(third_config_path, 'system.txt'), File.join(third_config_path, 'system2.txt')
|
|
359
|
+
#result, err = System.load_configuration(third_config_name)
|
|
360
|
+
#expect(result).to eql original_config_name
|
|
361
|
+
#expect(err).to_not be_nil
|
|
360
362
|
end
|
|
361
363
|
end
|
|
362
364
|
end
|
data/spec/system/target_spec.rb
CHANGED
|
@@ -164,6 +164,9 @@ module Cosmos
|
|
|
164
164
|
tf = Tempfile.new('unittest')
|
|
165
165
|
tf.puts("REQUIRE system_file.rb")
|
|
166
166
|
tf.close
|
|
167
|
+
|
|
168
|
+
# Initial require in target lib shouldn't be reported as error
|
|
169
|
+
expect(Logger).to_not receive(:error)
|
|
167
170
|
Target.new("INST").process_file(tf.path)
|
|
168
171
|
expect { SystemFile.new }.to_not raise_error
|
|
169
172
|
File.delete filename
|
|
@@ -21,14 +21,58 @@ module Cosmos
|
|
|
21
21
|
cts = File.join(Cosmos::USERPATH,'config','tools','cmd_tlm_server','cmd_tlm_server.txt')
|
|
22
22
|
FileUtils.mkdir_p(File.dirname(cts))
|
|
23
23
|
File.open(cts,'w') do |file|
|
|
24
|
-
file.puts 'INTERFACE
|
|
24
|
+
file.puts 'INTERFACE INST_INT interface.rb'
|
|
25
|
+
file.puts ' TARGET INST'
|
|
26
|
+
file.puts ' PROTOCOL READ_WRITE OverrideProtocol'
|
|
25
27
|
file.puts 'ROUTER ROUTE interface.rb'
|
|
28
|
+
file.puts 'BACKGROUND_TASK example_background_task1.rb'
|
|
29
|
+
file.puts 'BACKGROUND_TASK example_background_task2.rb'
|
|
30
|
+
end
|
|
31
|
+
@background1 = File.join(Cosmos::USERPATH,'lib','example_background_task1.rb')
|
|
32
|
+
File.open(@background1,'w') do |file|
|
|
33
|
+
file.write <<-DOC
|
|
34
|
+
require 'cosmos/tools/cmd_tlm_server/background_task'
|
|
35
|
+
module Cosmos
|
|
36
|
+
class ExampleBackgroundTask1 < BackgroundTask
|
|
37
|
+
def initialize
|
|
38
|
+
super()
|
|
39
|
+
@name = 'Example Background Task1'
|
|
40
|
+
@status = "This is example one"
|
|
41
|
+
end
|
|
42
|
+
def call
|
|
43
|
+
sleep 0.3
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
DOC
|
|
48
|
+
end
|
|
49
|
+
@background2 = File.join(Cosmos::USERPATH,'lib','example_background_task2.rb')
|
|
50
|
+
File.open(@background2,'w') do |file|
|
|
51
|
+
file.write <<-DOC
|
|
52
|
+
require 'cosmos/tools/cmd_tlm_server/background_task'
|
|
53
|
+
module Cosmos
|
|
54
|
+
class ExampleBackgroundTask2 < BackgroundTask
|
|
55
|
+
def initialize
|
|
56
|
+
super()
|
|
57
|
+
@name = 'Example Background Task2'
|
|
58
|
+
@status = "This is example two"
|
|
59
|
+
end
|
|
60
|
+
def call
|
|
61
|
+
loop do
|
|
62
|
+
sleep 1
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
DOC
|
|
26
68
|
end
|
|
27
69
|
end
|
|
28
70
|
|
|
29
71
|
after(:all) do
|
|
30
72
|
clean_config()
|
|
31
73
|
FileUtils.rm_rf File.join(Cosmos::USERPATH,'config','tools')
|
|
74
|
+
FileUtils.rm_rf @background1
|
|
75
|
+
FileUtils.rm_rf @background2
|
|
32
76
|
end
|
|
33
77
|
|
|
34
78
|
before(:each) do
|
|
@@ -37,8 +81,8 @@ module Cosmos
|
|
|
37
81
|
allow_any_instance_of(Interface).to receive(:disconnect)
|
|
38
82
|
allow_any_instance_of(Interface).to receive(:write_raw)
|
|
39
83
|
allow_any_instance_of(Interface).to receive(:read)
|
|
84
|
+
allow_any_instance_of(Interface).to receive(:write)
|
|
40
85
|
@api = CmdTlmServer.new
|
|
41
|
-
allow(@api.commanding).to receive(:send_command_to_target)
|
|
42
86
|
end
|
|
43
87
|
|
|
44
88
|
after(:each) do
|
|
@@ -395,6 +439,15 @@ module Cosmos
|
|
|
395
439
|
end
|
|
396
440
|
end
|
|
397
441
|
|
|
442
|
+
describe "get_cmd_buffer" do
|
|
443
|
+
it "returns a command packet buffer" do
|
|
444
|
+
@api.cmd("INST ABORT")
|
|
445
|
+
expect(@api.get_cmd_buffer("INST", "ABORT")[6..7].unpack("n")[0]).to eq 2
|
|
446
|
+
@api.cmd("INST COLLECT with TYPE NORMAL, DURATION 5")
|
|
447
|
+
expect(@api.get_cmd_buffer("INST", "COLLECT")[6..7].unpack("n")[0]).to eq 1
|
|
448
|
+
end
|
|
449
|
+
end
|
|
450
|
+
|
|
398
451
|
describe "get_cmd_list" do
|
|
399
452
|
it "returns command names sorted" do
|
|
400
453
|
result = @api.get_cmd_list("INST")
|
|
@@ -431,15 +484,17 @@ module Cosmos
|
|
|
431
484
|
result = @api.get_cmd_param_list("INST","COLLECT")
|
|
432
485
|
# Each element in the results array contains:
|
|
433
486
|
# name, default, states, description, full units, units, required
|
|
434
|
-
expect(result).to include ['TYPE',0,{"NORMAL"=>0,"SPECIAL"=>1},'Collect type',nil,nil,true]
|
|
435
|
-
expect(result).to include ['TEMP',0.0,nil,'Collect temperature','Celcius','C',false]
|
|
487
|
+
expect(result).to include ['TYPE',0,{"NORMAL"=>0,"SPECIAL"=>1},'Collect type',nil,nil,true,"UINT"]
|
|
488
|
+
expect(result).to include ['TEMP',0.0,nil,'Collect temperature','Celcius','C',false,"FLOAT"]
|
|
436
489
|
end
|
|
437
490
|
|
|
438
491
|
it "returns array parameters for the command" do
|
|
439
492
|
result = @api.get_cmd_param_list("INST","ARYCMD")
|
|
440
493
|
# Each element in the results array contains:
|
|
441
494
|
# name, default, states, description, full units, units, required
|
|
442
|
-
expect(result).to include ['ARRAY',[],nil,'Array parameter',nil,nil,false]
|
|
495
|
+
expect(result).to include ['ARRAY',[],nil,'Array parameter',nil,nil,false,"FLOAT"]
|
|
496
|
+
# Since ARRAY2 has a format string the default is in quotes
|
|
497
|
+
expect(result).to include ['ARRAY2',"[]",nil,'Array parameter',nil,nil,false,"UINT"]
|
|
443
498
|
end
|
|
444
499
|
end
|
|
445
500
|
|
|
@@ -466,22 +521,42 @@ module Cosmos
|
|
|
466
521
|
expect(@api.get_cmd_value("INST", "COLLECT", "RECEIVED_TIMESECONDS")).to eql time.to_f
|
|
467
522
|
expect(@api.get_cmd_value("INST", "COLLECT", "RECEIVED_COUNT")).to eql 5
|
|
468
523
|
end
|
|
524
|
+
|
|
525
|
+
it "returns special values for time if time isn't set" do
|
|
526
|
+
time = Time.now
|
|
527
|
+
packet = System.commands.packet("INST", "COLLECT")
|
|
528
|
+
packet.received_time = nil
|
|
529
|
+
packet.restore_defaults
|
|
530
|
+
packet.received_count = 5
|
|
531
|
+
expect(@api.get_cmd_value("INST", "COLLECT", "TYPE")).to eql 'NORMAL'
|
|
532
|
+
expect(@api.get_cmd_value("INST", "COLLECT", "RECEIVED_TIMEFORMATTED")).to eql "No Packet Received Time"
|
|
533
|
+
expect(@api.get_cmd_value("INST", "COLLECT", "RECEIVED_TIMESECONDS")).to eql 0.0
|
|
534
|
+
expect(@api.get_cmd_value("INST", "COLLECT", "RECEIVED_COUNT")).to eql 5
|
|
535
|
+
end
|
|
469
536
|
end
|
|
470
537
|
|
|
471
538
|
describe "get_cmd_time" do
|
|
472
539
|
it "returns command times" do
|
|
473
540
|
time = Time.now
|
|
474
541
|
time2 = Time.now + 2
|
|
475
|
-
|
|
476
|
-
|
|
542
|
+
collect_cmd = System.commands.packet("INST", "COLLECT")
|
|
543
|
+
collect_cmd.received_time = time
|
|
544
|
+
abort_cmd = System.commands.packet("INST", "ABORT")
|
|
545
|
+
abort_cmd.received_time = time + 1
|
|
477
546
|
packet2 = System.commands.packet("SYSTEM", "STARTLOGGING")
|
|
478
547
|
packet2.received_time = time2
|
|
479
548
|
expect(@api.get_cmd_time()).to eql ['SYSTEM', 'STARTLOGGING', time2.tv_sec, time2.tv_usec]
|
|
480
|
-
expect(@api.get_cmd_time('INST')).to eql ['INST', '
|
|
549
|
+
expect(@api.get_cmd_time('INST')).to eql ['INST', 'ABORT', time.tv_sec + 1, time.tv_usec]
|
|
481
550
|
expect(@api.get_cmd_time('SYSTEM')).to eql ['SYSTEM', 'STARTLOGGING', time2.tv_sec, time2.tv_usec]
|
|
482
551
|
expect(@api.get_cmd_time('INST', 'COLLECT')).to eql ['INST', 'COLLECT', time.tv_sec, time.tv_usec]
|
|
483
552
|
expect(@api.get_cmd_time('SYSTEM', 'STARTLOGGING')).to eql ['SYSTEM', 'STARTLOGGING', time2.tv_sec, time2.tv_usec]
|
|
484
553
|
end
|
|
554
|
+
|
|
555
|
+
it "returns nil if no times are set" do
|
|
556
|
+
System.commands.packets("INST").each { |name, pkt| pkt.received_time = nil }
|
|
557
|
+
expect(@api.get_cmd_time("INST")).to eql [nil, nil, nil, nil]
|
|
558
|
+
expect(@api.get_cmd_time("INST", "ABORT")).to eql ["INST", "ABORT", nil, nil]
|
|
559
|
+
end
|
|
485
560
|
end
|
|
486
561
|
|
|
487
562
|
def test_tlm_unknown(method)
|
|
@@ -499,12 +574,11 @@ module Cosmos
|
|
|
499
574
|
end
|
|
500
575
|
|
|
501
576
|
it "processes a string" do
|
|
502
|
-
|
|
503
|
-
expect(value).to eql -100.0
|
|
577
|
+
expect(@api.tlm("INST HEALTH_STATUS TEMP1")).to eql -100.0
|
|
504
578
|
end
|
|
505
579
|
|
|
506
580
|
it "processes parameters" do
|
|
507
|
-
|
|
581
|
+
expect(@api.tlm("INST","HEALTH_STATUS","TEMP1")).to eql -100.0
|
|
508
582
|
end
|
|
509
583
|
|
|
510
584
|
it "complains if too many parameters" do
|
|
@@ -603,7 +677,7 @@ module Cosmos
|
|
|
603
677
|
end
|
|
604
678
|
|
|
605
679
|
describe "set_tlm" do
|
|
606
|
-
it "complains about unknown targets,
|
|
680
|
+
it "complains about unknown targets, packets, and parameters" do
|
|
607
681
|
expect { @api.set_tlm("BLAH HEALTH_STATUS COLLECTS = 1") }.to raise_error(/does not exist/)
|
|
608
682
|
expect { @api.set_tlm("INST UNKNOWN COLLECTS = 1") }.to raise_error(/does not exist/)
|
|
609
683
|
expect { @api.set_tlm("INST HEALTH_STATUS BLAH = 1") }.to raise_error(/does not exist/)
|
|
@@ -612,6 +686,19 @@ module Cosmos
|
|
|
612
686
|
expect { @api.set_tlm("INST","HEALTH_STATUS","BLAH",1) }.to raise_error(/does not exist/)
|
|
613
687
|
end
|
|
614
688
|
|
|
689
|
+
it "doesn't allow SYSTEM META PKTID or CONFIG" do
|
|
690
|
+
expect { @api.set_tlm("SYSTEM META PKTID = 1") }.to raise_error(/set_tlm not allowed/)
|
|
691
|
+
expect { @api.set_tlm("SYSTEM META CONFIG = 1") }.to raise_error(/set_tlm not allowed/)
|
|
692
|
+
end
|
|
693
|
+
|
|
694
|
+
it "sets SYSTEM META command as well as tlm" do
|
|
695
|
+
cmd = System.commands.packet("SYSTEM", "META")
|
|
696
|
+
tlm = System.telemetry.packet("SYSTEM", "META")
|
|
697
|
+
@api.set_tlm("SYSTEM META RUBY_VERSION = 1.8.0")
|
|
698
|
+
expect(cmd.read("RUBY_VERSION")).to eq("1.8.0")
|
|
699
|
+
expect(tlm.read("RUBY_VERSION")).to eq("1.8.0")
|
|
700
|
+
end
|
|
701
|
+
|
|
615
702
|
it "processes a string" do
|
|
616
703
|
@api.set_tlm("INST HEALTH_STATUS TEMP1 = 0.0")
|
|
617
704
|
expect(@api.tlm("INST HEALTH_STATUS TEMP1")).to be_within(0.00001).of(-0.05759)
|
|
@@ -628,7 +715,7 @@ module Cosmos
|
|
|
628
715
|
end
|
|
629
716
|
|
|
630
717
|
describe "set_tlm_raw" do
|
|
631
|
-
it "complains about unknown targets,
|
|
718
|
+
it "complains about unknown targets, packets, and parameters" do
|
|
632
719
|
expect { @api.set_tlm_raw("BLAH HEALTH_STATUS COLLECTS = 1") }.to raise_error(/does not exist/)
|
|
633
720
|
expect { @api.set_tlm_raw("INST UNKNOWN COLLECTS = 1") }.to raise_error(/does not exist/)
|
|
634
721
|
expect { @api.set_tlm_raw("INST HEALTH_STATUS BLAH = 1") }.to raise_error(/does not exist/)
|
|
@@ -648,6 +735,148 @@ module Cosmos
|
|
|
648
735
|
end
|
|
649
736
|
end
|
|
650
737
|
|
|
738
|
+
describe "inject_tlm" do
|
|
739
|
+
it "complains about non-existant targets" do
|
|
740
|
+
expect { @api.inject_tlm("BLAH","HEALTH_STATUS") }.to raise_error(RuntimeError, "Unknown target: BLAH")
|
|
741
|
+
end
|
|
742
|
+
|
|
743
|
+
it "complains about non-existant packets" do
|
|
744
|
+
expect { @api.inject_tlm("INST","BLAH") }.to raise_error(RuntimeError, "Telemetry packet 'INST BLAH' does not exist")
|
|
745
|
+
end
|
|
746
|
+
|
|
747
|
+
it "complains about non-existant items" do
|
|
748
|
+
expect { @api.inject_tlm("INST","HEALTH_STATUS",{BLAH: 0}) }.to raise_error(RuntimeError, "Packet item 'INST HEALTH_STATUS BLAH' does not exist")
|
|
749
|
+
end
|
|
750
|
+
|
|
751
|
+
it "logs errors writing routers" do
|
|
752
|
+
@api.inject_tlm("INST","HEALTH_STATUS",{TEMP1: 50, TEMP2: 50, TEMP3: 50, TEMP4: 50}, :CONVERTED)
|
|
753
|
+
allow_any_instance_of(Interface).to receive(:write_allowed?).and_raise("PROBLEM!")
|
|
754
|
+
expect(Logger).to receive(:error) do |msg|
|
|
755
|
+
expect(msg).to match /Problem writing to router/
|
|
756
|
+
end
|
|
757
|
+
@api.inject_tlm("INST","HEALTH_STATUS")
|
|
758
|
+
end
|
|
759
|
+
|
|
760
|
+
it "injects a packet into the system" do
|
|
761
|
+
@api.inject_tlm("INST","HEALTH_STATUS",{TEMP1: 10, TEMP2: 20}, :CONVERTED, true, true, false)
|
|
762
|
+
expect(@api.tlm("INST HEALTH_STATUS TEMP1")).to be_within(0.1).of(10.0)
|
|
763
|
+
expect(@api.tlm("INST HEALTH_STATUS TEMP2")).to be_within(0.1).of(20.0)
|
|
764
|
+
@api.inject_tlm("INST","HEALTH_STATUS",{TEMP1: 0, TEMP2: 0}, :RAW, true, true, false)
|
|
765
|
+
expect(@api.tlm("INST HEALTH_STATUS TEMP1")).to eql -100.0
|
|
766
|
+
expect(@api.tlm("INST HEALTH_STATUS TEMP2")).to eql -100.0
|
|
767
|
+
end
|
|
768
|
+
|
|
769
|
+
it "writes to routers and logs even if the packet has no interface" do
|
|
770
|
+
sys = System.targets["SYSTEM"]
|
|
771
|
+
interface = sys.interface
|
|
772
|
+
sys.interface = nil
|
|
773
|
+
|
|
774
|
+
allow_any_instance_of(Interface).to receive(:write_allowed?).and_raise("PROBLEM!")
|
|
775
|
+
expect(Logger).to receive(:error) do |msg|
|
|
776
|
+
expect(msg).to match /Problem writing to router/
|
|
777
|
+
end
|
|
778
|
+
|
|
779
|
+
@api.inject_tlm("SYSTEM","LIMITS_CHANGE")
|
|
780
|
+
sys.interface = interface
|
|
781
|
+
end
|
|
782
|
+
end
|
|
783
|
+
|
|
784
|
+
describe "override_tlm" do
|
|
785
|
+
it "complains about unknown targets, packets, and parameters" do
|
|
786
|
+
expect { @api.override_tlm("BLAH HEALTH_STATUS COLLECTS = 1") }.to raise_error(/does not exist/)
|
|
787
|
+
expect { @api.override_tlm("INST UNKNOWN COLLECTS = 1") }.to raise_error(/does not exist/)
|
|
788
|
+
expect { @api.override_tlm("INST HEALTH_STATUS BLAH = 1") }.to raise_error(/does not exist/)
|
|
789
|
+
expect { @api.override_tlm("BLAH","HEALTH_STATUS","COLLECTS",1) }.to raise_error(/does not exist/)
|
|
790
|
+
expect { @api.override_tlm("INST","UNKNOWN","COLLECTS",1) }.to raise_error(/does not exist/)
|
|
791
|
+
expect { @api.override_tlm("INST","HEALTH_STATUS","BLAH",1) }.to raise_error(/does not exist/)
|
|
792
|
+
end
|
|
793
|
+
|
|
794
|
+
it "complains if the target has no interface" do
|
|
795
|
+
expect { @api.override_tlm("SYSTEM META PKTID = 1") }.to raise_error(/Target 'SYSTEM' has no interface/)
|
|
796
|
+
end
|
|
797
|
+
|
|
798
|
+
it "complains if the target doesn't have OVERRIDE protocol" do
|
|
799
|
+
interface = OpenStruct.new
|
|
800
|
+
interface.name = "SYSTEM_INT"
|
|
801
|
+
System.targets["SYSTEM"].interface = interface # Set a dummy interface
|
|
802
|
+
expect { @api.override_tlm("SYSTEM META PKTID = 1") }.to raise_error(/Interface SYSTEM_INT does not have override/)
|
|
803
|
+
System.targets["SYSTEM"].interface = nil
|
|
804
|
+
end
|
|
805
|
+
|
|
806
|
+
it "complains with too many parameters" do
|
|
807
|
+
expect { @api.override_tlm("INST","HEALTH_STATUS","TEMP1","TEMP2",0.0) }.to raise_error(/Invalid number of arguments/)
|
|
808
|
+
end
|
|
809
|
+
|
|
810
|
+
it "calls _override_tlm in the interface" do
|
|
811
|
+
int = System.targets["INST"].interface
|
|
812
|
+
expect(int).to receive("_override_tlm").with("INST","HEALTH_STATUS","TEMP1",100.0)
|
|
813
|
+
@api.override_tlm("INST HEALTH_STATUS TEMP1 = 100.0")
|
|
814
|
+
expect(int).to receive("_override_tlm").with("INST","HEALTH_STATUS","TEMP2",50.0)
|
|
815
|
+
@api.override_tlm("INST","HEALTH_STATUS","TEMP2", 50.0)
|
|
816
|
+
end
|
|
817
|
+
end
|
|
818
|
+
|
|
819
|
+
describe "override_tlm_raw" do
|
|
820
|
+
it "complains about unknown targets, commands, and parameters" do
|
|
821
|
+
expect { @api.override_tlm_raw("BLAH HEALTH_STATUS COLLECTS = 1") }.to raise_error(/does not exist/)
|
|
822
|
+
expect { @api.override_tlm_raw("INST UNKNOWN COLLECTS = 1") }.to raise_error(/does not exist/)
|
|
823
|
+
expect { @api.override_tlm_raw("INST HEALTH_STATUS BLAH = 1") }.to raise_error(/does not exist/)
|
|
824
|
+
expect { @api.override_tlm_raw("BLAH","HEALTH_STATUS","COLLECTS",1) }.to raise_error(/does not exist/)
|
|
825
|
+
expect { @api.override_tlm_raw("INST","UNKNOWN","COLLECTS",1) }.to raise_error(/does not exist/)
|
|
826
|
+
expect { @api.override_tlm_raw("INST","HEALTH_STATUS","BLAH",1) }.to raise_error(/does not exist/)
|
|
827
|
+
end
|
|
828
|
+
|
|
829
|
+
it "complains if the target has no interface" do
|
|
830
|
+
expect { @api.override_tlm_raw("SYSTEM META PKTID = 1") }.to raise_error(/Target 'SYSTEM' has no interface/)
|
|
831
|
+
end
|
|
832
|
+
|
|
833
|
+
it "complains with too many parameters" do
|
|
834
|
+
expect { @api.override_tlm_raw("INST","HEALTH_STATUS","TEMP1","TEMP2",0.0) }.to raise_error(/Invalid number of arguments/)
|
|
835
|
+
end
|
|
836
|
+
|
|
837
|
+
it "calls _override_tlm_raw in the interface" do
|
|
838
|
+
int = System.targets["INST"].interface
|
|
839
|
+
expect(int).to receive("_override_tlm_raw").with("INST","HEALTH_STATUS","TEMP1",100.0)
|
|
840
|
+
@api.override_tlm_raw("INST HEALTH_STATUS TEMP1 = 100.0")
|
|
841
|
+
expect(int).to receive("_override_tlm_raw").with("INST","HEALTH_STATUS","TEMP2",50.0)
|
|
842
|
+
@api.override_tlm_raw("INST","HEALTH_STATUS","TEMP2", 50.0)
|
|
843
|
+
end
|
|
844
|
+
end
|
|
845
|
+
|
|
846
|
+
describe "normalize_tlm" do
|
|
847
|
+
it "complains about unknown targets, commands, and parameters" do
|
|
848
|
+
expect { @api.normalize_tlm("BLAH HEALTH_STATUS COLLECTS") }.to raise_error(/does not exist/)
|
|
849
|
+
expect { @api.normalize_tlm("INST UNKNOWN COLLECTS") }.to raise_error(/does not exist/)
|
|
850
|
+
expect { @api.normalize_tlm("INST HEALTH_STATUS BLAH") }.to raise_error(/does not exist/)
|
|
851
|
+
expect { @api.normalize_tlm("BLAH","HEALTH_STATUS","COLLECTS") }.to raise_error(/does not exist/)
|
|
852
|
+
expect { @api.normalize_tlm("INST","UNKNOWN","COLLECTS") }.to raise_error(/does not exist/)
|
|
853
|
+
expect { @api.normalize_tlm("INST","HEALTH_STATUS","BLAH") }.to raise_error(/does not exist/)
|
|
854
|
+
end
|
|
855
|
+
|
|
856
|
+
it "complains if the target has no interface" do
|
|
857
|
+
expect { @api.normalize_tlm("SYSTEM META PKTID") }.to raise_error(/Target 'SYSTEM' has no interface/)
|
|
858
|
+
end
|
|
859
|
+
|
|
860
|
+
it "complains with too many parameters" do
|
|
861
|
+
expect { @api.normalize_tlm("INST","HEALTH_STATUS","TEMP1",0.0) }.to raise_error(/Invalid number of arguments/)
|
|
862
|
+
end
|
|
863
|
+
|
|
864
|
+
it "calls _normalize_tlm in the interface" do
|
|
865
|
+
int = System.targets["INST"].interface
|
|
866
|
+
expect(int).to receive("_normalize_tlm").with("INST","HEALTH_STATUS","TEMP1")
|
|
867
|
+
@api.normalize_tlm("INST HEALTH_STATUS TEMP1")
|
|
868
|
+
expect(int).to receive("_normalize_tlm").with("INST","HEALTH_STATUS","TEMP2")
|
|
869
|
+
@api.normalize_tlm("INST","HEALTH_STATUS","TEMP2")
|
|
870
|
+
end
|
|
871
|
+
end
|
|
872
|
+
|
|
873
|
+
describe "get_tlm_buffer" do
|
|
874
|
+
it "returns a telemetry packet buffer" do
|
|
875
|
+
@api.inject_tlm("INST","HEALTH_STATUS",{TIMESEC: 0xDEADBEEF})
|
|
876
|
+
expect(@api.get_tlm_buffer("INST", "HEALTH_STATUS")[6..10].unpack("N")[0]).to eq 0xDEADBEEF
|
|
877
|
+
end
|
|
878
|
+
end
|
|
879
|
+
|
|
651
880
|
describe "get_tlm_packet" do
|
|
652
881
|
it "complains about non-existant targets" do
|
|
653
882
|
expect { @api.get_tlm_packet("BLAH","HEALTH_STATUS") }.to raise_error(RuntimeError, "Telemetry target 'BLAH' does not exist")
|
|
@@ -666,15 +895,18 @@ module Cosmos
|
|
|
666
895
|
end
|
|
667
896
|
|
|
668
897
|
it "reads all telemetry items with their limits states" do
|
|
898
|
+
# Call inject_tlm to ensure the limits are set
|
|
899
|
+
@api.inject_tlm("INST","HEALTH_STATUS",{TEMP1: 0, TEMP2: 0, TEMP3: 0, TEMP4: 0}, :RAW)
|
|
900
|
+
|
|
669
901
|
vals = @api.get_tlm_packet("INST","HEALTH_STATUS")
|
|
670
902
|
expect(vals[0][0]).to eql "RECEIVED_TIMESECONDS"
|
|
671
|
-
expect(vals[0][1]).to
|
|
903
|
+
expect(vals[0][1]).to be > 0
|
|
672
904
|
expect(vals[0][2]).to be_nil
|
|
673
905
|
expect(vals[1][0]).to eql "RECEIVED_TIMEFORMATTED"
|
|
674
|
-
expect(vals[1][1]).to eql
|
|
906
|
+
expect(vals[1][1].split(' ')[0]).to eql Time.now.formatted.split(' ')[0]
|
|
675
907
|
expect(vals[1][2]).to be_nil
|
|
676
908
|
expect(vals[2][0]).to eql "RECEIVED_COUNT"
|
|
677
|
-
expect(vals[2][1]).to
|
|
909
|
+
expect(vals[2][1]).to be > 0
|
|
678
910
|
expect(vals[2][2]).to be_nil
|
|
679
911
|
# Spot check a few more
|
|
680
912
|
expect(vals[22][0]).to eql "TEMP1"
|
|
@@ -872,6 +1104,7 @@ module Cosmos
|
|
|
872
1104
|
|
|
873
1105
|
describe "get_out_of_limits" do
|
|
874
1106
|
it "returns all out of limits items" do
|
|
1107
|
+
@api.inject_tlm("INST","HEALTH_STATUS",{TEMP1: 0, TEMP2: 0, TEMP3: 0, TEMP4: 0}, :RAW)
|
|
875
1108
|
items = @api.get_out_of_limits
|
|
876
1109
|
(0..3).each do |i|
|
|
877
1110
|
expect(items[i][0]).to eql "INST"
|
|
@@ -882,6 +1115,13 @@ module Cosmos
|
|
|
882
1115
|
end
|
|
883
1116
|
end
|
|
884
1117
|
|
|
1118
|
+
describe "get_overall_limits_state" do
|
|
1119
|
+
it "returns the overall system limits state" do
|
|
1120
|
+
@api.inject_tlm("INST","HEALTH_STATUS",{TEMP1: 0, TEMP2: 0, TEMP3: 0, TEMP4: 0}, :RAW)
|
|
1121
|
+
expect(@api.get_overall_limits_state).to eq :RED
|
|
1122
|
+
end
|
|
1123
|
+
end
|
|
1124
|
+
|
|
885
1125
|
describe "limits_enabled?" do
|
|
886
1126
|
it "complains about non-existant targets" do
|
|
887
1127
|
expect { @api.limits_enabled?("BLAH","HEALTH_STATUS","TEMP1") }.to raise_error(RuntimeError, "Telemetry target 'BLAH' does not exist")
|
|
@@ -943,6 +1183,28 @@ module Cosmos
|
|
|
943
1183
|
end
|
|
944
1184
|
end
|
|
945
1185
|
|
|
1186
|
+
describe "get_stale" do
|
|
1187
|
+
it "complains about non-existant targets" do
|
|
1188
|
+
expect { @api.get_stale(false,"BLAH") }.to raise_error(RuntimeError, "Telemetry target 'BLAH' does not exist")
|
|
1189
|
+
end
|
|
1190
|
+
|
|
1191
|
+
it "gets stale packets for the specified target" do
|
|
1192
|
+
# By calling check_limits we make HEALTH_STATUS not stale
|
|
1193
|
+
System.telemetry.packet("INST","HEALTH_STATUS").check_limits
|
|
1194
|
+
stale = @api.get_stale(false,"INST").sort
|
|
1195
|
+
inst_pkts = []
|
|
1196
|
+
System.telemetry.packets("INST").each do |name, pkt|
|
|
1197
|
+
next if name == "HEALTH_STATUS" # not stale
|
|
1198
|
+
inst_pkts << ["INST", name]
|
|
1199
|
+
end
|
|
1200
|
+
expect(stale).to eq inst_pkts.sort
|
|
1201
|
+
|
|
1202
|
+
# Passing true only gets packets with limits items
|
|
1203
|
+
stale = @api.get_stale(true,"INST").sort
|
|
1204
|
+
expect(stale).to eq [["INST","PARAMS"]]
|
|
1205
|
+
end
|
|
1206
|
+
end
|
|
1207
|
+
|
|
946
1208
|
describe "get_limits" do
|
|
947
1209
|
it "complains about non-existant targets" do
|
|
948
1210
|
expect { @api.get_limits("BLAH","HEALTH_STATUS","TEMP1") }.to raise_error(RuntimeError, "Telemetry target 'BLAH' does not exist")
|
|
@@ -1084,27 +1346,276 @@ module Cosmos
|
|
|
1084
1346
|
end
|
|
1085
1347
|
end
|
|
1086
1348
|
|
|
1349
|
+
describe "get_packet" do
|
|
1350
|
+
it "creates a packet out of the get_packet_data" do
|
|
1351
|
+
time = Time.now
|
|
1352
|
+
expect(CmdTlmServer).to receive(:get_packet_data).and_return(["\xAB","INST","HEALTH_STATUS",time.to_f,0,10])
|
|
1353
|
+
pkt = @api.get_packet(10)
|
|
1354
|
+
expect(pkt.buffer[0]).to eq "\xAB"
|
|
1355
|
+
expect(pkt.target_name).to eq "INST"
|
|
1356
|
+
expect(pkt.packet_name).to eq "HEALTH_STATUS"
|
|
1357
|
+
expect(pkt.received_time.formatted).to eq time.formatted
|
|
1358
|
+
expect(pkt.received_count).to eq 10
|
|
1359
|
+
end
|
|
1360
|
+
end
|
|
1361
|
+
|
|
1362
|
+
describe "subscribe_server_messages" do
|
|
1363
|
+
it "calls CmdTlmServer" do
|
|
1364
|
+
stub_const("Cosmos::CmdTlmServer::DEFAULT_SERVER_MESSAGES_QUEUE_SIZE", 100)
|
|
1365
|
+
expect(CmdTlmServer).to receive(:subscribe_server_messages)
|
|
1366
|
+
@api.subscribe_server_messages
|
|
1367
|
+
end
|
|
1368
|
+
end
|
|
1369
|
+
|
|
1370
|
+
describe "unsubscribe_server_messages" do
|
|
1371
|
+
it "calls CmdTlmServer" do
|
|
1372
|
+
expect(CmdTlmServer).to receive(:unsubscribe_server_messages)
|
|
1373
|
+
@api.unsubscribe_server_messages(0)
|
|
1374
|
+
end
|
|
1375
|
+
end
|
|
1376
|
+
|
|
1377
|
+
describe "get_server_message" do
|
|
1378
|
+
it "gets a server message" do
|
|
1379
|
+
expect(CmdTlmServer).to receive(:get_server_message)
|
|
1380
|
+
@api.get_server_message(0)
|
|
1381
|
+
end
|
|
1382
|
+
end
|
|
1383
|
+
|
|
1384
|
+
describe "get_interface_targets" do
|
|
1385
|
+
it "returns the targets associated with an interface" do
|
|
1386
|
+
expect(@api.get_interface_targets("INST_INT")).to eql ["INST"]
|
|
1387
|
+
end
|
|
1388
|
+
end
|
|
1389
|
+
|
|
1390
|
+
describe "get_background_tasks" do
|
|
1391
|
+
it "gets background task details" do
|
|
1392
|
+
sleep 0.1
|
|
1393
|
+
tasks = @api.get_background_tasks
|
|
1394
|
+
expect(tasks[0][0]).to eql("Example Background Task1")
|
|
1395
|
+
expect(tasks[0][1]).to eql("sleep")
|
|
1396
|
+
expect(tasks[0][2]).to eql("This is example one")
|
|
1397
|
+
expect(tasks[1][0]).to eql("Example Background Task2")
|
|
1398
|
+
expect(tasks[1][1]).to eql("sleep")
|
|
1399
|
+
expect(tasks[1][2]).to eql("This is example two")
|
|
1400
|
+
sleep 0.5
|
|
1401
|
+
tasks = @api.get_background_tasks
|
|
1402
|
+
expect(tasks[0][0]).to eql("Example Background Task1")
|
|
1403
|
+
expect(tasks[0][1]).to eql("complete") # Thread completes
|
|
1404
|
+
expect(tasks[0][2]).to eql("This is example one")
|
|
1405
|
+
expect(tasks[1][0]).to eql("Example Background Task2")
|
|
1406
|
+
expect(tasks[1][1]).to eql("sleep")
|
|
1407
|
+
expect(tasks[1][2]).to eql("This is example two")
|
|
1408
|
+
end
|
|
1409
|
+
end
|
|
1410
|
+
|
|
1411
|
+
describe "get_server_status" do
|
|
1412
|
+
it "gets server details" do
|
|
1413
|
+
status = @api.get_server_status
|
|
1414
|
+
expect(status[0]).to eql 'DEFAULT'
|
|
1415
|
+
expect(status[1]).to eql 7777
|
|
1416
|
+
expect(status[2]).to eql 0
|
|
1417
|
+
expect(status[3]).to eql 0
|
|
1418
|
+
expect(status[4]).to eql 0.0
|
|
1419
|
+
expect(status[5]).to be > 10
|
|
1420
|
+
end
|
|
1421
|
+
end
|
|
1422
|
+
|
|
1423
|
+
describe "get_target_info" do
|
|
1424
|
+
it "complains about non-existant targets" do
|
|
1425
|
+
expect { @api.get_target_info("BLAH") }.to raise_error(RuntimeError, "Unknown target: BLAH")
|
|
1426
|
+
end
|
|
1427
|
+
|
|
1428
|
+
it "gets target cmd tlm count" do
|
|
1429
|
+
cmd1, tlm1 = @api.get_target_info("INST")
|
|
1430
|
+
@api.cmd("INST ABORT")
|
|
1431
|
+
@api.inject_tlm("INST","HEALTH_STATUS")
|
|
1432
|
+
cmd2, tlm2 = @api.get_target_info("INST")
|
|
1433
|
+
expect(cmd2 - cmd1).to eq 1
|
|
1434
|
+
expect(tlm2 - tlm1).to eq 1
|
|
1435
|
+
end
|
|
1436
|
+
end
|
|
1437
|
+
|
|
1438
|
+
describe "get_all_target_info" do
|
|
1439
|
+
it "gets target name, interface name, cmd & tlm count" do
|
|
1440
|
+
@api.cmd("INST ABORT")
|
|
1441
|
+
@api.inject_tlm("INST","HEALTH_STATUS")
|
|
1442
|
+
info = @api.get_all_target_info().sort
|
|
1443
|
+
expect(info[0][0]).to eq "INST"
|
|
1444
|
+
expect(info[0][1]).to eq "INST_INT"
|
|
1445
|
+
expect(info[0][2]).to be > 0
|
|
1446
|
+
expect(info[0][3]).to be > 0
|
|
1447
|
+
expect(info[1][0]).to eq "SYSTEM"
|
|
1448
|
+
expect(info[1][1]).to eq "" # No interface
|
|
1449
|
+
end
|
|
1450
|
+
end
|
|
1451
|
+
|
|
1452
|
+
describe "get_interface_info" do
|
|
1453
|
+
it "complains about non-existant interfaces" do
|
|
1454
|
+
expect { @api.get_interface_info("BLAH") }.to raise_error(RuntimeError, "Unknown interface: BLAH")
|
|
1455
|
+
end
|
|
1456
|
+
|
|
1457
|
+
it "gets interface info" do
|
|
1458
|
+
info = @api.get_interface_info("INST_INT")
|
|
1459
|
+
expect(info[0]).to eq "ATTEMPTING"
|
|
1460
|
+
expect(info[1..-1]).to eq [0,0,0,0,0,0,0]
|
|
1461
|
+
end
|
|
1462
|
+
end
|
|
1463
|
+
|
|
1464
|
+
describe "get_all_interface_info" do
|
|
1465
|
+
it "gets interface name and all info" do
|
|
1466
|
+
info = @api.get_all_interface_info.sort
|
|
1467
|
+
expect(info[0][0]).to eq "INST_INT"
|
|
1468
|
+
end
|
|
1469
|
+
end
|
|
1470
|
+
|
|
1471
|
+
describe "get_router_names" do
|
|
1472
|
+
it "returns all router names" do
|
|
1473
|
+
expect(@api.get_router_names.sort).to eq %w(PREIDENTIFIED_CMD_ROUTER PREIDENTIFIED_ROUTER ROUTE)
|
|
1474
|
+
end
|
|
1475
|
+
end
|
|
1476
|
+
|
|
1477
|
+
describe "get_router_info" do
|
|
1478
|
+
it "complains about non-existant routers" do
|
|
1479
|
+
expect { @api.get_router_info("BLAH") }.to raise_error(RuntimeError, "Unknown router: BLAH")
|
|
1480
|
+
end
|
|
1481
|
+
|
|
1482
|
+
it "gets router info" do
|
|
1483
|
+
info = @api.get_router_info("ROUTE")
|
|
1484
|
+
expect(info[0]).to eq "ATTEMPTING"
|
|
1485
|
+
expect(info[1..-1]).to eq [0,0,0,0,0,0,0]
|
|
1486
|
+
end
|
|
1487
|
+
end
|
|
1488
|
+
|
|
1489
|
+
describe "get_all_router_info" do
|
|
1490
|
+
it "gets router name and all info" do
|
|
1491
|
+
info = @api.get_all_router_info.sort
|
|
1492
|
+
expect(info[0][0]).to eq "PREIDENTIFIED_CMD_ROUTER"
|
|
1493
|
+
expect(info[1][0]).to eq "PREIDENTIFIED_ROUTER"
|
|
1494
|
+
expect(info[2][0]).to eq "ROUTE"
|
|
1495
|
+
end
|
|
1496
|
+
end
|
|
1497
|
+
|
|
1498
|
+
describe "get_cmd_cnt" do
|
|
1499
|
+
it "complains about non-existant targets" do
|
|
1500
|
+
expect { @api.get_cmd_cnt("BLAH", "ABORT") }.to raise_error(RuntimeError, /does not exist/)
|
|
1501
|
+
end
|
|
1502
|
+
|
|
1503
|
+
it "complains about non-existant packets" do
|
|
1504
|
+
expect { @api.get_cmd_cnt("INST", "BLAH") }.to raise_error(RuntimeError, /does not exist/)
|
|
1505
|
+
end
|
|
1506
|
+
|
|
1507
|
+
it "gets the command packet count" do
|
|
1508
|
+
cnt1 = @api.get_cmd_cnt("INST", "ABORT")
|
|
1509
|
+
@api.cmd("INST", "ABORT")
|
|
1510
|
+
cnt2 = @api.get_cmd_cnt("INST", "ABORT")
|
|
1511
|
+
expect(cnt2 - cnt1).to eq 1
|
|
1512
|
+
end
|
|
1513
|
+
end
|
|
1514
|
+
|
|
1515
|
+
describe "get_tlm_cnt" do
|
|
1516
|
+
it "complains about non-existant targets" do
|
|
1517
|
+
expect { @api.get_tlm_cnt("BLAH", "ABORT") }.to raise_error(RuntimeError, /does not exist/)
|
|
1518
|
+
end
|
|
1519
|
+
|
|
1520
|
+
it "complains about non-existant packets" do
|
|
1521
|
+
expect { @api.get_tlm_cnt("INST", "BLAH") }.to raise_error(RuntimeError, /does not exist/)
|
|
1522
|
+
end
|
|
1523
|
+
|
|
1524
|
+
it "gets the telemetry packet count" do
|
|
1525
|
+
cnt1 = @api.get_tlm_cnt("INST", "ADCS")
|
|
1526
|
+
@api.inject_tlm("INST","ADCS")
|
|
1527
|
+
cnt2 = @api.get_tlm_cnt("INST", "ADCS")
|
|
1528
|
+
expect(cnt2 - cnt1).to eq 1
|
|
1529
|
+
end
|
|
1530
|
+
end
|
|
1531
|
+
|
|
1532
|
+
describe "get_all_cmd_info" do
|
|
1533
|
+
it "gets tgt, pkt, rx cnt for all commands" do
|
|
1534
|
+
total = 1 # Unknown is 1
|
|
1535
|
+
System.commands.target_names.each do |tgt|
|
|
1536
|
+
total += System.commands.packets(tgt).keys.length
|
|
1537
|
+
end
|
|
1538
|
+
info = @api.get_all_cmd_info.sort
|
|
1539
|
+
expect(info.length).to eq total
|
|
1540
|
+
expect(info[0][0]).to eq "INST"
|
|
1541
|
+
expect(info[0][1]).to eq "ABORT"
|
|
1542
|
+
expect(info[0][2]).to be >= 0
|
|
1543
|
+
expect(info[-1][0]).to eq "UNKNOWN"
|
|
1544
|
+
expect(info[-1][1]).to eq "UNKNOWN"
|
|
1545
|
+
expect(info[-1][2]).to eq 0
|
|
1546
|
+
end
|
|
1547
|
+
end
|
|
1548
|
+
|
|
1549
|
+
describe "get_all_tlm_info" do
|
|
1550
|
+
it "gets tgt, pkt, rx cnt for all telemetry" do
|
|
1551
|
+
total = 1 # Unknown is 1
|
|
1552
|
+
System.telemetry.target_names.each do |tgt|
|
|
1553
|
+
total += System.telemetry.packets(tgt).keys.length
|
|
1554
|
+
end
|
|
1555
|
+
info = @api.get_all_tlm_info.sort
|
|
1556
|
+
expect(info.length).to eq total
|
|
1557
|
+
expect(info[0][0]).to eq "INST"
|
|
1558
|
+
expect(info[0][1]).to eq "ADCS"
|
|
1559
|
+
expect(info[0][2]).to be >= 0
|
|
1560
|
+
expect(info[-1][0]).to eq "UNKNOWN"
|
|
1561
|
+
expect(info[-1][1]).to eq "UNKNOWN"
|
|
1562
|
+
expect(info[-1][2]).to eq 0
|
|
1563
|
+
end
|
|
1564
|
+
end
|
|
1565
|
+
|
|
1566
|
+
describe "get_packet_logger_info" do
|
|
1567
|
+
it "complains about non-existant loggers" do
|
|
1568
|
+
expect { @api.get_packet_logger_info("BLAH") }.to raise_error(RuntimeError, "Unknown packet log writer: BLAH")
|
|
1569
|
+
end
|
|
1570
|
+
|
|
1571
|
+
it "gets packet logger info" do
|
|
1572
|
+
info = @api.get_packet_logger_info("DEFAULT")
|
|
1573
|
+
expect(info[0]).to eq ["INST_INT"]
|
|
1574
|
+
end
|
|
1575
|
+
end
|
|
1576
|
+
|
|
1577
|
+
describe "get_all_packet_logger_info" do
|
|
1578
|
+
it "gets all packet loggers info" do
|
|
1579
|
+
info = @api.get_all_packet_logger_info.sort
|
|
1580
|
+
expect(info[0][0]).to eq "DEFAULT"
|
|
1581
|
+
expect(info[0][1]).to eq ["INST_INT"]
|
|
1582
|
+
end
|
|
1583
|
+
end
|
|
1584
|
+
|
|
1585
|
+
describe "background_task apis" do
|
|
1586
|
+
it "starts, gets into, and stops background tasks" do
|
|
1587
|
+
@api.start_background_task("Example Background Task2")
|
|
1588
|
+
sleep 0.1
|
|
1589
|
+
info = @api.get_background_tasks.sort
|
|
1590
|
+
expect(info[1][0]).to eq "Example Background Task2"
|
|
1591
|
+
expect(info[1][1]).to eq "sleep"
|
|
1592
|
+
expect(info[1][2]).to eq "This is example two"
|
|
1593
|
+
@api.stop_background_task("Example Background Task2")
|
|
1594
|
+
sleep 0.1
|
|
1595
|
+
info = @api.get_background_tasks.sort
|
|
1596
|
+
expect(info[1][0]).to eq "Example Background Task2"
|
|
1597
|
+
expect(info[1][1]).to eq "complete"
|
|
1598
|
+
expect(info[1][2]).to eq "This is example two"
|
|
1599
|
+
end
|
|
1600
|
+
end
|
|
1601
|
+
|
|
1087
1602
|
# All these methods simply pass through directly to CmdTlmServer without
|
|
1088
1603
|
# adding any functionality. Thus we just test that they are are received
|
|
1089
1604
|
# by the CmdTlmServer.
|
|
1090
1605
|
describe "CmdTlmServer pass-throughs" do
|
|
1091
1606
|
it "calls through to the CmdTlmServer" do
|
|
1092
1607
|
@api.get_interface_names
|
|
1093
|
-
@api.connect_interface("
|
|
1094
|
-
@api.disconnect_interface("
|
|
1095
|
-
@api.interface_state("
|
|
1096
|
-
@api.map_target_to_interface("INST", "
|
|
1097
|
-
@api.
|
|
1098
|
-
@api.
|
|
1099
|
-
@api.
|
|
1100
|
-
@api.get_tlm_cnt("INST", "HEALTH_STATUS")
|
|
1101
|
-
@api.get_router_info("ROUTE")
|
|
1102
|
-
@api.get_packet_logger_info('DEFAULT')
|
|
1103
|
-
@api.get_router_names
|
|
1608
|
+
@api.connect_interface("INST_INT")
|
|
1609
|
+
@api.disconnect_interface("INST_INT")
|
|
1610
|
+
@api.interface_state("INST_INT")
|
|
1611
|
+
@api.map_target_to_interface("INST", "INST_INT")
|
|
1612
|
+
@api.get_target_ignored_parameters("INST")
|
|
1613
|
+
@api.get_target_ignored_items("INST")
|
|
1614
|
+
@api.get_packet_loggers
|
|
1104
1615
|
@api.connect_router("ROUTE")
|
|
1105
1616
|
@api.disconnect_router("ROUTE")
|
|
1106
1617
|
@api.router_state("ROUTE")
|
|
1107
|
-
@api.send_raw("
|
|
1618
|
+
@api.send_raw("INST_INT","\x00\x01")
|
|
1108
1619
|
@api.get_cmd_log_filename('DEFAULT')
|
|
1109
1620
|
@api.get_tlm_log_filename('DEFAULT')
|
|
1110
1621
|
@api.start_logging('ALL')
|
|
@@ -1115,9 +1626,12 @@ module Cosmos
|
|
|
1115
1626
|
@api.stop_tlm_log('ALL')
|
|
1116
1627
|
@api.get_server_message_log_filename
|
|
1117
1628
|
@api.start_new_server_message_log
|
|
1629
|
+
@api.start_raw_logging_interface
|
|
1630
|
+
@api.stop_raw_logging_interface
|
|
1631
|
+
@api.start_raw_logging_router
|
|
1632
|
+
@api.stop_raw_logging_router
|
|
1118
1633
|
end
|
|
1119
1634
|
end
|
|
1120
1635
|
|
|
1121
1636
|
end
|
|
1122
1637
|
end
|
|
1123
|
-
|