cosmos 4.1.1-java → 4.2.0-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (336) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -2
  3. data/.travis.yml +2 -0
  4. data/.yardopts +1 -0
  5. data/Gemfile +1 -0
  6. data/Manifest.txt +130 -0
  7. data/autohotkey/tools/ConfigEditorAHK +19 -0
  8. data/autohotkey/tools/cmd_extractor.ahk +4 -4
  9. data/autohotkey/tools/cmd_sequence.ahk +9 -5
  10. data/autohotkey/tools/config_editor.ahk +197 -0
  11. data/autohotkey/tools/packet_viewer.ahk +12 -6
  12. data/autohotkey/tools/replay.ahk +29 -29
  13. data/autohotkey/tools/script_runner.ahk +10 -2
  14. data/autohotkey/tools/tlm_extractor.ahk +7 -8
  15. data/autohotkey/tools/tlm_grapher.ahk +21 -9
  16. data/bin/dart_import +2 -0
  17. data/cosmos.gemspec +18 -16
  18. data/data/config/cmd_tlm_server.yaml +9 -0
  19. data/data/config/interface_modifiers.yaml +17 -0
  20. data/data/config/item_modifiers.yaml +3 -3
  21. data/data/crc.txt +184 -90
  22. data/data/dart.png +0 -0
  23. data/demo/Gemfile +1 -0
  24. data/demo/Rakefile +4 -0
  25. data/demo/config/dart/Gemfile +54 -0
  26. data/demo/config/data/crc.txt +28 -21
  27. data/demo/config/system/system.txt +3 -0
  28. data/demo/config/system/system2.txt +3 -0
  29. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +3 -3
  30. data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +1 -1
  31. data/demo/config/targets/INST/lib/sim_inst.rb +1 -1
  32. data/demo/config/targets/INST/screens/adcs.txt +2 -1
  33. data/demo/config/targets/INST/screens/array.txt +1 -1
  34. data/demo/config/targets/INST/screens/block.txt +1 -1
  35. data/demo/config/targets/INST/screens/commanding.txt +7 -2
  36. data/demo/config/targets/INST/screens/graphs.txt +1 -1
  37. data/demo/config/targets/INST/screens/ground.txt +1 -1
  38. data/demo/config/targets/INST/screens/hs.txt +2 -1
  39. data/demo/config/targets/INST/screens/latest.txt +1 -1
  40. data/demo/config/targets/INST/screens/limits.txt +1 -1
  41. data/demo/config/targets/INST/screens/other.txt +1 -1
  42. data/demo/config/targets/INST/screens/tabs.txt +1 -1
  43. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
  44. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +3 -1
  45. data/demo/config/tools/launcher/launcher.txt +3 -2
  46. data/demo/tools/Dart +16 -0
  47. data/demo/tools/Dart.bat +9 -0
  48. data/demo/tools/mac/CmdSequence.app/Contents/MacOS/main.sh +0 -0
  49. data/demo/tools/mac/ConfigEditor.app/Contents/MacOS/main.sh +0 -0
  50. data/install/Gemfile +1 -0
  51. data/install/Rakefile +4 -0
  52. data/install/config/dart/Gemfile +54 -0
  53. data/install/config/data/crc.txt +6 -3
  54. data/install/config/system/system.txt +3 -0
  55. data/install/config/tools/launcher/launcher.txt +3 -2
  56. data/install/tools/Dart +16 -0
  57. data/install/tools/Dart.bat +9 -0
  58. data/install/tools/mac/CmdSequence.app/Contents/MacOS/main.sh +0 -0
  59. data/install/tools/mac/ConfigEditor.app/Contents/MacOS/main.sh +0 -0
  60. data/lib/cosmos/core_ext/time.rb +8 -8
  61. data/lib/cosmos/dart/.rspec +1 -0
  62. data/lib/cosmos/dart/Gemfile +69 -0
  63. data/lib/cosmos/dart/Rakefile +7 -0
  64. data/lib/cosmos/dart/app/assets/config/manifest.js +4 -0
  65. data/lib/cosmos/dart/app/assets/images/.keep +0 -0
  66. data/lib/cosmos/dart/app/assets/javascripts/application.js +13 -0
  67. data/lib/cosmos/dart/app/assets/javascripts/cable.js +13 -0
  68. data/lib/cosmos/dart/app/assets/stylesheets/application.css.scss +15 -0
  69. data/lib/cosmos/dart/app/channels/application_cable/channel.rb +4 -0
  70. data/lib/cosmos/dart/app/channels/application_cable/connection.rb +4 -0
  71. data/lib/cosmos/dart/app/controllers/application_controller.rb +3 -0
  72. data/lib/cosmos/dart/app/helpers/application_helper.rb +2 -0
  73. data/lib/cosmos/dart/app/jobs/application_job.rb +2 -0
  74. data/lib/cosmos/dart/app/mailers/application_mailer.rb +4 -0
  75. data/lib/cosmos/dart/app/models/application_record.rb +3 -0
  76. data/lib/cosmos/dart/app/models/item.rb +6 -0
  77. data/lib/cosmos/dart/app/models/item_to_decom_table_mapping.rb +9 -0
  78. data/lib/cosmos/dart/app/models/packet.rb +4 -0
  79. data/lib/cosmos/dart/app/models/packet_config.rb +7 -0
  80. data/lib/cosmos/dart/app/models/packet_log.rb +3 -0
  81. data/lib/cosmos/dart/app/models/packet_log_entry.rb +41 -0
  82. data/lib/cosmos/dart/app/models/system_config.rb +2 -0
  83. data/lib/cosmos/dart/app/models/target.rb +4 -0
  84. data/lib/cosmos/dart/app/views/layouts/application.html.erb +14 -0
  85. data/lib/cosmos/dart/app/views/layouts/mailer.html.erb +13 -0
  86. data/lib/cosmos/dart/app/views/layouts/mailer.text.erb +1 -0
  87. data/lib/cosmos/dart/bin/bundle +3 -0
  88. data/lib/cosmos/dart/bin/rails +4 -0
  89. data/lib/cosmos/dart/bin/rake +4 -0
  90. data/lib/cosmos/dart/bin/setup +34 -0
  91. data/lib/cosmos/dart/bin/update +29 -0
  92. data/lib/cosmos/dart/config.ru +5 -0
  93. data/lib/cosmos/dart/config/application.rb +29 -0
  94. data/lib/cosmos/dart/config/boot.rb +3 -0
  95. data/lib/cosmos/dart/config/cable.yml +9 -0
  96. data/lib/cosmos/dart/config/database.yml +23 -0
  97. data/lib/cosmos/dart/config/environment.rb +5 -0
  98. data/lib/cosmos/dart/config/environments/development.rb +62 -0
  99. data/lib/cosmos/dart/config/environments/production.rb +84 -0
  100. data/lib/cosmos/dart/config/environments/test.rb +42 -0
  101. data/lib/cosmos/dart/config/initializers/application_controller_renderer.rb +6 -0
  102. data/lib/cosmos/dart/config/initializers/assets.rb +12 -0
  103. data/lib/cosmos/dart/config/initializers/backtrace_silencers.rb +7 -0
  104. data/lib/cosmos/dart/config/initializers/cookies_serializer.rb +5 -0
  105. data/lib/cosmos/dart/config/initializers/filter_parameter_logging.rb +4 -0
  106. data/lib/cosmos/dart/config/initializers/inflections.rb +16 -0
  107. data/lib/cosmos/dart/config/initializers/mime_types.rb +4 -0
  108. data/lib/cosmos/dart/config/initializers/new_framework_defaults.rb +25 -0
  109. data/lib/cosmos/dart/config/initializers/session_store.rb +3 -0
  110. data/lib/cosmos/dart/config/initializers/wrap_parameters.rb +14 -0
  111. data/lib/cosmos/dart/config/locales/en.yml +23 -0
  112. data/lib/cosmos/dart/config/puma.rb +47 -0
  113. data/lib/cosmos/dart/config/routes.rb +3 -0
  114. data/lib/cosmos/dart/config/secrets.yml +22 -0
  115. data/lib/cosmos/dart/db/migrate/20170406172907_create_targets.rb +8 -0
  116. data/lib/cosmos/dart/db/migrate/20170406172927_create_packets.rb +10 -0
  117. data/lib/cosmos/dart/db/migrate/20170406172937_create_packet_logs.rb +9 -0
  118. data/lib/cosmos/dart/db/migrate/20170406172943_create_packet_log_entries.rb +16 -0
  119. data/lib/cosmos/dart/db/migrate/20170406183500_change_packet_log_entries_primary_key.rb +5 -0
  120. data/lib/cosmos/dart/db/migrate/20170407153618_add_unique_requirements.rb +7 -0
  121. data/lib/cosmos/dart/db/migrate/20170511155447_add_meta_id_to_packet_log_entries.rb +6 -0
  122. data/lib/cosmos/dart/db/migrate/20170523185056_rename_received_time_and_add_is_tlm_to_packet_log_entries.rb +7 -0
  123. data/lib/cosmos/dart/db/migrate/20170525201157_create_items.rb +10 -0
  124. data/lib/cosmos/dart/db/migrate/20170525201315_create_system_configs.rb +9 -0
  125. data/lib/cosmos/dart/db/migrate/20170525201624_create_packet_configs.rb +11 -0
  126. data/lib/cosmos/dart/db/migrate/20170525201745_create_item_to_decom_table_mappings.rb +12 -0
  127. data/lib/cosmos/dart/db/migrate/20170525201939_create_decom_tables.rb +12 -0
  128. data/lib/cosmos/dart/db/migrate/20170525202051_add_decom_state_to_packet_log_entry.rb +5 -0
  129. data/lib/cosmos/dart/db/migrate/20170913160409_update_items.rb +6 -0
  130. data/lib/cosmos/dart/db/migrate/20170913160558_update_item_to_decom_table_mapping.rb +11 -0
  131. data/lib/cosmos/dart/db/migrate/20170913160916_udpate_decom_table.rb +6 -0
  132. data/lib/cosmos/dart/db/migrate/20170913212026_add_ready_to_packet_configs.rb +5 -0
  133. data/lib/cosmos/dart/db/migrate/20170913223556_modify_tables.rb +9 -0
  134. data/lib/cosmos/dart/db/migrate/20170914215744_modify_mapping_table.rb +6 -0
  135. data/lib/cosmos/dart/db/migrate/20170919201433_add_system_config_id_to_packet_config.rb +11 -0
  136. data/lib/cosmos/dart/db/migrate/20170919210307_add_max_table_index_to_packet_configs.rb +5 -0
  137. data/lib/cosmos/dart/db/migrate/20171215225546_add_ready_to_packet_log_entries.rb +5 -0
  138. data/lib/cosmos/dart/db/migrate/20180116214338_add_index_for_ple_ready_to_packet_log_entries.rb +5 -0
  139. data/lib/cosmos/dart/db/schema.rb +103 -0
  140. data/lib/cosmos/dart/db/seeds.rb +7 -0
  141. data/lib/cosmos/dart/examples/dart_decom_client.rb +45 -0
  142. data/lib/cosmos/dart/examples/dart_stream_client.rb +93 -0
  143. data/lib/cosmos/dart/lib/dart_common.rb +749 -0
  144. data/lib/cosmos/dart/lib/dart_database_cleaner.rb +172 -0
  145. data/lib/cosmos/dart/lib/dart_decom_query.rb +184 -0
  146. data/lib/cosmos/dart/lib/dart_decommutator.rb +235 -0
  147. data/lib/cosmos/dart/lib/dart_importer.rb +154 -0
  148. data/lib/cosmos/dart/lib/dart_logging.rb +50 -0
  149. data/lib/cosmos/dart/lib/dart_packet_log_writer.rb +139 -0
  150. data/lib/cosmos/dart/lib/dart_reducer_manager.rb +85 -0
  151. data/lib/cosmos/dart/lib/dart_reducer_worker_thread.rb +263 -0
  152. data/lib/cosmos/dart/lib/dart_tcpip_server_interface.rb +142 -0
  153. data/lib/cosmos/dart/processes/dart.rb +145 -0
  154. data/lib/cosmos/dart/processes/dart_decom_server.rb +39 -0
  155. data/lib/cosmos/dart/processes/dart_import.rb +63 -0
  156. data/lib/cosmos/dart/processes/dart_ingester.rb +92 -0
  157. data/lib/cosmos/dart/processes/dart_reducer.rb +27 -0
  158. data/lib/cosmos/dart/processes/dart_stream_server.rb +31 -0
  159. data/lib/cosmos/dart/processes/dart_worker.rb +37 -0
  160. data/lib/cosmos/dart/spec/dart/dart_common_spec.rb +333 -0
  161. data/lib/cosmos/dart/spec/dart/dart_database_cleaner_spec.rb +455 -0
  162. data/lib/cosmos/dart/spec/dart/dart_decom_query_spec.rb +153 -0
  163. data/lib/cosmos/dart/spec/dart/dart_decommutator_spec.rb +336 -0
  164. data/lib/cosmos/dart/spec/dart/dart_importer_spec.rb +83 -0
  165. data/lib/cosmos/dart/spec/dart/dart_logging_spec.rb +30 -0
  166. data/lib/cosmos/dart/spec/dart/dart_packet_log_writer_spec.rb +149 -0
  167. data/lib/cosmos/dart/spec/dart/dart_reducer_manager_spec.rb +289 -0
  168. data/lib/cosmos/dart/spec/dart/dart_tcpip_server_interface_spec.rb +241 -0
  169. data/lib/cosmos/dart/spec/rails_helper.rb +60 -0
  170. data/lib/cosmos/dart/spec/spec_helper.rb +139 -0
  171. data/lib/cosmos/gui/dialogs/about_dialog.rb +1 -1
  172. data/lib/cosmos/gui/dialogs/dart_dialog.rb +60 -0
  173. data/lib/cosmos/gui/dialogs/legal_dialog.rb +1 -0
  174. data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +0 -3
  175. data/lib/cosmos/gui/qt.rb +10 -1
  176. data/lib/cosmos/gui/text/completion.rb +10 -9
  177. data/lib/cosmos/gui/text/completion_text_edit.rb +16 -14
  178. data/lib/cosmos/gui/text/ruby_editor.rb +2 -2
  179. data/lib/cosmos/gui/widgets/dart_frame.rb +142 -0
  180. data/lib/cosmos/gui/widgets/dart_meta_frame.rb +119 -0
  181. data/lib/cosmos/gui/widgets/packet_log_frame.rb +42 -12
  182. data/lib/cosmos/interfaces/interface.rb +1 -2
  183. data/lib/cosmos/interfaces/protocols/crc_protocol.rb +26 -8
  184. data/lib/cosmos/interfaces/protocols/fixed_protocol.rb +8 -2
  185. data/lib/cosmos/interfaces/protocols/protocol.rb +2 -1
  186. data/lib/cosmos/interfaces/protocols/template_protocol.rb +1 -1
  187. data/lib/cosmos/interfaces/stream_interface.rb +1 -0
  188. data/lib/cosmos/interfaces/tcpip_server_interface.rb +2 -3
  189. data/lib/cosmos/io/json_drb_object.rb +1 -1
  190. data/lib/cosmos/io/json_rpc.rb +2 -1
  191. data/lib/cosmos/io/win32_serial_driver.rb +2 -9
  192. data/lib/cosmos/packet_logs/packet_log_writer.rb +1 -1
  193. data/lib/cosmos/packets/packet.rb +22 -12
  194. data/lib/cosmos/packets/packet_config.rb +2 -1
  195. data/lib/cosmos/packets/packet_item.rb +26 -24
  196. data/lib/cosmos/packets/parsers/macro_parser.rb +5 -2
  197. data/lib/cosmos/packets/parsers/packet_item_parser.rb +35 -17
  198. data/lib/cosmos/packets/parsers/packet_parser.rb +3 -10
  199. data/lib/cosmos/packets/parsers/xtce_converter.rb +21 -35
  200. data/lib/cosmos/packets/parsers/xtce_parser.rb +54 -46
  201. data/lib/cosmos/packets/structure.rb +10 -2
  202. data/lib/cosmos/packets/structure_item.rb +22 -8
  203. data/lib/cosmos/processors/statistics_processor.rb +2 -0
  204. data/lib/cosmos/script/api_shared.rb +13 -12
  205. data/lib/cosmos/script/cmd_tlm_server.rb +4 -0
  206. data/lib/cosmos/script/commands.rb +3 -15
  207. data/lib/cosmos/script/script.rb +69 -23
  208. data/lib/cosmos/streams/tcpip_client_stream.rb +2 -2
  209. data/lib/cosmos/system/system.rb +42 -25
  210. data/lib/cosmos/system/target.rb +6 -2
  211. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +177 -36
  212. data/lib/cosmos/tools/cmd_sender/cmd_param_table_item_delegate.rb +3 -2
  213. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +34 -8
  214. data/lib/cosmos/tools/cmd_sequence/cmd_sequence.rb +80 -25
  215. data/lib/cosmos/tools/cmd_tlm_server/api.rb +19 -4
  216. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +15 -14
  217. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +15 -9
  218. data/lib/cosmos/tools/cmd_tlm_server/gui/interfaces_tab.rb +1 -9
  219. data/lib/cosmos/tools/cmd_tlm_server/gui/logging_tab.rb +1 -6
  220. data/lib/cosmos/tools/cmd_tlm_server/gui/packets_tab.rb +1 -3
  221. data/lib/cosmos/tools/cmd_tlm_server/gui/replay_tab.rb +84 -7
  222. data/lib/cosmos/tools/cmd_tlm_server/gui/status_tab.rb +0 -1
  223. data/lib/cosmos/tools/cmd_tlm_server/gui/targets_tab.rb +1 -5
  224. data/lib/cosmos/tools/cmd_tlm_server/limits_groups_background_task.rb +3 -2
  225. data/lib/cosmos/tools/cmd_tlm_server/replay_backend.rb +159 -27
  226. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +1 -1
  227. data/lib/cosmos/tools/config_editor/config_editor.rb +17 -52
  228. data/lib/cosmos/tools/config_editor/config_editor_frame.rb +0 -5
  229. data/lib/cosmos/tools/data_viewer/data_viewer.rb +111 -0
  230. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +31 -18
  231. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +12 -3
  232. data/lib/cosmos/tools/script_runner/script_runner.rb +27 -14
  233. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +104 -37
  234. data/lib/cosmos/tools/table_manager/table_config.rb +1 -1
  235. data/lib/cosmos/tools/table_manager/table_item_parser.rb +4 -2
  236. data/lib/cosmos/tools/table_manager/table_manager.rb +0 -5
  237. data/lib/cosmos/tools/table_manager/table_manager_core.rb +0 -1
  238. data/lib/cosmos/tools/test_runner/test.rb +1 -3
  239. data/lib/cosmos/tools/test_runner/test_runner.rb +26 -15
  240. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +290 -137
  241. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +122 -25
  242. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +67 -0
  243. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +28 -0
  244. data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +36 -0
  245. data/lib/cosmos/tools/tlm_grapher/data_objects/data_object.rb +42 -3
  246. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +88 -14
  247. data/lib/cosmos/tools/tlm_grapher/data_objects/linegraph_data_object.rb +2 -5
  248. data/lib/cosmos/tools/tlm_grapher/data_objects/singlexy_data_object.rb +2 -6
  249. data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +74 -18
  250. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +3 -7
  251. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_dart_thread.rb +159 -0
  252. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +49 -2
  253. data/lib/cosmos/tools/tlm_viewer/screen.rb +3 -0
  254. data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +0 -2
  255. data/lib/cosmos/tools/tlm_viewer/widgets.rb +1 -0
  256. data/lib/cosmos/tools/tlm_viewer/widgets/backgroundbutton_widget.rb +54 -0
  257. data/lib/cosmos/tools/tlm_viewer/widgets/button_widget.rb +5 -5
  258. data/lib/cosmos/top_level.rb +1 -0
  259. data/lib/cosmos/utilities/crc.rb +3 -0
  260. data/lib/cosmos/utilities/csv.rb +1 -0
  261. data/lib/cosmos/utilities/message_log.rb +2 -1
  262. data/lib/cosmos/utilities/simulated_target.rb +8 -8
  263. data/lib/cosmos/version.rb +5 -5
  264. data/lib/cosmos/win32/win32.rb +4 -10
  265. data/run_gui_tests.bat +2 -1
  266. data/spec/config/config_parser_spec.rb +4 -4
  267. data/spec/core_ext/array_spec.rb +1 -1
  268. data/spec/core_ext/exception_spec.rb +12 -12
  269. data/spec/core_ext/file_spec.rb +6 -6
  270. data/spec/core_ext/hash_spec.rb +1 -1
  271. data/spec/core_ext/socket_spec.rb +2 -2
  272. data/spec/core_ext/string_spec.rb +13 -13
  273. data/spec/core_ext/time_spec.rb +0 -2
  274. data/spec/gui/utilities/script_module_gui_spec.rb +3 -3
  275. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +6 -6
  276. data/spec/install/config/tools/cmd_tlm_server/cmd_tlm_server.txt +4 -0
  277. data/spec/interfaces/cmd_tlm_server_interface_spec.rb +6 -2
  278. data/spec/interfaces/interface_spec.rb +0 -1
  279. data/spec/interfaces/linc_interface_spec.rb +0 -5
  280. data/spec/interfaces/protocols/crc_protocol_spec.rb +201 -85
  281. data/spec/interfaces/protocols/fixed_protocol_spec.rb +33 -9
  282. data/spec/interfaces/protocols/length_protocol_spec.rb +1 -1
  283. data/spec/interfaces/protocols/override_protocol_spec.rb +6 -2
  284. data/spec/interfaces/protocols/preidentified_protocol_spec.rb +1 -5
  285. data/spec/interfaces/protocols/template_protocol_spec.rb +0 -1
  286. data/spec/interfaces/simulated_target_interface_spec.rb +5 -5
  287. data/spec/interfaces/udp_interface_spec.rb +2 -4
  288. data/spec/io/buffered_file_spec.rb +8 -12
  289. data/spec/io/json_drb_spec.rb +9 -9
  290. data/spec/io/json_rpc_spec.rb +4 -4
  291. data/spec/io/raw_logger_spec.rb +4 -3
  292. data/spec/packet_logs/packet_log_reader_spec.rb +3 -6
  293. data/spec/packet_logs/packet_log_writer_spec.rb +4 -4
  294. data/spec/packets/binary_accessor_spec.rb +5 -8
  295. data/spec/packets/commands_spec.rb +2 -2
  296. data/spec/packets/limits_spec.rb +2 -2
  297. data/spec/packets/packet_config_spec.rb +12 -0
  298. data/spec/packets/packet_item_limits_spec.rb +1 -1
  299. data/spec/packets/packet_item_spec.rb +9 -9
  300. data/spec/packets/packet_spec.rb +15 -5
  301. data/spec/packets/parsers/packet_item_parser_spec.rb +27 -0
  302. data/spec/packets/parsers/xtce_parser_spec.rb +27 -30
  303. data/spec/packets/structure_spec.rb +2 -1
  304. data/spec/packets/telemetry_spec.rb +3 -5
  305. data/spec/processors/statistics_processor_spec.rb +35 -0
  306. data/spec/script/cmd_tlm_server_spec.rb +4 -21
  307. data/spec/script/commands_disconnect_spec.rb +46 -58
  308. data/spec/script/commands_spec.rb +40 -61
  309. data/spec/script/limits_spec.rb +1 -21
  310. data/spec/script/script_spec.rb +32 -41
  311. data/spec/script/scripting_spec.rb +166 -185
  312. data/spec/script/telemetry_spec.rb +10 -5
  313. data/spec/script/tools_spec.rb +2 -24
  314. data/spec/spec_helper.rb +11 -5
  315. data/spec/system/system_spec.rb +17 -12
  316. data/spec/tools/cmd_tlm_server/api_spec.rb +21 -10
  317. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +15 -16
  318. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +0 -1
  319. data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +16 -27
  320. data/spec/tools/cmd_tlm_server/commanding_spec.rb +2 -6
  321. data/spec/tools/cmd_tlm_server/connections_spec.rb +0 -4
  322. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +13 -13
  323. data/spec/tools/cmd_tlm_server/interfaces_spec.rb +5 -9
  324. data/spec/tools/cmd_tlm_server/limits_groups_background_task_spec.rb +11 -3
  325. data/spec/tools/cmd_tlm_server/packet_logging_spec.rb +0 -4
  326. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +5 -5
  327. data/spec/tools/cmd_tlm_server/routers_spec.rb +5 -9
  328. data/spec/tools/table_manager/table_config_spec.rb +0 -1
  329. data/spec/tools/table_manager/tablemanager_core_spec.rb +23 -23
  330. data/spec/tools/tlm_viewer/tlm_viewer_config_spec.rb +6 -4
  331. data/spec/top_level/top_level_spec.rb +9 -9
  332. data/spec/utilities/csv_spec.rb +2 -12
  333. data/spec/utilities/logger_spec.rb +6 -6
  334. data/spec/utilities/message_log_spec.rb +3 -11
  335. data/tasks/gemfile_stats.rake +2 -2
  336. metadata +167 -60
@@ -10,13 +10,17 @@
10
10
 
11
11
  require 'spec_helper'
12
12
  require 'cosmos'
13
- require 'cosmos/script/script'
13
+ require 'cosmos/script'
14
14
  require 'tempfile'
15
15
 
16
16
  module Cosmos
17
17
  describe Script do
18
18
  before(:all) do
19
+ # Save cmd_tlm_server.txt
19
20
  @cts = File.join(Cosmos::USERPATH,'config','tools','cmd_tlm_server','cmd_tlm_server.txt')
21
+ FileUtils.mv @cts, Cosmos::USERPATH
22
+
23
+ # Recreate cmd_tlm_server.txt with a PROTOCOL
20
24
  FileUtils.mkdir_p(File.dirname(@cts))
21
25
  File.open(@cts,'w') do |file|
22
26
  file.puts 'INTERFACE INST_INT interface.rb'
@@ -28,8 +32,10 @@ module Cosmos
28
32
  end
29
33
 
30
34
  after(:all) do
31
- clean_config()
32
- FileUtils.rm_rf File.join(Cosmos::USERPATH,'config','tools')
35
+ # Restore cmd_tlm_server.txt
36
+ FileUtils.mv File.join(Cosmos::USERPATH, 'cmd_tlm_server.txt'),
37
+ File.join(Cosmos::USERPATH,'config','tools','cmd_tlm_server')
38
+ System.class_eval('@@instance = nil')
33
39
  end
34
40
 
35
41
  before(:each) do
@@ -163,11 +169,10 @@ module Cosmos
163
169
 
164
170
  it "subscribes and gets packets" do
165
171
  id = subscribe_packet_data([["SYSTEM","META"]])
166
- inject_tlm("SYSTEM", "META")
167
172
  packet = get_packet(id)
173
+ inject_tlm("SYSTEM", "META")
168
174
  expect(packet.target_name).to eql "SYSTEM"
169
175
  expect(packet.packet_name).to eql "META"
170
- expect(packet.received_time).to be_within(1).of Time.now
171
176
  expect(packet.received_count).to eql 0
172
177
  packet = get_packet(id)
173
178
  expect(packet.target_name).to eql "SYSTEM"
@@ -10,30 +10,11 @@
10
10
 
11
11
  require 'spec_helper'
12
12
  require 'cosmos'
13
- require 'cosmos/script/script'
13
+ require 'cosmos/script'
14
14
  require 'tempfile'
15
15
 
16
16
  module Cosmos
17
-
18
17
  describe Script do
19
-
20
- before(:all) do
21
- cts = File.join(Cosmos::USERPATH,'config','tools','cmd_tlm_server','cmd_tlm_server.txt')
22
- FileUtils.mkdir_p(File.dirname(cts))
23
- File.open(cts,'w') do |file|
24
- file.puts 'INTERFACE INST_INT interface.rb'
25
- file.puts 'TARGET INST'
26
- end
27
- System.class_eval('@@instance = nil')
28
-
29
- require 'cosmos/script'
30
- end
31
-
32
- after(:all) do
33
- clean_config()
34
- FileUtils.rm_rf File.join(Cosmos::USERPATH,'config','tools')
35
- end
36
-
37
18
  before(:each) do
38
19
  allow_any_instance_of(Interface).to receive(:connected?).and_return(true)
39
20
  allow_any_instance_of(Interface).to receive(:disconnect)
@@ -118,9 +99,7 @@ module Cosmos
118
99
  get_line_delay
119
100
  get_scriptrunner_message_log_filename
120
101
  start_new_scriptrunner_message_log
121
- disable_instrumentation do
122
- value = 1
123
- end
102
+ disable_instrumentation { }
124
103
  set_stdout_max_lines(1000)
125
104
  insert_return
126
105
  step_mode
@@ -131,4 +110,3 @@ module Cosmos
131
110
 
132
111
  end
133
112
  end
134
-
@@ -38,10 +38,13 @@ if !ENV['COSMOS_NO_SIMPLECOV']
38
38
  add_group 'GUI', 'gui'
39
39
  add_group 'Tools', 'tools'
40
40
  root = File.dirname(__FILE__)
41
+ root.to_s
41
42
  end
42
43
  SimpleCov.at_exit do
43
- Encoding.default_external = Encoding::UTF_8
44
- Encoding.default_internal = nil
44
+ Cosmos.disable_warnings do
45
+ Encoding.default_external = Encoding::UTF_8
46
+ Encoding.default_internal = nil
47
+ end
45
48
  SimpleCov.result.format!
46
49
  end
47
50
  end
@@ -73,8 +76,11 @@ RSpec.configure do |config|
73
76
  end
74
77
 
75
78
  config.after(:all) {
76
- def Object.exit(*args)
77
- old_exit(*args)
79
+ clean_config()
80
+ Cosmos.disable_warnings do
81
+ def Object.exit(*args)
82
+ old_exit(*args)
83
+ end
78
84
  end
79
85
  }
80
86
 
@@ -101,7 +107,7 @@ end
101
107
 
102
108
  # Clean up the spec configuration directory
103
109
  def clean_config
104
- %w(outputs/logs outputs/saved_config outputs/tmp outputs/tables outputs/handbooks).each do |dir|
110
+ %w(outputs/logs outputs/saved_config outputs/tmp outputs/tables outputs/handbooks procedures).each do |dir|
105
111
  FileUtils.rm_rf(Dir.glob(File.join(Cosmos::USERPATH, dir, '*')))
106
112
  end
107
113
  end
@@ -34,6 +34,7 @@ module Cosmos
34
34
  # Restore system.txt
35
35
  FileUtils.mv File.join(Cosmos::USERPATH, 'system.txt'),
36
36
  File.join(Cosmos::USERPATH,'config','system')
37
+ System.class_eval('@@instance = nil')
37
38
  end
38
39
 
39
40
  after(:each) do
@@ -44,12 +45,12 @@ module Cosmos
44
45
  describe "instance" do
45
46
  it "creates default ports" do
46
47
  # Don't check the actual port numbers but just that they exist
47
- expect(System.ports.keys).to eql %w(CTS_API TLMVIEWER_API CTS_PREIDENTIFIED CTS_CMD_ROUTER REPLAY_API REPLAY_PREIDENTIFIED REPLAY_CMD_ROUTER)
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
49
  end
49
50
 
50
51
  it "creates default paths" do
51
52
  # Don't check the actual paths but just that they exist
52
- expect(System.paths.keys).to eql %w(LOGS TMP SAVED_CONFIG TABLES HANDBOOKS PROCEDURES SEQUENCES)
53
+ expect(System.paths.keys).to eql %w(LOGS TMP SAVED_CONFIG TABLES HANDBOOKS PROCEDURES SEQUENCES DART_DATA DART_LOGS)
53
54
  end
54
55
 
55
56
  context "initializing SYSTEM META" do
@@ -67,12 +68,14 @@ module Cosmos
67
68
  expect(tlm.read("COSMOS_VERSION")).to_not be_nil
68
69
  expect(tlm.read("RUBY_VERSION")).to_not be_nil
69
70
  expect(tlm.read("USER_VERSION")).to_not be_nil
71
+ expect(tlm.received_time.to_f).to be_within(1).of(Time.now.to_f)
70
72
  cmd = System.commands.packet("SYSTEM", "META")
71
73
  expect(cmd.read("PKTID")).to eql tlm.read("PKTID")
72
74
  expect(cmd.read("CONFIG")).to eql tlm.read("CONFIG")
73
75
  expect(cmd.read("COSMOS_VERSION")).to eql tlm.read("COSMOS_VERSION")
74
76
  expect(cmd.read("RUBY_VERSION")).to eql tlm.read("RUBY_VERSION")
75
77
  expect(cmd.read("USER_VERSION")).to eql tlm.read("USER_VERSION")
78
+ expect(cmd.received_time.to_f).to be_within(1).of(Time.now.to_f)
76
79
  end
77
80
 
78
81
  it "defaults badly defined TELEMETRY SYSTEM META" do
@@ -94,6 +97,9 @@ module Cosmos
94
97
  System.class_variable_set(:@@instance, nil)
95
98
  System.new(tf.path)
96
99
  tlm = System.telemetry.packet("SYSTEM", "META")
100
+ expect(tlm.read("RECEIVED_TIMESECONDS")).to_not be_nil
101
+ expect(tlm.read("RECEIVED_TIMEFORMATTED")).to_not be_nil
102
+ expect(tlm.read("RECEIVED_COUNT")).to_not be_nil
97
103
  expect(tlm.read("PKTID")).to_not be_nil
98
104
  expect(tlm.read("CONFIG")).to_not be_nil
99
105
  expect(tlm.read("COSMOS_VERSION")).to_not be_nil
@@ -203,7 +209,7 @@ module Cosmos
203
209
  capture_io do |stdout|
204
210
  allow(Zip::File).to receive(:open) { raise "Error" }
205
211
  System.commands
206
- expect(stdout.string).to match "Problem saving configuration"
212
+ expect(stdout.string).to match("Problem saving configuration")
207
213
  end
208
214
  File.open(@config_file, 'w') { |file| file.puts "# Comment" }
209
215
  end
@@ -263,7 +269,7 @@ module Cosmos
263
269
  expect(System.telemetry.target_names).to eql ['INST', 'SYSTEM']
264
270
  expect(System.commands.target_names).to eql ['INST', 'SYSTEM']
265
271
 
266
- expect(stdout.string).to match "Marshal file does not exist"
272
+ expect(stdout.string).to match("Marshal file does not exist")
267
273
 
268
274
  # Reset stdout for another go at the processing
269
275
  stdout.rewind
@@ -273,7 +279,7 @@ module Cosmos
273
279
  expect(System.telemetry.target_names).to eql ['INST', 'SYSTEM']
274
280
  expect(System.commands.target_names).to eql ['INST', 'SYSTEM']
275
281
 
276
- expect(stdout.string).to match "Marshal load success"
282
+ expect(stdout.string).to match("Marshal load success")
277
283
  end
278
284
  end
279
285
 
@@ -283,7 +289,7 @@ module Cosmos
283
289
  # This line actually does the work of reading the configuration
284
290
  expect { System.telemetry.target_names }.to raise_error("ProcessError")
285
291
 
286
- expect(stdout.string).to match "Problem processing"
292
+ expect(stdout.string).to match("Problem processing")
287
293
  end
288
294
  end
289
295
  end
@@ -312,7 +318,7 @@ module Cosmos
312
318
  original_config_name, err = System.load_configuration
313
319
  expect(err).to eql nil
314
320
  expect(System.telemetry.target_names).to eql %w(OVERRIDE SYSTEM)
315
- original_pkts = System.telemetry.packets('SYSTEM').keys
321
+ System.telemetry.packets('SYSTEM').keys
316
322
 
317
323
  # Create a new configuration by writing another telemetry file
318
324
  File.open(File.join(@config_targets,'SYSTEM','cmd_tlm','test1_tlm.txt'),'w') do |file|
@@ -336,10 +342,9 @@ module Cosmos
336
342
  file.puts " APPEND_ITEM DATA 240 STRING"
337
343
  end
338
344
  System.instance.process_file(@config_file)
339
- names = []
340
345
  # Verify the new telemetry packet is there as well as the second one
341
346
  expect(System.telemetry.packets('SYSTEM').keys).to include("TEST1", "TEST2")
342
- third_config_name = System.configuration_name
347
+ #third_config_name = System.configuration_name
343
348
 
344
349
  # Try loading something that doesn't exist
345
350
  # It should fail and reload the original configuration
@@ -529,7 +534,7 @@ module Cosmos
529
534
  tf.close
530
535
  capture_io do |stdout|
531
536
  System.instance.process_file(tf.path)
532
- expect(stdout.string).to match /WARN: Unknown port name given: MYPORT/
537
+ expect(stdout.string).to match(/WARN: Unknown port name given: MYPORT/)
533
538
  end
534
539
  tf.unlink
535
540
  end
@@ -566,7 +571,7 @@ module Cosmos
566
571
  tf.close
567
572
  capture_io do |stdout|
568
573
  System.instance.process_file(tf.path)
569
- expect(stdout.string).to match /WARN: Unknown path name given: MYPATH/
574
+ expect(stdout.string).to match(/WARN: Unknown path name given: MYPATH/)
570
575
  end
571
576
  tf.unlink
572
577
  end
@@ -576,7 +581,7 @@ module Cosmos
576
581
  tf = Tempfile.new('unittest')
577
582
  tf.puts("PATH LOGS C:/mylogs")
578
583
  tf.close
579
- expect(System.paths['LOGS']).to match 'outputs/logs'
584
+ expect(System.paths['LOGS']).to match('outputs/logs')
580
585
  System.instance.process_file(tf.path)
581
586
  expect(System.paths['LOGS']).to eql 'C:/mylogs'
582
587
  tf.unlink
@@ -18,9 +18,12 @@ module Cosmos
18
18
  describe Api do
19
19
 
20
20
  before(:all) do
21
- cts = File.join(Cosmos::USERPATH,'config','tools','cmd_tlm_server','cmd_tlm_server.txt')
22
- FileUtils.mkdir_p(File.dirname(cts))
23
- File.open(cts,'w') do |file|
21
+ # Save cmd_tlm_server.txt
22
+ @cts = File.join(Cosmos::USERPATH,'config','tools','cmd_tlm_server','cmd_tlm_server.txt')
23
+ FileUtils.mv @cts, Cosmos::USERPATH
24
+
25
+ FileUtils.mkdir_p(File.dirname(@cts))
26
+ File.open(@cts,'w') do |file|
24
27
  file.puts 'INTERFACE INST_INT interface.rb'
25
28
  file.puts ' TARGET INST'
26
29
  file.puts ' PROTOCOL READ_WRITE OverrideProtocol'
@@ -38,9 +41,13 @@ module Cosmos
38
41
  super()
39
42
  @name = 'Example Background Task1'
40
43
  @status = "This is example one"
44
+ @sleeper = Sleeper.new
41
45
  end
42
46
  def call
43
- sleep 0.3
47
+ return if @sleeper.sleep(0.3)
48
+ end
49
+ def stop
50
+ @sleeper.cancel
44
51
  end
45
52
  end
46
53
  end
@@ -56,12 +63,16 @@ module Cosmos
56
63
  super()
57
64
  @name = 'Example Background Task2'
58
65
  @status = "This is example two"
66
+ @sleeper = Sleeper.new
59
67
  end
60
68
  def call
61
69
  loop do
62
- sleep 1
70
+ return if @sleeper.sleep(1)
63
71
  end
64
72
  end
73
+ def stop
74
+ @sleeper.cancel
75
+ end
65
76
  end
66
77
  end
67
78
  DOC
@@ -69,10 +80,11 @@ DOC
69
80
  end
70
81
 
71
82
  after(:all) do
72
- clean_config()
73
- FileUtils.rm_rf File.join(Cosmos::USERPATH,'config','tools')
74
83
  FileUtils.rm_rf @background1
75
84
  FileUtils.rm_rf @background2
85
+ # Restore cmd_tlm_server.txt
86
+ FileUtils.mv File.join(Cosmos::USERPATH, 'cmd_tlm_server.txt'),
87
+ File.join(Cosmos::USERPATH,'config','tools','cmd_tlm_server')
76
88
  end
77
89
 
78
90
  before(:each) do
@@ -523,7 +535,6 @@ DOC
523
535
  end
524
536
 
525
537
  it "returns special values for time if time isn't set" do
526
- time = Time.now
527
538
  packet = System.commands.packet("INST", "COLLECT")
528
539
  packet.received_time = nil
529
540
  packet.restore_defaults
@@ -752,7 +763,7 @@ DOC
752
763
  @api.inject_tlm("INST","HEALTH_STATUS",{TEMP1: 50, TEMP2: 50, TEMP3: 50, TEMP4: 50}, :CONVERTED)
753
764
  allow_any_instance_of(Interface).to receive(:write_allowed?).and_raise("PROBLEM!")
754
765
  expect(Logger).to receive(:error) do |msg|
755
- expect(msg).to match /Problem writing to router/
766
+ expect(msg).to match(/Problem writing to router/)
756
767
  end
757
768
  @api.inject_tlm("INST","HEALTH_STATUS")
758
769
  end
@@ -773,7 +784,7 @@ DOC
773
784
 
774
785
  allow_any_instance_of(Interface).to receive(:write_allowed?).and_raise("PROBLEM!")
775
786
  expect(Logger).to receive(:error) do |msg|
776
- expect(msg).to match /Problem writing to router/
787
+ expect(msg).to match(/Problem writing to router/)
777
788
  end
778
789
 
779
790
  @api.inject_tlm("SYSTEM","LIMITS_CHANGE")
@@ -34,7 +34,6 @@ module Cosmos
34
34
  end
35
35
 
36
36
  after(:all) do
37
- clean_config()
38
37
  4.times.each { |i| File.delete(File.join(Cosmos::USERPATH,'lib',"my_bg_task#{i}.rb")) }
39
38
  end
40
39
 
@@ -56,22 +55,22 @@ module Cosmos
56
55
  sleep 0.2
57
56
  expect(running_threads.length).to eql(3)
58
57
  expect(bt.instance_variable_get("@threads").compact.length).to eq 2
59
- expect(stdout.string).to match "BG0 START"
60
- expect(stdout.string).to match "BG2 START"
58
+ expect(stdout.string).to match("BG0 START")
59
+ expect(stdout.string).to match("BG2 START")
61
60
 
62
61
  bt.start(1)
63
62
  sleep 0.1
64
63
  expect(running_threads.length).to eql(4)
65
64
  expect(bt.instance_variable_get("@threads").compact.length).to eq 3
66
- expect(stdout.string).to match "BG1 START"
65
+ expect(stdout.string).to match("BG1 START")
67
66
 
68
67
  bt.stop_all
69
68
  sleep 0.2
70
69
  expect(running_threads.length).to eql(1)
71
70
  expect(bt.instance_variable_get("@threads").compact.length).to eq 0
72
- expect(stdout.string).to match "BG0 STOP"
73
- expect(stdout.string).to match "BG1 STOP"
74
- expect(stdout.string).to match "BG2 STOP"
71
+ expect(stdout.string).to match("BG0 STOP")
72
+ expect(stdout.string).to match("BG1 STOP")
73
+ expect(stdout.string).to match("BG2 STOP")
75
74
  end
76
75
  tf.unlink
77
76
  end
@@ -97,54 +96,54 @@ module Cosmos
97
96
  expect(running_threads.length).to eql(2)
98
97
  expect(bt.instance_variable_get("@threads")[2].alive?).to eq true
99
98
  expect(bt.instance_variable_get("@threads").compact.length).to eq 1
100
- expect(stdout.string).to match "BG2 START"
99
+ expect(stdout.string).to match("BG2 START")
101
100
 
102
101
  bt.start(1)
103
102
  sleep 0.1
104
103
  expect(running_threads.length).to eql(3)
105
104
  expect(bt.instance_variable_get("@threads")[1].alive?).to eq true
106
105
  expect(bt.instance_variable_get("@threads").compact.length).to eq 2
107
- expect(stdout.string).to match "BG1 START"
106
+ expect(stdout.string).to match("BG1 START")
108
107
 
109
108
  bt.start(0)
110
109
  sleep 0.1
111
110
  expect(running_threads.length).to eql(4)
112
111
  expect(bt.instance_variable_get("@threads")[0].alive?).to eq true
113
112
  expect(bt.instance_variable_get("@threads").compact.length).to eq 3
114
- expect(stdout.string).to match "BG0 START"
113
+ expect(stdout.string).to match("BG0 START")
115
114
 
116
115
  bt.start(2) # Should do nothing since the task is already started
117
116
  sleep 0.1
118
117
  expect(running_threads.length).to eql(4)
119
118
  expect(bt.instance_variable_get("@threads").compact.length).to eq 3
120
- expect(stdout.string).to match "BG0 START" # No change
119
+ expect(stdout.string).to match("BG0 START") # No change
121
120
 
122
121
  bt.stop(1)
123
122
  sleep 0.2
124
123
  expect(running_threads.length).to eql(3)
125
124
  expect(bt.instance_variable_get("@threads")[1]).to be_nil
126
125
  expect(bt.instance_variable_get("@threads").compact.length).to eq 2
127
- expect(stdout.string).to match "BG1 STOP"
126
+ expect(stdout.string).to match("BG1 STOP")
128
127
 
129
128
  bt.stop(0)
130
129
  sleep 0.2
131
130
  expect(running_threads.length).to eql(2)
132
131
  expect(bt.instance_variable_get("@threads")[0]).to be_nil
133
132
  expect(bt.instance_variable_get("@threads").compact.length).to eq 1
134
- expect(stdout.string).to match "BG0 STOP"
133
+ expect(stdout.string).to match("BG0 STOP")
135
134
 
136
135
  bt.stop(2)
137
136
  sleep 0.2
138
137
  expect(running_threads.length).to eql(1)
139
138
  expect(bt.instance_variable_get("@threads")[2]).to be_nil
140
139
  expect(bt.instance_variable_get("@threads").compact.length).to eq 0
141
- expect(stdout.string).to match "BG2 STOP"
140
+ expect(stdout.string).to match("BG2 STOP")
142
141
 
143
142
  bt.stop(0) # Should be safe to stop something already stopped
144
143
  sleep 0.2
145
144
  expect(running_threads.length).to eql(1)
146
145
  expect(bt.instance_variable_get("@threads").compact.length).to eq 0
147
- expect(stdout.string).to match "BG2 STOP" # No change
146
+ expect(stdout.string).to match("BG2 STOP") # No change
148
147
 
149
148
  expect { bt.stop(3) }.to raise_error(/No task at index 3/)
150
149
  end
@@ -174,7 +173,7 @@ module Cosmos
174
173
  expect(running_threads.length).to eql(1)
175
174
  expect(bt.instance_variable_get("@threads").length).to eq 0
176
175
 
177
- expect(stdout.string).to match "unexpectedly died"
176
+ expect(stdout.string).to match("unexpectedly died")
178
177
  end
179
178
  tf.unlink
180
179
  end