cosmos 3.3.3 → 3.4.0
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/.gitattributes +2 -0
- data/.travis.yml +2 -1
- data/Gemfile +4 -3
- data/Manifest.txt +22 -0
- data/autohotkey/tools/handbook_creator.ahk +9 -0
- data/autohotkey/tools/packet_viewer.ahk +4 -0
- data/bin/exchndl20-x64.dll +0 -0
- data/bin/exchndl20.dll +0 -0
- data/bin/exchndl21-x64.dll +0 -0
- data/bin/exchndl21.dll +0 -0
- data/bin/exchndl22-x64.dll +0 -0
- data/bin/exchndl22.dll +0 -0
- data/bin/mgwhelp-x64.dll +0 -0
- data/bin/mgwhelp.dll +0 -0
- data/cosmos.gemspec +1 -0
- data/data/crc.txt +30 -24
- data/demo/config/data/crc.txt +3 -3
- data/demo/config/tools/handbook_creator/templates/command_packets.html.erb +3 -1
- data/demo/config/tools/handbook_creator/templates/telemetry_packets.html.erb +3 -1
- data/demo/procedures/cosmos_api_test.rb +1 -1
- data/ext/cosmos/ext/low_fragmentation_array/low_fragmentation_array.c +4 -0
- data/ext/cosmos/ext/platform/platform.c +22 -2
- data/ext/cosmos/ext/structure/structure.c +631 -104
- data/ext/cosmos/ext/telemetry/telemetry.c +3 -2
- data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +71 -92
- data/lib/cosmos/gui/line_graph/overview_graph.rb +1 -1
- data/lib/cosmos/gui/qt.rb +38 -24
- data/lib/cosmos/gui/text/ruby_editor.rb +1 -1
- data/lib/cosmos/packets/binary_accessor.rb +1 -288
- data/lib/cosmos/packets/telemetry.rb +2 -1
- data/lib/cosmos/script/cmd_tlm_server.rb +110 -0
- data/lib/cosmos/script/commands.rb +166 -0
- data/lib/cosmos/script/extract.rb +2 -2
- data/lib/cosmos/script/limits.rb +108 -0
- data/lib/cosmos/script/script.rb +28 -1487
- data/lib/cosmos/script/scripting.rb +889 -0
- data/lib/cosmos/script/telemetry.rb +174 -0
- data/lib/cosmos/script/tools.rb +138 -0
- data/lib/cosmos/streams/stream_protocol.rb +9 -6
- data/lib/cosmos/system/target.rb +55 -38
- data/lib/cosmos/tools/cmd_tlm_server/api.rb +6 -3
- data/lib/cosmos/tools/cmd_tlm_server/connections.rb +0 -1
- data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +17 -7
- data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +15 -4
- data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +15 -8
- data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +41 -13
- data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +18 -1
- data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +1 -1
- data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +1 -1
- data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +1 -1
- data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +1 -1
- data/lib/cosmos/top_level.rb +1 -1
- data/lib/cosmos/utilities/ruby_lex_utils.rb +1 -1
- data/lib/cosmos/version.rb +5 -5
- data/spec/gui/line_graph/line_clip_spec.rb +6 -6
- data/spec/gui/qt_spec.rb +102 -0
- data/spec/interfaces/interface_spec.rb +9 -9
- data/spec/interfaces/linc_interface_spec.rb +72 -15
- data/spec/interfaces/serial_interface_spec.rb +9 -9
- data/spec/interfaces/simulated_target_interface_spec.rb +7 -7
- data/spec/interfaces/stream_interface_spec.rb +4 -4
- data/spec/interfaces/tcpip_client_interface_spec.rb +8 -8
- data/spec/interfaces/tcpip_server_interface_spec.rb +9 -9
- data/spec/interfaces/udp_interface_spec.rb +20 -20
- data/spec/io/json_drb_spec.rb +4 -4
- data/spec/io/raw_logger_pair_spec.rb +20 -20
- data/spec/io/raw_logger_spec.rb +3 -3
- data/spec/io/tcpip_server_spec.rb +9 -9
- data/spec/io/udp_sockets_spec.rb +2 -2
- data/spec/io/win32_serial_driver_spec.rb +2 -2
- data/spec/packets/binary_accessor_spec.rb +143 -6
- data/spec/packets/commands_spec.rb +5 -5
- data/spec/packets/limits_spec.rb +15 -15
- data/spec/packets/packet_config_spec.rb +19 -19
- data/spec/packets/packet_item_limits_spec.rb +3 -3
- data/spec/packets/packet_item_spec.rb +4 -4
- data/spec/packets/packet_spec.rb +33 -33
- data/spec/packets/structure_item_spec.rb +19 -19
- data/spec/packets/telemetry_spec.rb +6 -6
- data/spec/script/cmd_tlm_server_spec.rb +110 -0
- data/spec/script/commands_disconnect_spec.rb +270 -0
- data/spec/script/commands_spec.rb +288 -0
- data/spec/script/limits_spec.rb +153 -0
- data/spec/script/script_spec.rb +32 -696
- data/spec/script/scripting_spec.rb +436 -0
- data/spec/script/telemetry_spec.rb +130 -0
- data/spec/script/tools_spec.rb +117 -0
- data/spec/spec_helper.rb +10 -5
- data/spec/streams/preidentified_stream_protocol_spec.rb +4 -4
- data/spec/streams/serial_stream_spec.rb +8 -8
- data/spec/streams/stream_protocol_spec.rb +4 -4
- data/spec/streams/tcpip_client_stream_spec.rb +3 -3
- data/spec/streams/tcpip_socket_stream_spec.rb +7 -7
- data/spec/streams/template_stream_protocol_spec.rb +1 -1
- data/spec/system/system_spec.rb +6 -6
- data/spec/system/target_spec.rb +2 -0
- data/spec/tools/cmd_tlm_server/api_spec.rb +17 -17
- data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +5 -5
- data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +3 -3
- data/spec/top_level/top_level_spec.rb +8 -8
- data/spec/utilities/csv_spec.rb +3 -3
- data/spec/utilities/message_log_spec.rb +3 -3
- data/spec/utilities/ruby_lex_utils_spec.rb +7 -7
- data/test/performance/config/tools/launcher/launcher_threads.txt +8 -1
- data/test/performance/tools/CmdTlmServerMemProf +1 -1
- data/test/performance/tools/TlmGrapherMemProf +19 -0
- data/test/performance/tools/TlmGrapherMemProf.bat +59 -0
- metadata +38 -2
|
@@ -366,17 +366,17 @@ module Cosmos
|
|
|
366
366
|
describe "check_stale" do
|
|
367
367
|
it "checks each packet for staleness" do
|
|
368
368
|
@tlm.check_stale
|
|
369
|
-
expect(@tlm.packet("TGT1","PKT1").stale).to
|
|
370
|
-
expect(@tlm.packet("TGT1","PKT2").stale).to
|
|
371
|
-
expect(@tlm.packet("TGT2","PKT1").stale).to
|
|
369
|
+
expect(@tlm.packet("TGT1","PKT1").stale).to be true
|
|
370
|
+
expect(@tlm.packet("TGT1","PKT2").stale).to be true
|
|
371
|
+
expect(@tlm.packet("TGT2","PKT1").stale).to be true
|
|
372
372
|
|
|
373
373
|
@tlm.packet("TGT1","PKT1").check_limits
|
|
374
374
|
@tlm.packet("TGT1","PKT2").check_limits
|
|
375
375
|
@tlm.packet("TGT2","PKT1").check_limits
|
|
376
376
|
@tlm.check_stale
|
|
377
|
-
expect(@tlm.packet("TGT1","PKT1").stale).to
|
|
378
|
-
expect(@tlm.packet("TGT1","PKT2").stale).to
|
|
379
|
-
expect(@tlm.packet("TGT2","PKT1").stale).to
|
|
377
|
+
expect(@tlm.packet("TGT1","PKT1").stale).to be false
|
|
378
|
+
expect(@tlm.packet("TGT1","PKT2").stale).to be false
|
|
379
|
+
expect(@tlm.packet("TGT2","PKT1").stale).to be false
|
|
380
380
|
end
|
|
381
381
|
end
|
|
382
382
|
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# encoding: ascii-8bit
|
|
2
|
+
|
|
3
|
+
# Copyright 2014 Ball Aerospace & Technologies Corp.
|
|
4
|
+
# All Rights Reserved.
|
|
5
|
+
#
|
|
6
|
+
# This program is free software; you can modify and/or redistribute it
|
|
7
|
+
# under the terms of the GNU General Public License
|
|
8
|
+
# as published by the Free Software Foundation; version 3 with
|
|
9
|
+
# attribution addendums as found in the LICENSE.txt
|
|
10
|
+
|
|
11
|
+
require 'spec_helper'
|
|
12
|
+
require 'cosmos'
|
|
13
|
+
require 'cosmos/script/script'
|
|
14
|
+
require 'tempfile'
|
|
15
|
+
|
|
16
|
+
module Cosmos
|
|
17
|
+
|
|
18
|
+
describe Script do
|
|
19
|
+
|
|
20
|
+
before(:all) do
|
|
21
|
+
cts = File.join(Cosmos::USERPATH,'config','tools','cmd_tlm_server','cmd_tlm_server.txt')
|
|
22
|
+
FileUtils.mkdir_p(File.dirname(cts))
|
|
23
|
+
File.open(cts,'w') do |file|
|
|
24
|
+
file.puts 'INTERFACE INST_INT interface.rb'
|
|
25
|
+
file.puts 'TARGET INST'
|
|
26
|
+
end
|
|
27
|
+
System.class_eval('@@instance = nil')
|
|
28
|
+
|
|
29
|
+
require 'cosmos/script'
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
after(:all) do
|
|
33
|
+
clean_config()
|
|
34
|
+
FileUtils.rm_rf File.join(Cosmos::USERPATH,'config','tools')
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
before(:each) do
|
|
38
|
+
allow_any_instance_of(Interface).to receive(:connected?).and_return(true)
|
|
39
|
+
allow_any_instance_of(Interface).to receive(:disconnect)
|
|
40
|
+
|
|
41
|
+
@server = CmdTlmServer.new
|
|
42
|
+
shutdown_cmd_tlm()
|
|
43
|
+
initialize_script_module()
|
|
44
|
+
sleep 0.1
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
after(:each) do
|
|
48
|
+
@server.stop
|
|
49
|
+
shutdown_cmd_tlm()
|
|
50
|
+
sleep(0.1)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
describe "get_interface_names" do
|
|
54
|
+
it "returns all interfaces" do
|
|
55
|
+
expect(get_interface_names).to include("INST_INT")
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
describe "connect_interface, disconnect_interface, interface_state" do
|
|
60
|
+
it "connects, disconnect and return the state of the interface CTS-3" do
|
|
61
|
+
connect_interface("INST_INT")
|
|
62
|
+
expect(interface_state("INST_INT")).to eql "CONNECTED"
|
|
63
|
+
disconnect_interface("INST_INT")
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
describe "map_target_to_interface" do
|
|
68
|
+
it "maps a target name to an interface" do
|
|
69
|
+
map_target_to_interface("INST","INST_INT")
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
describe "connect_router, disconnect_router, get_router_names, router_state" do
|
|
74
|
+
it "returns connect, disconnect, and list the routers CTS-11" do
|
|
75
|
+
expect(get_router_names).to include("PREIDENTIFIED_ROUTER")
|
|
76
|
+
connect_router("PREIDENTIFIED_ROUTER")
|
|
77
|
+
expect(router_state("PREIDENTIFIED_ROUTER")).to eql "CONNECTED"
|
|
78
|
+
disconnect_router("PREIDENTIFIED_ROUTER")
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
describe "logging methods" do
|
|
83
|
+
it "starts and stop logging and get filenames CTS-14" do
|
|
84
|
+
start_logging
|
|
85
|
+
stop_logging
|
|
86
|
+
get_cmd_log_filename
|
|
87
|
+
get_tlm_log_filename
|
|
88
|
+
start_cmd_log
|
|
89
|
+
start_tlm_log
|
|
90
|
+
get_cmd_log_filename
|
|
91
|
+
get_tlm_log_filename
|
|
92
|
+
stop_cmd_log
|
|
93
|
+
stop_tlm_log
|
|
94
|
+
get_cmd_log_filename
|
|
95
|
+
get_tlm_log_filename
|
|
96
|
+
start_raw_logging_interface
|
|
97
|
+
start_raw_logging_router
|
|
98
|
+
stop_raw_logging_interface
|
|
99
|
+
stop_raw_logging_router
|
|
100
|
+
|
|
101
|
+
start_new_server_message_log
|
|
102
|
+
sleep 0.1
|
|
103
|
+
filename = get_server_message_log_filename
|
|
104
|
+
expect(filename).to match /server_messages.txt/
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
# encoding: ascii-8bit
|
|
2
|
+
|
|
3
|
+
# Copyright 2014 Ball Aerospace & Technologies Corp.
|
|
4
|
+
# All Rights Reserved.
|
|
5
|
+
#
|
|
6
|
+
# This program is free software; you can modify and/or redistribute it
|
|
7
|
+
# under the terms of the GNU General Public License
|
|
8
|
+
# as published by the Free Software Foundation; version 3 with
|
|
9
|
+
# attribution addendums as found in the LICENSE.txt
|
|
10
|
+
|
|
11
|
+
require 'spec_helper'
|
|
12
|
+
require 'cosmos'
|
|
13
|
+
require 'cosmos/script/script'
|
|
14
|
+
require 'tempfile'
|
|
15
|
+
|
|
16
|
+
module Cosmos
|
|
17
|
+
|
|
18
|
+
describe Script do
|
|
19
|
+
|
|
20
|
+
before(:all) do
|
|
21
|
+
cts = File.join(Cosmos::USERPATH,'config','tools','cmd_tlm_server','cmd_tlm_server.txt')
|
|
22
|
+
FileUtils.mkdir_p(File.dirname(cts))
|
|
23
|
+
File.open(cts,'w') do |file|
|
|
24
|
+
file.puts 'INTERFACE INST_INT interface.rb'
|
|
25
|
+
file.puts 'TARGET INST'
|
|
26
|
+
end
|
|
27
|
+
System.class_eval('@@instance = nil')
|
|
28
|
+
require 'cosmos/script'
|
|
29
|
+
set_cmd_tlm_disconnect(true)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
after(:all) do
|
|
33
|
+
clean_config()
|
|
34
|
+
FileUtils.rm_rf File.join(Cosmos::USERPATH,'config','tools')
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
describe "require cosmos/script.rb" do
|
|
38
|
+
it "should raise when inside CmdTlmServer" do
|
|
39
|
+
save = $0
|
|
40
|
+
$0 = "CmdTlmServer"
|
|
41
|
+
expect { load 'cosmos/script.rb' }.to raise_error(/must not be required/)
|
|
42
|
+
$0 = save
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "should raise when inside Replay" do
|
|
46
|
+
save = $0
|
|
47
|
+
$0 = "Replay"
|
|
48
|
+
expect { load 'cosmos/script.rb' }.to raise_error(/must not be required/)
|
|
49
|
+
$0 = save
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
describe "cmd" do
|
|
54
|
+
it "sends a command" do
|
|
55
|
+
capture_io do |stdout|
|
|
56
|
+
cmd("INST ABORT")
|
|
57
|
+
expect(stdout.string).to match /cmd\(\"INST ABORT\"\)/ #"
|
|
58
|
+
stdout.rewind
|
|
59
|
+
cmd("INST", "ABORT")
|
|
60
|
+
expect(stdout.string).to match /cmd\(\"INST ABORT\"\)/ #"
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it "checks parameter ranges" do
|
|
65
|
+
expect { cmd("INST COLLECT with TYPE NORMAL, DURATION 20") }.to raise_error(/Command parameter 'INST COLLECT DURATION' = 20 not in valid range/)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
it "prompts for a hazardous command" do
|
|
69
|
+
capture_io do |stdout|
|
|
70
|
+
expect(self).to receive(:gets) { 'y' } # Send hazardous command
|
|
71
|
+
cmd("INST COLLECT with TYPE SPECIAL")
|
|
72
|
+
|
|
73
|
+
expect(stdout.string).to match /cmd\(\"INST COLLECT/ # "
|
|
74
|
+
expect(stdout.string).to match "Warning: Command INST COLLECT is Hazardous"
|
|
75
|
+
expect(stdout.string).to_not match "Command INST COLLECT being sent ignoring range checks"
|
|
76
|
+
expect(stdout.string).to_not match "Command INST COLLECT being sent ignoring hazardous warnings"
|
|
77
|
+
stdout.rewind
|
|
78
|
+
|
|
79
|
+
expect(self).to receive(:gets) { 'n' } # Don't send hazardous
|
|
80
|
+
expect(self).to receive(:gets) { 'y' } # Stop running script
|
|
81
|
+
cmd("INST COLLECT with TYPE SPECIAL")
|
|
82
|
+
expect(stdout.string).to match "Warning: Command INST COLLECT is Hazardous"
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
describe "cmd_no_range_check" do
|
|
88
|
+
it "sends an out of range command" do
|
|
89
|
+
expect { cmd_no_range_check("INST COLLECT with TYPE NORMAL, DURATION 20") }.to_not raise_error
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
it "prompts for a hazardous command" do
|
|
93
|
+
capture_io do |stdout|
|
|
94
|
+
expect(self).to receive(:gets) { 'y' } # Send hazardous command
|
|
95
|
+
cmd_no_range_check("INST COLLECT with TYPE SPECIAL")
|
|
96
|
+
|
|
97
|
+
expect(stdout.string).to match /cmd\(\"INST COLLECT/ # "
|
|
98
|
+
expect(stdout.string).to match "Warning: Command INST COLLECT is Hazardous"
|
|
99
|
+
expect(stdout.string).to match "Command INST COLLECT being sent ignoring range checks"
|
|
100
|
+
expect(stdout.string).to_not match "Command INST COLLECT being sent ignoring hazardous warnings"
|
|
101
|
+
stdout.rewind
|
|
102
|
+
|
|
103
|
+
expect(self).to receive(:gets) { 'n' } # Don't send hazardous
|
|
104
|
+
expect(self).to receive(:gets) { 'y' } # Stop running script
|
|
105
|
+
cmd_no_range_check("INST COLLECT with TYPE SPECIAL")
|
|
106
|
+
expect(stdout.string).to match "Warning: Command INST COLLECT is Hazardous"
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
describe "cmd_no_hazardous_check" do
|
|
112
|
+
it "checks parameter ranges" do
|
|
113
|
+
expect { cmd_no_hazardous_check("INST COLLECT with TYPE SPECIAL, DURATION 20") }.to raise_error(/Command parameter 'INST COLLECT DURATION' = 20 not in valid range/)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
it "sends a hazardous command without prompting" do
|
|
117
|
+
capture_io do |stdout|
|
|
118
|
+
cmd_no_hazardous_check("INST COLLECT with TYPE SPECIAL")
|
|
119
|
+
|
|
120
|
+
expect(stdout.string).to match /cmd\(\"INST COLLECT/ # "
|
|
121
|
+
expect(stdout.string).to_not match "Warning: Command INST COLLECT is Hazardous"
|
|
122
|
+
expect(stdout.string).to_not match "Command INST COLLECT being sent ignoring range checks"
|
|
123
|
+
expect(stdout.string).to match "Command INST COLLECT being sent ignoring hazardous warnings"
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
describe "cmd_no_checks" do
|
|
129
|
+
it "sends an out of range hazardous command without prompting" do
|
|
130
|
+
capture_io do |stdout|
|
|
131
|
+
cmd_no_checks("INST COLLECT with TYPE SPECIAL, DURATION 20")
|
|
132
|
+
|
|
133
|
+
expect(stdout.string).to match /cmd\(\"INST COLLECT/ # "
|
|
134
|
+
expect(stdout.string).to_not match "Warning: Command INST COLLECT is Hazardous"
|
|
135
|
+
expect(stdout.string).to match "Command INST COLLECT being sent ignoring range checks"
|
|
136
|
+
expect(stdout.string).to match "Command INST COLLECT being sent ignoring hazardous warnings"
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
describe "cmd_raw" do
|
|
142
|
+
it "sends a command" do
|
|
143
|
+
capture_io do |stdout|
|
|
144
|
+
cmd_raw("INST ABORT")
|
|
145
|
+
expect(stdout.string).to match /cmd_raw\(\"INST ABORT\"\)/ # "
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
it "checks parameter ranges" do
|
|
150
|
+
expect { cmd_raw("INST COLLECT with TYPE 0, DURATION 20") }.to raise_error(/Command parameter 'INST COLLECT DURATION' = 20 not in valid range/) # '
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
it "prompts for a hazardous command" do
|
|
154
|
+
capture_io do |stdout|
|
|
155
|
+
expect(self).to receive(:gets) { 'y' } # Send hazardous command
|
|
156
|
+
cmd_raw("INST COLLECT with TYPE 1")
|
|
157
|
+
|
|
158
|
+
expect(stdout.string).to match /cmd_raw\(\"INST COLLECT/ # "
|
|
159
|
+
expect(stdout.string).to match "Warning: Command INST COLLECT is Hazardous"
|
|
160
|
+
expect(stdout.string).to_not match "Command INST COLLECT being sent ignoring range checks"
|
|
161
|
+
expect(stdout.string).to_not match "Command INST COLLECT being sent ignoring hazardous warnings"
|
|
162
|
+
stdout.rewind
|
|
163
|
+
|
|
164
|
+
expect(self).to receive(:gets) { 'n' } # Don't send hazardous
|
|
165
|
+
expect(self).to receive(:gets) { 'y' } # Stop running script
|
|
166
|
+
cmd_raw("INST COLLECT with TYPE 1")
|
|
167
|
+
expect(stdout.string).to match "Warning: Command INST COLLECT is Hazardous"
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
describe "cmd_raw_no_range_check" do
|
|
173
|
+
it "sends an out of range command" do
|
|
174
|
+
expect { cmd_raw_no_range_check("INST COLLECT with TYPE 0, DURATION 20") }.to_not raise_error
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
it "prompts for a hazardous command" do
|
|
178
|
+
capture_io do |stdout|
|
|
179
|
+
expect(self).to receive(:gets) { 'y' } # Send hazardous command
|
|
180
|
+
cmd_raw_no_range_check("INST COLLECT with TYPE 1")
|
|
181
|
+
|
|
182
|
+
expect(stdout.string).to match /cmd_raw\(\"INST COLLECT/ # "
|
|
183
|
+
expect(stdout.string).to match "Warning: Command INST COLLECT is Hazardous"
|
|
184
|
+
expect(stdout.string).to match "Command INST COLLECT being sent ignoring range checks"
|
|
185
|
+
expect(stdout.string).to_not match "Command INST COLLECT being sent ignoring hazardous warnings"
|
|
186
|
+
stdout.rewind
|
|
187
|
+
|
|
188
|
+
expect(self).to receive(:gets) { 'n' } # Don't send hazardous
|
|
189
|
+
expect(self).to receive(:gets) { 'y' } # Stop running script
|
|
190
|
+
cmd_raw_no_range_check("INST COLLECT with TYPE 1")
|
|
191
|
+
expect(stdout.string).to match "Warning: Command INST COLLECT is Hazardous"
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
describe "cmd_raw_no_hazardous_check" do
|
|
197
|
+
it "checks parameter ranges" do
|
|
198
|
+
expect { cmd_raw_no_hazardous_check("INST COLLECT with TYPE 1, DURATION 20") }.to raise_error(/Command parameter 'INST COLLECT DURATION' = 20 not in valid range/)
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
it "sends a hazardous command without prompting" do
|
|
202
|
+
capture_io do |stdout|
|
|
203
|
+
cmd_raw_no_hazardous_check("INST COLLECT with TYPE 1")
|
|
204
|
+
expect(stdout.string).to match /cmd_raw\(\"INST COLLECT/ #"
|
|
205
|
+
expect(stdout.string).to_not match "Warning: Command INST COLLECT is Hazardous"
|
|
206
|
+
expect(stdout.string).to_not match "Command INST COLLECT being sent ignoring range checks"
|
|
207
|
+
expect(stdout.string).to match "Command INST COLLECT being sent ignoring hazardous warnings"
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
describe "cmd_raw_no_checks" do
|
|
213
|
+
it "sends an out of range hazardous command without prompting" do
|
|
214
|
+
capture_io do |stdout|
|
|
215
|
+
cmd_raw_no_checks("INST COLLECT with TYPE 1, DURATION 20")
|
|
216
|
+
expect(stdout.string).to match /cmd_raw\(\"INST COLLECT/ #"
|
|
217
|
+
expect(stdout.string).to_not match "Warning: Command INST COLLECT is Hazardous"
|
|
218
|
+
expect(stdout.string).to match "Command INST COLLECT being sent ignoring range checks"
|
|
219
|
+
expect(stdout.string).to match "Command INST COLLECT being sent ignoring hazardous warnings"
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
describe "send_raw" do
|
|
225
|
+
it "sends data to the write_raw interface method" do
|
|
226
|
+
expect_any_instance_of(Interface).to receive(:write_raw).with('\x00')
|
|
227
|
+
send_raw('INST_INT', '\x00')
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
describe "send_raw_file" do
|
|
232
|
+
it "sends file data to the write_raw interface method" do
|
|
233
|
+
file = File.open('raw_test_file.bin','wb')
|
|
234
|
+
file.write '\x00\x01\x02\x03'
|
|
235
|
+
file.close
|
|
236
|
+
|
|
237
|
+
expect_any_instance_of(Interface).to receive(:write_raw).with('\x00\x01\x02\x03')
|
|
238
|
+
|
|
239
|
+
send_raw_file('INST_INT', 'raw_test_file.bin')
|
|
240
|
+
|
|
241
|
+
File.delete('raw_test_file.bin')
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
describe "get_cmd_list" do
|
|
246
|
+
it "returns all the target commands" do
|
|
247
|
+
list = get_cmd_list("INST")
|
|
248
|
+
# Only check for the collect command to make this test list dependent
|
|
249
|
+
# on the demo INST command definition file
|
|
250
|
+
expect(list).to include(["COLLECT", "Starts a collect on the instrument"])
|
|
251
|
+
end
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
describe "get_cmd_param_list" do
|
|
255
|
+
it "returns all the parameters for a command" do
|
|
256
|
+
list = get_cmd_param_list("INST", "COLLECT")
|
|
257
|
+
expect(list).to include(["TYPE", 0, {"NORMAL"=>0, "SPECIAL"=>1}, "Collect type", nil, nil, true])
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
describe "get_cmd_hazardous" do
|
|
262
|
+
it "returns whether a command is hazardous" do
|
|
263
|
+
expect(get_cmd_hazardous("INST", "COLLECT", {"TYPE"=>"NORMAL"})).to be false
|
|
264
|
+
expect(get_cmd_hazardous("INST", "COLLECT", {"TYPE"=>"SPECIAL"})).to be true
|
|
265
|
+
end
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
end
|
|
269
|
+
end
|
|
270
|
+
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
# encoding: ascii-8bit
|
|
2
|
+
|
|
3
|
+
# Copyright 2014 Ball Aerospace & Technologies Corp.
|
|
4
|
+
# All Rights Reserved.
|
|
5
|
+
#
|
|
6
|
+
# This program is free software; you can modify and/or redistribute it
|
|
7
|
+
# under the terms of the GNU General Public License
|
|
8
|
+
# as published by the Free Software Foundation; version 3 with
|
|
9
|
+
# attribution addendums as found in the LICENSE.txt
|
|
10
|
+
|
|
11
|
+
require 'spec_helper'
|
|
12
|
+
require 'cosmos'
|
|
13
|
+
require 'cosmos/script/script'
|
|
14
|
+
require 'tempfile'
|
|
15
|
+
|
|
16
|
+
module Cosmos
|
|
17
|
+
|
|
18
|
+
describe Script do
|
|
19
|
+
|
|
20
|
+
before(:all) do
|
|
21
|
+
cts = File.join(Cosmos::USERPATH,'config','tools','cmd_tlm_server','cmd_tlm_server.txt')
|
|
22
|
+
FileUtils.mkdir_p(File.dirname(cts))
|
|
23
|
+
File.open(cts,'w') do |file|
|
|
24
|
+
file.puts 'INTERFACE INST_INT interface.rb'
|
|
25
|
+
file.puts 'TARGET INST'
|
|
26
|
+
end
|
|
27
|
+
System.class_eval('@@instance = nil')
|
|
28
|
+
|
|
29
|
+
require 'cosmos/script'
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
after(:all) do
|
|
33
|
+
clean_config()
|
|
34
|
+
FileUtils.rm_rf File.join(Cosmos::USERPATH,'config','tools')
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
before(:each) do
|
|
38
|
+
allow_any_instance_of(Interface).to receive(:connected?).and_return(true)
|
|
39
|
+
allow_any_instance_of(Interface).to receive(:disconnect)
|
|
40
|
+
allow_any_instance_of(Interface).to receive(:write)
|
|
41
|
+
allow_any_instance_of(Interface).to receive(:read)
|
|
42
|
+
|
|
43
|
+
@server = CmdTlmServer.new
|
|
44
|
+
shutdown_cmd_tlm()
|
|
45
|
+
initialize_script_module()
|
|
46
|
+
sleep 0.1
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
after(:each) do
|
|
50
|
+
@server.stop
|
|
51
|
+
shutdown_cmd_tlm()
|
|
52
|
+
sleep(0.1)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
describe "require cosmos/script.rb" do
|
|
56
|
+
it "should raise when inside CmdTlmServer" do
|
|
57
|
+
save = $0
|
|
58
|
+
$0 = "CmdTlmServer"
|
|
59
|
+
expect { load 'cosmos/script.rb' }.to raise_error(/must not be required/)
|
|
60
|
+
$0 = save
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it "should raise when inside Replay" do
|
|
64
|
+
save = $0
|
|
65
|
+
$0 = "Replay"
|
|
66
|
+
expect { load 'cosmos/script.rb' }.to raise_error(/must not be required/)
|
|
67
|
+
$0 = save
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
describe "cmd" do
|
|
72
|
+
it "sends a command" do
|
|
73
|
+
capture_io do |stdout|
|
|
74
|
+
cmd("INST ABORT")
|
|
75
|
+
expect(stdout.string).to match /cmd\(\"INST ABORT\"\)/ #"
|
|
76
|
+
stdout.rewind
|
|
77
|
+
cmd("INST", "ABORT")
|
|
78
|
+
expect(stdout.string).to match /cmd\(\"INST ABORT\"\)/ #"
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
it "checks parameter ranges" do
|
|
83
|
+
expect { cmd("INST COLLECT with TYPE NORMAL, DURATION 20") }.to raise_error(/Command parameter 'INST COLLECT DURATION' = 20 not in valid range/)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it "prompts for a hazardous command" do
|
|
87
|
+
capture_io do |stdout|
|
|
88
|
+
expect(self).to receive(:gets) { 'y' } # Send hazardous command
|
|
89
|
+
cmd("INST COLLECT with TYPE SPECIAL")
|
|
90
|
+
|
|
91
|
+
expect(stdout.string).to match /cmd\(\"INST COLLECT/ #"
|
|
92
|
+
expect(stdout.string).to match "Warning: Command INST COLLECT is Hazardous"
|
|
93
|
+
expect(stdout.string).to_not match "Command INST COLLECT being sent ignoring range checks"
|
|
94
|
+
expect(stdout.string).to_not match "Command INST COLLECT being sent ignoring hazardous warnings"
|
|
95
|
+
stdout.rewind
|
|
96
|
+
|
|
97
|
+
expect(self).to receive(:gets) { 'n' } # Don't send hazardous
|
|
98
|
+
expect(self).to receive(:gets) { 'y' } # Stop running script
|
|
99
|
+
cmd("INST COLLECT with TYPE SPECIAL")
|
|
100
|
+
expect(stdout.string).to match "Warning: Command INST COLLECT is Hazardous"
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
describe "cmd_no_range_check" do
|
|
106
|
+
it "sends an out of range command" do
|
|
107
|
+
expect { cmd_no_range_check("INST COLLECT with TYPE NORMAL, DURATION 20") }.to_not raise_error
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
it "prompts for a hazardous command" do
|
|
111
|
+
capture_io do |stdout|
|
|
112
|
+
expect(self).to receive(:gets) { 'y' } # Send hazardous command
|
|
113
|
+
cmd_no_range_check("INST COLLECT with TYPE SPECIAL")
|
|
114
|
+
|
|
115
|
+
expect(stdout.string).to match /cmd\(\"INST COLLECT/ #"
|
|
116
|
+
expect(stdout.string).to match "Warning: Command INST COLLECT is Hazardous"
|
|
117
|
+
expect(stdout.string).to match "Command INST COLLECT being sent ignoring range checks"
|
|
118
|
+
expect(stdout.string).to_not match "Command INST COLLECT being sent ignoring hazardous warnings"
|
|
119
|
+
stdout.rewind
|
|
120
|
+
|
|
121
|
+
expect(self).to receive(:gets) { 'n' } # Don't send hazardous
|
|
122
|
+
expect(self).to receive(:gets) { 'y' } # Stop running script
|
|
123
|
+
cmd_no_range_check("INST COLLECT with TYPE SPECIAL")
|
|
124
|
+
expect(stdout.string).to match "Warning: Command INST COLLECT is Hazardous"
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
describe "cmd_no_hazardous_check" do
|
|
130
|
+
it "checks parameter ranges" do
|
|
131
|
+
expect { cmd_no_hazardous_check("INST COLLECT with TYPE SPECIAL, DURATION 20") }.to raise_error(/Command parameter 'INST COLLECT DURATION' = 20 not in valid range/)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
it "sends a hazardous command without prompting" do
|
|
135
|
+
capture_io do |stdout|
|
|
136
|
+
cmd_no_hazardous_check("INST COLLECT with TYPE SPECIAL")
|
|
137
|
+
|
|
138
|
+
expect(stdout.string).to match /cmd\(\"INST COLLECT/ #"
|
|
139
|
+
expect(stdout.string).to_not match "Warning: Command INST COLLECT is Hazardous"
|
|
140
|
+
expect(stdout.string).to_not match "Command INST COLLECT being sent ignoring range checks"
|
|
141
|
+
expect(stdout.string).to match "Command INST COLLECT being sent ignoring hazardous warnings"
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
describe "cmd_no_checks" do
|
|
147
|
+
it "sends an out of range hazardous command without prompting" do
|
|
148
|
+
capture_io do |stdout|
|
|
149
|
+
cmd_no_checks("INST COLLECT with TYPE SPECIAL, DURATION 20")
|
|
150
|
+
|
|
151
|
+
expect(stdout.string).to match /cmd\(\"INST COLLECT/ #"
|
|
152
|
+
expect(stdout.string).to_not match "Warning: Command INST COLLECT is Hazardous"
|
|
153
|
+
expect(stdout.string).to match "Command INST COLLECT being sent ignoring range checks"
|
|
154
|
+
expect(stdout.string).to match "Command INST COLLECT being sent ignoring hazardous warnings"
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
describe "cmd_raw" do
|
|
160
|
+
it "sends a command" do
|
|
161
|
+
capture_io do |stdout|
|
|
162
|
+
cmd_raw("INST ABORT")
|
|
163
|
+
expect(stdout.string).to match /cmd_raw\(\"INST ABORT\"\)/ #"
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
it "checks parameter ranges" do
|
|
168
|
+
expect { cmd_raw("INST COLLECT with TYPE 0, DURATION 20") }.to raise_error(/Command parameter 'INST COLLECT DURATION' = 20 not in valid range/)
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
it "prompts for a hazardous command" do
|
|
172
|
+
capture_io do |stdout|
|
|
173
|
+
expect(self).to receive(:gets) { 'y' } # Send hazardous command
|
|
174
|
+
cmd_raw("INST COLLECT with TYPE 1")
|
|
175
|
+
|
|
176
|
+
expect(stdout.string).to match /cmd_raw\(\"INST COLLECT/ #"
|
|
177
|
+
expect(stdout.string).to match "Warning: Command INST COLLECT is Hazardous"
|
|
178
|
+
expect(stdout.string).to_not match "Command INST COLLECT being sent ignoring range checks"
|
|
179
|
+
expect(stdout.string).to_not match "Command INST COLLECT being sent ignoring hazardous warnings"
|
|
180
|
+
stdout.rewind
|
|
181
|
+
|
|
182
|
+
expect(self).to receive(:gets) { 'n' } # Don't send hazardous
|
|
183
|
+
expect(self).to receive(:gets) { 'y' } # Stop running script
|
|
184
|
+
cmd_raw("INST COLLECT with TYPE 1")
|
|
185
|
+
expect(stdout.string).to match "Warning: Command INST COLLECT is Hazardous"
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
describe "cmd_raw_no_range_check" do
|
|
191
|
+
it "sends an out of range command" do
|
|
192
|
+
expect { cmd_raw_no_range_check("INST COLLECT with TYPE 0, DURATION 20") }.to_not raise_error
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
it "prompts for a hazardous command" do
|
|
196
|
+
capture_io do |stdout|
|
|
197
|
+
expect(self).to receive(:gets) { 'y' } # Send hazardous command
|
|
198
|
+
cmd_raw_no_range_check("INST COLLECT with TYPE 1")
|
|
199
|
+
|
|
200
|
+
expect(stdout.string).to match /cmd_raw\(\"INST COLLECT/ #"
|
|
201
|
+
expect(stdout.string).to match "Warning: Command INST COLLECT is Hazardous"
|
|
202
|
+
expect(stdout.string).to match "Command INST COLLECT being sent ignoring range checks"
|
|
203
|
+
expect(stdout.string).to_not match "Command INST COLLECT being sent ignoring hazardous warnings"
|
|
204
|
+
stdout.rewind
|
|
205
|
+
|
|
206
|
+
expect(self).to receive(:gets) { 'n' } # Don't send hazardous
|
|
207
|
+
expect(self).to receive(:gets) { 'y' } # Stop running script
|
|
208
|
+
cmd_raw_no_range_check("INST COLLECT with TYPE 1")
|
|
209
|
+
expect(stdout.string).to match "Warning: Command INST COLLECT is Hazardous"
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
describe "cmd_raw_no_hazardous_check" do
|
|
215
|
+
it "checks parameter ranges" do
|
|
216
|
+
expect { cmd_raw_no_hazardous_check("INST COLLECT with TYPE 1, DURATION 20") }.to raise_error(/Command parameter 'INST COLLECT DURATION' = 20 not in valid range/)
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
it "sends a hazardous command without prompting" do
|
|
220
|
+
capture_io do |stdout|
|
|
221
|
+
cmd_raw_no_hazardous_check("INST COLLECT with TYPE 1")
|
|
222
|
+
expect(stdout.string).to match /cmd_raw\(\"INST COLLECT/ #"
|
|
223
|
+
expect(stdout.string).to_not match "Warning: Command INST COLLECT is Hazardous"
|
|
224
|
+
expect(stdout.string).to_not match "Command INST COLLECT being sent ignoring range checks"
|
|
225
|
+
expect(stdout.string).to match "Command INST COLLECT being sent ignoring hazardous warnings"
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
describe "cmd_raw_no_checks" do
|
|
231
|
+
it "sends an out of range hazardous command without prompting" do
|
|
232
|
+
capture_io do |stdout|
|
|
233
|
+
cmd_raw_no_checks("INST COLLECT with TYPE 1, DURATION 20")
|
|
234
|
+
expect(stdout.string).to match /cmd_raw\(\"INST COLLECT/ #"
|
|
235
|
+
expect(stdout.string).to_not match "Warning: Command INST COLLECT is Hazardous"
|
|
236
|
+
expect(stdout.string).to match "Command INST COLLECT being sent ignoring range checks"
|
|
237
|
+
expect(stdout.string).to match "Command INST COLLECT being sent ignoring hazardous warnings"
|
|
238
|
+
end
|
|
239
|
+
end
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
describe "send_raw" do
|
|
243
|
+
it "sends data to the write_raw interface method" do
|
|
244
|
+
expect_any_instance_of(Interface).to receive(:write_raw).with('\x00')
|
|
245
|
+
send_raw('INST_INT', '\x00')
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
describe "send_raw_file" do
|
|
250
|
+
it "sends file data to the write_raw interface method" do
|
|
251
|
+
file = File.open('raw_test_file.bin','wb')
|
|
252
|
+
file.write '\x00\x01\x02\x03'
|
|
253
|
+
file.close
|
|
254
|
+
|
|
255
|
+
expect_any_instance_of(Interface).to receive(:write_raw).with('\x00\x01\x02\x03')
|
|
256
|
+
|
|
257
|
+
send_raw_file('INST_INT', 'raw_test_file.bin')
|
|
258
|
+
|
|
259
|
+
File.delete('raw_test_file.bin')
|
|
260
|
+
end
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
describe "get_cmd_list" do
|
|
264
|
+
it "returns all the target commands" do
|
|
265
|
+
list = get_cmd_list("INST")
|
|
266
|
+
# Only check for the collect command to make this test list dependent
|
|
267
|
+
# on the demo INST command definition file
|
|
268
|
+
expect(list).to include(["COLLECT", "Starts a collect on the instrument"])
|
|
269
|
+
end
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
describe "get_cmd_param_list" do
|
|
273
|
+
it "returns all the parameters for a command" do
|
|
274
|
+
list = get_cmd_param_list("INST", "COLLECT")
|
|
275
|
+
expect(list).to include(["TYPE", 0, {"NORMAL"=>0, "SPECIAL"=>1}, "Collect type", nil, nil, true])
|
|
276
|
+
end
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
describe "get_cmd_hazardous" do
|
|
280
|
+
it "returns whether a command is hazardous" do
|
|
281
|
+
expect(get_cmd_hazardous("INST", "COLLECT", {"TYPE"=>"NORMAL"})).to be false
|
|
282
|
+
expect(get_cmd_hazardous("INST", "COLLECT", {"TYPE"=>"SPECIAL"})).to be true
|
|
283
|
+
end
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
end
|
|
287
|
+
end
|
|
288
|
+
|