roku_builder 3.13.0 → 4.0.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 (226) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -1
  3. data/CHANGELOG +12 -0
  4. data/Gemfile.lock +22 -7
  5. data/Guardfile +3 -3
  6. data/README.md +22 -398
  7. data/bin/roku +1 -194
  8. data/config.json.example +1 -1
  9. data/intergration/roku_builder/test_core.rb +52 -0
  10. data/intergration/roku_builder/test_files/core_intergration_test/manifest_template +7 -0
  11. data/intergration/roku_builder/test_files/core_intergration_test/test.pkg +0 -0
  12. data/intergration/roku_builder/test_files/inspector_intergration_test/components/rectanglescene.xml +28 -0
  13. data/intergration/roku_builder/test_files/inspector_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
  14. data/intergration/roku_builder/test_files/inspector_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
  15. data/intergration/roku_builder/test_files/inspector_intergration_test/images/rde_splash_fhd.jpg +0 -0
  16. data/intergration/roku_builder/test_files/inspector_intergration_test/images/rde_splash_hd.jpg +0 -0
  17. data/intergration/roku_builder/test_files/inspector_intergration_test/images/rde_splash_sd.jpg +0 -0
  18. data/intergration/roku_builder/test_files/inspector_intergration_test/images/rsgde_bg_hd.jpg +0 -0
  19. data/intergration/roku_builder/test_files/inspector_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
  20. data/intergration/roku_builder/test_files/inspector_intergration_test/images/rsgde_splash_hd.jpg +0 -0
  21. data/intergration/roku_builder/test_files/inspector_intergration_test/manifest +21 -0
  22. data/intergration/roku_builder/test_files/inspector_intergration_test/source/main.brs +23 -0
  23. data/intergration/roku_builder/test_files/inspector_intergration_test/test.pkg +0 -0
  24. data/intergration/roku_builder/test_files/linker_intergration_test/components/rectanglescene.xml +29 -0
  25. data/intergration/roku_builder/test_files/linker_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
  26. data/intergration/roku_builder/test_files/linker_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
  27. data/intergration/roku_builder/test_files/linker_intergration_test/images/rde_splash_fhd.jpg +0 -0
  28. data/intergration/roku_builder/test_files/linker_intergration_test/images/rde_splash_hd.jpg +0 -0
  29. data/intergration/roku_builder/test_files/linker_intergration_test/images/rde_splash_sd.jpg +0 -0
  30. data/intergration/roku_builder/test_files/linker_intergration_test/images/rsgde_bg_hd.jpg +0 -0
  31. data/intergration/roku_builder/test_files/linker_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
  32. data/intergration/roku_builder/test_files/linker_intergration_test/images/rsgde_splash_hd.jpg +0 -0
  33. data/intergration/roku_builder/test_files/linker_intergration_test/manifest +21 -0
  34. data/intergration/roku_builder/test_files/linker_intergration_test/source/main.brs +21 -0
  35. data/intergration/roku_builder/test_files/linker_intergration_test/test.pkg +0 -0
  36. data/intergration/roku_builder/test_files/loader_intergration_test/components/rectanglescene.xml +29 -0
  37. data/intergration/roku_builder/test_files/loader_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
  38. data/intergration/roku_builder/test_files/loader_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
  39. data/intergration/roku_builder/test_files/loader_intergration_test/images/rde_splash_fhd.jpg +0 -0
  40. data/intergration/roku_builder/test_files/loader_intergration_test/images/rde_splash_hd.jpg +0 -0
  41. data/intergration/roku_builder/test_files/loader_intergration_test/images/rde_splash_sd.jpg +0 -0
  42. data/intergration/roku_builder/test_files/loader_intergration_test/images/rsgde_bg_hd.jpg +0 -0
  43. data/intergration/roku_builder/test_files/loader_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
  44. data/intergration/roku_builder/test_files/loader_intergration_test/images/rsgde_splash_hd.jpg +0 -0
  45. data/intergration/roku_builder/test_files/loader_intergration_test/manifest +21 -0
  46. data/intergration/roku_builder/test_files/loader_intergration_test/source/main.brs +21 -0
  47. data/intergration/roku_builder/test_files/loader_intergration_test/test.pkg +0 -0
  48. data/intergration/roku_builder/test_files/monitor_intergration_test/components/rectanglescene.xml +29 -0
  49. data/intergration/roku_builder/test_files/monitor_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
  50. data/intergration/roku_builder/test_files/monitor_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
  51. data/intergration/roku_builder/test_files/monitor_intergration_test/images/rde_splash_fhd.jpg +0 -0
  52. data/intergration/roku_builder/test_files/monitor_intergration_test/images/rde_splash_hd.jpg +0 -0
  53. data/intergration/roku_builder/test_files/monitor_intergration_test/images/rde_splash_sd.jpg +0 -0
  54. data/intergration/roku_builder/test_files/monitor_intergration_test/images/rsgde_bg_hd.jpg +0 -0
  55. data/intergration/roku_builder/test_files/monitor_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
  56. data/intergration/roku_builder/test_files/monitor_intergration_test/images/rsgde_splash_hd.jpg +0 -0
  57. data/intergration/roku_builder/test_files/monitor_intergration_test/manifest +21 -0
  58. data/intergration/roku_builder/test_files/monitor_intergration_test/source/main.brs +21 -0
  59. data/intergration/roku_builder/test_files/monitor_intergration_test/test.pkg +0 -0
  60. data/intergration/roku_builder/test_files/navigator_intergration_test/components/rectanglescene.xml +29 -0
  61. data/intergration/roku_builder/test_files/navigator_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
  62. data/intergration/roku_builder/test_files/navigator_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
  63. data/intergration/roku_builder/test_files/navigator_intergration_test/images/rde_splash_fhd.jpg +0 -0
  64. data/intergration/roku_builder/test_files/navigator_intergration_test/images/rde_splash_hd.jpg +0 -0
  65. data/intergration/roku_builder/test_files/navigator_intergration_test/images/rde_splash_sd.jpg +0 -0
  66. data/intergration/roku_builder/test_files/navigator_intergration_test/images/rsgde_bg_hd.jpg +0 -0
  67. data/intergration/roku_builder/test_files/navigator_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
  68. data/intergration/roku_builder/test_files/navigator_intergration_test/images/rsgde_splash_hd.jpg +0 -0
  69. data/intergration/roku_builder/test_files/navigator_intergration_test/manifest +21 -0
  70. data/intergration/roku_builder/test_files/navigator_intergration_test/source/main.brs +21 -0
  71. data/intergration/roku_builder/test_files/navigator_intergration_test/test.pkg +0 -0
  72. data/intergration/roku_builder/test_files/packager_intergration_test/components/rectanglescene.xml +29 -0
  73. data/intergration/roku_builder/test_files/packager_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
  74. data/intergration/roku_builder/test_files/packager_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
  75. data/intergration/roku_builder/test_files/packager_intergration_test/images/rde_splash_fhd.jpg +0 -0
  76. data/intergration/roku_builder/test_files/packager_intergration_test/images/rde_splash_hd.jpg +0 -0
  77. data/intergration/roku_builder/test_files/packager_intergration_test/images/rde_splash_sd.jpg +0 -0
  78. data/intergration/roku_builder/test_files/packager_intergration_test/images/rsgde_bg_hd.jpg +0 -0
  79. data/intergration/roku_builder/test_files/packager_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
  80. data/intergration/roku_builder/test_files/packager_intergration_test/images/rsgde_splash_hd.jpg +0 -0
  81. data/intergration/roku_builder/test_files/packager_intergration_test/manifest +21 -0
  82. data/intergration/roku_builder/test_files/packager_intergration_test/source/main.brs +21 -0
  83. data/intergration/roku_builder/test_files/packager_intergration_test/test.pkg +0 -0
  84. data/intergration/roku_builder/test_files/profiler_intergration_test/components/rectanglescene.xml +29 -0
  85. data/intergration/roku_builder/test_files/profiler_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
  86. data/intergration/roku_builder/test_files/profiler_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
  87. data/intergration/roku_builder/test_files/profiler_intergration_test/images/rde_splash_fhd.jpg +0 -0
  88. data/intergration/roku_builder/test_files/profiler_intergration_test/images/rde_splash_hd.jpg +0 -0
  89. data/intergration/roku_builder/test_files/profiler_intergration_test/images/rde_splash_sd.jpg +0 -0
  90. data/intergration/roku_builder/test_files/profiler_intergration_test/images/rsgde_bg_hd.jpg +0 -0
  91. data/intergration/roku_builder/test_files/profiler_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
  92. data/intergration/roku_builder/test_files/profiler_intergration_test/images/rsgde_splash_hd.jpg +0 -0
  93. data/intergration/roku_builder/test_files/profiler_intergration_test/manifest +21 -0
  94. data/intergration/roku_builder/test_files/profiler_intergration_test/source/main.brs +21 -0
  95. data/intergration/roku_builder/test_files/profiler_intergration_test/test.pkg +0 -0
  96. data/intergration/roku_builder/test_files/scripter_intergration_test/components/rectanglescene.xml +29 -0
  97. data/intergration/roku_builder/test_files/scripter_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
  98. data/intergration/roku_builder/test_files/scripter_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
  99. data/intergration/roku_builder/test_files/scripter_intergration_test/images/rde_splash_fhd.jpg +0 -0
  100. data/intergration/roku_builder/test_files/scripter_intergration_test/images/rde_splash_hd.jpg +0 -0
  101. data/intergration/roku_builder/test_files/scripter_intergration_test/images/rde_splash_sd.jpg +0 -0
  102. data/intergration/roku_builder/test_files/scripter_intergration_test/images/rsgde_bg_hd.jpg +0 -0
  103. data/intergration/roku_builder/test_files/scripter_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
  104. data/intergration/roku_builder/test_files/scripter_intergration_test/images/rsgde_splash_hd.jpg +0 -0
  105. data/intergration/roku_builder/test_files/scripter_intergration_test/manifest +21 -0
  106. data/intergration/roku_builder/test_files/scripter_intergration_test/source/main.brs +21 -0
  107. data/intergration/roku_builder/test_files/scripter_intergration_test/test.pkg +0 -0
  108. data/intergration/roku_builder/test_files/tester_intergration_test/components/rectanglescene.xml +29 -0
  109. data/intergration/roku_builder/test_files/tester_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
  110. data/intergration/roku_builder/test_files/tester_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
  111. data/intergration/roku_builder/test_files/tester_intergration_test/images/rde_splash_fhd.jpg +0 -0
  112. data/intergration/roku_builder/test_files/tester_intergration_test/images/rde_splash_hd.jpg +0 -0
  113. data/intergration/roku_builder/test_files/tester_intergration_test/images/rde_splash_sd.jpg +0 -0
  114. data/intergration/roku_builder/test_files/tester_intergration_test/images/rsgde_bg_hd.jpg +0 -0
  115. data/intergration/roku_builder/test_files/tester_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
  116. data/intergration/roku_builder/test_files/tester_intergration_test/images/rsgde_splash_hd.jpg +0 -0
  117. data/intergration/roku_builder/test_files/tester_intergration_test/manifest +21 -0
  118. data/intergration/roku_builder/test_files/tester_intergration_test/source/main.brs +21 -0
  119. data/intergration/roku_builder/test_files/tester_intergration_test/test.pkg +0 -0
  120. data/intergration/roku_builder/test_helper.rb +138 -0
  121. data/intergration/roku_builder/test_inspector.rb +35 -0
  122. data/intergration/roku_builder/test_linker.rb +32 -0
  123. data/intergration/roku_builder/test_loader.rb +38 -0
  124. data/intergration/roku_builder/test_monitor.rb +21 -0
  125. data/intergration/roku_builder/test_navigator.rb +34 -0
  126. data/intergration/roku_builder/test_packager.rb +41 -0
  127. data/intergration/roku_builder/test_profiler.rb +48 -0
  128. data/intergration/roku_builder/test_scripter.rb +38 -0
  129. data/intergration/roku_builder/test_tester.rb +21 -0
  130. data/lib/roku_builder.rb +143 -154
  131. data/lib/roku_builder/config.rb +17 -40
  132. data/lib/roku_builder/config_parser.rb +49 -200
  133. data/lib/roku_builder/config_validator.rb +1 -1
  134. data/lib/roku_builder/errors.rb +12 -0
  135. data/lib/roku_builder/git.rb +28 -0
  136. data/lib/roku_builder/hash.rb +8 -0
  137. data/lib/roku_builder/manifest.rb +121 -0
  138. data/lib/roku_builder/options.rb +68 -29
  139. data/lib/roku_builder/plugin.rb +30 -0
  140. data/lib/roku_builder/plugins/core.rb +117 -0
  141. data/lib/roku_builder/plugins/inspector.rb +104 -0
  142. data/lib/roku_builder/{linker.rb → plugins/linker.rb} +38 -12
  143. data/lib/roku_builder/plugins/loader.rb +152 -0
  144. data/lib/roku_builder/{monitor.rb → plugins/monitor.rb} +20 -9
  145. data/lib/roku_builder/{navigator.rb → plugins/navigator.rb} +136 -88
  146. data/lib/roku_builder/plugins/packager.rb +194 -0
  147. data/lib/roku_builder/plugins/profiler.rb +135 -0
  148. data/lib/roku_builder/plugins/scripter.rb +53 -0
  149. data/lib/roku_builder/{tester.rb → plugins/tester.rb} +28 -19
  150. data/lib/roku_builder/stager.rb +48 -12
  151. data/lib/roku_builder/string.rb +20 -0
  152. data/lib/roku_builder/util.rb +10 -34
  153. data/lib/roku_builder/version.rb +1 -1
  154. data/rakefile +5 -1
  155. data/roku_builder.gemspec +2 -0
  156. data/test/roku_builder/plugins/test_core.rb +112 -0
  157. data/test/roku_builder/plugins/test_inspector.rb +165 -0
  158. data/test/roku_builder/plugins/test_linker.rb +123 -0
  159. data/test/roku_builder/plugins/test_loader.rb +115 -0
  160. data/test/roku_builder/plugins/test_monitor.rb +141 -0
  161. data/test/roku_builder/plugins/test_navigator.rb +274 -0
  162. data/test/roku_builder/plugins/test_packager.rb +202 -0
  163. data/test/roku_builder/plugins/test_profiler.rb +127 -0
  164. data/test/roku_builder/plugins/test_scripter.rb +110 -0
  165. data/test/roku_builder/plugins/test_tester.rb +109 -0
  166. data/test/roku_builder/test_config.rb +51 -35
  167. data/test/roku_builder/test_config_parser.rb +76 -154
  168. data/test/roku_builder/test_config_validator.rb +18 -1
  169. data/test/roku_builder/test_files/{loader_test/manifest → config_parser_test/test.pkg} +0 -0
  170. data/test/roku_builder/test_files/config_test/config.json +3 -0
  171. data/test/roku_builder/test_files/controller_commands_test/manifest_template +7 -0
  172. data/test/roku_builder/test_files/core_test/manifest_template +7 -0
  173. data/test/roku_builder/test_files/core_test/test.pkg +0 -0
  174. data/test/roku_builder/test_files/inspector_test/manifest +6 -0
  175. data/test/roku_builder/test_files/inspector_test/test.pkg +0 -0
  176. data/test/roku_builder/test_files/linker_test/manifest +6 -0
  177. data/test/roku_builder/test_files/linker_test/test.pkg +0 -0
  178. data/test/roku_builder/test_files/loader_test/manifest_template +6 -0
  179. data/test/roku_builder/test_files/loader_test/test.pkg +0 -0
  180. data/test/roku_builder/test_files/loader_test/test.zip +0 -0
  181. data/test/roku_builder/test_files/manifest_test/manifest_comments +6 -0
  182. data/test/roku_builder/test_files/manifest_test/manifest_template +7 -0
  183. data/test/roku_builder/test_files/manifest_test/test.zip +0 -0
  184. data/test/roku_builder/test_files/packager_test/manifest +6 -0
  185. data/test/roku_builder/test_files/packager_test/scripter_test/manifest +6 -0
  186. data/test/roku_builder/test_files/packager_test/test.pkg +0 -0
  187. data/test/roku_builder/test_files/roku_builder_test/config.json +32 -0
  188. data/test/roku_builder/test_files/scripter_test/manifest +6 -0
  189. data/test/roku_builder/test_files/scripter_test/test.pkg +0 -0
  190. data/test/roku_builder/test_files/stager_test/test.pkg +0 -0
  191. data/test/roku_builder/test_files/tester_test/manifest +6 -0
  192. data/test/roku_builder/test_files/tester_test/test.pkg +0 -0
  193. data/test/roku_builder/test_helper.rb +44 -11
  194. data/test/roku_builder/test_logger.rb +1 -0
  195. data/test/roku_builder/test_manifest.rb +99 -0
  196. data/test/roku_builder/test_options.rb +106 -77
  197. data/test/roku_builder/test_options_plugins.rb +111 -0
  198. data/test/roku_builder/test_plugin.rb +48 -0
  199. data/test/roku_builder/test_roku_builder.rb +239 -0
  200. data/test/roku_builder/test_stager.rb +49 -101
  201. data/test/roku_builder/test_util.rb +19 -4
  202. metadata +241 -47
  203. data/lib/roku_builder/controller.rb +0 -98
  204. data/lib/roku_builder/controller_commands.rb +0 -224
  205. data/lib/roku_builder/error_handler.rb +0 -142
  206. data/lib/roku_builder/inspector.rb +0 -82
  207. data/lib/roku_builder/keyer.rb +0 -106
  208. data/lib/roku_builder/loader.rb +0 -131
  209. data/lib/roku_builder/manifest_manager.rb +0 -126
  210. data/lib/roku_builder/packager.rb +0 -43
  211. data/lib/roku_builder/profiler.rb +0 -96
  212. data/lib/roku_builder/scripter.rb +0 -39
  213. data/test/roku_builder/test_controller.rb +0 -70
  214. data/test/roku_builder/test_controller_commands.rb +0 -465
  215. data/test/roku_builder/test_error_handler.rb +0 -90
  216. data/test/roku_builder/test_inspector.rb +0 -298
  217. data/test/roku_builder/test_keyer.rb +0 -176
  218. data/test/roku_builder/test_linker.rb +0 -110
  219. data/test/roku_builder/test_loader.rb +0 -337
  220. data/test/roku_builder/test_manifest_manager.rb +0 -103
  221. data/test/roku_builder/test_monitor.rb +0 -137
  222. data/test/roku_builder/test_navigator.rb +0 -280
  223. data/test/roku_builder/test_packager.rb +0 -127
  224. data/test/roku_builder/test_profiler.rb +0 -35
  225. data/test/roku_builder/test_scripter.rb +0 -102
  226. data/test/roku_builder/test_tester.rb +0 -130
@@ -0,0 +1,123 @@
1
+ # ********** Copyright Viacom, Inc. Apache 2.0 **********
2
+
3
+ require_relative "../test_helper.rb"
4
+
5
+ module RokuBuilder
6
+ class LinkerTest < Minitest::Test
7
+ def setup
8
+ Logger.set_testing
9
+ RokuBuilder.setup_plugins
10
+ register_plugins(Linker)
11
+ @requests = []
12
+ end
13
+ def teardown
14
+ @requests.each {|req| remove_request_stub(req)}
15
+ end
16
+ def test_linker_parse_options_long
17
+ parser = OptionParser.new
18
+ options = {}
19
+ Linker.parse_options(parser: parser, options: options)
20
+ argv = ["roku", "--deeplink", "options", "--app-list", "--app", "app"]
21
+ parser.parse! argv
22
+ assert_equal "options", options[:deeplink]
23
+ assert options[:applist]
24
+ assert_equal "app", options[:app_id]
25
+ end
26
+ def test_linker_parse_options_short
27
+ parser = OptionParser.new
28
+ options = {}
29
+ Linker.parse_options(parser: parser, options: options)
30
+ argv = ["roku", "-o", "options", "-A", "-a", "app"]
31
+ parser.parse! argv
32
+ assert_equal "options", options[:deeplink]
33
+ assert options[:applist]
34
+ assert_equal "app", options[:app_id]
35
+ end
36
+ def test_linker_link
37
+ @requests.push(stub_request(:post, "http://192.168.0.100:8060/launch/dev?a=A&b=B:C&d=a%5Cb").
38
+ to_return(status: 200, body: "", headers: {}))
39
+
40
+ options = {deeplink: 'a:A, b:B:C, d:a\b'}
41
+ config, options = build_config_options_objects(LinkerTest, options, false)
42
+
43
+ linker = Linker.new(config: config)
44
+ linker.deeplink(options: options)
45
+ end
46
+ def test_linker_link_sideload
47
+ @requests.push(stub_request(:post, "http://192.168.0.100:8060/launch/dev?a=A&b=B:C&d=a%5Cb").
48
+ to_return(status: 200, body: "", headers: {}))
49
+ @requests.push(stub_request(:post, "http://192.168.0.100:8060/keypress/Home").
50
+ to_return(status: 200, body: "", headers: {}))
51
+ @requests.push(stub_request(:post, "http://192.168.0.100/plugin_install").
52
+ to_return(status: 200, body: "Install Success", headers: {}))
53
+
54
+ options = {deeplink: 'a:A, b:B:C, d:a\b', working: true}
55
+ config, options = build_config_options_objects(LinkerTest, options, false)
56
+
57
+ linker = Linker.new(config: config)
58
+ linker.deeplink(options: options)
59
+ end
60
+ def test_linker_link_sideload_current
61
+ @requests.push(stub_request(:post, "http://192.168.0.100:8060/launch/dev?a=A&b=B:C&d=a%5Cb").
62
+ to_return(status: 200, body: "", headers: {}))
63
+ @requests.push(stub_request(:post, "http://192.168.0.100:8060/keypress/Home").
64
+ to_return(status: 200, body: "", headers: {}))
65
+ @requests.push(stub_request(:post, "http://192.168.0.100/plugin_install").
66
+ to_return(status: 200, body: "Install Success", headers: {}))
67
+
68
+ options = {deeplink: 'a:A, b:B:C, d:a\b', current: true}
69
+ config = nil
70
+ Pathname.stub(:pwd, test_files_path(LinkerTest)) do
71
+ config, options = build_config_options_objects(LinkerTest, options, false)
72
+ end
73
+
74
+ linker = Linker.new(config: config)
75
+ linker.deeplink(options: options)
76
+ end
77
+ def test_linker_link_app
78
+ @requests.push(stub_request(:post, "http://192.168.0.100:8060/launch/1234?a=A&b=B:C&d=a%5Cb").
79
+ to_return(status: 200, body: "", headers: {}))
80
+
81
+ options = {deeplink: 'a:A, b:B:C, d:a\b', app_id: "1234"}
82
+ config, options = build_config_options_objects(LinkerTest, options, false)
83
+
84
+ linker = Linker.new(config: config)
85
+ linker.deeplink(options: options)
86
+ end
87
+ def test_linker_link_nothing
88
+ @requests.push(stub_request(:post, "http://192.168.0.100:8060/launch/dev").
89
+ to_return(status: 200, body: "", headers: {}))
90
+
91
+ options = {deeplink: ''}
92
+ config, options = build_config_options_objects(LinkerTest, options, false)
93
+
94
+ linker = Linker.new(config: config)
95
+ linker.deeplink(options: options)
96
+ end
97
+
98
+ def test_linker_list
99
+ body = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<apps>\n\t
100
+ <app id=\"31012\" type=\"menu\" version=\"1.6.3\">Movie Store and TV Store</app>\n\t
101
+ <app id=\"31863\" type=\"menu\" version=\"1.2.6\">Roku Home News</app>\n\t
102
+ <app id=\"65066\" type=\"appl\" version=\"1.3.0\">Nick</app>\n\t
103
+ <app id=\"68161\" type=\"appl\" version=\"1.3.0\">Nick</app>\n\t
104
+ </apps>\n"
105
+ @requests.push(stub_request(:get, "http://192.168.0.100:8060/query/apps").
106
+ to_return(status: 200, body: body, headers: {}))
107
+
108
+ options = {applist: true}
109
+ config, options = build_config_options_objects(LinkerTest, options, false)
110
+
111
+ linker = Linker.new(config: config)
112
+
113
+ print_count = 0
114
+ did_print = Proc.new { |msg| print_count+=1 }
115
+
116
+ linker.stub(:printf, did_print) do
117
+ linker.applist(options: options)
118
+ end
119
+
120
+ assert_equal 6, print_count
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,115 @@
1
+ # ********** Copyright Viacom, Inc. Apache 2.0 **********
2
+
3
+ require_relative "../test_helper.rb"
4
+
5
+ module RokuBuilder
6
+ class LoaderTest < Minitest::Test
7
+ def setup
8
+ Logger.set_testing
9
+ RokuBuilder.setup_plugins
10
+ register_plugins(Loader)
11
+ @config, @options = build_config_options_objects(LoaderTest, {sideload: true, working: true}, false)
12
+ @root_dir = @config.root_dir
13
+ @device_config = @config.device_config
14
+ FileUtils.cp(File.join(@root_dir, "manifest_template"), File.join(@root_dir, "manifest"))
15
+ @request_stubs = []
16
+ end
17
+ def teardown
18
+ FileUtils.rm(File.join(@root_dir, "manifest"))
19
+ @request_stubs.each {|req| remove_request_stub(req)}
20
+ end
21
+ def test_loader_parse_options_long
22
+ parser = OptionParser.new
23
+ options = {}
24
+ Loader.parse_options(parser: parser, options: options)
25
+ argv = ["roku", "--sideload", "--delete", "--build", "--exclude"]
26
+ parser.parse! argv
27
+ assert options[:sideload]
28
+ assert options[:delete]
29
+ assert options[:build]
30
+ assert options[:exclude]
31
+ end
32
+ def test_loader_parse_options_short
33
+ parser = OptionParser.new
34
+ options = {}
35
+ Loader.parse_options(parser: parser, options: options)
36
+ argv = ["roku", "-s", "-d", "-b", "-x"]
37
+ parser.parse! argv
38
+ assert options[:sideload]
39
+ assert options[:delete]
40
+ assert options[:build]
41
+ assert options[:exclude]
42
+ end
43
+ def test_loader_sideload
44
+ @request_stubs.push(stub_request(:post, "http://#{@device_config[:ip]}:8060/keypress/Home").
45
+ to_return(status: 200, body: "", headers: {}))
46
+ @request_stubs.push(stub_request(:post, "http://#{@device_config[:ip]}/plugin_install").
47
+ to_return(status: 200, body: "Install Success", headers: {}))
48
+
49
+ loader = Loader.new(config: @config)
50
+ loader.sideload(options: @options)
51
+ end
52
+ def test_loader_sideload_infile
53
+ infile = File.join(@root_dir, "test.zip")
54
+ @config, @options = build_config_options_objects(LoaderTest, {
55
+ sideload: true,
56
+ in: infile
57
+ }, false)
58
+
59
+ @request_stubs.push(stub_request(:post, "http://#{@device_config[:ip]}:8060/keypress/Home").
60
+ to_return(status: 200, body: "", headers: {}))
61
+ @request_stubs.push(stub_request(:post, "http://#{@device_config[:ip]}/plugin_install").
62
+ to_return(status: 200, body: "Install Success", headers: {}))
63
+
64
+ loader = Loader.new(config: @config)
65
+ loader.sideload(options: @options)
66
+ end
67
+ def test_loader_build_defining_folder_and_files
68
+ loader = Loader.new(config: @config)
69
+ loader.build(options: @options)
70
+ file_path = File.join(@config.out[:folder], Manifest.new(config: @config).build_version+".zip")
71
+ Zip::File.open(file_path) do |file|
72
+ assert file.find_entry("manifest") != nil
73
+ assert_nil file.find_entry("a")
74
+ assert file.find_entry("source/b") != nil
75
+ assert file.find_entry("source/c/d") != nil
76
+ end
77
+ FileUtils.rm(file_path)
78
+ end
79
+ def test_loader_build_all_contents
80
+ Pathname.stub(:pwd, @root_dir) do
81
+ @config, @options = build_config_options_objects(LoaderTest, {
82
+ sideload: true,
83
+ current: true
84
+ }, false)
85
+ end
86
+ loader = Loader.new(config: @config)
87
+ loader.build(options: @options)
88
+ file_path = File.join(@config.out[:folder], Manifest.new(config: @config).build_version+".zip")
89
+ Zip::File.open(file_path) do |file|
90
+ assert file.find_entry("manifest") != nil
91
+ assert file.find_entry("a") != nil
92
+ assert file.find_entry("source/b") != nil
93
+ assert file.find_entry("source/c/d") != nil
94
+ end
95
+ FileUtils.rm(file_path)
96
+ end
97
+
98
+ def test_loader_unload
99
+ @request_stubs.push(stub_request(:post, "http://#{@device_config[:ip]}/plugin_install").
100
+ to_return(status: 200, body: "Delete Succeeded", headers: {}))
101
+
102
+ loader = Loader.new(config: @config)
103
+ loader.delete(options: @options)
104
+ end
105
+ def test_loader_unload_fail
106
+ @request_stubs.push(stub_request(:post, "http://#{@device_config[:ip]}/plugin_install").
107
+ to_return(status: 200, body: "Delete Failed", headers: {}))
108
+
109
+ loader = Loader.new(config: @config)
110
+ assert_raises ExecutionError do
111
+ loader.delete(options: @options)
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,141 @@
1
+ # ********** Copyright Viacom, Inc. Apache 2.0 **********
2
+
3
+ require_relative "../test_helper.rb"
4
+
5
+ module RokuBuilder
6
+ class MonitorTest < Minitest::Test
7
+ def setup
8
+ Logger.set_testing
9
+ RokuBuilder.setup_plugins
10
+ unless RokuBuilder.plugins.include?(Monitor)
11
+ RokuBuilder.register_plugin(Monitor)
12
+ end
13
+ @options = build_options({monitor: "main"}, false)
14
+ @config = Config.new(options: @options)
15
+ @connection = Minitest::Mock.new
16
+ device_config = {
17
+ ip: "111.222.333",
18
+ user: "user",
19
+ password: "password"
20
+ }
21
+ @config.instance_variable_set(:@parsed, {device_config: device_config, init_params: {}})
22
+ @monitor = Monitor.new(config: @config)
23
+ end
24
+ def teardown
25
+ @connection.verify
26
+ end
27
+ def test_scripter_parse_options_long
28
+ parser = OptionParser.new
29
+ options = {}
30
+ Monitor.parse_options(parser: parser, options: options)
31
+ argv = ["roku", "--monitor", "--regexp", "regexp"]
32
+ parser.parse! argv
33
+ assert options[:monitor]
34
+ assert_equal "regexp", options[:regexp]
35
+ end
36
+ def test_scripter_parse_options_short
37
+ parser = OptionParser.new
38
+ options = {}
39
+ Monitor.parse_options(parser: parser, options: options)
40
+ argv = ["roku", "-m", "-r", "regexp"]
41
+ parser.parse! argv
42
+ assert options[:monitor]
43
+ assert_equal "regexp", options[:regexp]
44
+ end
45
+ def test_monitor_monit
46
+ @connection.expect(:waitfor, nil) do |config|
47
+ assert_equal(/./, config['Match'])
48
+ assert_equal(false, config['Timeout'])
49
+ end
50
+
51
+ readline = proc {
52
+ sleep(0.1)
53
+ "q"
54
+ }
55
+
56
+ Readline.stub(:readline, readline) do
57
+ Net::Telnet.stub(:new, @connection) do
58
+ @monitor.monitor(options: @options)
59
+ end
60
+ end
61
+
62
+ end
63
+
64
+ def test_monitor_monit_and_manage
65
+ @monitor.instance_variable_set(:@show_prompt, true)
66
+
67
+ @connection.expect(:waitfor, nil) do |config, &blk|
68
+ assert_equal(/./, config['Match'])
69
+ assert_equal(false, config['Timeout'])
70
+ txt = "Fake Text"
71
+ blk.call(txt) == ""
72
+ end
73
+
74
+ readline = proc {
75
+ sleep(0.1)
76
+ "q"
77
+ }
78
+
79
+ Readline.stub(:readline, readline) do
80
+ Net::Telnet.stub(:new, @connection) do
81
+ @monitor.stub(:manage_text, "") do
82
+ @monitor.monitor(options: @options)
83
+ end
84
+ end
85
+ end
86
+ end
87
+
88
+ def test_monitor_monit_input
89
+ @monitor.instance_variable_set(:@show_prompt, true)
90
+
91
+ @connection.expect(:waitfor, nil) do |config|
92
+ assert_equal(/./, config['Match'])
93
+ assert_equal(false, config['Timeout'])
94
+ end
95
+ @connection.expect(:puts, nil) do |text|
96
+ assert_equal("text", text)
97
+ @monitor.instance_variable_set(:@show_prompt, true)
98
+ end
99
+
100
+ readline = proc {
101
+ @count ||= 0
102
+ sleep(0.1)
103
+ case @count
104
+ when 0
105
+ @count += 1
106
+ "text"
107
+ else
108
+ "q"
109
+ end
110
+ }
111
+
112
+ Readline.stub(:readline, readline) do
113
+ Net::Telnet.stub(:new, @connection) do
114
+ @monitor.monitor(options: @options)
115
+ end
116
+ end
117
+ end
118
+
119
+ def test_monitor_manage_text
120
+ mock = Minitest::Mock.new
121
+ @monitor.instance_variable_set(:@show_prompt, true)
122
+ @monitor.instance_variable_set(:@mock, mock)
123
+
124
+ def @monitor.puts(input)
125
+ @mock.puts(input)
126
+ end
127
+
128
+ mock.expect(:puts, nil, ["midline split\n"])
129
+
130
+ all_text = "midline "
131
+ txt = "split\nBrightScript Debugger> "
132
+
133
+ result = @monitor.send(:manage_text, {all_text: all_text, txt: txt})
134
+
135
+ assert_equal "", result
136
+
137
+ mock.verify
138
+
139
+ end
140
+ end
141
+ end
@@ -0,0 +1,274 @@
1
+ # ********** Copyright Viacom, Inc. Apache 2.0 **********
2
+
3
+ require_relative "../test_helper.rb"
4
+
5
+ module RokuBuilder
6
+ class NavigatorTest < Minitest::Test
7
+ def setup
8
+ Logger.set_testing
9
+ RokuBuilder.setup_plugins
10
+ register_plugins(Navigator)
11
+ @requests = []
12
+ end
13
+ def teardown
14
+ @requests.each {|req| remove_request_stub(req)}
15
+ end
16
+ def test_navigator_parse_options_long
17
+ parser = OptionParser.new
18
+ options = {}
19
+ Navigator.parse_options(parser: parser, options: options)
20
+ argv = ["roku", "--nav", "nav", "--navigate", "--type", "text", "--screen",
21
+ "screen", "--screens"]
22
+ parser.parse! argv
23
+ assert_equal "nav", options[:nav]
24
+ assert options[:navigate]
25
+ assert_equal "text", options[:type]
26
+ assert_equal "screen", options[:screen]
27
+ assert options[:screens]
28
+ end
29
+ def test_navigator_parse_options_short
30
+ parser = OptionParser.new
31
+ options = {}
32
+ Navigator.parse_options(parser: parser, options: options)
33
+ argv = ["roku", "-N", "nav", "-y", "text"]
34
+ parser.parse! argv
35
+ assert_equal "nav", options[:nav]
36
+ assert_equal "text", options[:type]
37
+ end
38
+ def test_navigator_nav
39
+ commands = {
40
+ up: "Up",
41
+ down: "Down",
42
+ right: "Right",
43
+ left: "Left",
44
+ select: "Select",
45
+ back: "Back",
46
+ home: "Home",
47
+ rew: "Rev",
48
+ ff: "Fwd",
49
+ play: "Play",
50
+ replay: "InstantReplay"
51
+ }
52
+ commands.each {|k,v|
53
+ path = "/keypress/#{v}"
54
+ navigator_test(path: path, input: k, type: :nav)
55
+ }
56
+ end
57
+
58
+ def test_navigator_nav_fail
59
+ path = ""
60
+ navigator_test(path: path, input: :bad, type: :nav, success: false)
61
+ end
62
+
63
+ def test_navigator_type
64
+ path = "keypress/LIT_"
65
+ navigator_test(path: path, input: "Type", type: :type)
66
+ end
67
+
68
+ def navigator_test(path:, input:, type:, success: true)
69
+ if success
70
+ if type == :nav
71
+ @requests.push(stub_request(:post, "http://192.168.0.100:8060#{path}").
72
+ to_return(status: 200, body: "", headers: {}))
73
+ elsif type == :type
74
+ input.split(//).each do |c|
75
+ path = "/keypress/LIT_#{CGI::escape(c)}"
76
+ @requests.push(stub_request(:post, "http://192.168.0.100:8060#{path}").
77
+ to_return(status: 200, body: "", headers: {}))
78
+ end
79
+ end
80
+ end
81
+ options = {}
82
+ options[type] = input.to_s
83
+ config, options = build_config_options_objects(NavigatorTest, options, false)
84
+ navigator = Navigator.new(config: config)
85
+ if success
86
+ navigator.send(type, options: options)
87
+ else
88
+ assert_raises ExecutionError do
89
+ navigator.send(type, options: options)
90
+ end
91
+ end
92
+ end
93
+
94
+ def test_navigator_screen_secret
95
+ logger = Minitest::Mock.new
96
+ Logger.class_variable_set(:@@instance, logger)
97
+ options = {screen: "secret"}
98
+ config, options = build_config_options_objects(NavigatorTest, options, false)
99
+ navigator = Navigator.new(config: config)
100
+
101
+ @requests.push(stub_request(:post, "http://192.168.0.100:8060/keypress/Home").
102
+ to_return(status: 200, body: "", headers: {}))
103
+ @requests.push(stub_request(:post, "http://192.168.0.100:8060/keypress/Fwd").
104
+ to_return(status: 200, body: "", headers: {}))
105
+ @requests.push(stub_request(:post, "http://192.168.0.100:8060/keypress/Rev").
106
+ to_return(status: 200, body: "", headers: {}))
107
+
108
+ logger.expect(:info, nil, ["Home x 5, Fwd x 3, Rev x 2,"])
109
+ 5.times do
110
+ logger.expect(:debug, nil, ["Send Command: /keypress/Home"])
111
+ end
112
+ 3.times do
113
+ logger.expect(:debug, nil, ["Send Command: /keypress/Fwd"])
114
+ end
115
+ 2.times do
116
+ logger.expect(:debug, nil, ["Send Command: /keypress/Rev"])
117
+ end
118
+
119
+ navigator.screen(options: options)
120
+
121
+ logger.verify
122
+ Logger.set_testing
123
+ end
124
+ def test_navigator_screen_reboot
125
+ logger = Minitest::Mock.new
126
+ Logger.class_variable_set(:@@instance, logger)
127
+ options = {screen: "reboot"}
128
+ config, options = build_config_options_objects(NavigatorTest, options, false)
129
+ navigator = Navigator.new(config: config)
130
+
131
+ logger.expect(:unknown, nil, ["Cannot run command automatically"])
132
+ logger.expect(:unknown, nil, ["Home x 5, Up, Rev x 2, Fwd x 2,"])
133
+
134
+ navigator.screen(options: options)
135
+
136
+ logger.verify
137
+ Logger.set_testing
138
+ end
139
+
140
+ def test_navigator_screen_fail
141
+ options = {screen: "bad"}
142
+ config, options = build_config_options_objects(NavigatorTest, options, false)
143
+ navigator = Navigator.new(config: config)
144
+ assert_raises ExecutionError do
145
+ navigator.screen(options: options)
146
+ end
147
+ end
148
+
149
+ def test_navigator_screens
150
+ logger = Minitest::Mock.new
151
+ Logger.class_variable_set(:@@instance, logger)
152
+ options = {screens: true}
153
+ config, options = build_config_options_objects(NavigatorTest, options, false)
154
+ navigator = Navigator.new(config: config)
155
+
156
+ navigator.instance_variable_get("@screens").each_key do |key|
157
+ logger.expect(:unknown, nil, [key])
158
+ end
159
+
160
+ navigator.screens(options: options)
161
+
162
+ logger.verify
163
+ Logger.set_testing
164
+ end
165
+
166
+ def test_navigator_read_char
167
+ getc = Minitest::Mock.new
168
+ chr = Minitest::Mock.new
169
+
170
+ getc.expect(:call, chr)
171
+ chr.expect(:chr, "a")
172
+
173
+ options = {navigate: true}
174
+ config, options = build_config_options_objects(NavigatorTest, options, false)
175
+
176
+ navigator = Navigator.new(config: config)
177
+ STDIN.stub(:echo=, nil) do
178
+ STDIN.stub(:raw!, nil) do
179
+ STDIN.stub(:getc, getc) do
180
+ assert_equal "a", navigator.send(:read_char)
181
+ end
182
+ end
183
+ end
184
+ getc.verify
185
+ chr.verify
186
+ end
187
+
188
+ def test_navigator_read_char_multichar
189
+ getc = Minitest::Mock.new
190
+ chr = Minitest::Mock.new
191
+ read_nonblock = Minitest::Mock.new
192
+
193
+ getc.expect(:call, chr)
194
+ chr.expect(:chr, "\e")
195
+ read_nonblock.expect(:call, "a", [3])
196
+ read_nonblock.expect(:call, "b", [2])
197
+
198
+ options = {navigate: true}
199
+ config, options = build_config_options_objects(NavigatorTest, options, false)
200
+
201
+ navigator = Navigator.new(config: config)
202
+ STDIN.stub(:echo=, nil) do
203
+ STDIN.stub(:raw!, nil) do
204
+ STDIN.stub(:getc, getc) do
205
+ STDIN.stub(:read_nonblock, read_nonblock) do
206
+ assert_equal "\eab", navigator.send(:read_char)
207
+ end
208
+ end
209
+ end
210
+ end
211
+ getc.verify
212
+ chr.verify
213
+ end
214
+
215
+ def test_navigator_interactive
216
+ options = {navigate: true}
217
+ config, options = build_config_options_objects(NavigatorTest, options, false)
218
+ navigator = Navigator.new(config: config)
219
+ navigator.stub(:read_char, "\u0003") do
220
+ navigator.navigate(options: options)
221
+ end
222
+ end
223
+
224
+ def test_navigator_interactive_nav
225
+ read_char = lambda {
226
+ @i ||= 0
227
+ char = nil
228
+ case(@i)
229
+ when 0
230
+ char = "<"
231
+ when 1
232
+ char = "\u0003"
233
+ end
234
+ @i += 1
235
+ char
236
+ }
237
+ thread_new = lambda { |char|
238
+ assert_equal "<", char
239
+ }
240
+ @requests.push(stub_request(:post, "http://192.168.0.100:8060/keypress/Rev").
241
+ to_return(status: 200, body: "", headers: {}))
242
+ options = {navigate: true}
243
+ config, options = build_config_options_objects(NavigatorTest, options, false)
244
+ navigator = Navigator.new(config: config)
245
+ navigator.stub(:read_char, read_char) do
246
+ Thread.stub(:new, thread_new, "<") do
247
+ navigator.navigate(options: options)
248
+ end
249
+ end
250
+ end
251
+ def test_navigator_hendle_interactive_text
252
+ @requests.push(stub_request(:post, "http://192.168.0.100:8060/keypress/LIT_b").
253
+ to_return(status: 200, body: "", headers: {}))
254
+ options = {navigate: true}
255
+ config, options = build_config_options_objects(NavigatorTest, options, false)
256
+ navigator = Navigator.new(config: config)
257
+ navigator.send(:handle_navigate_input, "b")
258
+ end
259
+ def test_navigator_hendle_interactive_command
260
+ @requests.push(stub_request(:post, "http://192.168.0.100:8060/keypress/Play").
261
+ to_return(status: 200, body: "", headers: {}))
262
+ options = {navigate: true}
263
+ config, options = build_config_options_objects(NavigatorTest, options, false)
264
+ navigator = Navigator.new(config: config)
265
+ navigator.send(:handle_navigate_input, "=")
266
+ end
267
+ def test_navigator_generate_mappings
268
+ options = {navigate: true}
269
+ config, options = build_config_options_objects(NavigatorTest, options, false)
270
+ navigator = Navigator.new(config: config)
271
+ assert_equal ["home", "Home"], navigator.instance_variable_get(:@mappings)[:a]
272
+ end
273
+ end
274
+ end