cosmos 3.1.1 → 3.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/Manifest.txt +6 -0
  3. data/autohotkey/config/tools/handbook_creator/templates/command_packets.html.erb +1 -1
  4. data/autohotkey/config/tools/handbook_creator/templates/footer.html.erb +2 -2
  5. data/autohotkey/config/tools/handbook_creator/templates/header.html.erb +4 -4
  6. data/autohotkey/tools/autohotkey.rb +1 -1
  7. data/autohotkey/tools/cmd_tlm_server.ahk +1 -0
  8. data/autohotkey/tools/packet_viewer.ahk +45 -2
  9. data/data/crc.txt +20 -15
  10. data/demo/Rakefile +16 -0
  11. data/demo/config/data/crc.txt +3 -3
  12. data/demo/config/tools/handbook_creator/templates/footer.html.erb +2 -2
  13. data/demo/config/tools/handbook_creator/templates/header.html.erb +4 -4
  14. data/demo/procedures/example_test.rb +1 -1
  15. data/install/Rakefile +16 -0
  16. data/install/config/data/crc.txt +2 -2
  17. data/install/config/tools/handbook_creator/templates/footer.html.erb +2 -2
  18. data/install/config/tools/handbook_creator/templates/header.html.erb +4 -4
  19. data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +64 -57
  20. data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +0 -9
  21. data/lib/cosmos/gui/qt.rb +22 -18
  22. data/lib/cosmos/packet_logs/packet_log_writer.rb +6 -2
  23. data/lib/cosmos/script/script.rb +1 -1
  24. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +0 -1
  25. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +99 -784
  26. data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +189 -0
  27. data/lib/cosmos/tools/cmd_tlm_server/gui/logging_tab.rb +176 -0
  28. data/lib/cosmos/tools/cmd_tlm_server/gui/packets_tab.rb +144 -0
  29. data/lib/cosmos/tools/cmd_tlm_server/gui/status_tab.rb +240 -0
  30. data/lib/cosmos/tools/cmd_tlm_server/gui/targets_tab.rb +90 -0
  31. data/lib/cosmos/tools/launcher/launcher_config.rb +142 -110
  32. data/lib/cosmos/tools/test_runner/results_writer.rb +1 -1
  33. data/lib/cosmos/tools/test_runner/test_runner.rb +3 -2
  34. data/lib/cosmos/tools/tlm_grapher/data_objects/data_object.rb +18 -2
  35. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +4 -9
  36. data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +5 -5
  37. data/lib/cosmos/top_level.rb +1 -1
  38. data/lib/cosmos/version.rb +4 -4
  39. data/run_gui_tests.bat +33 -31
  40. data/spec/core_ext/time_spec.rb +51 -0
  41. data/spec/script/script_spec.rb +96 -0
  42. data/spec/tools/cmd_tlm_server/commanding_spec.rb +28 -0
  43. data/spec/tools/cmd_tlm_server/connections_spec.rb +88 -0
  44. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +78 -25
  45. data/spec/tools/launcher/launcher_config_spec.rb +460 -0
  46. data/spec/top_level/top_level_spec.rb +1 -1
  47. metadata +8 -2
@@ -94,7 +94,7 @@ module Cosmos
94
94
  @file.puts " Exceptions:"
95
95
  result.exceptions.each_with_index do |error, index|
96
96
  error.formatted(true).each_line do |line|
97
- break if line =~ /cosmos_test.rb/
97
+ break if line =~ /test_runner\/test.rb/
98
98
  next if line =~ cosmos_lib
99
99
  if line =~ /[\x00-\x08\x0B-\x0C\x0E-\x1F\x7F-\xFF]/
100
100
  line.chomp!
@@ -1033,9 +1033,10 @@ module Cosmos
1033
1033
  end
1034
1034
 
1035
1035
  # Build list of TestSuites and Tests
1036
- @@test_suites = []
1036
+ @@test_suites = @@test_suites.select {|my_suite| my_suite.name == 'Cosmos::CustomTestSuite'}
1037
1037
  tests = []
1038
1038
  ObjectSpace.each_object(Class) do |object|
1039
+ next if object.name == 'Cosmos::CustomTestSuite'
1039
1040
  if (object.ancestors.include?(TestSuite) &&
1040
1041
  object != TestSuite &&
1041
1042
  !ignored_test_suite_classes.include?(object))
@@ -1125,7 +1126,7 @@ module Cosmos
1125
1126
  end
1126
1127
  end
1127
1128
  end
1128
- @@suites[suite.name.split('::')[-1]] = cur_suite
1129
+ @@suites[suite.name.split('::')[-1]] = cur_suite unless suite.name == 'Cosmos::CustomTestSuite'
1129
1130
  end
1130
1131
  Qt.execute_in_main_thread(true) { @test_runner_chooser.test_suites = @@suites }
1131
1132
  end
@@ -101,17 +101,33 @@ module Cosmos
101
101
  raise "process_packet must be defined by class #{self.class}"
102
102
  end
103
103
 
104
+ def handle_process_exception(error, telemetry_point)
105
+ raise error if error.class == NoMemoryError
106
+ reset()
107
+ @plot.redraw_needed = true
108
+ @error = error
109
+ if error.is_a? TypeError
110
+ @error = FatalError.new("Telemetry point #{telemetry_point} could not be displayed. This is most likely due to this telemetry point being a String which can't be represented on the graph. Remove the point from the list of telemetry items to cause this exception to go away.\n\n#{error}")
111
+ else
112
+ @exceptions_reported ||= []
113
+ unless @exceptions_reported.include?(error.message)
114
+ @exceptions_reported << error.message
115
+ Cosmos.write_exception_file(error)
116
+ end
117
+ end
118
+ end
119
+
104
120
  # Resets the data object's data (everything that is not configuration)
105
121
  def reset
106
122
  @error = nil
107
- #Reset this value at the max float so any x_value will be less than it
123
+ # Reset this value at the max float so any x_value will be less than it
108
124
  @first_x_value = Float::MAX
109
125
  end
110
126
 
111
127
  # Supplies text that should be appended to the popup string on mousing over the specified
112
128
  # x value
113
129
  def popup_modifier(x_value)
114
- #The default class returns an empty value
130
+ # The default class returns an empty value
115
131
  return ""
116
132
  end
117
133
 
@@ -161,8 +161,9 @@ module Cosmos
161
161
  y_value = packet.read(@item_name)
162
162
  end
163
163
  # Bail on the values if they are NaN or nil as we can't graph them
164
- return if x_value.nan? || y_value.nan? || x_value.nil? || y_value.nil?
165
-
164
+ return if x_value.nil? || y_value.nil? ||
165
+ (x_value.respond_to?(:nan?) && x_value.nan?) ||
166
+ (y_value.respond_to?(:nan?) && y_value.nan?)
166
167
  @formatted_x_values << packet.read(@formatted_time_item_name) if @formatted_time_item_name
167
168
 
168
169
  upper_index = nil
@@ -252,13 +253,7 @@ module Cosmos
252
253
  # Prune Data
253
254
  prune_to_max_points_saved()
254
255
  rescue Exception => error
255
- raise error if error.class == NoMemoryError
256
- reset()
257
- @error = error
258
- @plot.redraw_needed = true
259
- if error.is_a? TypeError
260
- @error = FatalError.new("Telemetry point #{packet.target_name} #{packet.packet_name} #{@item_name} could not be displayed. This is most likely due to this telemetry point being a String which can't be represented on the graph. Remove the point from the list of telemetry items to cause this exception to go away.\n\n#{error}")
261
- end
256
+ handle_process_exception(error, "#{packet.target_name} #{packet.packet_name} #{@item_name}")
262
257
  end
263
258
  end # def process_packet
264
259
 
@@ -191,8 +191,11 @@ module Cosmos
191
191
  else
192
192
  y_value = packet.read(@y_item_name)
193
193
  end
194
+
194
195
  # Bail on the values if they are NaN or nil as we can't graph them
195
- return if x_value.nan? || y_value.nan? || x_value.nil? || y_value.nil?
196
+ return if x_value.nil? || y_value.nil? ||
197
+ (x_value.respond_to?(:nan?) && x_value.nan?) ||
198
+ (y_value.respond_to?(:nan?) && y_value.nan?)
196
199
 
197
200
  time_value = packet.read(@time_item_name) if @time_item_name
198
201
 
@@ -205,10 +208,7 @@ module Cosmos
205
208
  # Prune Data
206
209
  prune_to_max_points_saved()
207
210
  rescue Exception => error
208
- raise error if error.class == NoMemoryError
209
- reset()
210
- @error = error
211
- @plot.redraw_needed = true
211
+ handle_process_exception(error, "#{packet.target_name} #{packet.packet_name} #{@x_item_name} or #{@y_item_name}")
212
212
  end
213
213
  end # def process_packet
214
214
 
@@ -235,7 +235,7 @@ module Cosmos
235
235
  if real_lines > 0
236
236
  Logger.error output
237
237
  self.write_unexpected_file(output)
238
- if defined? Qt and Qt::Application.instance
238
+ if defined? ::Qt and ::Qt::Application.instance
239
239
  Qt.execute_in_main_thread(false) do
240
240
  dialog = Qt::Dialog.new do |box|
241
241
  box.setWindowTitle('Unexpected text output')
@@ -1,12 +1,12 @@
1
1
  # encoding: ascii-8bit
2
2
 
3
- COSMOS_VERSION = '3.1.1'
3
+ COSMOS_VERSION = '3.1.2'
4
4
  module Cosmos
5
5
  module Version
6
6
  MAJOR = '3'
7
7
  MINOR = '1'
8
- PATCH = '1'
9
- BUILD = 'b48940656c271344ab5d18c7d2361bcb046a9fd4'
8
+ PATCH = '2'
9
+ BUILD = '5864bf4376d74014c01d625e46b5aefc843908ba'
10
10
  end
11
- VERSION = '3.1.1'
11
+ VERSION = '3.1.2'
12
12
  end
@@ -1,32 +1,34 @@
1
- ruby autohotkey\tools\CmdExtractorAHK --defaultsize
2
- ruby autohotkey\tools\CmdSenderAHK -w 650 -t 650
3
- ruby autohotkey\tools\CmdTlmServerAHK -x 50 -y 50 -w 900 -t 1000
4
- ruby autohotkey\tools\CmdTlmServerAHK2 -w 900 -t 1000 -p -n -c cmd_tlm_server.txt
5
- ruby autohotkey\tools\DataViewerAHK -w 600 -t 800
6
- ruby autohotkey\tools\HandbookCreatorAHK
7
- ruby autohotkey\tools\LauncherAHK
8
- ruby autohotkey\tools\LimitsMonitorAHK
9
- ruby autohotkey\tools\OpenGLBuilderAHK -w 600 -t 600
10
- ruby autohotkey\tools\PacketViewerAHK -w 600 -t 800
11
- ruby autohotkey\tools\PacketViewerAHK2 --defaultsize -p "INST ADCS"
12
- ruby autohotkey\tools\ReplayAHK
13
- ruby autohotkey\tools\ScriptRunnerAHK -w 600 -t 800
14
- ruby autohotkey\tools\ScriptRunnerAHK2 -w 600 -t 800
15
- ruby autohotkey\tools\TableManagerAHK -w 800 -t 800
16
- ruby autohotkey\tools\TestRunnerAHK -w 800 -t 800
17
- ruby autohotkey\tools\TestRunnerAHK2 -w 800 -t 800 -c test_runner2.txt
18
- ruby autohotkey\tools\TestRunnerAHK3 -w 800 -t 800 -c test_runner3.txt
19
- ruby autohotkey\tools\TestRunnerAHK4 -w 800 -t 800 -c test_runner4.txt
20
- ruby autohotkey\tools\TlmGrapherAHK -w 800 -t 800
21
- ruby autohotkey\tools\TlmGrapherAHK2 -s -c test2.txt -w 1200 -t 800
22
- ruby autohotkey\tools\TlmGrapherAHK3 -i 'INST HEALTH_STATUS TEMP1'
23
- ruby autohotkey\tools\TlmGrapherAHK4 -s -c bad.txt
24
- ruby autohotkey\tools\TlmExtractorAHK -w 800 -t 800
25
- ruby autohotkey\tools\TlmExtractorAHK2 -c tlm_extractor2.txt -i tlm.bin
26
- ruby autohotkey\tools\TlmExtractorAHK3 -c tlm_extractor2.txt -i tlm.bin -o outputs/logs/tlm.txt
27
- ruby autohotkey\tools\TlmViewerAHK
28
- ruby autohotkey\tools\TlmViewerAHK2 -c tlm_viewer2.txt
29
- ruby autohotkey\tools\TlmViewerAHK3 -s "BLAH" -c tlm_viewer3.txt
30
- ruby autohotkey\tools\TlmViewerAHK4 -c tlm_viewer3.txt
31
- ruby autohotkey\tools\TlmViewerAHK5 -n -s "INST ADCS"
1
+ call bundle exec ruby autohotkey\tools\CmdExtractorAHK --defaultsize
2
+ call bundle exec ruby autohotkey\tools\CmdSenderAHK -w 650 -t 650
3
+ call bundle exec ruby autohotkey\tools\CmdTlmServerAHK -x 50 -y 50 -w 900 -t 1000
4
+ call bundle exec ruby autohotkey\tools\CmdTlmServerAHK2 -w 900 -t 1000 -p -n -c cmd_tlm_server.txt
5
+ call bundle exec ruby autohotkey\tools\DataViewerAHK -w 600 -t 800
6
+ call bundle exec ruby autohotkey\tools\HandbookCreatorAHK
7
+ call bundle exec ruby autohotkey\tools\LauncherAHK
8
+ call bundle exec ruby autohotkey\tools\LimitsMonitorAHK
9
+ call bundle exec ruby autohotkey\tools\OpenGLBuilderAHK -w 600 -t 600
10
+ call bundle exec ruby autohotkey\tools\PacketViewerAHK -w 600 -t 800
11
+ call bundle exec ruby autohotkey\tools\PacketViewerAHK2 --defaultsize -p "INST ADCS"
12
+ call bundle exec ruby autohotkey\tools\ReplayAHK
13
+ call bundle exec ruby autohotkey\tools\ScriptRunnerAHK -w 600 -t 800
14
+ call bundle exec ruby autohotkey\tools\ScriptRunnerAHK2 -w 600 -t 800
15
+ call bundle exec ruby autohotkey\tools\TableManagerAHK -w 800 -t 800
16
+ call bundle exec ruby autohotkey\tools\TestRunnerAHK -w 800 -t 800
17
+ call bundle exec ruby autohotkey\tools\TestRunnerAHK2 -w 800 -t 800 -c test_runner2.txt
18
+ call bundle exec ruby autohotkey\tools\TestRunnerAHK3 -w 800 -t 800 -c test_runner3.txt
19
+ call bundle exec ruby autohotkey\tools\TestRunnerAHK4 -w 800 -t 800 -c test_runner4.txt
20
+ call bundle exec ruby autohotkey\tools\TlmGrapherAHK -w 800 -t 800
21
+ call bundle exec ruby autohotkey\tools\TlmGrapherAHK2 -s -c test2.txt -w 1200 -t 800
22
+ call bundle exec ruby autohotkey\tools\TlmGrapherAHK3 -i 'INST HEALTH_STATUS TEMP1'
23
+ call bundle exec ruby autohotkey\tools\TlmGrapherAHK4 -s -c bad.txt
24
+ call bundle exec ruby autohotkey\tools\TlmExtractorAHK -w 800 -t 800
25
+ call bundle exec ruby autohotkey\tools\TlmExtractorAHK2 -c tlm_extractor2.txt -i tlm.bin
26
+ call bundle exec ruby autohotkey\tools\TlmExtractorAHK3 -c tlm_extractor2.txt -i tlm.bin -o outputs/logs/tlm.txt
27
+ call bundle exec ruby autohotkey\tools\TlmViewerAHK
28
+ call bundle exec ruby autohotkey\tools\TlmViewerAHK2 -c tlm_viewer2.txt
29
+ call bundle exec ruby autohotkey\tools\TlmViewerAHK3 -s "BLAH" -c tlm_viewer3.txt
30
+ call bundle exec ruby autohotkey\tools\TlmViewerAHK4 -c tlm_viewer3.txt
31
+ call bundle exec ruby autohotkey\tools\TlmViewerAHK5 -n -s "INST ADCS"
32
32
 
33
+ REM Display any exception files that were generated
34
+ dir autohotkey\outputs\logs\*exception.txt
@@ -135,6 +135,50 @@ describe Time do
135
135
  end
136
136
  end
137
137
 
138
+ describe "Time.julian2mdy" do
139
+ it "should return the YMD from a Julian date" do
140
+ # Result generated from aa.usno.navy.mil/data/docs/JulianDate.php
141
+ # Ignore the seconds value
142
+ Time.julian2mdy(2457024.627836)[0..-2].should eql [2015,1,2,3,4,5]
143
+ # Ignore the seconds value
144
+ Time.julian2mdy(2369916.021181)[0..-2].should eql [1776,7,4,12,30,30]
145
+ end
146
+ end
147
+
148
+ describe "Time.ccsds2mdy and Time.mdy2ccsds" do
149
+ it "should convert YMD to and from CCSDS" do
150
+ Time.ccsds2mdy(0, 1000, 2).should eql [1958,1,1,0,0,1,2]
151
+ ccsds_day, ccsds_ms, ccsds_us = Time.mdy2ccsds(2015,1,2,3,4,5,6)
152
+ Time.ccsds2mdy(ccsds_day, ccsds_ms, ccsds_us).should eql [2015,1,2,3,4,5,6]
153
+ end
154
+ end
155
+
156
+ describe "Time.ccsds2julian and Time.julian2ccsds" do
157
+ it "should convert CCSDS to and from Julian" do
158
+ Time.ccsds2julian(0, 1000, 2).should be_within(0.00001).of(2436204.500012)
159
+ time = Time.now
160
+ ccsds_day, ccsds_ms, ccsds_us = Time.mdy2ccsds(2015,1,2,3,4,5,100)
161
+ julian = Time.ccsds2julian(ccsds_day, ccsds_ms, ccsds_us)
162
+ parts = Time.julian2ccsds(julian)
163
+ parts[0].should eql ccsds_day
164
+ parts[1].should eql ccsds_ms
165
+ parts[2].should be_within(50).of(ccsds_us)
166
+ end
167
+ end
168
+
169
+ describe "Time.ccsds2sec and Time.sec2ccsds" do
170
+ it "should convert seconds to and from CCSDS" do
171
+ Time.ccsds2sec(0, 1000, 2).should be_within(0.00001).of(1)
172
+ time = Time.now
173
+ ccsds_day, ccsds_ms, ccsds_us = Time.mdy2ccsds(2015,1,2,3,4,5,100)
174
+ seconds = Time.ccsds2sec(ccsds_day, ccsds_ms, ccsds_us)
175
+ parts = Time.sec2ccsds(seconds)
176
+ parts[0].should eql ccsds_day
177
+ parts[1].should eql ccsds_ms
178
+ parts[2].should be_within(50).of(ccsds_us)
179
+ end
180
+ end
181
+
138
182
  describe "Time.yds2mdy" do
139
183
  it "should convert year, day, seconds" do
140
184
  Time.yds2mdy(2020, 1, 1.5).should eql [2020,1,1,0,0,1,500000]
@@ -148,4 +192,11 @@ describe Time do
148
192
  Time.yds2julian(2000,1,12*60*60).should eql Time::JULIAN_DATE_OF_J2000_EPOCH
149
193
  end
150
194
  end
195
+
196
+ describe "Time.unix_epoch_delta" do
197
+ it "should return a delta to the unix epoch" do
198
+ Time.init_epoch_delta("1970/01/01 00:00:00").should eql 0
199
+ Time.init_epoch_delta("1969/12/31 12:00:00").should eql 60*60*12
200
+ end
201
+ end
151
202
  end
@@ -308,6 +308,23 @@ module Cosmos
308
308
  end
309
309
  end
310
310
 
311
+ describe "get_overall_limits_state" do
312
+ it "should get the overall limits state of the system" do
313
+ get_overall_limits_state.should eql :RED
314
+ end
315
+
316
+ it "should ignore specified items" do
317
+ ignore = []
318
+ ignore << %w(INST HEALTH_STATUS TEMP1)
319
+ ignore << %w(INST HEALTH_STATUS TEMP2)
320
+ ignore << %w(INST HEALTH_STATUS TEMP3)
321
+ ignore << %w(INST HEALTH_STATUS TEMP4)
322
+ ignore << %w(INST HEALTH_STATUS GROUND1STATUS)
323
+ ignore << %w(INST HEALTH_STATUS GROUND2STATUS)
324
+ get_overall_limits_state(ignore).should eql :STALE
325
+ end
326
+ end
327
+
311
328
  describe "limits_enabled?, disable_limits, enable_limits" do
312
329
  it "should enable, disable, and check limits for an item" do
313
330
  limits_enabled?("INST HEALTH_STATUS TEMP1").should be_truthy
@@ -375,6 +392,14 @@ module Cosmos
375
392
  result[0].should eql :LIMITS_SETTINGS
376
393
  unsubscribe_limits_events(id)
377
394
  end
395
+
396
+ it "should handle unknown limits events" do
397
+ id = subscribe_limits_events
398
+ CmdTlmServer.instance.post_limits_event(:UNKNOWN, "This is a test")
399
+ result = get_limits_event(id, true)
400
+ result[0].should eql :UNKNOWN
401
+ unsubscribe_limits_events(id)
402
+ end
378
403
  end
379
404
 
380
405
  describe "subscribe_packet_data, get_packet, unsubscribe_packet_data" do
@@ -394,6 +419,18 @@ module Cosmos
394
419
  end
395
420
  end
396
421
 
422
+ describe "play_wav_file" do
423
+ it "should play a wav file if Qt is available" do
424
+ module Qt
425
+ def self.execute_in_main_thread(bool); yield; end
426
+ class CoreApplication; def self.instance; true; end; end;
427
+ class Sound; def self.isAvailable; true; end; end
428
+ end
429
+ expect(Qt::Sound).to receive(:play).with("sound.wav")
430
+ play_wav_file("sound.wav")
431
+ end
432
+ end
433
+
397
434
  describe "status_bar" do
398
435
  it "should set the ScriptRunner status bar" do
399
436
  class ScriptRunner; end
@@ -649,6 +686,65 @@ module Cosmos
649
686
  end
650
687
  end
651
688
 
689
+ describe "display" do
690
+ it "should display a telemetry viewer screen" do
691
+ expect { display("HI") }.to raise_error(RuntimeError, /HI could not be displayed/)
692
+ end
693
+ end
694
+ describe "clear" do
695
+ it "should close a telemetry viewer screen" do
696
+ expect { clear("HI") }.to raise_error(RuntimeError, /HI could not be cleared/)
697
+ end
698
+ end
699
+
700
+ describe "ScriptRunnerFrame methods" do
701
+ it "should call various ScriptRunnerFrame methods" do
702
+ class Dummy; def method_missing(meth, *args, &block); end; end
703
+ class ScriptRunnerFrame
704
+ def self.method_missing(meth, *args, &block); end
705
+ def self.instance; Dummy.new; end
706
+ end
707
+ set_line_delay(1.0)
708
+ get_line_delay
709
+ get_scriptrunner_message_log_filename
710
+ start_new_scriptrunner_message_log
711
+ insert_return
712
+ step_mode
713
+ run_mode
714
+ show_backtrace
715
+ end
716
+ end
717
+
718
+ describe "start" do
719
+ it "should start a script locally" do
720
+ class ScriptRunnerFrame; def self.instance; false; end; end
721
+ start("cosmos.rb")
722
+ end
723
+
724
+ it "should start a script without the .rb extension" do
725
+ class ScriptRunnerFrame; def self.instance; false; end; end
726
+ start("cosmos")
727
+ end
728
+
729
+ it "should raise an error if the script can't be found" do
730
+ class ScriptRunnerFrame; def self.instance; false; end; end
731
+ expect { start("unknown_script.rb") }.to raise_error(RuntimeError)
732
+ end
733
+
734
+ it "should start a script within ScriptRunnerFrame" do
735
+ class ScriptRunnerFrame
736
+ @@instrumented_cache = {}
737
+ def self.instance; true; end
738
+ def self.instrumented_cache; @@instrumented_cache; end
739
+ def self.instrumented_cache=(value); @@instrumented_cache = value; end
740
+ def self.instrument_script(file_text, path, bool); "#"; end
741
+ end
742
+ start("cosmos.rb")
743
+ # This one should use the cached version
744
+ start("cosmos.rb")
745
+ end
746
+ end
747
+
652
748
  end
653
749
  end
654
750
 
@@ -48,12 +48,40 @@ module Cosmos
48
48
  # Set the target_name to nil to make it "unidentified"
49
49
  pkt.target_name = nil
50
50
 
51
+ count = System.targets['COSMOS'].cmd_cnt
51
52
  cmd.send_command_to_target('COSMOS', pkt)
52
53
  # Verify the COSMOS STARTLOGGING packet has been updated
53
54
  System.commands.packet("COSMOS","STARTLOGGING").buffer.should eql pkt.buffer
55
+ # Verify the target count didn't get updated
56
+ expect(System.targets['COSMOS'].cmd_cnt).to eq count
57
+ # Restore target name
58
+ pkt.target_name = 'COSMOS'
54
59
  tf.unlink
55
60
  end
56
61
 
62
+ it "should send already identified commands" do
63
+ tf = Tempfile.new('unittest')
64
+ tf.puts 'INTERFACE MY_INT interface.rb'
65
+ tf.close
66
+ config = CmdTlmServerConfig.new(tf.path)
67
+ cmd = Commanding.new(config)
68
+ interfaces = Interfaces.new(config)
69
+ interfaces.map_target("COSMOS","MY_INT")
70
+ expect(interfaces.all["MY_INT"]).to receive(:write)
71
+ expect(interfaces.all["MY_INT"].packet_log_writer_pairs[0].cmd_log_writer).to receive(:write)
72
+
73
+ # Grab an existing packet
74
+ pkt = System.commands.packet('COSMOS','STARTLOGGING')
75
+
76
+ count = System.targets['COSMOS'].cmd_cnt
77
+ cmd.send_command_to_target('COSMOS', pkt)
78
+ # Verify the COSMOS STARTLOGGING packet has been updated
79
+ System.commands.packet("COSMOS","STARTLOGGING").buffer.should eql pkt.buffer
80
+ expect(System.targets['COSMOS'].cmd_cnt).to eq count + 1
81
+ tf.unlink
82
+ end
83
+
84
+
57
85
  it "should log unknown commands" do
58
86
  Logger.level = Logger::DEBUG
59
87
  stdout = StringIO.new('', 'r+')
@@ -142,6 +142,94 @@ module Cosmos
142
142
  tf.unlink
143
143
  end
144
144
  end
145
+
146
+ describe "start_raw_logging" do
147
+ it "should start raw logging on all connections by default" do
148
+ tf = Tempfile.new('unittest')
149
+ tf.puts 'INTERFACE INTERFACE1 interface.rb'
150
+ tf.puts 'INTERFACE INTERFACE2 interface.rb'
151
+ tf.puts 'INTERFACE INTERFACE3 interface.rb'
152
+ tf.close
153
+ interfaces = Connections.new(:INTERFACES, CmdTlmServerConfig.new(tf.path))
154
+ expect(interfaces.all['INTERFACE1']).to receive(:start_raw_logging)
155
+ expect(interfaces.all['INTERFACE2']).to receive(:start_raw_logging)
156
+ expect(interfaces.all['INTERFACE3']).to receive(:start_raw_logging)
157
+ interfaces.start_raw_logging
158
+ tf.unlink
159
+ end
160
+
161
+ it "should start raw logging on a specified connections by name" do
162
+ tf = Tempfile.new('unittest')
163
+ tf.puts 'INTERFACE INTERFACE1 interface.rb'
164
+ tf.puts 'INTERFACE INTERFACE2 interface.rb'
165
+ tf.puts 'INTERFACE INTERFACE3 interface.rb'
166
+ tf.close
167
+ interfaces = Connections.new(:INTERFACES, CmdTlmServerConfig.new(tf.path))
168
+ expect(interfaces.all['INTERFACE1']).to_not receive(:start_raw_logging)
169
+ expect(interfaces.all['INTERFACE2']).to receive(:start_raw_logging)
170
+ expect(interfaces.all['INTERFACE3']).to_not receive(:start_raw_logging)
171
+ interfaces.start_raw_logging('INTERFACE2')
172
+ tf.unlink
173
+ end
174
+
175
+ it "should raise on an unknown connection" do
176
+ tf = Tempfile.new('unittest')
177
+ tf.puts 'INTERFACE INTERFACE1 interface.rb'
178
+ tf.puts 'INTERFACE INTERFACE2 interface.rb'
179
+ tf.puts 'INTERFACE INTERFACE3 interface.rb'
180
+ tf.close
181
+ interfaces = Connections.new(:INTERFACES, CmdTlmServerConfig.new(tf.path))
182
+ expect(interfaces.all['INTERFACE1']).to_not receive(:start_raw_logging)
183
+ expect(interfaces.all['INTERFACE2']).to_not receive(:start_raw_logging)
184
+ expect(interfaces.all['INTERFACE3']).to_not receive(:start_raw_logging)
185
+ expect { interfaces.start_raw_logging('BLAH') }.to raise_error(/Unknown/)
186
+ tf.unlink
187
+ end
188
+ end
189
+
190
+ describe "stop_raw_logging" do
191
+ it "should stop raw logging on all connections by default" do
192
+ tf = Tempfile.new('unittest')
193
+ tf.puts 'INTERFACE INTERFACE1 interface.rb'
194
+ tf.puts 'INTERFACE INTERFACE2 interface.rb'
195
+ tf.puts 'INTERFACE INTERFACE3 interface.rb'
196
+ tf.close
197
+ interfaces = Connections.new(:INTERFACES, CmdTlmServerConfig.new(tf.path))
198
+ expect(interfaces.all['INTERFACE1']).to receive(:stop_raw_logging)
199
+ expect(interfaces.all['INTERFACE2']).to receive(:stop_raw_logging)
200
+ expect(interfaces.all['INTERFACE3']).to receive(:stop_raw_logging)
201
+ interfaces.stop_raw_logging
202
+ tf.unlink
203
+ end
204
+
205
+ it "should stop raw logging on a specified connections by name" do
206
+ tf = Tempfile.new('unittest')
207
+ tf.puts 'INTERFACE INTERFACE1 interface.rb'
208
+ tf.puts 'INTERFACE INTERFACE2 interface.rb'
209
+ tf.puts 'INTERFACE INTERFACE3 interface.rb'
210
+ tf.close
211
+ interfaces = Connections.new(:INTERFACES, CmdTlmServerConfig.new(tf.path))
212
+ expect(interfaces.all['INTERFACE1']).to_not receive(:stop_raw_logging)
213
+ expect(interfaces.all['INTERFACE2']).to receive(:stop_raw_logging)
214
+ expect(interfaces.all['INTERFACE3']).to_not receive(:stop_raw_logging)
215
+ interfaces.stop_raw_logging('INTERFACE2')
216
+ tf.unlink
217
+ end
218
+
219
+ it "should raise on an unknown connection" do
220
+ tf = Tempfile.new('unittest')
221
+ tf.puts 'INTERFACE INTERFACE1 interface.rb'
222
+ tf.puts 'INTERFACE INTERFACE2 interface.rb'
223
+ tf.puts 'INTERFACE INTERFACE3 interface.rb'
224
+ tf.close
225
+ interfaces = Connections.new(:INTERFACES, CmdTlmServerConfig.new(tf.path))
226
+ expect(interfaces.all['INTERFACE1']).to_not receive(:stop_raw_logging)
227
+ expect(interfaces.all['INTERFACE2']).to_not receive(:stop_raw_logging)
228
+ expect(interfaces.all['INTERFACE3']).to_not receive(:stop_raw_logging)
229
+ expect { interfaces.stop_raw_logging('BLAH') }.to raise_error(/Unknown/)
230
+ tf.unlink
231
+ end
232
+ end
145
233
  end
146
234
  end
147
235