roku_builder 3.13.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
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