cosmos 4.4.0-java → 4.5.1-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -200,6 +200,20 @@ module Cosmos
200
200
  sleep(0.1)
201
201
  end
202
202
 
203
+ it "processes success requests with uppercase" do
204
+ class MyServer5
205
+ def my_method(param)
206
+ end
207
+ end
208
+
209
+ @json.start_service('127.0.0.1', 7777, MyServer5.new)
210
+ request_data = JsonRpcRequest.new('MY_METHOD', 'param', 1).to_json
211
+ _, error_code = @json.process_request(request_data, Time.now)
212
+ expect(error_code).to eq nil
213
+ @json.stop_service
214
+ sleep(0.1)
215
+ end
216
+
203
217
  it "does not allow dangerous methods" do
204
218
  @json.start_service('127.0.0.1', 7777, self)
205
219
  request_data = JsonRpcRequest.new('send', 'param', 1).to_json
@@ -238,25 +238,25 @@ module Cosmos
238
238
 
239
239
  it "reports an error if there is no 'result' or 'error' key" do
240
240
  json = JsonRpcResponse.new(10).as_json
241
- expect { JsonRpcResponse.from_json(json.to_json) }.to raise_error("Invalid JSON-RPC 2.0 Response")
241
+ expect { JsonRpcResponse.from_json(json.to_json) }.to raise_error(/Invalid JSON-RPC 2.0 Response/)
242
242
  end
243
243
 
244
244
  it "reports an error if the version isn't 2.0" do
245
245
  json = JsonRpcResponse.new(10).as_json
246
246
  json['jsonrpc'] = "1.1"
247
247
  json['result'] = "true"
248
- expect { JsonRpcResponse.from_json(json.to_json) }.to raise_error("Invalid JSON-RPC 2.0 Response")
248
+ expect { JsonRpcResponse.from_json(json.to_json) }.to raise_error(/Invalid JSON-RPC 2.0 Response/)
249
249
  end
250
250
 
251
251
  it "reports an error if there is both a 'result' and 'error' key" do
252
252
  json = JsonRpcResponse.new(10).as_json
253
253
  json['result'] = "true"
254
254
  json['error'] = {"code"=>-1, "message"=>"error"}
255
- expect { JsonRpcResponse.from_json(json.to_json) }.to raise_error("Invalid JSON-RPC 2.0 Response")
255
+ expect { JsonRpcResponse.from_json(json.to_json) }.to raise_error(/Invalid JSON-RPC 2.0 Response/)
256
256
  end
257
257
 
258
258
  it "reports an error if it is not json" do
259
- expect { JsonRpcResponse.from_json(Object.new) }.to raise_error("Invalid JSON-RPC 2.0 Response")
259
+ expect { JsonRpcResponse.from_json(Object.new) }.to raise_error(/Invalid JSON-RPC 2.0 Response/)
260
260
  end
261
261
 
262
262
  it "reports an error if the error hash is bad" do
@@ -268,4 +268,3 @@ module Cosmos
268
268
 
269
269
  end
270
270
  end
271
-
@@ -0,0 +1,81 @@
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
+ if RbConfig::CONFIG['target_os'] !~ /mswin|mingw|cygwin/i and RUBY_ENGINE == 'ruby' and !ENV['TRAVIS']
12
+
13
+ require 'spec_helper'
14
+ require 'cosmos/io/posix_serial_driver'
15
+
16
+ module Cosmos
17
+
18
+ describe PosixSerialDriver do
19
+ describe "instance" do
20
+ it "enforces the baud rate to a known value" do
21
+ expect { PosixSerialDriver.new('/dev/ttyS0',10,:NONE) }.to raise_error(ArgumentError, "Invalid baud rate: 10")
22
+ end
23
+
24
+ it "supports even, odd, or no parity" do
25
+ expect { PosixSerialDriver.new('/dev/ttyS0',9600,:EVEN).close }.to_not raise_error
26
+ expect { PosixSerialDriver.new('/dev/ttyS0',9600,:ODD).close }.to_not raise_error
27
+ expect { PosixSerialDriver.new('/dev/ttyS0',9600,:NONE).close }.to_not raise_error
28
+ expect { PosixSerialDriver.new('/dev/ttyS0',9600,:BLAH) }.to raise_error(ArgumentError, "Invalid parity: BLAH")
29
+ end
30
+
31
+ it "supports 1 or 2 stop bits" do
32
+ expect { PosixSerialDriver.new('/dev/ttyS0',9600,:NONE,1).close }.to_not raise_error
33
+ expect { PosixSerialDriver.new('/dev/ttyS0',9600,:NONE,2).close }.to_not raise_error
34
+ expect { PosixSerialDriver.new('/dev/ttyS0',9600,:NONE,3) }.to raise_error(ArgumentError, "Invalid stop bits: 3")
35
+ end
36
+
37
+ it "supports 5-8 data bits" do
38
+ (5..8).each do |data_bits|
39
+ driver = PosixSerialDriver.new('/dev/ttyS0',9600,:NONE,1,10,nil,:NONE,data_bits)
40
+ handle = driver.instance_variable_get(:@handle)
41
+ expect(handle.tcgetattr.cflag & Termios::CSIZE).to eq(Termios.const_get("CS#{data_bits}"))
42
+ driver.close
43
+ end
44
+ expect { PosixSerialDriver.new('/dev/ttyS0',9600,:NONE,1,10,nil,:NONE,9) }.to raise_error(ArgumentError, "Invalid data bits: 9")
45
+ end
46
+
47
+ it "sets arbitrary Posix structure elements" do
48
+ driver = PosixSerialDriver.new('/dev/ttyS0',9600,:NONE,1,10,nil,:NONE,8)
49
+ handle = driver.instance_variable_get(:@handle)
50
+ # Verify non of the things we're going to set are already set
51
+ expect(handle.tcgetattr.iflag & Termios::IGNBRK).to eq(0)
52
+ expect(handle.tcgetattr.oflag & Termios::OPOST).to eq(0)
53
+ expect(handle.tcgetattr.cflag & Termios::CLOCAL).to eq(Termios::CLOCAL) # We set this by default
54
+ expect(handle.tcgetattr.lflag & Termios::ECHO).to eq(0)
55
+ expect(handle.tcgetattr.cc[Termios::VMIN]).to eq(1)
56
+ driver.close
57
+ # When setting a field the "1" is optional. When clearing a field the "0" is required.
58
+ # Entries in the "cc" special characters field are automatically converted to integers if they are numbers
59
+ struct = [["iflag", "IGNBRK"], ["oflag", "OPOST", "1"], ["cflag", "CLOCAL", "0"], ["lflag", "ECHO"], ["cc", "VMIN", "2"]]
60
+ driver = PosixSerialDriver.new('/dev/ttyS0',9600,:NONE,1,10,nil,:NONE,8,struct)
61
+ handle = driver.instance_variable_get(:@handle)
62
+ expect(handle.tcgetattr.iflag & Termios::IGNBRK).to eq(Termios::IGNBRK)
63
+ expect(handle.tcgetattr.oflag & Termios::OPOST).to eq(Termios::OPOST)
64
+ expect(handle.tcgetattr.cflag & Termios::CLOCAL).to eq(0)
65
+ expect(handle.tcgetattr.lflag & Termios::ECHO).to eq(Termios::ECHO)
66
+ expect(handle.tcgetattr.cc[Termios::VMIN]).to eq(2)
67
+ driver.close
68
+ end
69
+ end
70
+
71
+ describe "close, closed?" do
72
+ it "closes the handle" do
73
+ driver = PosixSerialDriver.new('/dev/ttyS0',9600)
74
+ expect(driver.closed?).to be false
75
+ driver.close
76
+ expect(driver.closed?).to be true
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -19,7 +19,8 @@ if RUBY_ENGINE == 'ruby' or Gem.win_platform?
19
19
  before(:each) do
20
20
  allow(Win32).to receive(:create_file).and_return(Object.new)
21
21
  state = double("comm_state")
22
- allow(state).to receive(:write)
22
+ @dcb_struct = {}
23
+ allow(state).to receive(:write) { |key, value| @dcb_struct[key] = value }
23
24
  allow(Win32).to receive(:get_comm_state).and_return(state)
24
25
  allow(Win32).to receive(:set_comm_state)
25
26
  allow(Win32).to receive(:set_comm_timeouts)
@@ -34,12 +35,14 @@ if RUBY_ENGINE == 'ruby' or Gem.win_platform?
34
35
  expect { Win32SerialDriver.new('COM1',9600,:EVEN) }.to_not raise_error
35
36
  expect { Win32SerialDriver.new('COM1',9600,:ODD) }.to_not raise_error
36
37
  expect { Win32SerialDriver.new('COM1',9600,:NONE) }.to_not raise_error
38
+ expect(@dcb_struct["Parity"]).to_not be_nil # Simply check that Parity was set
37
39
  expect { Win32SerialDriver.new('COM1',9600,:BLAH) }.to raise_error(ArgumentError, "Invalid parity: BLAH")
38
40
  end
39
41
 
40
42
  it "supports 1 or 2 stop bits" do
41
43
  expect { Win32SerialDriver.new('COM1',9600,:NONE,1) }.to_not raise_error
42
44
  expect { Win32SerialDriver.new('COM1',9600,:NONE,2) }.to_not raise_error
45
+ expect(@dcb_struct["StopBits"]).to_not be_nil # Simply check that StopBits was set
43
46
  expect { Win32SerialDriver.new('COM1',9600,:NONE,3) }.to raise_error(ArgumentError, "Invalid stop bits: 3")
44
47
  end
45
48
 
@@ -49,6 +52,35 @@ if RUBY_ENGINE == 'ruby' or Gem.win_platform?
49
52
  expect { Win32SerialDriver.new('COM1',9600,:NONE,1,10,nil,0.01,1000,:NONE,7) }.to_not raise_error
50
53
  expect { Win32SerialDriver.new('COM1',9600,:NONE,1,10,nil,0.01,1000,:NONE,8) }.to_not raise_error
51
54
  expect { Win32SerialDriver.new('COM1',9600,:NONE,1,10,nil,0.01,1000,:NONE,9) }.to raise_error(ArgumentError, "Invalid data bits: 9")
55
+ expect(@dcb_struct["ByteSize"]).to_not be_nil # Simply check that ByteSize was set
56
+ end
57
+
58
+ it "sets arbitrary Windows DCB structure elements" do
59
+ Win32SerialDriver.new('COM1',9600,:NONE,1,10,nil,0.01,1000,:NONE,8)
60
+ expect(@dcb_struct["fOutxDsrFlow"]).to be_nil # This isn't set by default
61
+ expect(@dcb_struct["Parity"]).to eq(0)
62
+ # Set a new variable in the Windows DCB struct and override the :NONE parity
63
+ # We pass them in as strings because that's how they're parsed
64
+ struct = [["fOutxDsrFlow", "1"], ["Parity", "4"]]
65
+ Win32SerialDriver.new('COM1',9600,:NONE,1,10,nil,0.01,1000,:NONE,8,struct)
66
+ expect(@dcb_struct["fOutxDsrFlow"]).to eq(1)
67
+ expect(@dcb_struct["Parity"]).to eq(4)
68
+ end
69
+
70
+ it "calculates the correct timeouts" do
71
+ Win32::BAUD_RATES.each do |baud|
72
+ (5..8).each do |data_bits|
73
+ (1..2).each do |stop_bits|
74
+ [:EVEN, :ODD, :NONE].each do |parity|
75
+ # data_bits + 1 start bit + stop bits + potentially a parity bit
76
+ symbols = data_bits + 1 + stop_bits + (parity == :NONE ? 0 : 1)
77
+ delay = 1000.0 / (baud.to_f / symbols)
78
+ expect(Win32).to receive(:set_comm_timeouts).with(anything, 0xFFFFFFFF,0,0,delay.ceil,1000)
79
+ Win32SerialDriver.new('COM1',baud,parity,stop_bits,10,nil,0.01,1000,:NONE,data_bits)
80
+ end
81
+ end
82
+ end
83
+ end
52
84
  end
53
85
  end
54
86
 
@@ -92,8 +124,6 @@ if RUBY_ENGINE == 'ruby' or Gem.win_platform?
92
124
  expect { driver.read }.to raise_error(Timeout::Error)
93
125
  end
94
126
  end
95
-
96
127
  end
97
128
  end
98
-
99
129
  end
@@ -23,7 +23,10 @@ module Cosmos
23
23
  plw = PacketLogWriter.new(:CMD,nil,true,nil,10000000,nil,false)
24
24
  @cmd_packets = []
25
25
  pkt = System.commands.packet("SYSTEM","STARTLOGGING").clone
26
- pkt.received_time = Time.new(2020,1,31,12,30,15)
26
+ # Avoid precision errors by rounding to nearest second and then add 1 to ensure
27
+ # the time is AFTER the initial META packet with the current time
28
+ @time = Time.now.round + 1
29
+ pkt.received_time = @time
27
30
  pkt.write('label','PKT1')
28
31
  plw.write(pkt)
29
32
  @cmd_packet_length = pkt.length
@@ -43,7 +46,7 @@ module Cosmos
43
46
  plw = PacketLogWriter.new(:TLM,nil,true,nil,10000000,nil,false)
44
47
  @tlm_packets = []
45
48
  pkt = System.telemetry.packet("SYSTEM","LIMITS_CHANGE").clone
46
- pkt.received_time = Time.new(2020,2,1,12,30,15)
49
+ pkt.received_time = @time
47
50
  pkt.write('PACKET','PKT1')
48
51
  plw.write(pkt)
49
52
  @tlm_packet_length = pkt.length
@@ -121,7 +124,7 @@ module Cosmos
121
124
  file.write [pkt.buffer.length].pack('N')
122
125
  file.write pkt.buffer
123
126
  end
124
- expect(@plr.open(filename)).to eql [false, nil]
127
+ expect(@plr.open(filename)[0]).to eql false
125
128
  pkt1 = @plr.read
126
129
  expect(pkt1.target_name).to eql 'TGT1'
127
130
  expect(pkt1.packet_name).to eql 'PKT1'
@@ -149,7 +152,7 @@ module Cosmos
149
152
  file.write [pkt.buffer.length].pack('N')
150
153
  file.write pkt.buffer
151
154
  end
152
- expect(@plr.open(filename)).to eql [false, nil]
155
+ expect(@plr.open(filename)[0]).to eql false
153
156
  pkt1 = @plr.read
154
157
  expect(pkt1.target_name).to eql 'TGT1'
155
158
  expect(pkt1.packet_name).to eql 'PKT1'
@@ -203,7 +206,7 @@ module Cosmos
203
206
  end
204
207
 
205
208
  # Corrupt the second config
206
- second_config_path = System.instance.send(:find_configuration, second_config_name)
209
+ second_config_path = System.instance.public_send(:find_configuration, second_config_name)
207
210
  md5 = File.basename(second_config_path, '.*')
208
211
  Zip::File.open(second_config_path) do |zip|
209
212
  zip.file.rename(File.join(md5, 'system.txt'), File.join(md5, 'system2.txt'))
@@ -239,10 +242,11 @@ module Cosmos
239
242
  expect(packet_offsets).to eql [PacketLogReader::COSMOS4_HEADER_LENGTH, PacketLogReader::COSMOS4_HEADER_LENGTH + meta_header_length + meta_length, PacketLogReader::COSMOS4_HEADER_LENGTH + meta_header_length + meta_length + header_length + @cmd_packet_length, PacketLogReader::COSMOS4_HEADER_LENGTH + meta_header_length + meta_length + (header_length + @cmd_packet_length) * 2]
240
243
 
241
244
  expect(@plr.open(Dir[File.join(@log_path,"*cmd.bin")][0])).to eql [true, nil]
242
- pkt = @plr.read_at_offset(packet_offsets[2])
245
+ pkt = @plr.read_at_offset(packet_offsets[2]) # Grab the second STARTLOGGING (META is 0)
243
246
  expect(pkt.target_name).to eql "SYSTEM"
244
247
  expect(pkt.packet_name).to eql "STARTLOGGING"
245
- expect(pkt.received_time).to eql Time.new(2020,1,31,12,30,16)
248
+ expect(pkt.read('LABEL')).to eql "PKT2"
249
+ expect(pkt.received_time).to eql @time + 1
246
250
  @plr.close
247
251
  end
248
252
 
@@ -257,10 +261,11 @@ module Cosmos
257
261
  expect(packet_offsets).to eql [PacketLogReader::COSMOS4_HEADER_LENGTH, PacketLogReader::COSMOS4_HEADER_LENGTH + meta_header_length + meta_length, PacketLogReader::COSMOS4_HEADER_LENGTH + meta_header_length + meta_length + header_length + @tlm_packet_length, PacketLogReader::COSMOS4_HEADER_LENGTH + meta_header_length + meta_length + (header_length + @tlm_packet_length) * 2]
258
262
 
259
263
  expect(@plr.open(Dir[File.join(@log_path,"*tlm.bin")][0])).to eql [true, nil]
260
- pkt = @plr.read_at_offset(packet_offsets[2])
264
+ pkt = @plr.read_at_offset(packet_offsets[2]) # Grab the second LIMITS_CHANGE (META is 0)
261
265
  expect(pkt.target_name).to eql "SYSTEM"
262
266
  expect(pkt.packet_name).to eql "LIMITS_CHANGE"
263
- expect(pkt.received_time).to eql Time.new(2020,2,1,12,30,16)
267
+ expect(pkt.read('PACKET')).to eql "PKT2"
268
+ expect(pkt.received_time).to eql @time + 1
264
269
  @plr.close
265
270
  end
266
271
  end
@@ -415,9 +420,8 @@ module Cosmos
415
420
  end
416
421
 
417
422
  it "returns all packets if the start time is before all" do
418
- time = Time.new(2000,1,31,12,30,16)
419
423
  index = 0
420
- @plr.each(Dir[File.join(@log_path,"*cmd.bin")][0], true, time) do |packet|
424
+ @plr.each(Dir[File.join(@log_path,"*cmd.bin")][0], true, @time) do |packet|
421
425
  next if packet.packet_name == 'META'
422
426
  expect(packet.target_name).to eql @cmd_packets[index].target_name
423
427
  expect(packet.packet_name).to eql @cmd_packets[index].packet_name
@@ -429,51 +433,48 @@ module Cosmos
429
433
  end
430
434
 
431
435
  it "returns no packets if the start time is after all" do
432
- time = Time.new(2030,2,1,12,30,16)
433
436
  index = 0
434
- @plr.each(Dir[File.join(@log_path,"*tlm.bin")][0], true, time) do |packet|
437
+ @plr.each(Dir[File.join(@log_path,"*tlm.bin")][0], true, @time + 100) do |packet|
435
438
  index += 1
436
439
  end
437
440
  expect(index).to eql 0
438
441
  end
439
442
 
440
443
  it "returns all packets after a start time" do
441
- time = Time.new(2020,1,31,12,30,16)
442
444
  index = 0
443
- @plr.each(Dir[File.join(@log_path,"*cmd.bin")][0], true, time) do |packet|
444
- expect(packet.target_name).to eql @cmd_packets[index+1].target_name
445
- expect(packet.packet_name).to eql @cmd_packets[index+1].packet_name
446
- expect(packet.received_time).to eql @cmd_packets[index+1].received_time
447
- expect(packet.read('LABEL')).to eql @cmd_packets[index+1].read('LABEL')
445
+ @plr.each(Dir[File.join(@log_path,"*cmd.bin")][0], true, @time) do |packet|
446
+ next if packet.packet_name == 'META'
447
+ expect(packet.target_name).to eql @cmd_packets[index].target_name
448
+ expect(packet.packet_name).to eql @cmd_packets[index].packet_name
449
+ expect(packet.received_time).to eql @cmd_packets[index].received_time
450
+ expect(packet.read('LABEL')).to eql @cmd_packets[index].read('LABEL')
448
451
  index += 1
449
452
  end
450
- expect(index).to eql 2
453
+ expect(index).to eql 3
451
454
 
452
- time = Time.new(2020,2,1,12,30,16)
453
- index = 0
454
- @plr.each(Dir[File.join(@log_path,"*tlm.bin")][0], true, time) do |packet|
455
- expect(packet.target_name).to eql @tlm_packets[index+1].target_name
456
- expect(packet.packet_name).to eql @tlm_packets[index+1].packet_name
457
- expect(packet.received_time).to eql @tlm_packets[index+1].received_time
458
- expect(packet.read('PACKET')).to eql @tlm_packets[index+1].read('PACKET')
455
+ index = 1 # @time + 1
456
+ @plr.each(Dir[File.join(@log_path,"*tlm.bin")][0], true, @time + 1) do |packet|
457
+ next if packet.packet_name == 'META'
458
+ expect(packet.target_name).to eql @tlm_packets[index].target_name
459
+ expect(packet.packet_name).to eql @tlm_packets[index].packet_name
460
+ expect(packet.received_time).to eql @tlm_packets[index].received_time
461
+ expect(packet.read('PACKET')).to eql @tlm_packets[index].read('PACKET')
459
462
  index += 1
460
463
  end
461
- expect(index).to eql 2
464
+ expect(index).to eql 3
462
465
  end
463
466
 
464
467
  it "returns no packets if the end time is before all" do
465
- time = Time.new(2000,1,31,12,30,16)
466
468
  index = 0
467
- @plr.each(Dir[File.join(@log_path,"*tlm.bin")][0], true, nil, time) do |packet|
469
+ @plr.each(Dir[File.join(@log_path,"*tlm.bin")][0], true, nil, @time - 10) do |packet|
468
470
  index += 1
469
471
  end
470
472
  expect(index).to eql 0
471
473
  end
472
474
 
473
475
  it "returns all packets if the end time is after all" do
474
- time = Time.new(2030,2,1,12,30,16)
475
476
  index = 0
476
- @plr.each(Dir[File.join(@log_path,"*cmd.bin")][0], true, nil, time) do |packet|
477
+ @plr.each(Dir[File.join(@log_path,"*cmd.bin")][0], true, nil, @time + 10) do |packet|
477
478
  next if packet.packet_name == 'META'
478
479
  expect(packet.target_name).to eql @cmd_packets[index].target_name
479
480
  expect(packet.packet_name).to eql @cmd_packets[index].packet_name
@@ -485,9 +486,8 @@ module Cosmos
485
486
  end
486
487
 
487
488
  it "returns all packets before an end time" do
488
- time = Time.new(2020,1,31,12,30,16)
489
489
  index = 0
490
- @plr.each(Dir[File.join(@log_path,"*cmd.bin")][0], true, nil, time) do |packet|
490
+ @plr.each(Dir[File.join(@log_path,"*cmd.bin")][0], true, nil, @time) do |packet|
491
491
  next if packet.packet_name == 'META'
492
492
  expect(packet.target_name).to eql @cmd_packets[index].target_name
493
493
  expect(packet.packet_name).to eql @cmd_packets[index].packet_name
@@ -495,11 +495,10 @@ module Cosmos
495
495
  expect(packet.read('LABEL')).to eql @cmd_packets[index].read('LABEL')
496
496
  index += 1
497
497
  end
498
- expect(index).to eql 2
498
+ expect(index).to eql 1
499
499
 
500
- time = Time.new(2020,2,1,12,30,16)
501
500
  index = 0
502
- @plr.each(Dir[File.join(@log_path,"*tlm.bin")][0], true, nil, time) do |packet|
501
+ @plr.each(Dir[File.join(@log_path,"*tlm.bin")][0], true, nil, @time + 1) do |packet|
503
502
  next if packet.packet_name == 'META'
504
503
  expect(packet.target_name).to eql @tlm_packets[index].target_name
505
504
  expect(packet.packet_name).to eql @tlm_packets[index].packet_name
@@ -185,6 +185,8 @@ module Cosmos
185
185
  expect(@s.defined_length).to eql 1
186
186
  si = StructureItem.new("test1",0,16,:INT,:BIG_ENDIAN)
187
187
  @s.define(si)
188
+ expect(@s.items.length).to eql 1
189
+ expect(@s.sorted_items.length).to eql 1
188
190
  expect(@s.sorted_items[0].name).to eql "TEST1"
189
191
  expect(@s.items["TEST1"].bit_size).to eql 16
190
192
  expect(@s.items["TEST1"].data_type).to eql :INT
@@ -290,6 +292,56 @@ module Cosmos
290
292
  end
291
293
  end
292
294
 
295
+ describe "delete_item" do
296
+ before(:each) do
297
+ @s = Structure.new(:BIG_ENDIAN)
298
+ @s.define_item("test1", 0, 8, :UINT)
299
+ end
300
+
301
+ it "removes the item and leaves a hole" do
302
+ @s.append_item("test2", 16, :UINT)
303
+ expect(@s.defined_length).to eql 3
304
+ @s.delete_item("test1")
305
+ expect { @s.get_item("test1") }.to raise_error(ArgumentError, "Unknown item: test1")
306
+ expect(@s.defined_length).to eql 3
307
+ expect(@s.items["TEST1"]).to be_nil
308
+ expect(@s.items["TEST2"]).not_to be_nil
309
+ expect(@s.sorted_items.length).to eql 1
310
+ expect(@s.sorted_items[0]).to eql(@s.get_item("test2"))
311
+ buffer = "\x01\x02\x03"
312
+ expect(@s.read("test2", :RAW, buffer)).to eql 0x0203
313
+ end
314
+
315
+ it "allows new items to be defined in place" do
316
+ @s.append_item("test2", 16, :UINT)
317
+ @s.append_item("test3", 8, :UINT)
318
+ expect(@s.defined_length).to eql 4
319
+ # Delete the first 2 items, note a 3 byte hole now exists
320
+ @s.delete_item("test1")
321
+ @s.delete_item("test2")
322
+ expect(@s.defined_length).to eql 4
323
+ expect(@s.items.length).to eql 1
324
+ expect(@s.sorted_items.length).to eql 1
325
+ # Fill the hole and overlap the last byte
326
+ @s.define_item("test4", 0, 16, :UINT)
327
+ @s.define_item("test5", 16, 16, :UINT)
328
+ @s.define_item("test6", 32, 32, :UINT)
329
+ buffer = "\x01\x02\x03\x04\x05\x06\x07\x08"
330
+ expect(@s.read("test4", :RAW, buffer)).to eql 0x0102
331
+ expect(@s.read("test5", :RAW, buffer)).to eql 0x0304
332
+ expect(@s.read("test6", :RAW, buffer)).to eql 0x05060708
333
+ # test3 is still defined
334
+ expect(@s.read("test3", :RAW, buffer)).to eql 0x04
335
+ expect(@s.items.length).to eql 4
336
+ expect(@s.sorted_items.length).to eql 4
337
+ # Check that everything is sorted correctly
338
+ expect(@s.sorted_items[0].name).to eql "TEST4"
339
+ expect(@s.sorted_items[1].name).to eql "TEST5"
340
+ expect(@s.sorted_items[2].name).to eql "TEST3"
341
+ expect(@s.sorted_items[3].name).to eql "TEST6"
342
+ end
343
+ end
344
+
293
345
  describe "read_item" do
294
346
  it "complains if no buffer given" do
295
347
  s = Structure.new
@@ -601,7 +653,5 @@ module Cosmos
601
653
  expect { s.test1 }.to raise_error(ArgumentError, "Unknown item: test1")
602
654
  end
603
655
  end
604
-
605
656
  end # describe Structure
606
-
607
657
  end
@@ -596,6 +596,34 @@ module Cosmos
596
596
  end
597
597
  end
598
598
 
599
+ describe "all_item_strings" do
600
+ it "returns hidden TGT,PKT,ITEMs in the system" do
601
+ @tlm.packet("TGT1","PKT1").hidden = true
602
+ @tlm.packet("TGT1","PKT2").disabled = true
603
+ default = @tlm.all_item_strings() # Return only those not hidden or disabled
604
+ strings = @tlm.all_item_strings(true) # Return everything, even hidden & disabled
605
+ expect(default).to_not eq strings
606
+ # Spot check the default
607
+ expect(default).to include("TGT2 PKT1 ITEM1")
608
+ expect(default).to include("TGT2 PKT1 ITEM2")
609
+ expect(default).to_not include("TGT1 PKT1 ITEM1") # hidden
610
+ expect(default).to_not include("TGT1 PKT2 ITEM1") # disabled
611
+
612
+ items = {}
613
+ # Built from the before(:each) section
614
+ items['TGT1 PKT1'] = %w(ITEM1 ITEM2 ITEM3 ITEM4)
615
+ items['TGT1 PKT2'] = %w(ITEM1 ITEM2)
616
+ items['TGT2 PKT1'] = %w(ITEM1 ITEM2)
617
+ items.each do |tgt_pkt, items|
618
+ Packet::RESERVED_ITEM_NAMES.each do |item|
619
+ expect(strings).to include("#{tgt_pkt} #{item}")
620
+ end
621
+ items.each do |item|
622
+ expect(strings).to include("#{tgt_pkt} #{item}")
623
+ end
624
+ end
625
+ end
626
+ end
627
+
599
628
  end
600
629
  end
601
-
@@ -148,6 +148,10 @@ module Cosmos
148
148
  expect(extract_fields_from_check_text("TARGET PACKET ITEM < 5")).to eql(['TARGET', 'PACKET', 'ITEM', '< 5'])
149
149
  end
150
150
 
151
+ it "should support target packet items named the same" do
152
+ expect(extract_fields_from_check_text("TEST TEST TEST == 5")).to eql(['TEST', 'TEST', 'TEST', '== 5'])
153
+ end
154
+
151
155
  it "should complain about trying to do an = comparison" do
152
156
  expect { extract_fields_from_check_text("TARGET PACKET ITEM = 5") }.to raise_error(/ERROR: Use/)
153
157
  end
@@ -160,4 +164,3 @@ module Cosmos
160
164
 
161
165
  end
162
166
  end
163
-
@@ -45,7 +45,7 @@ module Cosmos
45
45
  describe "instance" do
46
46
  it "creates default ports" do
47
47
  # Don't check the actual port numbers but just that they exist
48
- expect(System.ports.keys).to eql %w(CTS_API TLMVIEWER_API CTS_PREIDENTIFIED CTS_CMD_ROUTER REPLAY_API REPLAY_PREIDENTIFIED REPLAY_CMD_ROUTER DART_DECOM DART_STREAM)
48
+ expect(System.ports.keys).to eql %w(CTS_API TLMVIEWER_API CTS_PREIDENTIFIED CTS_CMD_ROUTER REPLAY_API REPLAY_PREIDENTIFIED REPLAY_CMD_ROUTER DART_STREAM DART_DECOM DART_MASTER)
49
49
  end
50
50
 
51
51
  it "creates default paths" do
@@ -349,7 +349,7 @@ module Cosmos
349
349
  # Try loading something that doesn't exist
350
350
  # It should fail and reload the original configuration
351
351
  name, err = System.load_configuration("BLAH")
352
- expect(err).to eql nil
352
+ expect(err.message).to eql "Unable to find configuration: BLAH"
353
353
  expect(name).to eql original_config_name
354
354
 
355
355
  # Now load the second configuration. It shouldn't have the most
@@ -359,7 +359,7 @@ module Cosmos
359
359
  expect(System.telemetry.packets('SYSTEM').keys).not_to include "TEST2"
360
360
 
361
361
  # Now remove system.txt from the third configuration and try to load it again to cause an error
362
- #third_config_path = System.instance.send(:find_configuration, third_config_name)
362
+ #third_config_path = System.instance.public_send(:find_configuration, third_config_name)
363
363
  #FileUtils.mv File.join(third_config_path, 'system.txt'), File.join(third_config_path, 'system2.txt')
364
364
  #result, err = System.load_configuration(third_config_name)
365
365
  #expect(result).to eql original_config_name
@@ -703,6 +703,114 @@ module Cosmos
703
703
  end
704
704
  end
705
705
 
706
+ context "with ALLOW_ROUTER_COMMANDING" do
707
+ it "takes 0 parameters" do
708
+ tf = Tempfile.new('unittest')
709
+ tf.puts("ALLOW_ROUTER_COMMANDING BLAH TRUE")
710
+ tf.close
711
+ expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, /Too many parameters for ALLOW_ROUTER_COMMANDING./)
712
+ tf.unlink
713
+ end
714
+
715
+ it "allows router commanding" do
716
+ tf = Tempfile.new('unittest')
717
+ tf.puts("ALLOW_ROUTER_COMMANDING")
718
+ tf.close
719
+ expect(System.allow_router_commanding).to be false
720
+ System.instance.process_file(tf.path)
721
+ expect(System.allow_router_commanding).to be true
722
+ tf.unlink
723
+ end
724
+
725
+ it "it disallows router commanding if not present" do
726
+ tf = Tempfile.new('unittest')
727
+
728
+ tf.close
729
+ expect(System.allow_router_commanding).to be false
730
+ System.instance.process_file(tf.path)
731
+ expect(System.allow_router_commanding).to be false
732
+ tf.unlink
733
+ end
734
+ end
735
+
736
+ context "with X_CSRF_TOKEN" do
737
+ it "takes 1 parameters" do
738
+ tf = Tempfile.new('unittest')
739
+ tf.puts("X_CSRF_TOKEN")
740
+ tf.close
741
+ expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, /Not enough parameters for X_CSRF_TOKEN./)
742
+ tf.unlink
743
+
744
+ tf = Tempfile.new('unittest')
745
+ tf.puts("X_CSRF_TOKEN localhost true")
746
+ tf.close
747
+ expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, /Too many parameters for X_CSRF_TOKEN./)
748
+ tf.unlink
749
+ end
750
+
751
+ it "updates the CSRF token" do
752
+ tf = Tempfile.new('unittest')
753
+ tf.puts("X_CSRF_TOKEN ExtraSpecial")
754
+ tf.close
755
+ expect(System.x_csrf_token).to eql "SuperSecret"
756
+ System.instance.process_file(tf.path)
757
+ expect(System.x_csrf_token).to eql "ExtraSpecial"
758
+ tf.unlink
759
+ end
760
+ end
761
+
762
+ context "with ALLOW_HOST" do
763
+ it "takes 1 parameters" do
764
+ tf = Tempfile.new('unittest')
765
+ tf.puts("ALLOW_HOST")
766
+ tf.close
767
+ expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, /Not enough parameters for ALLOW_HOST./)
768
+ tf.unlink
769
+
770
+ tf = Tempfile.new('unittest')
771
+ tf.puts("ALLOW_HOST localhost true")
772
+ tf.close
773
+ expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, /Too many parameters for ALLOW_HOST./)
774
+ tf.unlink
775
+ end
776
+
777
+ it "adds to allowed hosts" do
778
+ tf = Tempfile.new('unittest')
779
+ tf.puts("ALLOW_HOST 1.2.3.4:8888")
780
+ tf.close
781
+ expect(System.allowed_hosts).to_not include("1.2.3.4:8888")
782
+ System.instance.process_file(tf.path)
783
+ expect(System.allowed_hosts).to include("1.2.3.4:8888")
784
+ tf.unlink
785
+ end
786
+ end
787
+
788
+ context "with ALLOW_ORIGIN" do
789
+ it "takes 1 parameters" do
790
+ tf = Tempfile.new('unittest')
791
+ tf.puts("ALLOW_ORIGIN")
792
+ tf.close
793
+ expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, /Not enough parameters for ALLOW_ORIGIN./)
794
+ tf.unlink
795
+
796
+ tf = Tempfile.new('unittest')
797
+ tf.puts("ALLOW_ORIGIN localhost true")
798
+ tf.close
799
+ expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, /Too many parameters for ALLOW_ORIGIN./)
800
+ tf.unlink
801
+ end
802
+
803
+ it "adds to allowed origins" do
804
+ tf = Tempfile.new('unittest')
805
+ tf.puts("ALLOW_ORIGIN 1.2.3.4:8888")
806
+ tf.close
807
+ expect(System.allowed_origins).to_not include("1.2.3.4:8888")
808
+ System.instance.process_file(tf.path)
809
+ expect(System.allowed_origins).to include("1.2.3.4:8888")
810
+ tf.unlink
811
+ end
812
+ end
813
+
706
814
  context "with ALLOW_ACCESS" do
707
815
  it "takes 1 parameters" do
708
816
  tf = Tempfile.new('unittest')