cosmos 4.4.0-java → 4.5.1-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (202) hide show
  1. checksums.yaml +4 -4
  2. data/.dockerignore +2 -0
  3. data/.gitignore +1 -0
  4. data/.travis.yml +6 -6
  5. data/Dockerfile +70 -0
  6. data/Manifest.txt +37 -2
  7. data/README.md +9 -0
  8. data/Rakefile +55 -5
  9. data/appveyor.yml +18 -8
  10. data/autohotkey/config/tools/cmd_sequence/cmd_sequence.txt +2 -0
  11. data/autohotkey/lib/cmd_sequence_exporter.rb +52 -0
  12. data/autohotkey/procedures/collect.rb +2 -2
  13. data/autohotkey/procedures/collect_util.rb +1 -1
  14. data/autohotkey/procedures/script_test.rb +1 -1
  15. data/autohotkey/tools/CmdSenderAHK2 +18 -0
  16. data/autohotkey/tools/cmd_extractor.ahk +11 -9
  17. data/autohotkey/tools/cmd_sender.ahk +35 -7
  18. data/autohotkey/tools/cmd_sender2.ahk +4 -0
  19. data/autohotkey/tools/cmd_sequence.ahk +22 -9
  20. data/autohotkey/tools/config_editor.ahk +4 -4
  21. data/autohotkey/tools/data_viewer.ahk +1 -1
  22. data/autohotkey/tools/limits_monitor.ahk +1 -1
  23. data/autohotkey/tools/packet_viewer.ahk +1 -1
  24. data/autohotkey/tools/script_runner.ahk +1 -1
  25. data/autohotkey/tools/test_runner2.ahk +1 -1
  26. data/autohotkey/tools/tlm_grapher.ahk +1 -1
  27. data/autohotkey/tools/tlm_grapher3.ahk +1 -1
  28. data/autohotkey/tools/tlm_viewer.ahk +1 -1
  29. data/autohotkey/tools/tlm_viewer2.ahk +1 -1
  30. data/autohotkey/tools/tlm_viewer5.ahk +1 -1
  31. data/bin/cstol_converter +1 -1
  32. data/bin/rubysloc +73 -28
  33. data/bin/xtce_converter +1 -1
  34. data/cosmos.gemspec +2 -2
  35. data/data/config/command_modifiers.yaml +16 -1
  36. data/data/config/interface_modifiers.yaml +3 -2
  37. data/data/config/param_item_modifiers.yaml +5 -0
  38. data/data/config/system.yaml +110 -23
  39. data/data/config/telemetry_modifiers.yaml +16 -1
  40. data/data/crc.txt +416 -411
  41. data/demo/Rakefile +4 -4
  42. data/demo/config/dart/Gemfile +1 -6
  43. data/demo/config/data/crc.txt +233 -232
  44. data/demo/config/system/system.txt +17 -6
  45. data/demo/config/system/system2.txt +17 -6
  46. data/demo/config/system/system_alt_ports.txt +17 -6
  47. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +4 -4
  48. data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +4 -0
  49. data/demo/config/targets/INST/cmd_tlm/inst_tlm_override.txt +12 -0
  50. data/demo/config/targets/INST/lib/sim_inst.rb +2 -2
  51. data/demo/config/targets/INST/target.txt +1 -0
  52. data/demo/config/tools/handbook_creator/default_toc.xsl +59 -59
  53. data/demo/procedures/cosmos_api_test.rb +8 -8
  54. data/ext/cosmos/ext/buffered_file/buffered_file.c +2 -2
  55. data/ext/cosmos/ext/config_parser/config_parser.c +1 -2
  56. data/ext/cosmos/ext/line_graph/line_graph.c +53 -94
  57. data/ext/cosmos/ext/platform/platform.c +56 -21
  58. data/ext/cosmos/ext/polynomial_conversion/polynomial_conversion.c +4 -8
  59. data/ext/cosmos/ext/structure/structure.c +12 -0
  60. data/extensions/vscode/.gitignore +4 -0
  61. data/extensions/vscode/.vscode/launch.json +32 -0
  62. data/extensions/vscode/.vscode/settings.json +13 -0
  63. data/extensions/vscode/.vscode/tasks.json +79 -0
  64. data/extensions/vscode/License.txt +879 -0
  65. data/extensions/vscode/README.md +9 -0
  66. data/extensions/vscode/client/License.txt +879 -0
  67. data/extensions/vscode/client/README.md +39 -0
  68. data/extensions/vscode/client/cosmos.configuration.json +23 -0
  69. data/extensions/vscode/client/images/icon.png +0 -0
  70. data/extensions/vscode/client/package-lock.json +414 -0
  71. data/extensions/vscode/client/package.json +105 -0
  72. data/extensions/vscode/client/src/extension.ts +132 -0
  73. data/extensions/vscode/client/src/screen_preview.rb +25 -0
  74. data/extensions/vscode/client/syntaxes/cosmos.tmLanguage.json +219 -0
  75. data/extensions/vscode/client/tsconfig.json +17 -0
  76. data/extensions/vscode/package-lock.json +26 -0
  77. data/extensions/vscode/package.json +35 -0
  78. data/extensions/vscode/server/License.txt +879 -0
  79. data/extensions/vscode/server/package-lock.json +236 -0
  80. data/extensions/vscode/server/package.json +29 -0
  81. data/extensions/vscode/server/src/server.ts +59 -0
  82. data/extensions/vscode/server/tsconfig.json +16 -0
  83. data/install/Rakefile +4 -4
  84. data/install/config/dart/Gemfile +2 -7
  85. data/install/config/data/crc.txt +137 -137
  86. data/install/config/system/system.txt +17 -6
  87. data/install/config/tools/handbook_creator/default_toc.xsl +59 -59
  88. data/lib/cosmos/config/config_parser.rb +2 -10
  89. data/lib/cosmos/core_ext/class.rb +10 -0
  90. data/lib/cosmos/core_ext/time.rb +5 -3
  91. data/lib/cosmos/dart/config/boot.rb +1 -1
  92. data/lib/cosmos/dart/config/database.yml +2 -0
  93. data/lib/cosmos/dart/examples/dart_decom_client.rb +1 -1
  94. data/lib/cosmos/dart/lib/dart_common.rb +12 -5
  95. data/lib/cosmos/dart/lib/dart_constants.rb +15 -0
  96. data/lib/cosmos/dart/lib/dart_decom_query.rb +5 -6
  97. data/lib/cosmos/dart/lib/dart_decommutator.rb +64 -54
  98. data/lib/cosmos/dart/lib/dart_master_query.rb +71 -0
  99. data/lib/cosmos/dart/lib/dart_reducer_worker_thread.rb +165 -134
  100. data/lib/cosmos/dart/processes/dart.rb +4 -2
  101. data/lib/cosmos/dart/processes/dart_decom_server.rb +3 -3
  102. data/lib/cosmos/dart/processes/dart_ingester.rb +38 -1
  103. data/lib/cosmos/dart/processes/dart_master.rb +44 -0
  104. data/lib/cosmos/dart/processes/dart_util.rb +115 -0
  105. data/lib/cosmos/dart/spec/dart/dart_database_cleaner_spec.rb +2 -2
  106. data/lib/cosmos/gui/qt.rb +10 -10
  107. data/lib/cosmos/gui/qt_tool.rb +17 -12
  108. data/lib/cosmos/gui/text/completion_text_edit.rb +2 -0
  109. data/lib/cosmos/gui/widgets/dart_meta_frame.rb +22 -3
  110. data/lib/cosmos/interfaces/dart_status_interface.rb +1 -1
  111. data/lib/cosmos/interfaces/linc_interface.rb +3 -3
  112. data/lib/cosmos/interfaces/protocols/burst_protocol.rb +1 -1
  113. data/lib/cosmos/interfaces/protocols/crc_protocol.rb +1 -1
  114. data/lib/cosmos/interfaces/protocols/length_protocol.rb +5 -0
  115. data/lib/cosmos/interfaces/protocols/template_protocol.rb +3 -3
  116. data/lib/cosmos/interfaces/serial_interface.rb +7 -1
  117. data/lib/cosmos/interfaces/stream_interface.rb +1 -1
  118. data/lib/cosmos/interfaces/tcpip_server_interface.rb +16 -16
  119. data/lib/cosmos/io/io_multiplexer.rb +6 -2
  120. data/lib/cosmos/io/json_drb.rb +5 -5
  121. data/lib/cosmos/io/json_drb_object.rb +7 -2
  122. data/lib/cosmos/io/json_drb_rack.rb +25 -5
  123. data/lib/cosmos/io/json_rpc.rb +1 -1
  124. data/lib/cosmos/io/posix_serial_driver.rb +60 -22
  125. data/lib/cosmos/io/serial_driver.rb +11 -8
  126. data/lib/cosmos/io/win32_serial_driver.rb +31 -3
  127. data/lib/cosmos/packet_logs/packet_log_reader.rb +2 -2
  128. data/lib/cosmos/packets/packet.rb +9 -9
  129. data/lib/cosmos/packets/packet_config.rb +27 -9
  130. data/lib/cosmos/packets/parsers/xtce_converter.rb +10 -10
  131. data/lib/cosmos/packets/parsers/xtce_parser.rb +3 -0
  132. data/lib/cosmos/packets/structure.rb +35 -5
  133. data/lib/cosmos/packets/structure_item.rb +5 -1
  134. data/lib/cosmos/packets/telemetry.rb +7 -1
  135. data/lib/cosmos/script/api_shared.rb +18 -1
  136. data/lib/cosmos/script/extract.rb +1 -1
  137. data/lib/cosmos/script/script.rb +4 -11
  138. data/lib/cosmos/streams/serial_stream.rb +11 -6
  139. data/lib/cosmos/system/system.rb +155 -57
  140. data/lib/cosmos/tools/cmd_sender/cmd_param_table_item_delegate.rb +15 -0
  141. data/lib/cosmos/tools/cmd_sender/cmd_params.rb +382 -0
  142. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +29 -318
  143. data/lib/cosmos/tools/cmd_sequence/cmd_sequence.rb +14 -17
  144. data/lib/cosmos/tools/cmd_sequence/sequence_item.rb +38 -331
  145. data/lib/cosmos/tools/cmd_sequence/sequence_list.rb +16 -11
  146. data/lib/cosmos/tools/cmd_tlm_server/api.rb +10 -8
  147. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +2 -2
  148. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +1 -0
  149. data/lib/cosmos/tools/cmd_tlm_server/gui/logging_tab.rb +1 -1
  150. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +29 -26
  151. data/lib/cosmos/tools/cmd_tlm_server/limits_groups_background_task.rb +1 -1
  152. data/lib/cosmos/tools/cmd_tlm_server/router_thread.rb +5 -0
  153. data/lib/cosmos/tools/config_editor/config_editor.rb +34 -3
  154. data/lib/cosmos/tools/config_editor/config_editor_frame.rb +8 -9
  155. data/lib/cosmos/tools/config_editor/system_config_dialog.rb +158 -0
  156. data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +1 -1
  157. data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +1 -1
  158. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +7 -4
  159. data/lib/cosmos/tools/test_runner/test.rb +6 -3
  160. data/lib/cosmos/tools/test_runner/test_runner.rb +6 -6
  161. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +3 -3
  162. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +1 -4
  163. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +20 -16
  164. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_dart_thread.rb +21 -17
  165. data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +18 -11
  166. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +17 -6
  167. data/lib/cosmos/tools/tlm_viewer/widgets/canvasdot_widget.rb +2 -0
  168. data/lib/cosmos/top_level.rb +1 -1
  169. data/lib/cosmos/utilities/ruby_lex_utils.rb +34 -30
  170. data/lib/cosmos/utilities/simulated_target.rb +1 -1
  171. data/lib/cosmos/version.rb +5 -5
  172. data/lib/cosmos/win32/excel.rb +23 -17
  173. data/run_gui_tests.bat +1 -0
  174. data/spec/core_ext/class_spec.rb +54 -0
  175. data/spec/core_ext/socket_spec.rb +1 -1
  176. data/spec/core_ext/time_spec.rb +4 -0
  177. data/spec/install/yaml_docs_spec.rb +26 -6
  178. data/spec/interfaces/linc_interface_spec.rb +1 -1
  179. data/spec/interfaces/protocols/length_protocol_spec.rb +39 -0
  180. data/spec/interfaces/serial_interface_spec.rb +1 -5
  181. data/spec/io/json_drb_rack_spec.rb +166 -0
  182. data/spec/io/json_drb_spec.rb +14 -0
  183. data/spec/io/json_rpc_spec.rb +4 -5
  184. data/spec/io/posix_serial_driver_spec.rb +81 -0
  185. data/spec/io/win32_serial_driver_spec.rb +33 -3
  186. data/spec/packet_logs/packet_log_reader_spec.rb +36 -37
  187. data/spec/packets/structure_spec.rb +52 -2
  188. data/spec/packets/telemetry_spec.rb +29 -1
  189. data/spec/script/extract_spec.rb +4 -1
  190. data/spec/system/system_spec.rb +111 -3
  191. data/spec/tools/cmd_tlm_server/api_spec.rb +12 -12
  192. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +2 -2
  193. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +4 -3
  194. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +2 -3
  195. data/spec/utilities/logger_spec.rb +3 -3
  196. data/spec/utilities/message_log_spec.rb +6 -3
  197. data/tasks/gemfile_stats.rake +22 -13
  198. data/test/performance/Rakefile +4 -4
  199. data/test/performance/config/data/crc.txt +67 -48
  200. metadata +44 -9
  201. data/demo/outputs/dart/logs/README.txt +0 -1
  202. data/lib/cosmos/dart/Gemfile +0 -69
@@ -73,17 +73,24 @@ module Cosmos
73
73
  target_name.upcase!
74
74
  packet_name.upcase!
75
75
  item_name.upcase!
76
- # Check to see if the item name is followed by an array index,
77
- # notated by square brackets around an integer; i.e. ARRAY_ITEM[1]
78
- if (item_name =~ /\[\d+\]$/)
79
- # We found an array index.
80
- # The $` special variable is the string before the regex match, i.e. ARRAY_ITEM
81
- item_name = $`
82
- # The $& special variable is the string matched by the regex, i.e. [1].
83
- # Strip off the brackets and then convert the array index to an integer.
84
- item_array_index = $&.gsub(/[\[\]]/, "").to_i
85
- else
86
- item_array_index = nil
76
+
77
+ item_array_index = nil
78
+ begin
79
+ # See if we can access the item
80
+ _, item = System.telemetry.packet_and_item(target_name, packet_name, item_name)
81
+ rescue => error
82
+ # Check to see if the item name is followed by an array index,
83
+ # notated by square brackets around an integer; i.e. ARRAY_ITEM[1]
84
+ if (item_name =~ /\[\d+\]$/)
85
+ # The $` special variable is the string before the regex match, i.e. ARRAY_ITEM
86
+ item_name = $`
87
+ # The $& special variable is the string matched by the regex, i.e. [1].
88
+ # Strip off the brackets and then convert the array index to an integer.
89
+ item_array_index = $&.gsub(/[\[\]]/, "").to_i
90
+ else
91
+ # If we couldn't access the item and it's not bracket notation then it's an error
92
+ raise error
93
+ end
87
94
  end
88
95
  # Default configuration has one plot so don't add plot for first item
89
96
  data_object = HousekeepingDataObject.new
@@ -53,6 +53,12 @@ module Cosmos
53
53
  @@instance = nil
54
54
 
55
55
  def self.instance
56
+ unless @@instance
57
+ _, options = create_default_options()
58
+ options.listen = false
59
+ options.show_main = false
60
+ TlmViewer.new(options)
61
+ end
56
62
  @@instance
57
63
  end
58
64
 
@@ -118,12 +124,14 @@ module Cosmos
118
124
 
119
125
  Splash.execute(self) do |splash|
120
126
  ConfigParser.splash = splash
121
- splash.message = "Displaying requested screens"
127
+ if options.show_main
128
+ splash.message = "Displaying requested screens"
122
129
 
123
- # Startup desired screens once we're running
124
- @tlm_viewer_config.screen_infos.each do |screen_full_name, screen_info|
125
- if screen_info.show_on_startup
126
- display(screen_full_name, screen_info.x_pos, screen_info.y_pos)
130
+ # Startup desired screens once we're running
131
+ @tlm_viewer_config.screen_infos.each do |screen_full_name, screen_info|
132
+ if screen_info.show_on_startup
133
+ display(screen_full_name, screen_info.x_pos, screen_info.y_pos)
134
+ end
127
135
  end
128
136
  end
129
137
 
@@ -138,7 +146,7 @@ module Cosmos
138
146
  'clear_all']
139
147
  @json_drb.method_whitelist = whitelist
140
148
  begin
141
- @json_drb.start_service System.listen_hosts['TLMVIEWER_API'], port, self
149
+ @json_drb.start_service System.listen_hosts['TLMVIEWER_API'], port, self, 1000, System
142
150
  rescue Exception
143
151
  raise FatalError.new("Error starting JsonDRb on port #{port}.\nPerhaps a Telemetry Viewer is already running?")
144
152
  end
@@ -163,6 +171,8 @@ module Cosmos
163
171
 
164
172
  ConfigParser.splash = nil
165
173
  end
174
+
175
+ hide() unless options.show_main
166
176
  end
167
177
 
168
178
  def initialize_actions
@@ -551,6 +561,7 @@ module Cosmos
551
561
  options.title = 'Telemetry Viewer'
552
562
  options.screen = nil
553
563
  options.listen = true
564
+ options.show_main = true
554
565
  options.restore_size = false
555
566
  options.production = false
556
567
  options.replay = false
@@ -61,6 +61,8 @@ module Cosmos
61
61
  end
62
62
 
63
63
  def eval_str(string_to_eval)
64
+ # Fortify: Dynamic Code Evaluation: Code Injection
65
+ # TODO: Not sure how to sanitize this string
64
66
  @screen.instance_eval(string_to_eval)
65
67
  end
66
68
 
@@ -397,7 +397,7 @@ module Cosmos
397
397
  # @param hashing_algorithm [String] Hashing algorithm to use
398
398
  # @return [Digest::<algorithm>] The hashing sum object
399
399
  def self.hash_files(filenames, additional_data = nil, hashing_algorithm = 'MD5')
400
- digest = Digest.const_get(hashing_algorithm).send('new')
400
+ digest = Digest.const_get(hashing_algorithm).public_send('new')
401
401
 
402
402
  Cosmos.set_working_dir do
403
403
  filenames.each do |filename|
@@ -45,41 +45,45 @@ class RubyLex
45
45
  @exception_on_syntax_error = true
46
46
  @prompt = nil
47
47
  end
48
+
49
+ # Monkey patch to keep this from looping forever if the string never is closed with a right brace
50
+ def identify_string_dvar
51
+ begin
52
+ getc
48
53
 
49
- # Monkey patch to fix performance issue caused by call to reverse
50
- def get_readed
51
- if idx = @readed.rindex("\n")
52
- @base_char_no = @readed.size - (idx + 1)
53
- else
54
- @base_char_no += @readed.size
55
- end
54
+ reserve_continue = @continue
55
+ reserve_ltype = @ltype
56
+ reserve_indent = @indent
57
+ reserve_indent_stack = @indent_stack
58
+ reserve_state = @lex_state
59
+ reserve_quoted = @quoted
56
60
 
57
- readed = @readed.join("")
58
- @readed = []
59
- readed
60
- end
61
+ @ltype = nil
62
+ @quoted = nil
63
+ @indent = 0
64
+ @indent_stack = []
65
+ @lex_state = EXPR_BEG
61
66
 
62
- # Monkey patch to fix performance issue caused by call to reverse
63
- def ungetc(c = nil)
64
- if @here_readed.empty?
65
- c2 = @readed.pop
66
- else
67
- c2 = @here_readed.pop
68
- end
69
- c = c2 unless c
70
- @rests.unshift c #c =
71
- @seek -= 1
72
- if c == "\n"
73
- @line_no -= 1
74
- if idx = @readed.rindex("\n")
75
- @char_no = idx + 1
76
- else
77
- @char_no = @base_char_no + @readed.size
67
+ loop do
68
+ @continue = false
69
+ prompt
70
+ tk = token
71
+ break if tk.nil? # This is the patch
72
+ if @ltype or @continue or @indent >= 0
73
+ next
74
+ end
75
+ break if tk.kind_of?(TkRBRACE)
78
76
  end
79
- else
80
- @char_no -= 1
77
+ ensure
78
+ @continue = reserve_continue
79
+ @ltype = reserve_ltype
80
+ @indent = reserve_indent
81
+ @indent_stack = reserve_indent_stack
82
+ @lex_state = reserve_state
83
+ @quoted = reserve_quoted
81
84
  end
82
- end
85
+ end
86
+
83
87
  end
84
88
  $VERBOSE = old_verbose
85
89
 
@@ -37,7 +37,7 @@ module Cosmos
37
37
  @tlm_packets.each do |name, packet|
38
38
  ids = packet.id_items
39
39
  ids.each do |id|
40
- packet.send((id.name + '=').to_sym, id.id_value)
40
+ packet.public_send((id.name + '=').to_sym, id.id_value)
41
41
  end
42
42
  end
43
43
 
@@ -1,12 +1,12 @@
1
1
  # encoding: ascii-8bit
2
2
 
3
- COSMOS_VERSION = '4.4.0'
3
+ COSMOS_VERSION = '4.5.1'
4
4
  module Cosmos
5
5
  module Version
6
6
  MAJOR = '4'
7
- MINOR = '4'
8
- PATCH = '0'
9
- BUILD = '30bd354efce074e6684f2fb4f4df8dc12d2f3df5'
7
+ MINOR = '5'
8
+ PATCH = '1'
9
+ BUILD = 'cb4647f6e93fcfb1dd38500288ecf5e1a6f79c76'
10
10
  end
11
- VERSION = '4.4.0'
11
+ VERSION = '4.5.1'
12
12
  end
@@ -31,8 +31,10 @@ module Cosmos
31
31
 
32
32
  # Build a lookup table based on the first column
33
33
  @lkup = {}
34
- @data.each do |row|
35
- @lkup[row[0]] = row[1..-1]
34
+ if @data
35
+ @data.each do |row|
36
+ @lkup[row[0]] = row[1..-1]
37
+ end
36
38
  end
37
39
  end
38
40
 
@@ -70,23 +72,27 @@ module Cosmos
70
72
  File.chmod(0444, archive) # Mark read-only
71
73
  end
72
74
 
73
- excel = WIN32OLE.new('excel.application')
74
- excel.visible = false
75
- wb = excel.workbooks.open(filename)
75
+ begin
76
+ excel = WIN32OLE.new('excel.application')
77
+ excel.visible = false
78
+ wb = excel.workbooks.open(filename)
76
79
 
77
- @worksheets = []
78
- @lkup = {}
79
- count = wb.worksheets.count
80
- count.times do |index|
81
- ws = wb.worksheets(index + 1)
82
- @worksheets << ExcelWorksheet.new(ws)
83
- @lkup[ws.name] = @worksheets[-1]
80
+ @worksheets = []
81
+ @lkup = {}
82
+ count = wb.worksheets.count
83
+ count.times do |index|
84
+ ws = wb.worksheets(index + 1)
85
+ @worksheets << ExcelWorksheet.new(ws)
86
+ @lkup[ws.name] = @worksheets[-1]
87
+ end
88
+ ensure
89
+ if excel
90
+ excel.DisplayAlerts = false
91
+ excel.quit
92
+ end
93
+ excel = nil
94
+ GC.start
84
95
  end
85
-
86
- excel.DisplayAlerts = false
87
- excel.quit
88
- excel = nil
89
- GC.start
90
96
  end
91
97
 
92
98
  # @return [Array<String>] Array of all the worksheet names
data/run_gui_tests.bat CHANGED
@@ -1,5 +1,6 @@
1
1
  call bundle exec ruby autohotkey\tools\CmdExtractorAHK --defaultsize
2
2
  call bundle exec ruby autohotkey\tools\CmdSenderAHK -w 650 -t 650
3
+ call bundle exec ruby autohotkey\tools\CmdSenderAHK2 -w 650 -t 650 -p "INST COLLECT" --production
3
4
  call bundle exec ruby autohotkey\tools\CmdSequenceAHK -w 650 -t 650
4
5
  call bundle exec ruby autohotkey\tools\CmdSequenceAHK2 -w 650 -t 650 -r run_sequence.txt -o procedures
5
6
  call bundle exec ruby autohotkey\tools\CmdTlmServerAHK -x 50 -y 50 -w 900 -t 1000
@@ -31,6 +31,60 @@ describe Class do
31
31
  my = MyClass.new
32
32
  expect(MyClass.test).to eql "Test"
33
33
  expect(my.test).to eql "Test"
34
+ # No accessor methods are created
35
+ expect { my.test = "Blah" }.to raise_error(NoMethodError)
36
+ end
37
+
38
+ it "does not allow arbitrary code" do
39
+ expect {
40
+ class MyClass
41
+ instance_attr_reader "test;puts 'HI'"
42
+ end
43
+ }.to raise_error(ArgumentError)
44
+
45
+ expect {
46
+ class MyClass
47
+ instance_attr_reader "test\nputs 'HI'"
48
+ end
49
+ }.to raise_error(ArgumentError)
50
+ end
51
+ end
52
+
53
+ describe "instance_attr_accessor" do
54
+ it "adds instance attribute readers for class variables" do
55
+ class MyClass
56
+ instance_attr_accessor :test
57
+ @@instance = nil
58
+ def self.instance
59
+ @@instance ||= self.new
60
+ return @@instance
61
+ end
62
+ def initialize
63
+ @test = "Test"
64
+ @@instance = self
65
+ end
66
+ end
67
+
68
+ my = MyClass.new
69
+ expect(MyClass.test).to eql "Test"
70
+ expect(my.test).to eql "Test"
71
+ my.test = "Blah"
72
+ expect(MyClass.test).to eql "Blah"
73
+ expect(my.test).to eql "Blah"
74
+ end
75
+
76
+ it "does not allow arbitrary code" do
77
+ expect {
78
+ class MyClass
79
+ instance_attr_accessor "test;puts 'HI'"
80
+ end
81
+ }.to raise_error(ArgumentError)
82
+
83
+ expect {
84
+ class MyClass
85
+ instance_attr_accessor "test\nputs 'HI'"
86
+ end
87
+ }.to raise_error(ArgumentError)
34
88
  end
35
89
  end
36
90
  end
@@ -27,7 +27,7 @@ describe Socket do
27
27
  it "returns the hostname for the ip address" do
28
28
  if !ENV['APPVEYOR']
29
29
  ipaddr = Resolv.getaddress "localhost"
30
- expect(Socket.lookup_hostname_from_ip(ipaddr)).to match("localhost")
30
+ expect(Socket.lookup_hostname_from_ip(ipaddr)).to_not be_nil
31
31
  end
32
32
  end
33
33
  end
@@ -183,6 +183,10 @@ describe Time do
183
183
  expect(parts[1]).to eql ccsds_ms
184
184
  expect(parts[2]).to be_within(50).of(ccsds_us)
185
185
  end
186
+
187
+ it "maintains precision" do
188
+ expect(Time.ccsds2sec(22766, 65115943, 552).round(6)).to eql(1967047515.943552)
189
+ end
186
190
  end
187
191
 
188
192
  describe "Time.yds2mdy" do
@@ -15,6 +15,25 @@ module Cosmos
15
15
  OPENGL = %w(STL_FILE TEXTURE_MAPPED_SPHERE TIP_TEXT POSITION ROTATION_X ROTATION_Y ROTATION_Z)
16
16
  OPENGL.concat(%w(ZOOM ORIENTATION CENTER BOUNDS))
17
17
 
18
+ def process_line(line)
19
+ line.split(',').each do |item|
20
+ item.strip!
21
+ if (item[0] == "'" || item[0] == '"') && (item[-1] == "'" || item[-1] == '"')
22
+ @src_keywords << item[1..-2]
23
+ end
24
+ end
25
+ end
26
+
27
+ def process_continuation(line)
28
+ if line[-1] == "\\"
29
+ continuation = true
30
+ line = line[0..-2] # remove the continuation character
31
+ else
32
+ continuation = false
33
+ end
34
+ return continuation
35
+ end
36
+
18
37
  def get_src_keywords
19
38
  @src_keywords = []
20
39
  path = File.expand_path(File.join(File.dirname(__FILE__), "../../lib/**/*.rb"))
@@ -27,15 +46,16 @@ module Cosmos
27
46
  part = data.split('handle_keyword(parser, keyword, parameters)')[1..-1].join
28
47
  end
29
48
  if part
49
+ continuation = false
30
50
  part.split("\n").each do |line|
51
+ if continuation
52
+ continuation = process_continuation(line)
53
+ process_line(line)
54
+ end
31
55
  if match = line.match(/when (.*)/)
32
56
  line = match.captures[0]
33
- line.split(',').each do |item|
34
- item.strip!
35
- if (item[0] == "'" || item[0] == '"') && (item[-1] == "'" || item[-1] == '"')
36
- @src_keywords << item[1..-2]
37
- end
38
- end
57
+ continuation = process_continuation(line)
58
+ process_line(line)
39
59
  end
40
60
  end
41
61
  end
@@ -179,7 +179,7 @@ module Cosmos
179
179
  it "warns if an error code is set" do
180
180
  allow_any_instance_of(TcpipClientStream).to receive(:read).and_return @handshake.buffer(false)
181
181
  expect(Logger).to receive(:warn) do |msg|
182
- expect(msg).to eql "Warning sending command (12345): BAD"
182
+ expect(msg).to eql "LincInterface: Warning sending command (12345): BAD"
183
183
  end
184
184
  t = Thread.new do
185
185
  sleep 0.1
@@ -160,6 +160,45 @@ module Cosmos
160
160
  expect(packet.buffer.length).to eql 5
161
161
  end
162
162
 
163
+ it "raises an error with a packet length of 0" do
164
+ @interface.instance_variable_set(:@stream, LengthStream.new)
165
+ @interface.add_protocol(LengthProtocol, [
166
+ 16, # bit offset
167
+ 16, # bit size
168
+ 0, # length offset
169
+ 1, # bytes per count
170
+ 'BIG_ENDIAN'], :READ_WRITE)
171
+ $buffer = "\x00\x01\x00\x00\x03\x04\x05\x06\x07\x08\x09"
172
+ expect { @interface.read }.to raise_error(RuntimeError, /Calculated packet length of 0 bits/)
173
+ end
174
+
175
+ it "raises an error if packet length not enough to support offset and size" do
176
+ @interface.instance_variable_set(:@stream, LengthStream.new)
177
+ @interface.add_protocol(LengthProtocol, [
178
+ 16, # bit offset
179
+ 16, # bit size
180
+ 3, # length offset of 3 not enough to support 2 byte length field at offset 2 bytes
181
+ 1, # bytes per count
182
+ 'BIG_ENDIAN'], :READ_WRITE)
183
+ $buffer = "\x00\x01\x00\x00\x03\x04\x05\x06\x07\x08\x09"
184
+ expect { @interface.read }.to raise_error(RuntimeError, /Calculated packet length of 24 bits/)
185
+ end
186
+
187
+ it "processes a 0 length with a non-zero length offset" do
188
+ @interface.instance_variable_set(:@stream, LengthStream.new)
189
+ @interface.add_protocol(LengthProtocol, [
190
+ 0, # bit offset
191
+ 16, # bit size
192
+ 4, # length offset
193
+ 1, # bytes per count
194
+ 'BIG_ENDIAN'], :READ_WRITE)
195
+ $buffer = "\x00\x00\x01\x02\x00\x00\x03\x04"
196
+ packet = @interface.read
197
+ expect(packet.buffer).to eql "\x00\x00\x01\x02"
198
+ packet = @interface.read
199
+ expect(packet.buffer).to eql "\x00\x00\x03\x04"
200
+ end
201
+
163
202
  it "validates length against the maximum length" do
164
203
  @interface.instance_variable_set(:@stream, LengthStream.new)
165
204
  @interface.add_protocol(LengthProtocol, [
@@ -9,14 +9,11 @@
9
9
  # attribution addendums as found in the LICENSE.txt
10
10
 
11
11
  if RUBY_ENGINE == 'ruby' or Gem.win_platform?
12
-
13
12
  require 'spec_helper'
14
13
  require 'cosmos/interfaces/serial_interface'
15
14
 
16
15
  module Cosmos
17
-
18
- describe SerialInterface do
19
-
16
+ describe SerialInterface, :if => `change port /query 2>&1` !~ /No serial ports/ do
20
17
  describe "initialize" do
21
18
  it "initializes the instance variables" do
22
19
  i = SerialInterface.new('COM1','COM1','9600','NONE','1','0','0','burst')
@@ -66,5 +63,4 @@ if RUBY_ENGINE == 'ruby' or Gem.win_platform?
66
63
  end
67
64
  end
68
65
  end
69
-
70
66
  end
@@ -0,0 +1,166 @@
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/io/json_drb_rack'
13
+
14
+ module Cosmos
15
+
16
+ describe JsonDrbRack do
17
+ before(:each) do
18
+ @env = {
19
+ "GATEWAY_INTERFACE" => "CGI/1.1",
20
+ "PATH_INFO" => "/index.html",
21
+ "QUERY_STRING" => "",
22
+ "REMOTE_ADDR" => "::1",
23
+ "REMOTE_HOST" => "localhost",
24
+ "REQUEST_METHOD" => "POST",
25
+ "REQUEST_URI" => "http://localhost:3000/index.html",
26
+ "SCRIPT_NAME" => "",
27
+ "SERVER_NAME" => "localhost",
28
+ "SERVER_PORT" => "3000",
29
+ "SERVER_PROTOCOL" => "HTTP/1.1",
30
+ "SERVER_SOFTWARE" => "WEBrick/1.3.1 (Ruby/2.0.0/2013-11-22)",
31
+ "HTTP_HOST" => "127.0.0.1:7777",
32
+ "HTTP_USER_AGENT" => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:26.0) Gecko/20100101 Firefox/26.0",
33
+ "HTTP_ACCEPT" => "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
34
+ "HTTP_ACCEPT_LANGUAGE" => "zh-tw,zh;q=0.8,en-us;q=0.5,en;q=0.3",
35
+ "HTTP_ACCEPT_ENCODING" => "gzip, deflate",
36
+ "HTTP_COOKIE" => "jsonrpc.session=3iqp3ydRwFyqjcfO0GT2bzUh.bacc2786c7a81df0d0e950bec8fa1a9b1ba0bb61",
37
+ "HTTP_CONNECTION" => "keep-alive",
38
+ "HTTP_CACHE_CONTROL" => "max-age=0",
39
+ "rack.version" => [1, 2],
40
+ "rack.input" => StringIO.new(""),
41
+ "rack.errors" => nil,
42
+ "rack.multithread" => true,
43
+ "rack.multiprocess" => false,
44
+ "rack.run_once" => false,
45
+ "rack.url_scheme" => "http",
46
+ "HTTP_VERSION" => "HTTP/1.1",
47
+ "REQUEST_PATH" => "/index.html"
48
+ }
49
+ end
50
+
51
+ class MockDRb
52
+ class MockDRbAcl
53
+ def initialize(val = true)
54
+ @val = val
55
+ end
56
+ def allow_addr?(val)
57
+ return @val
58
+ end
59
+ end
60
+
61
+ def initialize(val, response_data = "response", error_code = nil)
62
+ @acl = MockDRbAcl.new(val)
63
+ @response_data = response_data
64
+ @error_code = error_code
65
+ end
66
+
67
+ def acl
68
+ @acl
69
+ end
70
+
71
+ def process_request(request_data, start_time)
72
+ return @response_data, @error_code
73
+ end
74
+ end
75
+
76
+ class MockSystem
77
+ def initialize(token = 'SuperSecret', hosts = ['127.0.0.1:7777'], origins = [])
78
+ @token = token
79
+ @hosts = hosts
80
+ @origins = origins
81
+ end
82
+ def x_csrf_token
83
+ @token
84
+ end
85
+ def allowed_hosts
86
+ @hosts
87
+ end
88
+ def allowed_origins
89
+ @origins
90
+ end
91
+ end
92
+
93
+ describe "call" do
94
+ it "supports the drb acl" do
95
+ json_drb_rack = JsonDrbRack.new(MockDRb.new(false), MockSystem.new)
96
+ status, type, body_array = json_drb_rack.call(@env)
97
+ expect(status).to eql 403
98
+ expect(type).to eql({'Content-Type' => "text/plain"})
99
+ expect(body_array).to eql ["Forbidden"]
100
+ end
101
+
102
+ it "handles X-Csrf-Token" do
103
+ json_drb_rack = JsonDrbRack.new(MockDRb.new(true), MockSystem.new('NeverGuess'))
104
+ @env['HTTP_X_CSRF_TOKEN'] = 'TryToGuess'
105
+ status, type, body_array = json_drb_rack.call(@env)
106
+ expect(status).to eql 403
107
+ expect(type).to eql({'Content-Type' => "text/plain"})
108
+ expect(body_array).to eql ["Forbidden: Bad X-Csrf-Token: #{@env['HTTP_X_CSRF_TOKEN']}"]
109
+
110
+ json_drb_rack = JsonDrbRack.new(MockDRb.new(true), MockSystem.new('NeverGuess'))
111
+ @env['HTTP_X_CSRF_TOKEN'] = 'NeverGuess'
112
+ status, type, body_array = json_drb_rack.call(@env)
113
+ expect(status).to eql 200
114
+ expect(type).to eql({'Content-Type' => "application/json-rpc"})
115
+ expect(body_array).to eql ["response"]
116
+ end
117
+
118
+ it "Handles Allowed Hosts" do
119
+ json_drb_rack = JsonDrbRack.new(MockDRb.new(true), MockSystem.new('NeverGuess'))
120
+ @env['HTTP_X_CSRF_TOKEN'] = 'NeverGuess'
121
+ @env['HTTP_HOST'] = "5.6.7.8:7777"
122
+ status, type, body_array = json_drb_rack.call(@env)
123
+ expect(status).to eql 403
124
+ expect(type).to eql({'Content-Type' => "text/plain"})
125
+ expect(body_array).to eql ["Forbidden: #{@env['HTTP_HOST']} not in allowed hosts"]
126
+
127
+ json_drb_rack = JsonDrbRack.new(MockDRb.new(true), MockSystem.new('NeverGuess', ['5.6.7.8:7777']))
128
+ @env['HTTP_X_CSRF_TOKEN'] = 'NeverGuess'
129
+ @env['HTTP_HOST'] = "5.6.7.8:7777"
130
+ status, type, body_array = json_drb_rack.call(@env)
131
+ expect(status).to eql 200
132
+ expect(type).to eql({'Content-Type' => "application/json-rpc"})
133
+ expect(body_array).to eql ["response"]
134
+ end
135
+
136
+ it "Handles Allowed Origins" do
137
+ json_drb_rack = JsonDrbRack.new(MockDRb.new(true), MockSystem.new('NeverGuess'))
138
+ @env['HTTP_X_CSRF_TOKEN'] = 'NeverGuess'
139
+ @env['HTTP_ORIGIN'] = "5.6.7.8:7777"
140
+ status, type, body_array = json_drb_rack.call(@env)
141
+ expect(status).to eql 403
142
+ expect(type).to eql({'Content-Type' => "text/plain"})
143
+ expect(body_array).to eql ["Forbidden: #{@env['HTTP_ORIGIN']} not in allowed origins"]
144
+
145
+ json_drb_rack = JsonDrbRack.new(MockDRb.new(true), MockSystem.new('NeverGuess', ['127.0.0.1:7777'], ['3.6.7.8:7777']))
146
+ @env['HTTP_X_CSRF_TOKEN'] = 'NeverGuess'
147
+ @env['HTTP_ORIGIN'] = "3.6.7.8:7777"
148
+ status, type, body_array = json_drb_rack.call(@env)
149
+ expect(status).to eql 200
150
+ expect(type).to eql({'Content-Type' => "application/json-rpc"})
151
+ expect(body_array).to eql ["response"]
152
+ end
153
+
154
+ it "Only accepts posts" do
155
+ json_drb_rack = JsonDrbRack.new(MockDRb.new(true), MockSystem.new('NeverGuess'))
156
+ @env['HTTP_X_CSRF_TOKEN'] = 'NeverGuess'
157
+ @env["REQUEST_METHOD"] = "GET"
158
+ status, type, body_array = json_drb_rack.call(@env)
159
+ expect(status).to eql 405
160
+ expect(type).to eql({'Content-Type' => "text/plain"})
161
+ expect(body_array).to eql ["Request not allowed"]
162
+ end
163
+
164
+ end
165
+ end
166
+ end