cosmos 3.0.1 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (912) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +48 -48
  4. data/.travis.yml +7 -7
  5. data/CONTRIBUTING.txt +50 -50
  6. data/Gemfile +6 -6
  7. data/Guardfile +27 -27
  8. data/LICENSE.txt +879 -879
  9. data/Manifest.txt +1116 -1114
  10. data/README.md +109 -107
  11. data/Rakefile +214 -214
  12. data/autohotkey/config/data/diamond.STL +57 -57
  13. data/autohotkey/config/system/system.txt +34 -34
  14. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  15. data/autohotkey/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  16. data/autohotkey/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  17. data/autohotkey/config/targets/COSMOS/target.txt +5 -5
  18. data/autohotkey/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  19. data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
  20. data/autohotkey/config/targets/INST/cmd_tlm_server.txt +5 -5
  21. data/autohotkey/config/targets/INST/lib/example_limits_response.rb +30 -30
  22. data/autohotkey/config/targets/INST/lib/sim_inst.rb +305 -294
  23. data/autohotkey/config/targets/INST/screens/adcs.txt +46 -46
  24. data/autohotkey/config/targets/INST/screens/array.txt +7 -7
  25. data/autohotkey/config/targets/INST/screens/block.txt +8 -8
  26. data/autohotkey/config/targets/INST/screens/commanding.txt +30 -30
  27. data/autohotkey/config/targets/INST/screens/graphs.txt +14 -14
  28. data/autohotkey/config/targets/INST/screens/ground.txt +25 -25
  29. data/autohotkey/config/targets/INST/screens/health_status.txt +33 -33
  30. data/autohotkey/config/targets/INST/screens/hs.txt +49 -49
  31. data/autohotkey/config/targets/INST/screens/image.txt +21 -21
  32. data/autohotkey/config/targets/INST/screens/latest.txt +23 -23
  33. data/autohotkey/config/targets/INST/screens/mech.txt +25 -25
  34. data/autohotkey/config/targets/INST/screens/other.txt +25 -25
  35. data/autohotkey/config/targets/INST/screens/params.txt +25 -25
  36. data/autohotkey/config/targets/INST/screens/tabs.txt +68 -68
  37. data/autohotkey/config/targets/INST/target.txt +26 -26
  38. data/autohotkey/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  39. data/autohotkey/config/targets/META/cmd_tlm/meta_tlm.txt +9 -9
  40. data/autohotkey/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  41. data/autohotkey/config/targets/SYSTEM/screens/error.txt +11 -11
  42. data/autohotkey/config/tools/cmd_tlm_server/cmd_tlm_server.txt +22 -22
  43. data/autohotkey/config/tools/data_viewer/data_viewer.txt +11 -11
  44. data/autohotkey/config/tools/handbook_creator/handbook_creator.txt +49 -49
  45. data/autohotkey/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  46. data/autohotkey/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  47. data/autohotkey/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  48. data/autohotkey/config/tools/handbook_creator/templates/header.html.erb +25 -25
  49. data/autohotkey/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  50. data/autohotkey/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  51. data/autohotkey/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  52. data/autohotkey/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  53. data/autohotkey/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  54. data/autohotkey/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  55. data/autohotkey/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  56. data/autohotkey/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  57. data/autohotkey/config/tools/handbook_creator/templates/title.html.erb +1 -1
  58. data/autohotkey/config/tools/launcher/launcher.txt +38 -38
  59. data/autohotkey/config/tools/script_runner/script_runner.txt +3 -3
  60. data/autohotkey/config/tools/table_manager/ConfigTables_def.txt +8 -8
  61. data/autohotkey/config/tools/table_manager/OneDimensionalTable_def.txt +19 -19
  62. data/autohotkey/config/tools/table_manager/TwoDimensionalTable_def.txt +248 -248
  63. data/autohotkey/config/tools/test_runner/test_runner.txt +8 -8
  64. data/autohotkey/config/tools/test_runner/test_runner2.txt +11 -11
  65. data/autohotkey/config/tools/test_runner/test_runner3.txt +6 -6
  66. data/autohotkey/config/tools/test_runner/test_runner4.txt +1 -1
  67. data/autohotkey/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  68. data/autohotkey/config/tools/tlm_extractor/tlm_extractor2.txt +9 -9
  69. data/autohotkey/config/tools/tlm_grapher/bad.txt +50 -50
  70. data/autohotkey/config/tools/tlm_grapher/temp1-4.txt +51 -51
  71. data/autohotkey/config/tools/tlm_grapher/test2.txt +111 -111
  72. data/autohotkey/config/tools/tlm_viewer/tlm_viewer.txt +24 -24
  73. data/autohotkey/config/tools/tlm_viewer/tlm_viewer2.txt +4 -4
  74. data/autohotkey/config/tools/tlm_viewer/tlm_viewer3.txt +3 -3
  75. data/autohotkey/lib/example_background_task.rb +42 -42
  76. data/autohotkey/lib/user_version.rb +3 -3
  77. data/autohotkey/procedures/clear_util.rb +7 -7
  78. data/autohotkey/procedures/collect.rb +18 -18
  79. data/autohotkey/procedures/collect_util.rb +14 -14
  80. data/autohotkey/procedures/example_test.rb +67 -67
  81. data/autohotkey/procedures/example_test2.rb +74 -74
  82. data/autohotkey/procedures/script_test.rb +17 -17
  83. data/autohotkey/procedures/syntax_error.rb +18 -18
  84. data/autohotkey/tools/CmdExtractorAHK +16 -16
  85. data/autohotkey/tools/CmdSender +14 -14
  86. data/autohotkey/tools/CmdSenderAHK +18 -18
  87. data/autohotkey/tools/CmdTlmServer +14 -14
  88. data/autohotkey/tools/CmdTlmServerAHK +28 -28
  89. data/autohotkey/tools/CmdTlmServerAHK2 +17 -17
  90. data/autohotkey/tools/DataViewer +14 -14
  91. data/autohotkey/tools/DataViewerAHK +17 -17
  92. data/autohotkey/tools/HandbookCreatorAHK +20 -20
  93. data/autohotkey/tools/LauncherAHK +17 -17
  94. data/autohotkey/tools/LimitsMonitorAHK +20 -20
  95. data/autohotkey/tools/OpenGLBuilderAHK +20 -20
  96. data/autohotkey/tools/PacketViewer +14 -14
  97. data/autohotkey/tools/PacketViewerAHK +18 -18
  98. data/autohotkey/tools/PacketViewerAHK2 +17 -17
  99. data/autohotkey/tools/Replay +14 -14
  100. data/autohotkey/tools/Replay.bat +59 -59
  101. data/autohotkey/tools/ReplayAHK +17 -17
  102. data/autohotkey/tools/ScriptRunner +14 -14
  103. data/autohotkey/tools/ScriptRunnerAHK +20 -20
  104. data/autohotkey/tools/ScriptRunnerAHK2 +17 -17
  105. data/autohotkey/tools/TableManager +14 -14
  106. data/autohotkey/tools/TableManagerAHK +30 -30
  107. data/autohotkey/tools/TestRunner +15 -15
  108. data/autohotkey/tools/TestRunnerAHK +17 -17
  109. data/autohotkey/tools/TestRunnerAHK2 +17 -17
  110. data/autohotkey/tools/TestRunnerAHK3 +17 -17
  111. data/autohotkey/tools/TestRunnerAHK4 +17 -17
  112. data/autohotkey/tools/TlmExtractor +15 -15
  113. data/autohotkey/tools/TlmExtractorAHK +19 -19
  114. data/autohotkey/tools/TlmExtractorAHK2 +16 -16
  115. data/autohotkey/tools/TlmExtractorAHK3 +16 -16
  116. data/autohotkey/tools/TlmGrapher +14 -14
  117. data/autohotkey/tools/TlmGrapherAHK +19 -19
  118. data/autohotkey/tools/TlmGrapherAHK2 +23 -23
  119. data/autohotkey/tools/TlmGrapherAHK3 +17 -17
  120. data/autohotkey/tools/TlmGrapherAHK4 +17 -17
  121. data/autohotkey/tools/TlmViewer +14 -14
  122. data/autohotkey/tools/TlmViewerAHK +28 -28
  123. data/autohotkey/tools/TlmViewerAHK2 +18 -18
  124. data/autohotkey/tools/TlmViewerAHK3 +18 -18
  125. data/autohotkey/tools/TlmViewerAHK4 +18 -18
  126. data/autohotkey/tools/TlmViewerAHK5 +18 -18
  127. data/autohotkey/tools/autohotkey.rb +37 -37
  128. data/autohotkey/tools/cmd_extractor.ahk +27 -27
  129. data/autohotkey/tools/cmd_sender.ahk +182 -162
  130. data/autohotkey/tools/cmd_tlm_server.ahk +89 -89
  131. data/autohotkey/tools/cmd_tlm_server2.ahk +45 -45
  132. data/autohotkey/tools/data_viewer.ahk +135 -135
  133. data/autohotkey/tools/handbook_creator.ahk +23 -23
  134. data/autohotkey/tools/launcher.ahk +41 -41
  135. data/autohotkey/tools/limits_monitor.ahk +70 -70
  136. data/autohotkey/tools/open_gl_builder.ahk +134 -134
  137. data/autohotkey/tools/packet_viewer.ahk +143 -143
  138. data/autohotkey/tools/packet_viewer2.ahk +9 -9
  139. data/autohotkey/tools/replay.ahk +98 -98
  140. data/autohotkey/tools/script_runner.ahk +589 -589
  141. data/autohotkey/tools/script_runner2.ahk +34 -31
  142. data/autohotkey/tools/table_manager.ahk +220 -220
  143. data/autohotkey/tools/test_runner.ahk +262 -259
  144. data/autohotkey/tools/test_runner2.ahk +52 -52
  145. data/autohotkey/tools/test_runner3.ahk +13 -13
  146. data/autohotkey/tools/tlm_extractor.ahk +272 -272
  147. data/autohotkey/tools/tlm_grapher.ahk +642 -642
  148. data/autohotkey/tools/tlm_grapher2.ahk +115 -115
  149. data/autohotkey/tools/tlm_grapher3.ahk +24 -24
  150. data/autohotkey/tools/tlm_viewer.ahk +133 -133
  151. data/autohotkey/tools/tlm_viewer2.ahk +50 -49
  152. data/autohotkey/tools/tlm_viewer4.ahk +4 -4
  153. data/autohotkey/tools/tlm_viewer5.ahk +20 -20
  154. data/bin/cosmos +96 -96
  155. data/bin/cstol_converter +1166 -1166
  156. data/bin/rubysloc +85 -85
  157. data/cosmos.gemspec +98 -97
  158. data/data/about.txt +4 -4
  159. data/data/crc.txt +306 -305
  160. data/data/diamond.STL +57 -57
  161. data/data/legal.txt +9 -9
  162. data/demo/Gemfile +6 -6
  163. data/demo/Launcher +15 -15
  164. data/demo/Launcher.bat +59 -59
  165. data/demo/Rakefile +61 -61
  166. data/demo/config/data/crc.txt +222 -206
  167. data/demo/config/data/diamond.STL +57 -57
  168. data/demo/config/data/meta_init.txt +4 -4
  169. data/demo/config/system/system.txt +34 -34
  170. data/demo/config/system/system2.txt +33 -33
  171. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  172. data/demo/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  173. data/demo/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  174. data/demo/config/targets/COSMOS/screens/limits_change.txt +20 -20
  175. data/demo/config/targets/COSMOS/screens/version.txt +19 -19
  176. data/demo/config/targets/COSMOS/target.txt +11 -11
  177. data/demo/config/targets/EXAMPLE/cmd_tlm/example_cmds.txt +2 -2
  178. data/demo/config/targets/EXAMPLE/cmd_tlm/example_tlm.txt +3 -3
  179. data/demo/config/targets/EXAMPLE/cmd_tlm_server.txt +6 -6
  180. data/demo/config/targets/EXAMPLE/lib/example_interface.rb +22 -22
  181. data/demo/config/targets/EXAMPLE/target.txt +6 -6
  182. data/demo/config/targets/INST/cmd_tlm/inst_cmds.txt +121 -121
  183. data/demo/config/targets/INST/cmd_tlm/inst_tlm.txt +247 -247
  184. data/demo/config/targets/INST/cmd_tlm_server.txt +5 -5
  185. data/demo/config/targets/INST/lib/example_limits_response.rb +30 -30
  186. data/demo/config/targets/INST/lib/sim_inst.rb +305 -294
  187. data/demo/config/targets/INST/screens/adcs.txt +46 -46
  188. data/demo/config/targets/INST/screens/array.txt +15 -15
  189. data/demo/config/targets/INST/screens/block.txt +8 -8
  190. data/demo/config/targets/INST/screens/commanding.txt +30 -30
  191. data/demo/config/targets/INST/screens/graphs.txt +14 -14
  192. data/demo/config/targets/INST/screens/ground.txt +25 -25
  193. data/demo/config/targets/INST/screens/hs.txt +44 -44
  194. data/demo/config/targets/INST/screens/latest.txt +23 -23
  195. data/demo/config/targets/INST/screens/other.txt +29 -29
  196. data/demo/config/targets/INST/screens/tabs.txt +70 -70
  197. data/demo/config/targets/INST/target.txt +33 -33
  198. data/demo/config/targets/META/cmd_tlm/meta_cmd.txt +10 -10
  199. data/demo/config/targets/META/cmd_tlm/meta_tlm.txt +13 -13
  200. data/demo/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  201. data/demo/config/targets/SYSTEM/cmd_tlm/override.txt +29 -29
  202. data/demo/config/targets/SYSTEM/screens/status.txt +12 -12
  203. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_cmds.txt +13 -12
  204. data/demo/config/targets/TEMPLATED/cmd_tlm/templated_tlm.txt +3 -3
  205. data/demo/config/targets/TEMPLATED/cmd_tlm_server.txt +6 -6
  206. data/demo/config/targets/TEMPLATED/lib/templated_interface.rb +54 -48
  207. data/demo/config/targets/TEMPLATED/target.txt +6 -6
  208. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server.txt +33 -33
  209. data/demo/config/tools/cmd_tlm_server/cmd_tlm_server2.txt +29 -29
  210. data/demo/config/tools/data_viewer/data_viewer.txt +11 -11
  211. data/demo/config/tools/handbook_creator/handbook_creator.txt +66 -66
  212. data/demo/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  213. data/demo/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  214. data/demo/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  215. data/demo/config/tools/handbook_creator/templates/header.html.erb +25 -25
  216. data/demo/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  217. data/demo/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  218. data/demo/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  219. data/demo/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  220. data/demo/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  221. data/demo/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  222. data/demo/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  223. data/demo/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  224. data/demo/config/tools/handbook_creator/templates/title.html.erb +1 -1
  225. data/demo/config/tools/launcher/launcher.txt +45 -45
  226. data/demo/config/tools/launcher/launcher2.txt +45 -45
  227. data/demo/config/tools/script_runner/script_runner.txt +3 -3
  228. data/demo/config/tools/table_manager/ConfigTables_def.txt +8 -8
  229. data/demo/config/tools/table_manager/ExampleTableDefinition.txt +24 -24
  230. data/demo/config/tools/table_manager/MCConfigurationTable_fsw1_def.txt +25 -25
  231. data/demo/config/tools/table_manager/MCConfigurationTable_fsw2_def.txt +25 -25
  232. data/demo/config/tools/table_manager/PPSSelectionTable_def.txt +8 -8
  233. data/demo/config/tools/table_manager/TLMMonitoringTable_def.txt +248 -248
  234. data/demo/config/tools/test_runner/test_runner.txt +17 -17
  235. data/demo/config/tools/tlm_extractor/tlm_extractor.txt +13 -13
  236. data/demo/config/tools/tlm_extractor/tlm_extractor2.txt +2 -2
  237. data/demo/config/tools/tlm_extractor/tlm_extractor3.txt +2 -2
  238. data/demo/config/tools/tlm_extractor/tlm_extractor4.txt +2 -2
  239. data/demo/config/tools/tlm_viewer/tlm_viewer.txt +41 -41
  240. data/demo/lib/example_background_task.rb +57 -52
  241. data/demo/lib/example_target.rb +113 -108
  242. data/demo/lib/scpi_target.rb +74 -74
  243. data/demo/lib/user_version.rb +3 -3
  244. data/demo/procedures/checks.rb +11 -11
  245. data/demo/procedures/clear_util.rb +7 -7
  246. data/demo/procedures/collect.rb +18 -18
  247. data/demo/procedures/collect_util.rb +14 -14
  248. data/demo/procedures/cosmos_api_test.rb +293 -293
  249. data/demo/procedures/disconnect.rb +29 -29
  250. data/demo/procedures/example_test.rb +182 -182
  251. data/demo/procedures/plot_test.rb +8 -8
  252. data/demo/procedures/run_example_test.rb +3 -3
  253. data/demo/procedures/test.rb +51 -51
  254. data/demo/tools/CmdExtractor +15 -15
  255. data/demo/tools/CmdExtractor.bat +59 -59
  256. data/demo/tools/CmdSender +15 -15
  257. data/demo/tools/CmdSender.bat +59 -59
  258. data/demo/tools/CmdTlmServer +15 -15
  259. data/demo/tools/CmdTlmServer.bat +59 -59
  260. data/demo/tools/DataViewer +15 -15
  261. data/demo/tools/DataViewer.bat +59 -59
  262. data/demo/tools/ExampleTarget +15 -15
  263. data/demo/tools/ExampleTarget.bat +59 -59
  264. data/demo/tools/HandbookCreator +15 -15
  265. data/demo/tools/HandbookCreator.bat +61 -61
  266. data/demo/tools/Launcher +15 -15
  267. data/demo/tools/Launcher.bat +59 -59
  268. data/demo/tools/LimitsMonitor +15 -15
  269. data/demo/tools/LimitsMonitor.bat +59 -59
  270. data/demo/tools/OpenGLBuilder +15 -15
  271. data/demo/tools/OpenGLBuilder.bat +59 -59
  272. data/demo/tools/PacketViewer +15 -15
  273. data/demo/tools/PacketViewer.bat +59 -59
  274. data/demo/tools/Replay +15 -15
  275. data/demo/tools/Replay.bat +59 -59
  276. data/demo/tools/ScpiTarget +15 -15
  277. data/demo/tools/ScpiTarget.bat +59 -59
  278. data/demo/tools/ScriptRunner +15 -15
  279. data/demo/tools/ScriptRunner.bat +59 -59
  280. data/demo/tools/TableManager +15 -15
  281. data/demo/tools/TableManager.bat +59 -59
  282. data/demo/tools/TestRunner +15 -15
  283. data/demo/tools/TestRunner.bat +59 -59
  284. data/demo/tools/TlmExtractor +15 -15
  285. data/demo/tools/TlmExtractor.bat +59 -59
  286. data/demo/tools/TlmGrapher +15 -15
  287. data/demo/tools/TlmGrapher.bat +59 -59
  288. data/demo/tools/TlmViewer +15 -15
  289. data/demo/tools/TlmViewer.bat +59 -59
  290. data/demo/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  291. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
  292. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
  293. data/demo/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  294. data/demo/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
  295. data/demo/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
  296. data/demo/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  297. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
  298. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
  299. data/demo/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  300. data/demo/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
  301. data/demo/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
  302. data/demo/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  303. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
  304. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
  305. data/demo/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  306. data/demo/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
  307. data/demo/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
  308. data/demo/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  309. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
  310. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
  311. data/demo/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  312. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
  313. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
  314. data/demo/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  315. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
  316. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
  317. data/demo/tools/mac/Replay.app/Contents/Info.plist +38 -38
  318. data/demo/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
  319. data/demo/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
  320. data/demo/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  321. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
  322. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
  323. data/demo/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  324. data/demo/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
  325. data/demo/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
  326. data/demo/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  327. data/demo/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
  328. data/demo/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
  329. data/demo/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  330. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
  331. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
  332. data/demo/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  333. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
  334. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
  335. data/demo/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  336. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
  337. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
  338. data/ext/cosmos/ext/array/array.c +111 -111
  339. data/ext/cosmos/ext/array/extconf.rb +13 -13
  340. data/ext/cosmos/ext/buffered_file/buffered_file.c +167 -167
  341. data/ext/cosmos/ext/buffered_file/extconf.rb +13 -13
  342. data/ext/cosmos/ext/config_parser/config_parser.c +237 -237
  343. data/ext/cosmos/ext/config_parser/extconf.rb +13 -13
  344. data/ext/cosmos/ext/cosmos_io/cosmos_io.c +117 -117
  345. data/ext/cosmos/ext/cosmos_io/extconf.rb +13 -13
  346. data/ext/cosmos/ext/crc/crc.c +341 -341
  347. data/ext/cosmos/ext/crc/extconf.rb +12 -12
  348. data/ext/cosmos/ext/line_graph/extconf.rb +13 -13
  349. data/ext/cosmos/ext/line_graph/line_graph.c +501 -501
  350. data/ext/cosmos/ext/low_fragmentation_array/extconf.rb +12 -12
  351. data/ext/cosmos/ext/low_fragmentation_array/low_fragmentation_array.c +261 -261
  352. data/ext/cosmos/ext/packet/extconf.rb +13 -13
  353. data/ext/cosmos/ext/packet/packet.c +339 -339
  354. data/ext/cosmos/ext/platform/extconf.rb +13 -13
  355. data/ext/cosmos/ext/platform/platform.c +81 -81
  356. data/ext/cosmos/ext/polynomial_conversion/extconf.rb +13 -13
  357. data/ext/cosmos/ext/polynomial_conversion/polynomial_conversion.c +73 -73
  358. data/ext/cosmos/ext/string/extconf.rb +13 -13
  359. data/ext/cosmos/ext/string/string.c +49 -49
  360. data/ext/cosmos/ext/structure/structure.c +894 -894
  361. data/ext/cosmos/ext/tabbed_plots_config/extconf.rb +13 -13
  362. data/ext/cosmos/ext/tabbed_plots_config/tabbed_plots_config.c +51 -51
  363. data/ext/cosmos/ext/telemetry/extconf.rb +13 -13
  364. data/ext/cosmos/ext/telemetry/telemetry.c +306 -306
  365. data/ext/mkrf_conf.rb +40 -40
  366. data/install/Gemfile +6 -6
  367. data/install/Launcher +14 -14
  368. data/install/Launcher.bat +59 -59
  369. data/install/Rakefile +61 -61
  370. data/install/config/data/crc.txt +134 -133
  371. data/install/config/system/system.txt +29 -29
  372. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  373. data/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  374. data/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  375. data/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  376. data/install/config/targets/COSMOS/screens/version.txt +19 -19
  377. data/install/config/targets/COSMOS/target.txt +8 -8
  378. data/install/config/tools/cmd_tlm_server/cmd_tlm_server.txt +2 -2
  379. data/install/config/tools/data_viewer/data_viewer.txt +3 -3
  380. data/install/config/tools/handbook_creator/handbook_creator.txt +49 -49
  381. data/install/config/tools/handbook_creator/templates/command_packets.html.erb +86 -86
  382. data/install/config/tools/handbook_creator/templates/command_toc.html.erb +38 -38
  383. data/install/config/tools/handbook_creator/templates/footer.html.erb +9 -9
  384. data/install/config/tools/handbook_creator/templates/header.html.erb +25 -25
  385. data/install/config/tools/handbook_creator/templates/limits_groups.html.erb +13 -13
  386. data/install/config/tools/handbook_creator/templates/nav.html.erb +27 -27
  387. data/install/config/tools/handbook_creator/templates/overview.html.erb +1 -1
  388. data/install/config/tools/handbook_creator/templates/pdf_cover.html.erb +23 -23
  389. data/install/config/tools/handbook_creator/templates/pdf_footer.html.erb +33 -33
  390. data/install/config/tools/handbook_creator/templates/pdf_header.html.erb +41 -41
  391. data/install/config/tools/handbook_creator/templates/telemetry_packets.html.erb +80 -80
  392. data/install/config/tools/handbook_creator/templates/telemetry_toc.html.erb +38 -38
  393. data/install/config/tools/handbook_creator/templates/title.html.erb +1 -1
  394. data/install/config/tools/launcher/launcher.txt +39 -39
  395. data/install/config/tools/script_runner/script_runner.txt +3 -3
  396. data/install/config/tools/test_runner/test_runner.txt +8 -8
  397. data/install/config/tools/tlm_viewer/tlm_viewer.txt +5 -5
  398. data/install/lib/user_version.rb +3 -3
  399. data/install/tools/CmdExtractor +15 -15
  400. data/install/tools/CmdExtractor.bat +59 -59
  401. data/install/tools/CmdSender +15 -15
  402. data/install/tools/CmdSender.bat +59 -59
  403. data/install/tools/CmdTlmServer +15 -15
  404. data/install/tools/CmdTlmServer.bat +59 -59
  405. data/install/tools/DataViewer +15 -15
  406. data/install/tools/DataViewer.bat +59 -59
  407. data/install/tools/HandbookCreator +15 -15
  408. data/install/tools/HandbookCreator.bat +61 -61
  409. data/install/tools/Launcher +15 -15
  410. data/install/tools/Launcher.bat +59 -59
  411. data/install/tools/LimitsMonitor +15 -15
  412. data/install/tools/LimitsMonitor.bat +59 -59
  413. data/install/tools/OpenGLBuilder +15 -15
  414. data/install/tools/OpenGLBuilder.bat +59 -59
  415. data/install/tools/PacketViewer +15 -15
  416. data/install/tools/PacketViewer.bat +59 -59
  417. data/install/tools/Replay +15 -15
  418. data/install/tools/Replay.bat +59 -59
  419. data/install/tools/ScriptRunner +15 -15
  420. data/install/tools/ScriptRunner.bat +59 -59
  421. data/install/tools/TableManager +15 -15
  422. data/install/tools/TableManager.bat +59 -59
  423. data/install/tools/TestRunner +15 -15
  424. data/install/tools/TestRunner.bat +59 -59
  425. data/install/tools/TlmExtractor +15 -15
  426. data/install/tools/TlmExtractor.bat +59 -59
  427. data/install/tools/TlmGrapher +15 -15
  428. data/install/tools/TlmGrapher.bat +59 -59
  429. data/install/tools/TlmViewer +15 -15
  430. data/install/tools/TlmViewer.bat +59 -59
  431. data/install/tools/mac/CmdExtractor.app/Contents/Info.plist +38 -38
  432. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +15 -15
  433. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/main.sh +6 -6
  434. data/install/tools/mac/CmdSender.app/Contents/Info.plist +38 -38
  435. data/install/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +15 -15
  436. data/install/tools/mac/CmdSender.app/Contents/MacOS/main.sh +6 -6
  437. data/install/tools/mac/CmdTlmServer.app/Contents/Info.plist +38 -38
  438. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +15 -15
  439. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/main.sh +6 -6
  440. data/install/tools/mac/DataViewer.app/Contents/Info.plist +38 -38
  441. data/install/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +15 -15
  442. data/install/tools/mac/DataViewer.app/Contents/MacOS/main.sh +6 -6
  443. data/install/tools/mac/HandbookCreator.app/Contents/Info.plist +38 -38
  444. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +15 -15
  445. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/main.sh +6 -6
  446. data/install/tools/mac/Launcher.app/Contents/Info.plist +38 -38
  447. data/install/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +15 -15
  448. data/install/tools/mac/Launcher.app/Contents/MacOS/main.sh +6 -6
  449. data/install/tools/mac/LimitsMonitor.app/Contents/Info.plist +38 -38
  450. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +15 -15
  451. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/main.sh +6 -6
  452. data/install/tools/mac/OpenGLBuilder.app/Contents/Info.plist +38 -38
  453. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +15 -15
  454. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/main.sh +6 -6
  455. data/install/tools/mac/PacketViewer.app/Contents/Info.plist +38 -38
  456. data/install/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +15 -15
  457. data/install/tools/mac/PacketViewer.app/Contents/MacOS/main.sh +6 -6
  458. data/install/tools/mac/Replay.app/Contents/Info.plist +38 -38
  459. data/install/tools/mac/Replay.app/Contents/MacOS/Replay.rb +15 -15
  460. data/install/tools/mac/Replay.app/Contents/MacOS/main.sh +6 -6
  461. data/install/tools/mac/ScriptRunner.app/Contents/Info.plist +38 -38
  462. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +15 -15
  463. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/main.sh +6 -6
  464. data/install/tools/mac/TableManager.app/Contents/Info.plist +38 -38
  465. data/install/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +15 -15
  466. data/install/tools/mac/TableManager.app/Contents/MacOS/main.sh +6 -6
  467. data/install/tools/mac/TestRunner.app/Contents/Info.plist +38 -38
  468. data/install/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +15 -15
  469. data/install/tools/mac/TestRunner.app/Contents/MacOS/main.sh +6 -6
  470. data/install/tools/mac/TlmExtractor.app/Contents/Info.plist +38 -38
  471. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +15 -15
  472. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/main.sh +6 -6
  473. data/install/tools/mac/TlmGrapher.app/Contents/Info.plist +38 -38
  474. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +15 -15
  475. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/main.sh +6 -6
  476. data/install/tools/mac/TlmViewer.app/Contents/Info.plist +38 -38
  477. data/install/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +15 -15
  478. data/install/tools/mac/TlmViewer.app/Contents/MacOS/main.sh +6 -6
  479. data/lib/cosmos.rb +63 -63
  480. data/lib/cosmos/ccsds/ccsds_packet.rb +63 -63
  481. data/lib/cosmos/ccsds/ccsds_parser.rb +143 -143
  482. data/lib/cosmos/config/config_parser.rb +324 -324
  483. data/lib/cosmos/conversions.rb +13 -13
  484. data/lib/cosmos/conversions/conversion.rb +47 -47
  485. data/lib/cosmos/conversions/generic_conversion.rb +55 -55
  486. data/lib/cosmos/conversions/new_packet_log_conversion.rb +45 -45
  487. data/lib/cosmos/conversions/polynomial_conversion.rb +57 -57
  488. data/lib/cosmos/conversions/processor_conversion.rb +46 -46
  489. data/lib/cosmos/conversions/received_count_conversion.rb +33 -33
  490. data/lib/cosmos/conversions/received_time_formatted_conversion.rb +37 -37
  491. data/lib/cosmos/conversions/received_time_seconds_conversion.rb +37 -37
  492. data/lib/cosmos/conversions/segmented_polynomial_conversion.rb +128 -128
  493. data/lib/cosmos/conversions/unix_time_conversion.rb +50 -50
  494. data/lib/cosmos/conversions/unix_time_formatted_conversion.rb +44 -44
  495. data/lib/cosmos/conversions/unix_time_seconds_conversion.rb +44 -44
  496. data/lib/cosmos/core_ext.rb +18 -18
  497. data/lib/cosmos/core_ext/array.rb +354 -354
  498. data/lib/cosmos/core_ext/class.rb +51 -51
  499. data/lib/cosmos/core_ext/cosmos_io.rb +29 -29
  500. data/lib/cosmos/core_ext/exception.rb +52 -52
  501. data/lib/cosmos/core_ext/file.rb +75 -75
  502. data/lib/cosmos/core_ext/hash.rb +28 -28
  503. data/lib/cosmos/core_ext/io.rb +75 -75
  504. data/lib/cosmos/core_ext/kernel.rb +38 -38
  505. data/lib/cosmos/core_ext/math.rb +119 -119
  506. data/lib/cosmos/core_ext/matrix.rb +146 -146
  507. data/lib/cosmos/core_ext/objectspace.rb +29 -29
  508. data/lib/cosmos/core_ext/range.rb +22 -22
  509. data/lib/cosmos/core_ext/socket.rb +32 -32
  510. data/lib/cosmos/core_ext/string.rb +310 -310
  511. data/lib/cosmos/core_ext/stringio.rb +24 -24
  512. data/lib/cosmos/core_ext/time.rb +446 -446
  513. data/lib/cosmos/gui/choosers/combobox_chooser.rb +130 -130
  514. data/lib/cosmos/gui/choosers/file_chooser.rb +68 -68
  515. data/lib/cosmos/gui/choosers/float_chooser.rb +82 -82
  516. data/lib/cosmos/gui/choosers/integer_chooser.rb +80 -80
  517. data/lib/cosmos/gui/choosers/string_chooser.rb +53 -53
  518. data/lib/cosmos/gui/choosers/telemetry_chooser.rb +317 -317
  519. data/lib/cosmos/gui/dialogs/about_dialog.rb +128 -128
  520. data/lib/cosmos/gui/dialogs/calendar_dialog.rb +136 -136
  521. data/lib/cosmos/gui/dialogs/cmd_details_dialog.rb +52 -52
  522. data/lib/cosmos/gui/dialogs/cmd_tlm_raw_dialog.rb +149 -149
  523. data/lib/cosmos/gui/dialogs/details_dialog.rb +174 -174
  524. data/lib/cosmos/gui/dialogs/exception_dialog.rb +97 -97
  525. data/lib/cosmos/gui/dialogs/exception_list_dialog.rb +59 -59
  526. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +196 -196
  527. data/lib/cosmos/gui/dialogs/legal_dialog.rb +169 -168
  528. data/lib/cosmos/gui/dialogs/packet_log_dialog.rb +118 -118
  529. data/lib/cosmos/gui/dialogs/progress_dialog.rb +270 -262
  530. data/lib/cosmos/gui/dialogs/pry_dialog.rb +165 -161
  531. data/lib/cosmos/gui/dialogs/scroll_text_dialog.rb +37 -37
  532. data/lib/cosmos/gui/dialogs/select_dialog.rb +54 -54
  533. data/lib/cosmos/gui/dialogs/set_tlm_dialog.rb +131 -131
  534. data/lib/cosmos/gui/dialogs/splash.rb +113 -113
  535. data/lib/cosmos/gui/dialogs/tlm_details_dialog.rb +206 -206
  536. data/lib/cosmos/gui/dialogs/tlm_edit_dialog.rb +81 -81
  537. data/lib/cosmos/gui/line_graph/line_graph.rb +456 -456
  538. data/lib/cosmos/gui/line_graph/line_graph_dialog.rb +34 -34
  539. data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +494 -494
  540. data/lib/cosmos/gui/line_graph/line_graph_popups.rb +116 -116
  541. data/lib/cosmos/gui/line_graph/line_graph_scaling.rb +460 -460
  542. data/lib/cosmos/gui/line_graph/line_graph_script.rb +26 -26
  543. data/lib/cosmos/gui/line_graph/lines.rb +290 -290
  544. data/lib/cosmos/gui/line_graph/overview_graph.rb +459 -459
  545. data/lib/cosmos/gui/opengl/earth_model.rb +22 -22
  546. data/lib/cosmos/gui/opengl/gl_bounds.rb +67 -67
  547. data/lib/cosmos/gui/opengl/gl_light.rb +39 -39
  548. data/lib/cosmos/gui/opengl/gl_material.rb +29 -29
  549. data/lib/cosmos/gui/opengl/gl_scene.rb +72 -72
  550. data/lib/cosmos/gui/opengl/gl_shape.rb +146 -146
  551. data/lib/cosmos/gui/opengl/gl_viewer.rb +724 -712
  552. data/lib/cosmos/gui/opengl/gl_viewport.rb +35 -35
  553. data/lib/cosmos/gui/opengl/moon_model.rb +22 -22
  554. data/lib/cosmos/gui/opengl/opengl.rb +8 -8
  555. data/lib/cosmos/gui/opengl/stl_reader.rb +211 -211
  556. data/lib/cosmos/gui/opengl/stl_shape.rb +124 -124
  557. data/lib/cosmos/gui/opengl/texture_mapped_sphere.rb +202 -202
  558. data/lib/cosmos/gui/qt.rb +813 -786
  559. data/lib/cosmos/gui/qt_tool.rb +378 -373
  560. data/lib/cosmos/gui/text/completion.rb +381 -381
  561. data/lib/cosmos/gui/text/completion_line_edit.rb +30 -30
  562. data/lib/cosmos/gui/text/completion_text_edit.rb +179 -179
  563. data/lib/cosmos/gui/text/ruby_editor.rb +395 -395
  564. data/lib/cosmos/gui/utilities/screenshot.rb +25 -25
  565. data/lib/cosmos/gui/utilities/script_module_gui.rb +203 -203
  566. data/lib/cosmos/gui/widgets/full_text_search_line_edit.rb +161 -161
  567. data/lib/cosmos/gui/widgets/packet_log_frame.rb +305 -305
  568. data/lib/cosmos/gui/widgets/realtime_button_bar.rb +98 -98
  569. data/lib/cosmos/interfaces.rb +11 -11
  570. data/lib/cosmos/interfaces/cmd_tlm_server_interface.rb +153 -149
  571. data/lib/cosmos/interfaces/interface.rb +213 -213
  572. data/lib/cosmos/interfaces/linc_interface.rb +360 -360
  573. data/lib/cosmos/interfaces/serial_interface.rb +76 -76
  574. data/lib/cosmos/interfaces/simulated_target_interface.rb +129 -128
  575. data/lib/cosmos/interfaces/stream_interface.rb +156 -156
  576. data/lib/cosmos/interfaces/tcpip_client_interface.rb +60 -60
  577. data/lib/cosmos/interfaces/tcpip_server_interface.rb +154 -154
  578. data/lib/cosmos/interfaces/udp_interface.rb +173 -173
  579. data/lib/cosmos/io/buffered_file.rb +11 -11
  580. data/lib/cosmos/io/cosmos_snmp.rb +50 -50
  581. data/lib/cosmos/io/io_multiplexer.rb +89 -89
  582. data/lib/cosmos/io/json_drb.rb +344 -320
  583. data/lib/cosmos/io/json_drb_object.rb +137 -137
  584. data/lib/cosmos/io/json_rpc.rb +365 -365
  585. data/lib/cosmos/io/posix_serial_driver.rb +145 -145
  586. data/lib/cosmos/io/raw_logger.rb +174 -174
  587. data/lib/cosmos/io/raw_logger_pair.rb +71 -71
  588. data/lib/cosmos/io/serial_driver.rb +85 -85
  589. data/lib/cosmos/io/stderr.rb +36 -36
  590. data/lib/cosmos/io/stdout.rb +36 -36
  591. data/lib/cosmos/io/tcpip_server.rb +583 -532
  592. data/lib/cosmos/io/udp_sockets.rb +152 -152
  593. data/lib/cosmos/io/win32_serial_driver.rb +147 -147
  594. data/lib/cosmos/packet_logs.rb +6 -6
  595. data/lib/cosmos/packet_logs/meta_packet_log_writer.rb +107 -107
  596. data/lib/cosmos/packet_logs/packet_log_reader.rb +441 -439
  597. data/lib/cosmos/packet_logs/packet_log_writer.rb +321 -309
  598. data/lib/cosmos/packet_logs/packet_log_writer_pair.rb +30 -30
  599. data/lib/cosmos/packets/binary_accessor.rb +921 -921
  600. data/lib/cosmos/packets/commands.rb +291 -291
  601. data/lib/cosmos/packets/limits.rb +263 -263
  602. data/lib/cosmos/packets/limits_response.rb +38 -38
  603. data/lib/cosmos/packets/packet.rb +714 -699
  604. data/lib/cosmos/packets/packet_config.rb +1034 -1034
  605. data/lib/cosmos/packets/packet_item.rb +317 -317
  606. data/lib/cosmos/packets/packet_item_limits.rb +128 -128
  607. data/lib/cosmos/packets/structure.rb +421 -386
  608. data/lib/cosmos/packets/structure_item.rb +233 -233
  609. data/lib/cosmos/packets/telemetry.rb +317 -317
  610. data/lib/cosmos/processors.rb +6 -6
  611. data/lib/cosmos/processors/new_packet_log_processor.rb +34 -34
  612. data/lib/cosmos/processors/processor.rb +71 -71
  613. data/lib/cosmos/processors/statistics_processor.rb +65 -65
  614. data/lib/cosmos/processors/watermark_processor.rb +44 -44
  615. data/lib/cosmos/script.rb +9 -9
  616. data/lib/cosmos/script/extract.rb +115 -115
  617. data/lib/cosmos/script/script.rb +1513 -1493
  618. data/lib/cosmos/streams/burst_stream_protocol.rb +25 -25
  619. data/lib/cosmos/streams/fixed_stream_protocol.rb +111 -111
  620. data/lib/cosmos/streams/length_stream_protocol.rb +140 -140
  621. data/lib/cosmos/streams/preidentified_stream_protocol.rb +118 -118
  622. data/lib/cosmos/streams/serial_stream.rb +152 -143
  623. data/lib/cosmos/streams/stream.rb +57 -57
  624. data/lib/cosmos/streams/stream_protocol.rb +369 -369
  625. data/lib/cosmos/streams/tcpip_client_stream.rb +77 -77
  626. data/lib/cosmos/streams/tcpip_socket_stream.rb +139 -139
  627. data/lib/cosmos/streams/template_stream_protocol.rb +140 -140
  628. data/lib/cosmos/streams/terminated_stream_protocol.rb +81 -81
  629. data/lib/cosmos/system.rb +4 -4
  630. data/lib/cosmos/system/system.rb +558 -558
  631. data/lib/cosmos/system/target.rb +178 -178
  632. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +254 -253
  633. data/lib/cosmos/tools/cmd_sender/cmd_sender.rb +716 -716
  634. data/lib/cosmos/tools/cmd_sender/cmd_sender_item_delegate.rb +77 -77
  635. data/lib/cosmos/tools/cmd_sender/cmd_sender_text_edit.rb +70 -70
  636. data/lib/cosmos/tools/cmd_tlm_server/api.rb +936 -940
  637. data/lib/cosmos/tools/cmd_tlm_server/background_task.rb +46 -46
  638. data/lib/cosmos/tools/cmd_tlm_server/background_tasks.rb +67 -63
  639. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +511 -497
  640. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_config.rb +241 -241
  641. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +1033 -1008
  642. data/lib/cosmos/tools/cmd_tlm_server/commanding.rb +112 -112
  643. data/lib/cosmos/tools/cmd_tlm_server/connections.rb +176 -176
  644. data/lib/cosmos/tools/cmd_tlm_server/interface_thread.rb +241 -221
  645. data/lib/cosmos/tools/cmd_tlm_server/interfaces.rb +127 -127
  646. data/lib/cosmos/tools/cmd_tlm_server/packet_logging.rb +132 -132
  647. data/lib/cosmos/tools/cmd_tlm_server/router_thread.rb +66 -66
  648. data/lib/cosmos/tools/cmd_tlm_server/routers.rb +97 -97
  649. data/lib/cosmos/tools/data_viewer/data_viewer.rb +628 -600
  650. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +167 -167
  651. data/lib/cosmos/tools/data_viewer/dump_component.rb +40 -40
  652. data/lib/cosmos/tools/handbook_creator/handbook_creator.rb +149 -149
  653. data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +360 -360
  654. data/lib/cosmos/tools/launcher/launcher.rb +184 -184
  655. data/lib/cosmos/tools/launcher/launcher_config.rb +175 -167
  656. data/lib/cosmos/tools/launcher/launcher_multitool.rb +40 -41
  657. data/lib/cosmos/tools/launcher/launcher_tool.rb +104 -104
  658. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +796 -768
  659. data/lib/cosmos/tools/opengl_builder/opengl_builder.rb +416 -416
  660. data/lib/cosmos/tools/opengl_builder/scene_config.rb +118 -118
  661. data/lib/cosmos/tools/packet_viewer/packet_viewer.rb +525 -525
  662. data/lib/cosmos/tools/replay/replay.rb +495 -488
  663. data/lib/cosmos/tools/replay/replay_server.rb +91 -91
  664. data/lib/cosmos/tools/script_runner/script_audit.rb +147 -139
  665. data/lib/cosmos/tools/script_runner/script_runner.rb +914 -914
  666. data/lib/cosmos/tools/script_runner/script_runner_config.rb +40 -40
  667. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +1892 -1859
  668. data/lib/cosmos/tools/table_manager/table.rb +70 -70
  669. data/lib/cosmos/tools/table_manager/table_config.rb +764 -764
  670. data/lib/cosmos/tools/table_manager/table_item.rb +74 -74
  671. data/lib/cosmos/tools/table_manager/table_manager.rb +1065 -1065
  672. data/lib/cosmos/tools/table_manager/table_manager_core.rb +539 -539
  673. data/lib/cosmos/tools/test_runner/results_writer.rb +283 -283
  674. data/lib/cosmos/tools/test_runner/test.rb +480 -480
  675. data/lib/cosmos/tools/test_runner/test_runner.rb +1157 -1157
  676. data/lib/cosmos/tools/test_runner/test_runner_chooser.rb +338 -338
  677. data/lib/cosmos/tools/tlm_extractor/text_item_chooser.rb +60 -60
  678. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +1008 -1008
  679. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_config.rb +371 -371
  680. data/lib/cosmos/tools/tlm_extractor/tlm_extractor_processor.rb +60 -60
  681. data/lib/cosmos/tools/tlm_grapher/data_object_adders/housekeeping_data_object_adder.rb +75 -75
  682. data/lib/cosmos/tools/tlm_grapher/data_object_adders/singlexy_data_object_adder.rb +44 -44
  683. data/lib/cosmos/tools/tlm_grapher/data_object_adders/xy_data_object_adder.rb +94 -94
  684. data/lib/cosmos/tools/tlm_grapher/data_object_editors/data_object_editor.rb +61 -61
  685. data/lib/cosmos/tools/tlm_grapher/data_object_editors/housekeeping_data_object_editor.rb +180 -180
  686. data/lib/cosmos/tools/tlm_grapher/data_object_editors/linegraph_data_object_editor.rb +141 -141
  687. data/lib/cosmos/tools/tlm_grapher/data_object_editors/singlexy_data_object_editor.rb +30 -30
  688. data/lib/cosmos/tools/tlm_grapher/data_object_editors/xy_data_object_editor.rb +173 -173
  689. data/lib/cosmos/tools/tlm_grapher/data_objects/data_object.rb +177 -177
  690. data/lib/cosmos/tools/tlm_grapher/data_objects/housekeeping_data_object.rb +412 -409
  691. data/lib/cosmos/tools/tlm_grapher/data_objects/linegraph_data_object.rb +176 -176
  692. data/lib/cosmos/tools/tlm_grapher/data_objects/singlexy_data_object.rb +25 -25
  693. data/lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb +323 -320
  694. data/lib/cosmos/tools/tlm_grapher/plot_editors/linegraph_plot_editor.rb +181 -181
  695. data/lib/cosmos/tools/tlm_grapher/plot_editors/plot_editor.rb +28 -28
  696. data/lib/cosmos/tools/tlm_grapher/plot_editors/singlexy_plot_editor.rb +30 -30
  697. data/lib/cosmos/tools/tlm_grapher/plot_editors/xy_plot_editor.rb +59 -59
  698. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/linegraph_plot_gui_object.rb +172 -172
  699. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/singlexy_plot_gui_object.rb +27 -27
  700. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/xy_plot_gui_object.rb +74 -74
  701. data/lib/cosmos/tools/tlm_grapher/plots/linegraph_plot.rb +201 -201
  702. data/lib/cosmos/tools/tlm_grapher/plots/plot.rb +69 -69
  703. data/lib/cosmos/tools/tlm_grapher/plots/singlexy_plot.rb +20 -20
  704. data/lib/cosmos/tools/tlm_grapher/plots/xy_plot.rb +61 -61
  705. data/lib/cosmos/tools/tlm_grapher/tabbed_plots/overview_tabbed_plots.rb +1278 -1278
  706. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_config.rb +430 -430
  707. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_data_object_editor.rb +107 -107
  708. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_logfile_thread.rb +111 -95
  709. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_plot_editor.rb +101 -101
  710. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_realtime_thread.rb +72 -66
  711. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tab.rb +57 -57
  712. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_tool.rb +1004 -1004
  713. data/lib/cosmos/tools/tlm_grapher/tlm_grapher.rb +87 -87
  714. data/lib/cosmos/tools/tlm_viewer/screen.rb +486 -458
  715. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +563 -544
  716. data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +287 -287
  717. data/lib/cosmos/tools/tlm_viewer/widgets.rb +53 -53
  718. data/lib/cosmos/tools/tlm_viewer/widgets/aging_widget.rb +110 -110
  719. data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +70 -70
  720. data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +61 -61
  721. data/lib/cosmos/tools/tlm_viewer/widgets/button_widget.rb +39 -39
  722. data/lib/cosmos/tools/tlm_viewer/widgets/canvas_widget.rb +62 -62
  723. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimage_widget.rb +41 -41
  724. data/lib/cosmos/tools/tlm_viewer/widgets/canvasimagevalue_widget.rb +57 -57
  725. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabel_widget.rb +37 -37
  726. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslabelvalue_widget.rb +56 -56
  727. data/lib/cosmos/tools/tlm_viewer/widgets/canvasline_widget.rb +55 -55
  728. data/lib/cosmos/tools/tlm_viewer/widgets/canvaslinevalue_widget.rb +66 -66
  729. data/lib/cosmos/tools/tlm_viewer/widgets/canvasvalue_widget.rb +124 -124
  730. data/lib/cosmos/tools/tlm_viewer/widgets/checkbutton_widget.rb +31 -31
  731. data/lib/cosmos/tools/tlm_viewer/widgets/combobox_widget.rb +30 -30
  732. data/lib/cosmos/tools/tlm_viewer/widgets/formatfontvalue_widget.rb +36 -36
  733. data/lib/cosmos/tools/tlm_viewer/widgets/formatvalue_widget.rb +35 -35
  734. data/lib/cosmos/tools/tlm_viewer/widgets/horizontal_widget.rb +27 -27
  735. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalbox_widget.rb +31 -31
  736. data/lib/cosmos/tools/tlm_viewer/widgets/horizontalline_widget.rb +26 -26
  737. data/lib/cosmos/tools/tlm_viewer/widgets/label_widget.rb +29 -29
  738. data/lib/cosmos/tools/tlm_viewer/widgets/labelformatvalue_widget.rb +39 -39
  739. data/lib/cosmos/tools/tlm_viewer/widgets/labelprogressbar_widget.rb +38 -38
  740. data/lib/cosmos/tools/tlm_viewer/widgets/labeltrendlimitsbar_widget.rb +38 -38
  741. data/lib/cosmos/tools/tlm_viewer/widgets/labelvalue_widget.rb +39 -39
  742. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluedesc_widget.rb +42 -42
  743. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluelimitsbar_widget.rb +37 -37
  744. data/lib/cosmos/tools/tlm_viewer/widgets/labelvaluerangebar_widget.rb +37 -37
  745. data/lib/cosmos/tools/tlm_viewer/widgets/layout_widget.rb +34 -34
  746. data/lib/cosmos/tools/tlm_viewer/widgets/limitsbar_widget.rb +178 -178
  747. data/lib/cosmos/tools/tlm_viewer/widgets/linegraph_widget.rb +54 -54
  748. data/lib/cosmos/tools/tlm_viewer/widgets/matrixbycolumns_widget.rb +47 -47
  749. data/lib/cosmos/tools/tlm_viewer/widgets/multi_widget.rb +116 -116
  750. data/lib/cosmos/tools/tlm_viewer/widgets/progressbar_widget.rb +34 -34
  751. data/lib/cosmos/tools/tlm_viewer/widgets/radiobutton_widget.rb +30 -30
  752. data/lib/cosmos/tools/tlm_viewer/widgets/rangebar_widget.rb +57 -57
  753. data/lib/cosmos/tools/tlm_viewer/widgets/screenshotbutton_widget.rb +34 -34
  754. data/lib/cosmos/tools/tlm_viewer/widgets/scrollwindow_widget.rb +35 -35
  755. data/lib/cosmos/tools/tlm_viewer/widgets/sectionheader_widget.rb +33 -33
  756. data/lib/cosmos/tools/tlm_viewer/widgets/tabbook_widget.rb +26 -26
  757. data/lib/cosmos/tools/tlm_viewer/widgets/tabitem_widget.rb +28 -28
  758. data/lib/cosmos/tools/tlm_viewer/widgets/textbox_widget.rb +47 -47
  759. data/lib/cosmos/tools/tlm_viewer/widgets/textfield_widget.rb +26 -26
  760. data/lib/cosmos/tools/tlm_viewer/widgets/timegraph_widget.rb +88 -88
  761. data/lib/cosmos/tools/tlm_viewer/widgets/title_widget.rb +27 -27
  762. data/lib/cosmos/tools/tlm_viewer/widgets/trendbar_widget.rb +130 -130
  763. data/lib/cosmos/tools/tlm_viewer/widgets/trendlimitsbar_widget.rb +46 -46
  764. data/lib/cosmos/tools/tlm_viewer/widgets/value_widget.rb +43 -43
  765. data/lib/cosmos/tools/tlm_viewer/widgets/valuelimitsbar_widget.rb +37 -37
  766. data/lib/cosmos/tools/tlm_viewer/widgets/valuerangebar_widget.rb +37 -37
  767. data/lib/cosmos/tools/tlm_viewer/widgets/vertical_widget.rb +35 -35
  768. data/lib/cosmos/tools/tlm_viewer/widgets/verticalbox_widget.rb +37 -37
  769. data/lib/cosmos/tools/tlm_viewer/widgets/widget.rb +257 -257
  770. data/lib/cosmos/top_level.rb +647 -596
  771. data/lib/cosmos/utilities.rb +11 -10
  772. data/lib/cosmos/utilities/crc.rb +166 -166
  773. data/lib/cosmos/utilities/csv.rb +83 -83
  774. data/lib/cosmos/utilities/logger.rb +137 -137
  775. data/lib/cosmos/utilities/low_fragmentation_array.rb +11 -11
  776. data/lib/cosmos/utilities/message_log.rb +74 -74
  777. data/lib/cosmos/utilities/quaternion.rb +258 -258
  778. data/lib/cosmos/utilities/ruby_lex_utils.rb +313 -313
  779. data/lib/cosmos/utilities/simulated_target.rb +99 -99
  780. data/lib/cosmos/utilities/sleeper.rb +44 -0
  781. data/lib/cosmos/version.rb +12 -12
  782. data/lib/cosmos/win32/excel.rb +66 -66
  783. data/lib/cosmos/win32/win32.rb +387 -387
  784. data/lib/cosmos/win32/win32_main.rb +311 -311
  785. data/roodi.yml +24 -24
  786. data/run_gui_tests.bat +32 -32
  787. data/spec/ccsds/ccsds_packet_spec.rb +67 -67
  788. data/spec/ccsds/ccsds_parser_spec.rb +148 -148
  789. data/spec/config/config_parser_spec.rb +322 -322
  790. data/spec/conversions/conversion_spec.rb +31 -31
  791. data/spec/conversions/generic_conversion_spec.rb +45 -45
  792. data/spec/conversions/new_packet_log_conversion_spec.rb +39 -39
  793. data/spec/conversions/polynomial_conversion_spec.rb +40 -40
  794. data/spec/conversions/processor_conversion_spec.rb +45 -45
  795. data/spec/conversions/received_count_conversion_spec.rb +43 -43
  796. data/spec/conversions/received_time_formatted_conversion_spec.rb +49 -49
  797. data/spec/conversions/received_time_seconds_conversion_spec.rb +50 -50
  798. data/spec/conversions/segmented_polynomial_conversion_spec.rb +51 -51
  799. data/spec/conversions/unix_time_formatted_conversion_spec.rb +74 -74
  800. data/spec/conversions/unix_time_seconds_conversion_spec.rb +76 -76
  801. data/spec/core_ext/array_spec.rb +186 -186
  802. data/spec/core_ext/class_spec.rb +36 -36
  803. data/spec/core_ext/cosmos_io_spec.rb +77 -77
  804. data/spec/core_ext/exception_spec.rb +91 -91
  805. data/spec/core_ext/file_spec.rb +72 -72
  806. data/spec/core_ext/hash_spec.rb +24 -24
  807. data/spec/core_ext/io_spec.rb +46 -46
  808. data/spec/core_ext/kernel_spec.rb +54 -54
  809. data/spec/core_ext/math_spec.rb +116 -116
  810. data/spec/core_ext/matrix_spec.rb +66 -66
  811. data/spec/core_ext/objectspace_spec.rb +29 -29
  812. data/spec/core_ext/range_spec.rb +21 -21
  813. data/spec/core_ext/socket_spec.rb +32 -32
  814. data/spec/core_ext/string_spec.rb +223 -223
  815. data/spec/core_ext/stringio_spec.rb +21 -21
  816. data/spec/core_ext/time_spec.rb +151 -151
  817. data/spec/gui/line_graph/line_clip_spec.rb +322 -322
  818. data/spec/install/config/system/system.txt +33 -33
  819. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +41 -41
  820. data/spec/install/config/targets/COSMOS/cmd_tlm/cosmos_server_tlm.txt +15 -15
  821. data/spec/install/config/targets/COSMOS/cmd_tlm_server.txt +6 -6
  822. data/spec/install/config/targets/COSMOS/screens/limits_change.txt +20 -20
  823. data/spec/install/config/targets/COSMOS/screens/version.txt +19 -19
  824. data/spec/install/config/targets/COSMOS/target.txt +5 -5
  825. data/spec/install/config/targets/INST/cmd_tlm/inst_cmd_linc.txt +30 -30
  826. data/spec/install/config/targets/INST/cmd_tlm/inst_cmds.txt +111 -111
  827. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm.txt +236 -236
  828. data/spec/install/config/targets/INST/cmd_tlm/inst_tlm_linc.txt +25 -25
  829. data/spec/install/config/targets/INST/cmd_tlm_server.txt +5 -5
  830. data/spec/install/config/targets/INST/lib/sim_inst.rb +305 -294
  831. data/spec/install/config/targets/INST/target.txt +10 -10
  832. data/spec/install/config/targets/META/cmd_tlm/meta_cmd.txt +4 -4
  833. data/spec/install/config/targets/META/cmd_tlm/meta_tlm.txt +4 -4
  834. data/spec/install/config/targets/SYSTEM/cmd_tlm/limits_groups.txt +7 -7
  835. data/spec/interfaces/cmd_tlm_server_interface_spec.rb +150 -150
  836. data/spec/interfaces/interface_spec.rb +130 -131
  837. data/spec/interfaces/linc_interface_spec.rb +199 -199
  838. data/spec/interfaces/serial_interface_spec.rb +56 -56
  839. data/spec/interfaces/simulated_target_interface_spec.rb +128 -128
  840. data/spec/interfaces/stream_interface_spec.rb +157 -157
  841. data/spec/interfaces/tcpip_client_interface_spec.rb +54 -54
  842. data/spec/interfaces/tcpip_server_interface_spec.rb +151 -151
  843. data/spec/interfaces/udp_interface_spec.rb +175 -177
  844. data/spec/io/buffered_file_spec.rb +113 -113
  845. data/spec/io/io_multiplexer_spec.rb +94 -94
  846. data/spec/io/json_drb_object_spec.rb +99 -99
  847. data/spec/io/json_drb_spec.rb +311 -311
  848. data/spec/io/json_rpc_spec.rb +264 -264
  849. data/spec/io/raw_logger_pair_spec.rb +76 -76
  850. data/spec/io/raw_logger_spec.rb +133 -133
  851. data/spec/io/serial_driver_spec.rb +61 -61
  852. data/spec/io/stderr_spec.rb +32 -32
  853. data/spec/io/stdout_spec.rb +32 -32
  854. data/spec/io/tcpip_server_spec.rb +338 -338
  855. data/spec/io/udp_sockets_spec.rb +94 -94
  856. data/spec/io/win32_serial_driver_spec.rb +88 -88
  857. data/spec/packet_logs/meta_packet_log_writer_spec.rb +170 -170
  858. data/spec/packet_logs/packet_log_reader_spec.rb +408 -408
  859. data/spec/packet_logs/packet_log_writer_pair_spec.rb +30 -30
  860. data/spec/packet_logs/packet_log_writer_spec.rb +223 -223
  861. data/spec/packets/binary_accessor_spec.rb +2073 -2073
  862. data/spec/packets/commands_spec.rb +369 -369
  863. data/spec/packets/limits_response_spec.rb +25 -25
  864. data/spec/packets/limits_spec.rb +326 -326
  865. data/spec/packets/packet_config_spec.rb +1620 -1620
  866. data/spec/packets/packet_item_limits_spec.rb +161 -161
  867. data/spec/packets/packet_item_spec.rb +386 -386
  868. data/spec/packets/packet_spec.rb +1057 -949
  869. data/spec/packets/structure_item_spec.rb +195 -195
  870. data/spec/packets/structure_spec.rb +419 -419
  871. data/spec/packets/telemetry_spec.rb +535 -535
  872. data/spec/processors/new_packet_log_processor_spec.rb +39 -39
  873. data/spec/processors/processor_spec.rb +55 -55
  874. data/spec/processors/statistics_processor_spec.rb +60 -60
  875. data/spec/processors/watermark_processor_spec.rb +51 -51
  876. data/spec/script/script_spec.rb +654 -654
  877. data/spec/spec_helper.rb +154 -148
  878. data/spec/streams/burst_stream_protocol_spec.rb +32 -32
  879. data/spec/streams/fixed_stream_protocol_spec.rb +110 -110
  880. data/spec/streams/length_stream_protocol_spec.rb +297 -297
  881. data/spec/streams/preidentified_stream_protocol_spec.rb +118 -118
  882. data/spec/streams/serial_stream_spec.rb +105 -105
  883. data/spec/streams/stream_protocol_spec.rb +332 -332
  884. data/spec/streams/stream_spec.rb +29 -29
  885. data/spec/streams/tcpip_client_stream_spec.rb +54 -54
  886. data/spec/streams/tcpip_socket_stream_spec.rb +146 -146
  887. data/spec/streams/template_stream_protocol_spec.rb +151 -151
  888. data/spec/streams/terminated_stream_protocol_spec.rb +123 -123
  889. data/spec/system/system_spec.rb +645 -645
  890. data/spec/system/target_spec.rb +248 -248
  891. data/spec/tools/cmd_tlm_server/api_spec.rb +1087 -1113
  892. data/spec/tools/cmd_tlm_server/background_task_spec.rb +32 -32
  893. data/spec/tools/cmd_tlm_server/background_tasks_spec.rb +81 -81
  894. data/spec/tools/cmd_tlm_server/cmd_tlm_server_config_spec.rb +411 -411
  895. data/spec/tools/cmd_tlm_server/cmd_tlm_server_spec.rb +415 -415
  896. data/spec/tools/cmd_tlm_server/commanding_spec.rb +123 -123
  897. data/spec/tools/cmd_tlm_server/connections_spec.rb +147 -147
  898. data/spec/tools/cmd_tlm_server/interface_thread_spec.rb +306 -306
  899. data/spec/tools/cmd_tlm_server/interfaces_spec.rb +252 -238
  900. data/spec/tools/cmd_tlm_server/packet_logging_spec.rb +143 -143
  901. data/spec/tools/cmd_tlm_server/router_thread_spec.rb +98 -101
  902. data/spec/tools/cmd_tlm_server/routers_spec.rb +223 -208
  903. data/spec/top_level/top_level_spec.rb +334 -321
  904. data/spec/utilities/crc_spec.rb +45 -45
  905. data/spec/utilities/csv_spec.rb +97 -97
  906. data/spec/utilities/logger_spec.rb +102 -102
  907. data/spec/utilities/message_log_spec.rb +89 -89
  908. data/spec/utilities/quaternion_spec.rb +107 -107
  909. data/spec/utilities/ruby_lex_utils_spec.rb +86 -86
  910. data/tasks/manifest.rake +22 -22
  911. data/tasks/spec.rake +23 -23
  912. metadata +18 -2
@@ -1,645 +1,645 @@
1
- # encoding: ascii-8bit
2
-
3
- # Copyright 2014 Ball Aerospace & Technologies Corp.
4
- # All Rights Reserved.
5
- #
6
- # This program is free software; you can modify and/or redistribute it
7
- # under the terms of the GNU General Public License
8
- # as published by the Free Software Foundation; version 3 with
9
- # attribution addendums as found in the LICENSE.txt
10
-
11
- require 'spec_helper'
12
- require 'cosmos'
13
- require 'cosmos/system/system'
14
- require 'tempfile'
15
-
16
- module Cosmos
17
-
18
- describe System do
19
- before(:all) do
20
- clean_config()
21
- System.class_eval('@@instance = nil')
22
-
23
- # Save system.txt
24
- @config_file = File.join(Cosmos::USERPATH,'config','system','system.txt')
25
- FileUtils.mv @config_file, Cosmos::USERPATH
26
-
27
- # Create a dummy system.txt
28
- File.open(@config_file,'w') {|file| file.puts "# This is a comment" }
29
- @config_targets = File.join(Cosmos::USERPATH,'config','targets')
30
- end
31
-
32
- after(:all) do
33
- # Restore system.txt
34
- FileUtils.mv File.join(Cosmos::USERPATH, 'system.txt'),
35
- File.join(Cosmos::USERPATH,'config','system')
36
- end
37
-
38
- after(:each) do
39
- clean_config()
40
- System.class_eval('@@instance = nil')
41
- end
42
-
43
- describe "instance" do
44
- it "should create default ports" do
45
- # Don't check the actual port numbers but just that they exist
46
- System.ports.keys.should eql %w(CTS_API TLMVIEWER_API CTS_PREIDENTIFIED)
47
- end
48
-
49
- it "should create default paths" do
50
- # Don't check the actual paths but just that they exist
51
- System.paths.keys.should eql %w(LOGS TMP SAVED_CONFIG TABLES HANDBOOKS PROCEDURES)
52
- end
53
- end
54
-
55
- describe "System.commands" do
56
- it "should only contain UNKNOWN" do
57
- System.commands.target_names.should eql ["UNKNOWN"]
58
- end
59
-
60
- it "should log errors saving the configuration" do
61
- # Force a reload of the configuration
62
- System.class_eval('@@instance = nil')
63
-
64
- capture_io do |stdout|
65
- allow(FileUtils).to receive(:mkdir_p) { raise "Error" }
66
- System.commands.target_names.should eql ["UNKNOWN"]
67
- stdout.string.should match "Problem saving configuration"
68
- end
69
- end
70
- end
71
-
72
- describe "System.telemetry" do
73
- it "should only contain UNKNOWN" do
74
- System.telemetry.target_names.should eql ["UNKNOWN"]
75
- end
76
- end
77
-
78
- describe "System.limits" do
79
- it "should include the DEFAULT limit set" do
80
- System.limits.sets.should include :DEFAULT
81
- end
82
- end
83
-
84
- context "with valid targets" do
85
- before(:all) do
86
- # Write the system.txt file to auto declare targets
87
- File.open(@config_file,'w') { |file| file.puts "AUTO_DECLARE_TARGETS" }
88
- end
89
-
90
- describe "System.clear_counters" do
91
- it "should clear the target, command and telemetry counters" do
92
- System.targets.each do |name, tgt|
93
- tgt.cmd_cnt = 100
94
- tgt.tlm_cnt = 100
95
- end
96
- System.commands.all do |tgt, pkt|
97
- pkt.received_count = 100
98
- end
99
- System.telemetry.all do |tgt, pkt|
100
- pkt.received_count = 100
101
- end
102
-
103
- System.clear_counters
104
-
105
- System.targets.each do |name, tgt|
106
- tgt.cmd_cnt.should eql 0
107
- tgt.tlm_cnt.should eql 0
108
- end
109
- System.commands.all do |tgt, pkt|
110
- pkt.received_count.should eql 0
111
- end
112
- System.telemetry.all do |tgt, pkt|
113
- pkt.received_count.should eql 0
114
- end
115
- end
116
- end
117
-
118
- describe "packets and System.packets" do
119
- it "should calculate MD5s across all the target files" do
120
- capture_io do |stdout|
121
- # This line actually does the work of reading the configuration
122
- System.telemetry.target_names.should eql ['COSMOS','INST','META','UNKNOWN']
123
- System.commands.target_names.should eql ['COSMOS','INST','META','UNKNOWN']
124
-
125
- stdout.string.should match "Marshal file does not exist"
126
-
127
- # Reset stdout for another go at the processing
128
- stdout.rewind
129
- # Reset the instance variable so it will read the new configuration
130
- System.class_eval('@@instance = nil')
131
- # This line actually does the work of reading the configuration
132
- System.telemetry.target_names.should eql ['COSMOS','INST','META','UNKNOWN']
133
- System.commands.target_names.should eql ['COSMOS','INST','META','UNKNOWN']
134
-
135
- stdout.string.should match "Marshal load success"
136
- end
137
- end
138
-
139
- it "should handle target parsing errors" do
140
- capture_io do |stdout|
141
- allow_any_instance_of(PacketConfig).to receive(:process_file) { raise "ProcessError" }
142
- # This line actually does the work of reading the configuration
143
- expect { System.telemetry.target_names.should eql ['COSMOS','INST','META','UNKNOWN'] }.to raise_error("ProcessError")
144
-
145
- stdout.string.should match "Problem processing"
146
- end
147
- end
148
- end
149
-
150
- describe "load_configuration" do
151
- after(:all) do
152
- File.delete(File.join(@config_targets,'COSMOS','cmd_tlm','test1_tlm.txt'))
153
- File.delete(File.join(@config_targets,'COSMOS','cmd_tlm','test2_tlm.txt'))
154
- end
155
-
156
- it "should load the initial configuration" do
157
- System.load_configuration
158
- System.commands.target_names.should eql ['COSMOS','INST','META','UNKNOWN']
159
- System.telemetry.target_names.should eql ['COSMOS','INST','META','UNKNOWN']
160
- end
161
-
162
- it "should load a named configuration" do
163
- File.open(@config_file,'w') do |file|
164
- file.puts "DECLARE_TARGET COSMOS"
165
- file.puts "DECLARE_TARGET COSMOS OVERRIDE"
166
- end
167
-
168
- # Load the original configuration
169
- original_config_name = System.load_configuration()
170
- System.telemetry.target_names.should eql %w(COSMOS OVERRIDE UNKNOWN)
171
- original_pkts = System.telemetry.packets('COSMOS').keys
172
-
173
- # Create a new configuration by writing another telemetry file
174
- File.open(File.join(@config_targets,'COSMOS','cmd_tlm','test1_tlm.txt'),'w') do |file|
175
- file.puts "TELEMETRY COSMOS TEST1 BIG_ENDIAN"
176
- file.puts " APPEND_ITEM DATA 240 STRING"
177
- end
178
- System.instance.process_file(@config_file)
179
- # Verify the new telemetry packet is there
180
- System.telemetry.packets('COSMOS').keys.should include "TEST1"
181
- second_config_name = System.configuration_name
182
-
183
- # Now load the original configuration
184
- name = System.load_configuration(original_config_name)
185
- original_config_name.should eql name
186
- System.telemetry.packets('COSMOS').keys.should_not include "TEST1"
187
-
188
- # Create yet another configuration by writing another telemetry file
189
- File.open(File.join(@config_targets,'COSMOS','cmd_tlm','test2_tlm.txt'),'w') do |file|
190
- file.puts "TELEMETRY COSMOS TEST2 BIG_ENDIAN"
191
- file.puts " APPEND_ITEM DATA 240 STRING"
192
- end
193
- System.instance.process_file(@config_file)
194
- names = []
195
- # Verify the new telemetry packet is there as well as the second one
196
- System.telemetry.packets('COSMOS').keys.should include("TEST1", "TEST2")
197
- third_config_name = System.configuration_name
198
-
199
- # Try loading something that doesn't exist
200
- # It should fail and reload the original configuration
201
- name = System.load_configuration("BLAH")
202
- name.should eql original_config_name
203
-
204
- # Now load the second configuration. It shouldn't have the most
205
- # recently defined telemetry packet.
206
- System.load_configuration(second_config_name)
207
- System.telemetry.packets('COSMOS').keys.should include "TEST1"
208
- System.telemetry.packets('COSMOS').keys.should_not include "TEST2"
209
- end
210
- end
211
- end
212
-
213
- describe "process_file" do
214
- before(:all) do
215
- begin
216
- # Move the targets directory out of the way so we can make our own
217
- FileUtils.mv @config_targets, Cosmos::USERPATH
218
- FileUtils.mkdir_p(@config_targets)
219
- File.open(@config_file,'w') { |file| file.puts "AUTO_DECLARE_TARGETS" }
220
- rescue
221
- puts "Cannot move targets folder... probably due to open editor or explorer"
222
- exit 1
223
- end
224
- end
225
- after(:all) do
226
- # Restore the targets directory
227
- FileUtils.rm_rf @config_targets
228
- FileUtils.mv File.join(Cosmos::USERPATH, 'targets'), File.join(Cosmos::USERPATH, 'config')
229
- end
230
-
231
- it "should complain about unknown keywords" do
232
- tf = Tempfile.new('unittest')
233
- tf.puts("BLAH")
234
- tf.close
235
- expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Unknown keyword 'BLAH'")
236
- tf.unlink
237
- end
238
-
239
- context "with AUTO_DECLARE_TARGETS" do
240
- it "should take 0 parameters" do
241
- tf = Tempfile.new('unittest')
242
- tf.puts("AUTO_DECLARE_TARGETS TRUE")
243
- tf.close
244
- expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Too many parameters for AUTO_DECLARE_TARGETS.")
245
- tf.unlink
246
- end
247
-
248
- it "should complain if config/targets doesn't exist" do
249
- tf = Tempfile.new('unittest')
250
- tf.puts("AUTO_DECLARE_TARGETS")
251
- tf.close
252
- FileUtils.rm_rf(@config_targets)
253
- expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, /\/config\/targets must exist/)
254
- FileUtils.mkdir_p(@config_targets)
255
- tf.unlink
256
- end
257
-
258
- it "should complain if target directories aren't uppercase" do
259
- tf = Tempfile.new('unittest')
260
- tf.puts("AUTO_DECLARE_TARGETS")
261
- tf.close
262
- FileUtils.mkdir_p(File.join(@config_targets, 'tgt'))
263
- expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Target folder must be uppercase: 'tgt'")
264
- Dir.rmdir(File.join(@config_targets, 'tgt'))
265
- tf.unlink
266
- end
267
-
268
- it "should process target directories with the SYSTEM directory last" do
269
- tf = Tempfile.new('unittest')
270
- tf.puts("AUTO_DECLARE_TARGETS")
271
- tf.close
272
- FileUtils.mkdir_p(File.join(@config_targets, 'ABC'))
273
- FileUtils.mkdir_p(File.join(@config_targets, 'SYSTEM'))
274
- FileUtils.mkdir_p(File.join(@config_targets, 'XYZ'))
275
- System.instance.process_file(tf.path)
276
- # Since Ruby 1.9+ uses ordered Hashes we can ask for the keys and
277
- # SYSTEM should be last
278
- System.instance.targets.keys.should eql %w(ABC XYZ SYSTEM)
279
- Dir.rmdir(File.join(@config_targets, 'ABC'))
280
- Dir.rmdir(File.join(@config_targets, 'SYSTEM'))
281
- Dir.rmdir(File.join(@config_targets, 'XYZ'))
282
- tf.unlink
283
- end
284
- end
285
-
286
- context "with DECLARE_TARGET" do
287
- it "should take 1 or 2 parameters" do
288
- tf = Tempfile.new('unittest')
289
- tf.puts("DECLARE_TARGET")
290
- tf.close
291
- expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Not enough parameters for DECLARE_TARGET.")
292
- tf.unlink
293
-
294
- tf = Tempfile.new('unittest')
295
- tf.puts("DECLARE_TARGET TGT TGT TGT TGT")
296
- tf.close
297
- expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Too many parameters for DECLARE_TARGET.")
298
- tf.unlink
299
- end
300
-
301
- it "should complain if the target directory doesn't exist" do
302
- tf = Tempfile.new('unittest')
303
- tf.puts("DECLARE_TARGET TGT")
304
- tf.close
305
- expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, /Target folder must exist/)
306
- tf.unlink
307
- end
308
-
309
- it "should process the target directory" do
310
- tf = Tempfile.new('unittest')
311
- tf.puts("DECLARE_TARGET TGT")
312
- tf.close
313
- FileUtils.mkdir_p(File.join(@config_targets, 'TGT'))
314
- System.instance.process_file(tf.path)
315
- tf.unlink
316
- end
317
-
318
- it "should process the target directory with substitute name" do
319
- tf = Tempfile.new('unittest')
320
- tf.puts("DECLARE_TARGET TGT NEW")
321
- tf.close
322
- FileUtils.mkdir_p(File.join(@config_targets, 'TGT'))
323
- System.instance.process_file(tf.path)
324
- tf.unlink
325
- end
326
-
327
- it "should process the target directory with specified target.txt" do
328
- tf = Tempfile.new('unittest')
329
- tf.puts("DECLARE_TARGET TGT nil target.txt")
330
- tf.close
331
- FileUtils.mkdir_p(File.join(@config_targets, 'TGT'))
332
- File.open(File.join(@config_targets, 'TGT', 'target.txt'), 'w') do |file|
333
- file.puts "# target.txt"
334
- end
335
- System.instance.process_file(tf.path)
336
- tf.unlink
337
- end
338
- end
339
-
340
- context "with PORT" do
341
- it "should take 2 parameters" do
342
- tf = Tempfile.new('unittest')
343
- tf.puts("PORT CTS_API")
344
- tf.close
345
- expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Not enough parameters for PORT.")
346
- tf.unlink
347
-
348
- tf = Tempfile.new('unittest')
349
- tf.puts("PORT CTS_API 8888 TRUE")
350
- tf.close
351
- expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Too many parameters for PORT.")
352
- tf.unlink
353
- end
354
-
355
- it "should complain about unknown ports" do
356
- tf = Tempfile.new('unittest')
357
- tf.puts("PORT MYPORT 10")
358
- tf.close
359
- capture_io do |stdout|
360
- System.instance.process_file(tf.path)
361
- stdout.string.should match /WARN: Unknown port name given: MYPORT/
362
- end
363
- tf.unlink
364
- end
365
-
366
- it "should change known ports" do
367
- tf = Tempfile.new('unittest')
368
- tf.puts("PORT CTS_API 8888")
369
- tf.close
370
- System.ports['CTS_API'].should eql 7777
371
- System.instance.process_file(tf.path)
372
- System.ports['CTS_API'].should eql 8888
373
- tf.unlink
374
- end
375
- end
376
-
377
- context "with PATH" do
378
- it "should take 2 parameters" do
379
- tf = Tempfile.new('unittest')
380
- tf.puts("PATH C:/")
381
- tf.close
382
- expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Not enough parameters for PATH.")
383
- tf.unlink
384
-
385
- tf = Tempfile.new('unittest')
386
- tf.puts("PATH MYPATH C:/ TRUE")
387
- tf.close
388
- expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Too many parameters for PATH.")
389
- tf.unlink
390
- end
391
-
392
- it "should complain about unknown paths" do
393
- tf = Tempfile.new('unittest')
394
- tf.puts("PATH MYPATH C:/")
395
- tf.close
396
- capture_io do |stdout|
397
- System.instance.process_file(tf.path)
398
- stdout.string.should match /WARN: Unknown path name given: MYPATH/
399
- end
400
- tf.unlink
401
- end
402
-
403
- it "should change known paths" do
404
- if Kernel.is_windows?
405
- tf = Tempfile.new('unittest')
406
- tf.puts("PATH LOGS C:/mylogs")
407
- tf.close
408
- System.paths['LOGS'].should match 'outputs/logs'
409
- System.instance.process_file(tf.path)
410
- System.paths['LOGS'].should eql 'C:/mylogs'
411
- tf.unlink
412
- end
413
- end
414
- end
415
-
416
- context "with DEFAULT_PACKET_LOG_WRITER" do
417
- it "should take 1 parameters" do
418
- tf = Tempfile.new('unittest')
419
- tf.puts("DEFAULT_PACKET_LOG_WRITER")
420
- tf.close
421
- expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Not enough parameters for DEFAULT_PACKET_LOG_WRITER.")
422
- tf.unlink
423
-
424
- tf = Tempfile.new('unittest')
425
- tf.puts("DEFAULT_PACKET_LOG_WRITER my_nonexistent_class TRUE")
426
- tf.close
427
- expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Too many parameters for DEFAULT_PACKET_LOG_WRITER.")
428
- tf.unlink
429
- end
430
-
431
- it "should complain if the class doesn't exist" do
432
- tf = Tempfile.new('unittest')
433
- tf.puts("DEFAULT_PACKET_LOG_WRITER my_nonexistent_class")
434
- tf.close
435
- expect { System.instance.process_file(tf.path) }.to raise_error(/Unable to require my_nonexistent_class/)
436
- tf.unlink
437
- end
438
-
439
- it "should set the packet writer" do
440
- filename = File.join(File.dirname(__FILE__),'..','..','lib','my_writer.rb')
441
- File.open(filename, 'w') do |file|
442
- file.puts "class MyWriter"
443
- file.puts "end"
444
- end
445
- tf = Tempfile.new('unittest')
446
- tf.puts("DEFAULT_PACKET_LOG_WRITER my_writer")
447
- tf.close
448
- System.instance.process_file(tf.path)
449
- System.default_packet_log_writer.should eql MyWriter
450
- File.delete filename
451
- tf.unlink
452
- end
453
- end
454
-
455
- context "with DEFAULT_PACKET_LOG_READER" do
456
- it "should take 1 parameters" do
457
- tf = Tempfile.new('unittest')
458
- tf.puts("DEFAULT_PACKET_LOG_READER")
459
- tf.close
460
- expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Not enough parameters for DEFAULT_PACKET_LOG_READER.")
461
- tf.unlink
462
-
463
- tf = Tempfile.new('unittest')
464
- tf.puts("DEFAULT_PACKET_LOG_READER my_nonexistent_class TRUE")
465
- tf.close
466
- expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Too many parameters for DEFAULT_PACKET_LOG_READER.")
467
- tf.unlink
468
- end
469
-
470
- it "should complain if the class doesn't exist" do
471
- tf = Tempfile.new('unittest')
472
- tf.puts("DEFAULT_PACKET_LOG_READER my_nonexistent_class")
473
- tf.close
474
- expect { System.instance.process_file(tf.path) }.to raise_error(/Unable to require my_nonexistent_class/)
475
- tf.unlink
476
- end
477
-
478
- it "should set the packet reader" do
479
- filename = File.join(File.dirname(__FILE__),'..','..','lib','my_reader.rb')
480
- File.open(filename, 'w') do |file|
481
- file.puts "class MyReader"
482
- file.puts "end"
483
- end
484
- tf = Tempfile.new('unittest')
485
- tf.puts("DEFAULT_PACKET_LOG_READER my_reader")
486
- tf.close
487
- System.instance.process_file(tf.path)
488
- System.default_packet_log_reader.should eql MyReader
489
- File.delete filename
490
- tf.unlink
491
- end
492
- end
493
-
494
- context "with DISABLE_DNS" do
495
- it "should take 0 parameters" do
496
- tf = Tempfile.new('unittest')
497
- tf.puts("DISABLE_DNS BLAH TRUE")
498
- tf.close
499
- expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Too many parameters for DISABLE_DNS.")
500
- tf.unlink
501
- end
502
-
503
- it "should disable dns lookups" do
504
- tf = Tempfile.new('unittest')
505
- tf.puts("DISABLE_DNS")
506
- tf.close
507
- System.use_dns.should be_truthy
508
- System.instance.process_file(tf.path)
509
- System.use_dns.should be_falsey
510
- tf.unlink
511
- end
512
- end
513
-
514
- context "with ALLOW_ACCESS" do
515
- it "should take 1 parameters" do
516
- tf = Tempfile.new('unittest')
517
- tf.puts("ALLOW_ACCESS")
518
- tf.close
519
- expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Not enough parameters for ALLOW_ACCESS.")
520
- tf.unlink
521
-
522
- tf = Tempfile.new('unittest')
523
- tf.puts("ALLOW_ACCESS localhost true")
524
- tf.close
525
- expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Too many parameters for ALLOW_ACCESS.")
526
- tf.unlink
527
- end
528
-
529
- it "should complain about bad addresses" do
530
- tf = Tempfile.new('unittest')
531
- tf.puts("ALLOW_ACCESS blah")
532
- tf.close
533
- expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error)
534
- tf.unlink
535
-
536
- tf = Tempfile.new('unittest')
537
- tf.puts("ALLOW_ACCESS hopefully_this_is_not_a_valid_machine_name_XYZ")
538
- tf.close
539
- expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error)
540
- tf.unlink
541
- end
542
-
543
- it "should allow ALL" do
544
- tf = Tempfile.new('unittest')
545
- tf.puts("ALLOW_ACCESS ALL")
546
- tf.close
547
- System.instance.process_file(tf.path)
548
- System.acl.should be_nil
549
- tf.unlink
550
- end
551
-
552
- it "should store host by name" do
553
- tf = Tempfile.new('unittest')
554
- tf.puts("ALLOW_ACCESS localhost")
555
- tf.close
556
- System.instance.process_file(tf.path)
557
- System.acl.allow_addr?(["AF_INET",0,"localhost","127.0.0.1"]).should be_truthy
558
- tf.unlink
559
- end
560
-
561
- it "should store host by IP address" do
562
- addr = IPSocket.getaddress("www.google.com")
563
- if addr and !addr.index(':')
564
- tf = Tempfile.new('unittest')
565
- tf.puts("ALLOW_ACCESS #{addr}")
566
- tf.close
567
- System.instance.process_file(tf.path)
568
- System.acl.allow_addr?(["AF_INET",0,"www.google.com",addr]).should be_truthy
569
- tf.unlink
570
- end
571
- end
572
- end
573
-
574
- context "with STALENESS_SECONDS" do
575
- it "should take 1 parameters" do
576
- tf = Tempfile.new('unittest')
577
- tf.puts("STALENESS_SECONDS")
578
- tf.close
579
- expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Not enough parameters for STALENESS_SECONDS.")
580
- tf.unlink
581
-
582
- tf = Tempfile.new('unittest')
583
- tf.puts("STALENESS_SECONDS 1 2")
584
- tf.close
585
- expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Too many parameters for STALENESS_SECONDS.")
586
- tf.unlink
587
- end
588
-
589
- it "should set the number of seconds required to be stale" do
590
- tf = Tempfile.new('unittest')
591
- tf.puts("STALENESS_SECONDS 3")
592
- tf.close
593
- System.staleness_seconds.should eql 30
594
- System.instance.process_file(tf.path)
595
- System.staleness_seconds.should eql 3
596
- tf.unlink
597
- end
598
- end
599
-
600
- context "with CMD_TLM_VERSION" do
601
- it "should take 1 parameters" do
602
- tf = Tempfile.new('unittest')
603
- tf.puts("CMD_TLM_VERSION")
604
- tf.close
605
- expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Not enough parameters for CMD_TLM_VERSION.")
606
- tf.unlink
607
-
608
- tf = Tempfile.new('unittest')
609
- tf.puts("CMD_TLM_VERSION 1 2")
610
- tf.close
611
- expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Too many parameters for CMD_TLM_VERSION.")
612
- tf.unlink
613
- end
614
-
615
- it "should set the command and telemetry version" do
616
- tf = Tempfile.new('unittest')
617
- tf.puts("CMD_TLM_VERSION 2.1")
618
- tf.close
619
- System.cmd_tlm_version.should be_nil
620
- System.instance.process_file(tf.path)
621
- System.cmd_tlm_version.should eql "2.1"
622
- tf.unlink
623
- end
624
- end
625
- end
626
-
627
- describe "Cosmos.write_exception_file" do
628
- it "should write a file with the exception" do
629
- filename = Cosmos.write_exception_file(RuntimeError.new("HELP!"))
630
- File.exist?(filename).should be_truthy
631
- File.delete(filename)
632
- end
633
-
634
- it "should write a file without a defined LOGS directory" do
635
- File.open(@config_file,'w') {|file| file.puts "PATH LOGS C:/this/is/not/a/real/path" }
636
- # Reset the instance variable so it will read the new config file
637
- System.instance_eval('@instance = nil')
638
- filename = Cosmos.write_exception_file(RuntimeError.new("HELP!"))
639
- File.exist?(filename).should be_truthy
640
- File.delete(filename)
641
- end
642
- end
643
- end
644
- end
645
-
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2014 Ball Aerospace & Technologies Corp.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+
11
+ require 'spec_helper'
12
+ require 'cosmos'
13
+ require 'cosmos/system/system'
14
+ require 'tempfile'
15
+
16
+ module Cosmos
17
+
18
+ describe System do
19
+ before(:all) do
20
+ clean_config()
21
+ System.class_eval('@@instance = nil')
22
+
23
+ # Save system.txt
24
+ @config_file = File.join(Cosmos::USERPATH,'config','system','system.txt')
25
+ FileUtils.mv @config_file, Cosmos::USERPATH
26
+
27
+ # Create a dummy system.txt
28
+ File.open(@config_file,'w') {|file| file.puts "# This is a comment" }
29
+ @config_targets = File.join(Cosmos::USERPATH,'config','targets')
30
+ end
31
+
32
+ after(:all) do
33
+ # Restore system.txt
34
+ FileUtils.mv File.join(Cosmos::USERPATH, 'system.txt'),
35
+ File.join(Cosmos::USERPATH,'config','system')
36
+ end
37
+
38
+ after(:each) do
39
+ clean_config()
40
+ System.class_eval('@@instance = nil')
41
+ end
42
+
43
+ describe "instance" do
44
+ it "should create default ports" do
45
+ # Don't check the actual port numbers but just that they exist
46
+ System.ports.keys.should eql %w(CTS_API TLMVIEWER_API CTS_PREIDENTIFIED)
47
+ end
48
+
49
+ it "should create default paths" do
50
+ # Don't check the actual paths but just that they exist
51
+ System.paths.keys.should eql %w(LOGS TMP SAVED_CONFIG TABLES HANDBOOKS PROCEDURES)
52
+ end
53
+ end
54
+
55
+ describe "System.commands" do
56
+ it "should only contain UNKNOWN" do
57
+ System.commands.target_names.should eql ["UNKNOWN"]
58
+ end
59
+
60
+ it "should log errors saving the configuration" do
61
+ # Force a reload of the configuration
62
+ System.class_eval('@@instance = nil')
63
+
64
+ capture_io do |stdout|
65
+ allow(FileUtils).to receive(:mkdir_p) { raise "Error" }
66
+ System.commands.target_names.should eql ["UNKNOWN"]
67
+ stdout.string.should match "Problem saving configuration"
68
+ end
69
+ end
70
+ end
71
+
72
+ describe "System.telemetry" do
73
+ it "should only contain UNKNOWN" do
74
+ System.telemetry.target_names.should eql ["UNKNOWN"]
75
+ end
76
+ end
77
+
78
+ describe "System.limits" do
79
+ it "should include the DEFAULT limit set" do
80
+ System.limits.sets.should include :DEFAULT
81
+ end
82
+ end
83
+
84
+ context "with valid targets" do
85
+ before(:all) do
86
+ # Write the system.txt file to auto declare targets
87
+ File.open(@config_file,'w') { |file| file.puts "AUTO_DECLARE_TARGETS" }
88
+ end
89
+
90
+ describe "System.clear_counters" do
91
+ it "should clear the target, command and telemetry counters" do
92
+ System.targets.each do |name, tgt|
93
+ tgt.cmd_cnt = 100
94
+ tgt.tlm_cnt = 100
95
+ end
96
+ System.commands.all do |tgt, pkt|
97
+ pkt.received_count = 100
98
+ end
99
+ System.telemetry.all do |tgt, pkt|
100
+ pkt.received_count = 100
101
+ end
102
+
103
+ System.clear_counters
104
+
105
+ System.targets.each do |name, tgt|
106
+ tgt.cmd_cnt.should eql 0
107
+ tgt.tlm_cnt.should eql 0
108
+ end
109
+ System.commands.all do |tgt, pkt|
110
+ pkt.received_count.should eql 0
111
+ end
112
+ System.telemetry.all do |tgt, pkt|
113
+ pkt.received_count.should eql 0
114
+ end
115
+ end
116
+ end
117
+
118
+ describe "packets and System.packets" do
119
+ it "should calculate MD5s across all the target files" do
120
+ capture_io do |stdout|
121
+ # This line actually does the work of reading the configuration
122
+ System.telemetry.target_names.should eql ['COSMOS','INST','META','UNKNOWN']
123
+ System.commands.target_names.should eql ['COSMOS','INST','META','UNKNOWN']
124
+
125
+ stdout.string.should match "Marshal file does not exist"
126
+
127
+ # Reset stdout for another go at the processing
128
+ stdout.rewind
129
+ # Reset the instance variable so it will read the new configuration
130
+ System.class_eval('@@instance = nil')
131
+ # This line actually does the work of reading the configuration
132
+ System.telemetry.target_names.should eql ['COSMOS','INST','META','UNKNOWN']
133
+ System.commands.target_names.should eql ['COSMOS','INST','META','UNKNOWN']
134
+
135
+ stdout.string.should match "Marshal load success"
136
+ end
137
+ end
138
+
139
+ it "should handle target parsing errors" do
140
+ capture_io do |stdout|
141
+ allow_any_instance_of(PacketConfig).to receive(:process_file) { raise "ProcessError" }
142
+ # This line actually does the work of reading the configuration
143
+ expect { System.telemetry.target_names.should eql ['COSMOS','INST','META','UNKNOWN'] }.to raise_error("ProcessError")
144
+
145
+ stdout.string.should match "Problem processing"
146
+ end
147
+ end
148
+ end
149
+
150
+ describe "load_configuration" do
151
+ after(:all) do
152
+ File.delete(File.join(@config_targets,'COSMOS','cmd_tlm','test1_tlm.txt'))
153
+ File.delete(File.join(@config_targets,'COSMOS','cmd_tlm','test2_tlm.txt'))
154
+ end
155
+
156
+ it "should load the initial configuration" do
157
+ System.load_configuration
158
+ System.commands.target_names.should eql ['COSMOS','INST','META','UNKNOWN']
159
+ System.telemetry.target_names.should eql ['COSMOS','INST','META','UNKNOWN']
160
+ end
161
+
162
+ it "should load a named configuration" do
163
+ File.open(@config_file,'w') do |file|
164
+ file.puts "DECLARE_TARGET COSMOS"
165
+ file.puts "DECLARE_TARGET COSMOS OVERRIDE"
166
+ end
167
+
168
+ # Load the original configuration
169
+ original_config_name = System.load_configuration()
170
+ System.telemetry.target_names.should eql %w(COSMOS OVERRIDE UNKNOWN)
171
+ original_pkts = System.telemetry.packets('COSMOS').keys
172
+
173
+ # Create a new configuration by writing another telemetry file
174
+ File.open(File.join(@config_targets,'COSMOS','cmd_tlm','test1_tlm.txt'),'w') do |file|
175
+ file.puts "TELEMETRY COSMOS TEST1 BIG_ENDIAN"
176
+ file.puts " APPEND_ITEM DATA 240 STRING"
177
+ end
178
+ System.instance.process_file(@config_file)
179
+ # Verify the new telemetry packet is there
180
+ System.telemetry.packets('COSMOS').keys.should include "TEST1"
181
+ second_config_name = System.configuration_name
182
+
183
+ # Now load the original configuration
184
+ name = System.load_configuration(original_config_name)
185
+ original_config_name.should eql name
186
+ System.telemetry.packets('COSMOS').keys.should_not include "TEST1"
187
+
188
+ # Create yet another configuration by writing another telemetry file
189
+ File.open(File.join(@config_targets,'COSMOS','cmd_tlm','test2_tlm.txt'),'w') do |file|
190
+ file.puts "TELEMETRY COSMOS TEST2 BIG_ENDIAN"
191
+ file.puts " APPEND_ITEM DATA 240 STRING"
192
+ end
193
+ System.instance.process_file(@config_file)
194
+ names = []
195
+ # Verify the new telemetry packet is there as well as the second one
196
+ System.telemetry.packets('COSMOS').keys.should include("TEST1", "TEST2")
197
+ third_config_name = System.configuration_name
198
+
199
+ # Try loading something that doesn't exist
200
+ # It should fail and reload the original configuration
201
+ name = System.load_configuration("BLAH")
202
+ name.should eql original_config_name
203
+
204
+ # Now load the second configuration. It shouldn't have the most
205
+ # recently defined telemetry packet.
206
+ System.load_configuration(second_config_name)
207
+ System.telemetry.packets('COSMOS').keys.should include "TEST1"
208
+ System.telemetry.packets('COSMOS').keys.should_not include "TEST2"
209
+ end
210
+ end
211
+ end
212
+
213
+ describe "process_file" do
214
+ before(:all) do
215
+ begin
216
+ # Move the targets directory out of the way so we can make our own
217
+ FileUtils.mv @config_targets, Cosmos::USERPATH
218
+ FileUtils.mkdir_p(@config_targets)
219
+ File.open(@config_file,'w') { |file| file.puts "AUTO_DECLARE_TARGETS" }
220
+ rescue
221
+ puts "Cannot move targets folder... probably due to open editor or explorer"
222
+ exit 1
223
+ end
224
+ end
225
+ after(:all) do
226
+ # Restore the targets directory
227
+ FileUtils.rm_rf @config_targets
228
+ FileUtils.mv File.join(Cosmos::USERPATH, 'targets'), File.join(Cosmos::USERPATH, 'config')
229
+ end
230
+
231
+ it "should complain about unknown keywords" do
232
+ tf = Tempfile.new('unittest')
233
+ tf.puts("BLAH")
234
+ tf.close
235
+ expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Unknown keyword 'BLAH'")
236
+ tf.unlink
237
+ end
238
+
239
+ context "with AUTO_DECLARE_TARGETS" do
240
+ it "should take 0 parameters" do
241
+ tf = Tempfile.new('unittest')
242
+ tf.puts("AUTO_DECLARE_TARGETS TRUE")
243
+ tf.close
244
+ expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Too many parameters for AUTO_DECLARE_TARGETS.")
245
+ tf.unlink
246
+ end
247
+
248
+ it "should complain if config/targets doesn't exist" do
249
+ tf = Tempfile.new('unittest')
250
+ tf.puts("AUTO_DECLARE_TARGETS")
251
+ tf.close
252
+ FileUtils.rm_rf(@config_targets)
253
+ expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, /\/config\/targets must exist/)
254
+ FileUtils.mkdir_p(@config_targets)
255
+ tf.unlink
256
+ end
257
+
258
+ it "should complain if target directories aren't uppercase" do
259
+ tf = Tempfile.new('unittest')
260
+ tf.puts("AUTO_DECLARE_TARGETS")
261
+ tf.close
262
+ FileUtils.mkdir_p(File.join(@config_targets, 'tgt'))
263
+ expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Target folder must be uppercase: 'tgt'")
264
+ Dir.rmdir(File.join(@config_targets, 'tgt'))
265
+ tf.unlink
266
+ end
267
+
268
+ it "should process target directories with the SYSTEM directory last" do
269
+ tf = Tempfile.new('unittest')
270
+ tf.puts("AUTO_DECLARE_TARGETS")
271
+ tf.close
272
+ FileUtils.mkdir_p(File.join(@config_targets, 'ABC'))
273
+ FileUtils.mkdir_p(File.join(@config_targets, 'SYSTEM'))
274
+ FileUtils.mkdir_p(File.join(@config_targets, 'XYZ'))
275
+ System.instance.process_file(tf.path)
276
+ # Since Ruby 1.9+ uses ordered Hashes we can ask for the keys and
277
+ # SYSTEM should be last
278
+ System.instance.targets.keys.should eql %w(ABC XYZ SYSTEM)
279
+ Dir.rmdir(File.join(@config_targets, 'ABC'))
280
+ Dir.rmdir(File.join(@config_targets, 'SYSTEM'))
281
+ Dir.rmdir(File.join(@config_targets, 'XYZ'))
282
+ tf.unlink
283
+ end
284
+ end
285
+
286
+ context "with DECLARE_TARGET" do
287
+ it "should take 1 or 2 parameters" do
288
+ tf = Tempfile.new('unittest')
289
+ tf.puts("DECLARE_TARGET")
290
+ tf.close
291
+ expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Not enough parameters for DECLARE_TARGET.")
292
+ tf.unlink
293
+
294
+ tf = Tempfile.new('unittest')
295
+ tf.puts("DECLARE_TARGET TGT TGT TGT TGT")
296
+ tf.close
297
+ expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Too many parameters for DECLARE_TARGET.")
298
+ tf.unlink
299
+ end
300
+
301
+ it "should complain if the target directory doesn't exist" do
302
+ tf = Tempfile.new('unittest')
303
+ tf.puts("DECLARE_TARGET TGT")
304
+ tf.close
305
+ expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, /Target folder must exist/)
306
+ tf.unlink
307
+ end
308
+
309
+ it "should process the target directory" do
310
+ tf = Tempfile.new('unittest')
311
+ tf.puts("DECLARE_TARGET TGT")
312
+ tf.close
313
+ FileUtils.mkdir_p(File.join(@config_targets, 'TGT'))
314
+ System.instance.process_file(tf.path)
315
+ tf.unlink
316
+ end
317
+
318
+ it "should process the target directory with substitute name" do
319
+ tf = Tempfile.new('unittest')
320
+ tf.puts("DECLARE_TARGET TGT NEW")
321
+ tf.close
322
+ FileUtils.mkdir_p(File.join(@config_targets, 'TGT'))
323
+ System.instance.process_file(tf.path)
324
+ tf.unlink
325
+ end
326
+
327
+ it "should process the target directory with specified target.txt" do
328
+ tf = Tempfile.new('unittest')
329
+ tf.puts("DECLARE_TARGET TGT nil target.txt")
330
+ tf.close
331
+ FileUtils.mkdir_p(File.join(@config_targets, 'TGT'))
332
+ File.open(File.join(@config_targets, 'TGT', 'target.txt'), 'w') do |file|
333
+ file.puts "# target.txt"
334
+ end
335
+ System.instance.process_file(tf.path)
336
+ tf.unlink
337
+ end
338
+ end
339
+
340
+ context "with PORT" do
341
+ it "should take 2 parameters" do
342
+ tf = Tempfile.new('unittest')
343
+ tf.puts("PORT CTS_API")
344
+ tf.close
345
+ expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Not enough parameters for PORT.")
346
+ tf.unlink
347
+
348
+ tf = Tempfile.new('unittest')
349
+ tf.puts("PORT CTS_API 8888 TRUE")
350
+ tf.close
351
+ expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Too many parameters for PORT.")
352
+ tf.unlink
353
+ end
354
+
355
+ it "should complain about unknown ports" do
356
+ tf = Tempfile.new('unittest')
357
+ tf.puts("PORT MYPORT 10")
358
+ tf.close
359
+ capture_io do |stdout|
360
+ System.instance.process_file(tf.path)
361
+ stdout.string.should match /WARN: Unknown port name given: MYPORT/
362
+ end
363
+ tf.unlink
364
+ end
365
+
366
+ it "should change known ports" do
367
+ tf = Tempfile.new('unittest')
368
+ tf.puts("PORT CTS_API 8888")
369
+ tf.close
370
+ System.ports['CTS_API'].should eql 7777
371
+ System.instance.process_file(tf.path)
372
+ System.ports['CTS_API'].should eql 8888
373
+ tf.unlink
374
+ end
375
+ end
376
+
377
+ context "with PATH" do
378
+ it "should take 2 parameters" do
379
+ tf = Tempfile.new('unittest')
380
+ tf.puts("PATH C:/")
381
+ tf.close
382
+ expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Not enough parameters for PATH.")
383
+ tf.unlink
384
+
385
+ tf = Tempfile.new('unittest')
386
+ tf.puts("PATH MYPATH C:/ TRUE")
387
+ tf.close
388
+ expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Too many parameters for PATH.")
389
+ tf.unlink
390
+ end
391
+
392
+ it "should complain about unknown paths" do
393
+ tf = Tempfile.new('unittest')
394
+ tf.puts("PATH MYPATH C:/")
395
+ tf.close
396
+ capture_io do |stdout|
397
+ System.instance.process_file(tf.path)
398
+ stdout.string.should match /WARN: Unknown path name given: MYPATH/
399
+ end
400
+ tf.unlink
401
+ end
402
+
403
+ it "should change known paths" do
404
+ if Kernel.is_windows?
405
+ tf = Tempfile.new('unittest')
406
+ tf.puts("PATH LOGS C:/mylogs")
407
+ tf.close
408
+ System.paths['LOGS'].should match 'outputs/logs'
409
+ System.instance.process_file(tf.path)
410
+ System.paths['LOGS'].should eql 'C:/mylogs'
411
+ tf.unlink
412
+ end
413
+ end
414
+ end
415
+
416
+ context "with DEFAULT_PACKET_LOG_WRITER" do
417
+ it "should take 1 parameters" do
418
+ tf = Tempfile.new('unittest')
419
+ tf.puts("DEFAULT_PACKET_LOG_WRITER")
420
+ tf.close
421
+ expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Not enough parameters for DEFAULT_PACKET_LOG_WRITER.")
422
+ tf.unlink
423
+
424
+ tf = Tempfile.new('unittest')
425
+ tf.puts("DEFAULT_PACKET_LOG_WRITER my_nonexistent_class TRUE")
426
+ tf.close
427
+ expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Too many parameters for DEFAULT_PACKET_LOG_WRITER.")
428
+ tf.unlink
429
+ end
430
+
431
+ it "should complain if the class doesn't exist" do
432
+ tf = Tempfile.new('unittest')
433
+ tf.puts("DEFAULT_PACKET_LOG_WRITER my_nonexistent_class")
434
+ tf.close
435
+ expect { System.instance.process_file(tf.path) }.to raise_error(/Unable to require my_nonexistent_class/)
436
+ tf.unlink
437
+ end
438
+
439
+ it "should set the packet writer" do
440
+ filename = File.join(File.dirname(__FILE__),'..','..','lib','my_writer.rb')
441
+ File.open(filename, 'w') do |file|
442
+ file.puts "class MyWriter"
443
+ file.puts "end"
444
+ end
445
+ tf = Tempfile.new('unittest')
446
+ tf.puts("DEFAULT_PACKET_LOG_WRITER my_writer")
447
+ tf.close
448
+ System.instance.process_file(tf.path)
449
+ System.default_packet_log_writer.should eql MyWriter
450
+ File.delete filename
451
+ tf.unlink
452
+ end
453
+ end
454
+
455
+ context "with DEFAULT_PACKET_LOG_READER" do
456
+ it "should take 1 parameters" do
457
+ tf = Tempfile.new('unittest')
458
+ tf.puts("DEFAULT_PACKET_LOG_READER")
459
+ tf.close
460
+ expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Not enough parameters for DEFAULT_PACKET_LOG_READER.")
461
+ tf.unlink
462
+
463
+ tf = Tempfile.new('unittest')
464
+ tf.puts("DEFAULT_PACKET_LOG_READER my_nonexistent_class TRUE")
465
+ tf.close
466
+ expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Too many parameters for DEFAULT_PACKET_LOG_READER.")
467
+ tf.unlink
468
+ end
469
+
470
+ it "should complain if the class doesn't exist" do
471
+ tf = Tempfile.new('unittest')
472
+ tf.puts("DEFAULT_PACKET_LOG_READER my_nonexistent_class")
473
+ tf.close
474
+ expect { System.instance.process_file(tf.path) }.to raise_error(/Unable to require my_nonexistent_class/)
475
+ tf.unlink
476
+ end
477
+
478
+ it "should set the packet reader" do
479
+ filename = File.join(File.dirname(__FILE__),'..','..','lib','my_reader.rb')
480
+ File.open(filename, 'w') do |file|
481
+ file.puts "class MyReader"
482
+ file.puts "end"
483
+ end
484
+ tf = Tempfile.new('unittest')
485
+ tf.puts("DEFAULT_PACKET_LOG_READER my_reader")
486
+ tf.close
487
+ System.instance.process_file(tf.path)
488
+ System.default_packet_log_reader.should eql MyReader
489
+ File.delete filename
490
+ tf.unlink
491
+ end
492
+ end
493
+
494
+ context "with DISABLE_DNS" do
495
+ it "should take 0 parameters" do
496
+ tf = Tempfile.new('unittest')
497
+ tf.puts("DISABLE_DNS BLAH TRUE")
498
+ tf.close
499
+ expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Too many parameters for DISABLE_DNS.")
500
+ tf.unlink
501
+ end
502
+
503
+ it "should disable dns lookups" do
504
+ tf = Tempfile.new('unittest')
505
+ tf.puts("DISABLE_DNS")
506
+ tf.close
507
+ System.use_dns.should be_truthy
508
+ System.instance.process_file(tf.path)
509
+ System.use_dns.should be_falsey
510
+ tf.unlink
511
+ end
512
+ end
513
+
514
+ context "with ALLOW_ACCESS" do
515
+ it "should take 1 parameters" do
516
+ tf = Tempfile.new('unittest')
517
+ tf.puts("ALLOW_ACCESS")
518
+ tf.close
519
+ expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Not enough parameters for ALLOW_ACCESS.")
520
+ tf.unlink
521
+
522
+ tf = Tempfile.new('unittest')
523
+ tf.puts("ALLOW_ACCESS localhost true")
524
+ tf.close
525
+ expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Too many parameters for ALLOW_ACCESS.")
526
+ tf.unlink
527
+ end
528
+
529
+ it "should complain about bad addresses" do
530
+ tf = Tempfile.new('unittest')
531
+ tf.puts("ALLOW_ACCESS blah")
532
+ tf.close
533
+ expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error)
534
+ tf.unlink
535
+
536
+ tf = Tempfile.new('unittest')
537
+ tf.puts("ALLOW_ACCESS hopefully_this_is_not_a_valid_machine_name_XYZ")
538
+ tf.close
539
+ expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error)
540
+ tf.unlink
541
+ end
542
+
543
+ it "should allow ALL" do
544
+ tf = Tempfile.new('unittest')
545
+ tf.puts("ALLOW_ACCESS ALL")
546
+ tf.close
547
+ System.instance.process_file(tf.path)
548
+ System.acl.should be_nil
549
+ tf.unlink
550
+ end
551
+
552
+ it "should store host by name" do
553
+ tf = Tempfile.new('unittest')
554
+ tf.puts("ALLOW_ACCESS localhost")
555
+ tf.close
556
+ System.instance.process_file(tf.path)
557
+ System.acl.allow_addr?(["AF_INET",0,"localhost","127.0.0.1"]).should be_truthy
558
+ tf.unlink
559
+ end
560
+
561
+ it "should store host by IP address" do
562
+ addr = IPSocket.getaddress("www.google.com")
563
+ if addr and !addr.index(':')
564
+ tf = Tempfile.new('unittest')
565
+ tf.puts("ALLOW_ACCESS #{addr}")
566
+ tf.close
567
+ System.instance.process_file(tf.path)
568
+ System.acl.allow_addr?(["AF_INET",0,"www.google.com",addr]).should be_truthy
569
+ tf.unlink
570
+ end
571
+ end
572
+ end
573
+
574
+ context "with STALENESS_SECONDS" do
575
+ it "should take 1 parameters" do
576
+ tf = Tempfile.new('unittest')
577
+ tf.puts("STALENESS_SECONDS")
578
+ tf.close
579
+ expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Not enough parameters for STALENESS_SECONDS.")
580
+ tf.unlink
581
+
582
+ tf = Tempfile.new('unittest')
583
+ tf.puts("STALENESS_SECONDS 1 2")
584
+ tf.close
585
+ expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Too many parameters for STALENESS_SECONDS.")
586
+ tf.unlink
587
+ end
588
+
589
+ it "should set the number of seconds required to be stale" do
590
+ tf = Tempfile.new('unittest')
591
+ tf.puts("STALENESS_SECONDS 3")
592
+ tf.close
593
+ System.staleness_seconds.should eql 30
594
+ System.instance.process_file(tf.path)
595
+ System.staleness_seconds.should eql 3
596
+ tf.unlink
597
+ end
598
+ end
599
+
600
+ context "with CMD_TLM_VERSION" do
601
+ it "should take 1 parameters" do
602
+ tf = Tempfile.new('unittest')
603
+ tf.puts("CMD_TLM_VERSION")
604
+ tf.close
605
+ expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Not enough parameters for CMD_TLM_VERSION.")
606
+ tf.unlink
607
+
608
+ tf = Tempfile.new('unittest')
609
+ tf.puts("CMD_TLM_VERSION 1 2")
610
+ tf.close
611
+ expect { System.instance.process_file(tf.path) }.to raise_error(ConfigParser::Error, "Too many parameters for CMD_TLM_VERSION.")
612
+ tf.unlink
613
+ end
614
+
615
+ it "should set the command and telemetry version" do
616
+ tf = Tempfile.new('unittest')
617
+ tf.puts("CMD_TLM_VERSION 2.1")
618
+ tf.close
619
+ System.cmd_tlm_version.should be_nil
620
+ System.instance.process_file(tf.path)
621
+ System.cmd_tlm_version.should eql "2.1"
622
+ tf.unlink
623
+ end
624
+ end
625
+ end
626
+
627
+ describe "Cosmos.write_exception_file" do
628
+ it "should write a file with the exception" do
629
+ filename = Cosmos.write_exception_file(RuntimeError.new("HELP!"))
630
+ File.exist?(filename).should be_truthy
631
+ File.delete(filename)
632
+ end
633
+
634
+ it "should write a file without a defined LOGS directory" do
635
+ File.open(@config_file,'w') {|file| file.puts "PATH LOGS C:/this/is/not/a/real/path" }
636
+ # Reset the instance variable so it will read the new config file
637
+ System.instance_eval('@instance = nil')
638
+ filename = Cosmos.write_exception_file(RuntimeError.new("HELP!"))
639
+ File.exist?(filename).should be_truthy
640
+ File.delete(filename)
641
+ end
642
+ end
643
+ end
644
+ end
645
+