roku_builder 3.3.2

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 (46) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +4 -0
  3. data/Gemfile +4 -0
  4. data/Gemfile.lock +101 -0
  5. data/Guardfile +21 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +282 -0
  8. data/bin/roku +152 -0
  9. data/config.json.example +28 -0
  10. data/lib/roku_builder.rb +32 -0
  11. data/lib/roku_builder/config_manager.rb +157 -0
  12. data/lib/roku_builder/controller.rb +582 -0
  13. data/lib/roku_builder/inspector.rb +90 -0
  14. data/lib/roku_builder/keyer.rb +52 -0
  15. data/lib/roku_builder/linker.rb +46 -0
  16. data/lib/roku_builder/loader.rb +197 -0
  17. data/lib/roku_builder/manifest_manager.rb +63 -0
  18. data/lib/roku_builder/monitor.rb +62 -0
  19. data/lib/roku_builder/navigator.rb +107 -0
  20. data/lib/roku_builder/packager.rb +47 -0
  21. data/lib/roku_builder/tester.rb +32 -0
  22. data/lib/roku_builder/util.rb +31 -0
  23. data/lib/roku_builder/version.rb +4 -0
  24. data/rakefile +8 -0
  25. data/roku_builder.gemspec +36 -0
  26. data/tests/roku_builder/config_manager_test.rb +400 -0
  27. data/tests/roku_builder/controller_test.rb +250 -0
  28. data/tests/roku_builder/inspector_test.rb +153 -0
  29. data/tests/roku_builder/keyer_test.rb +88 -0
  30. data/tests/roku_builder/linker_test.rb +37 -0
  31. data/tests/roku_builder/loader_test.rb +153 -0
  32. data/tests/roku_builder/manifest_manager_test.rb +25 -0
  33. data/tests/roku_builder/monitor_test.rb +34 -0
  34. data/tests/roku_builder/navigator_test.rb +72 -0
  35. data/tests/roku_builder/packager_test.rb +125 -0
  36. data/tests/roku_builder/test_files/controller_test/load_config_test.json +28 -0
  37. data/tests/roku_builder/test_files/controller_test/valid_config.json +28 -0
  38. data/tests/roku_builder/test_files/loader_test/c +0 -0
  39. data/tests/roku_builder/test_files/loader_test/manifest +0 -0
  40. data/tests/roku_builder/test_files/loader_test/source/a +0 -0
  41. data/tests/roku_builder/test_files/loader_test/source/b +0 -0
  42. data/tests/roku_builder/test_files/manifest_manager_test/manifest_template +2 -0
  43. data/tests/roku_builder/test_helper.rb +6 -0
  44. data/tests/roku_builder/tester_test.rb +33 -0
  45. data/tests/roku_builder/util_test.rb +23 -0
  46. metadata +286 -0
@@ -0,0 +1,250 @@
1
+ require_relative "test_helper.rb"
2
+
3
+ class ControllerTest < Minitest::Test
4
+ def test_controller_validate_options
5
+ logger = Logger.new("/dev/null")
6
+ options = {
7
+ sideload: true,
8
+ package: true
9
+ }
10
+ assert_equal 1, RokuBuilder::Controller.validate_options(options: options, logger: logger)
11
+ options = {}
12
+ assert_equal 2, RokuBuilder::Controller.validate_options(options: options, logger: logger)
13
+ options = {
14
+ sideload: true,
15
+ working: true,
16
+ current: true
17
+ }
18
+ assert_equal 3, RokuBuilder::Controller.validate_options(options: options, logger: logger)
19
+ options = {
20
+ sideload: true,
21
+ working: true
22
+ }
23
+ assert_equal 0, RokuBuilder::Controller.validate_options(options: options, logger: logger)
24
+ options = {
25
+ package: true
26
+ }
27
+ assert_equal 4, RokuBuilder::Controller.validate_options(options: options, logger: logger)
28
+ options = {
29
+ package: true,
30
+ current: true
31
+ }
32
+ assert_equal 5, RokuBuilder::Controller.validate_options(options: options, logger: logger)
33
+ options = {
34
+ deeplink: true
35
+ }
36
+ assert_equal 6, RokuBuilder::Controller.validate_options(options: options, logger: logger)
37
+ options = {
38
+ deeplink: true,
39
+ deeplink_options: ""
40
+ }
41
+ assert_equal 6, RokuBuilder::Controller.validate_options(options: options, logger: logger)
42
+ end
43
+ def test_controller_configure
44
+ logger = Logger.new("/dev/null")
45
+ target_config = File.join(File.dirname(__FILE__), "test_files", "controller_test", "configure_test.json")
46
+ File.delete(target_config) if File.exists?(target_config)
47
+ assert !File.exists?(target_config)
48
+
49
+ options = {
50
+ configure: true,
51
+ config: target_config,
52
+ }
53
+
54
+ RokuBuilder::Controller.handle_options(options: options, logger: logger)
55
+
56
+ assert File.exists?(target_config)
57
+
58
+ options = {
59
+ configure: true,
60
+ config: target_config,
61
+ edit_params: "ip:111.222.333.444"
62
+ }
63
+
64
+ RokuBuilder::Controller.handle_options(options: options, logger: logger)
65
+
66
+ assert File.exists?(target_config)
67
+ config = RokuBuilder::ConfigManager.get_config(config: target_config, logger: logger)
68
+ assert_equal "111.222.333.444", config[:devices][:roku][:ip]
69
+ File.delete(target_config) if File.exists?(target_config)
70
+ end
71
+
72
+ def test_controller_validate
73
+ logger = Logger.new("/dev/null")
74
+ target_config = File.join(File.dirname(__FILE__), "test_files", "controller_test", "configure_test.json")
75
+ File.delete(target_config) if File.exists?(target_config)
76
+
77
+ # Test Missing Config
78
+ options = {validate: true, config: target_config}
79
+ code = RokuBuilder::Controller.handle_options(options: options, logger: logger)
80
+ assert_equal RokuBuilder::Controller::MISSING_CONFIG, code
81
+
82
+ FileUtils.cp(File.join(File.dirname(target_config), "valid_config.json"), target_config)
83
+
84
+ # Test Invalid config json
85
+ options = {validate: true, config: target_config}
86
+ RokuBuilder::ConfigManager.stub(:get_config, nil) do
87
+ code = RokuBuilder::Controller.handle_options(options: options, logger: logger)
88
+ end
89
+ assert_equal RokuBuilder::Controller::INVALID_CONFIG, code
90
+
91
+ # Test Invalid config
92
+ options = {validate: true, config: target_config}
93
+ RokuBuilder::ConfigManager.stub(:validate_config, [1]) do
94
+ code = RokuBuilder::Controller.handle_options(options: options, logger: logger)
95
+ end
96
+ assert_equal RokuBuilder::Controller::INVALID_CONFIG, code
97
+
98
+ # Test Depricated Config
99
+ options = {validate: true, stage: 'production', config: target_config}
100
+ RokuBuilder::ConfigManager.stub(:validate_config, [-1]) do
101
+ code = RokuBuilder::Controller.handle_options(options: options, logger: logger)
102
+ end
103
+ assert_equal RokuBuilder::Controller::DEPRICATED_CONFIG, code
104
+
105
+ # Test valid Config
106
+ options = {validate: true, stage: 'production', config: target_config}
107
+ RokuBuilder::ConfigManager.stub(:validate_config, [0]) do
108
+ RokuBuilder::Controller.stub(:check_devices, [0, nil]) do
109
+ code = RokuBuilder::Controller.handle_options(options: options, logger: logger)
110
+ end
111
+ end
112
+ assert_equal RokuBuilder::Controller::SUCCESS, code
113
+
114
+ # Test valid config in pwd
115
+ options = {validate: true, stage: 'production', config: target_config}
116
+ RokuBuilder::ConfigManager.stub(:validate_config, [0]) do
117
+ RokuBuilder::Controller.stub(:system, "/dev/null/test") do
118
+ RokuBuilder::Controller.stub(:check_devices, [0, nil]) do
119
+ code = RokuBuilder::Controller.handle_options(options: options, logger: logger)
120
+ end
121
+ end
122
+ end
123
+ assert_equal RokuBuilder::Controller::SUCCESS, code
124
+
125
+ File.delete(target_config) if File.exists?(target_config)
126
+ end
127
+
128
+ def test_controller_sideload
129
+ logger = Logger.new("/dev/null")
130
+ target_config = File.join(File.dirname(__FILE__), "test_files", "controller_test", "configure_test.json")
131
+ File.delete(target_config) if File.exists?(target_config)
132
+ FileUtils.cp(File.join(File.dirname(target_config), "valid_config.json"), target_config)
133
+ loader = Minitest::Mock.new
134
+
135
+ code = nil
136
+ options = {sideload: true, stage: 'production', config: target_config}
137
+ sideload_config = {
138
+ root_dir: "/dev/null",
139
+ branch: "master",
140
+ update_manifest: nil,
141
+ fetch: nil,
142
+ folders: ["resources", "source"],
143
+ files: ["manifest"]
144
+ }
145
+ # Test Success
146
+ loader.expect(:sideload, true, [sideload_config])
147
+ RokuBuilder::Loader.stub(:new, loader) do
148
+ RokuBuilder::Controller.stub(:check_devices, [0, {device_config: {}, sideload_config: sideload_config}]) do
149
+ code = RokuBuilder::Controller.handle_options(options: options, logger: logger)
150
+ end
151
+ end
152
+ assert_equal RokuBuilder::Controller::SUCCESS, code
153
+
154
+ # Test Failure
155
+ loader.expect(:sideload, false, [sideload_config])
156
+ RokuBuilder::Loader.stub(:new, loader) do
157
+ RokuBuilder::Controller.stub(:check_devices, [0, {device_config: {}, sideload_config: sideload_config}]) do
158
+ code = RokuBuilder::Controller.handle_options(options: options, logger: logger)
159
+ end
160
+ end
161
+ assert_equal RokuBuilder::Controller::FAILED_SIDELOAD, code
162
+
163
+ loader.verify
164
+ File.delete(target_config) if File.exists?(target_config)
165
+ end
166
+
167
+ def test_controller_package
168
+ logger = Logger.new("/dev/null")
169
+ target_config = File.join(File.dirname(__FILE__), "test_files", "controller_test", "configure_test.json")
170
+ File.delete(target_config) if File.exists?(target_config)
171
+ FileUtils.cp(File.join(File.dirname(target_config), "valid_config.json"), target_config)
172
+ loader = Minitest::Mock.new
173
+ #TODO
174
+ end
175
+
176
+ def test_controller_build
177
+ logger = Logger.new("/dev/null")
178
+ target_config = File.join(File.dirname(__FILE__), "test_files", "controller_test", "configure_test.json")
179
+ File.delete(target_config) if File.exists?(target_config)
180
+ FileUtils.cp(File.join(File.dirname(target_config), "valid_config.json"), target_config)
181
+ loader = Minitest::Mock.new
182
+
183
+ code = nil
184
+ options = {build: true, stage: 'production', out_folder: "/tmp", config: target_config}
185
+ build_config = {
186
+ root_dir: "/dev/null",
187
+ branch: "master",
188
+ outfile: "/tmp/app_production_1.zip",
189
+ fetch: nil,
190
+ folders: ["resources", "source"],
191
+ files: ["manifest"]
192
+ }
193
+ loader.expect(:build, "/tmp/build", [build_config])
194
+ RokuBuilder::Loader.stub(:new, loader) do
195
+ RokuBuilder::ManifestManager.stub(:build_version, "1") do
196
+ RokuBuilder::Controller.stub(:check_devices, [0, {device_config: {}, manifest_config: {}, project_config: {}, build_config: build_config}]) do
197
+ code = RokuBuilder::Controller.handle_options(options: options, logger: logger)
198
+ end
199
+ end
200
+ end
201
+ assert_equal RokuBuilder::Controller::SUCCESS, code
202
+ end
203
+ def test_controller_update
204
+ logger = Logger.new("/dev/null")
205
+ target_config = File.join(File.dirname(__FILE__), "test_files", "controller_test", "configure_test.json")
206
+ File.delete(target_config) if File.exists?(target_config)
207
+ FileUtils.cp(File.join(File.dirname(target_config), "valid_config.json"), target_config)
208
+ mock = Minitest::Mock.new
209
+
210
+ code = nil
211
+ options = {update: true, stage: 'production', out_folder: "/tmp", config: target_config}
212
+ manifest_config = {
213
+ root_dir: "/dev/null"
214
+ }
215
+ mock.expect(:call, "1", [manifest_config])
216
+ mock.expect(:call, "2", [manifest_config])
217
+ RokuBuilder::ManifestManager.stub(:build_version, mock) do
218
+ RokuBuilder::ManifestManager.stub(:update_build, mock) do
219
+ RokuBuilder::Controller.stub(:check_devices, [0, {device_config: {}, manifest_config: manifest_config}]) do
220
+ code = RokuBuilder::Controller.handle_options(options: options, logger: logger)
221
+ end
222
+ end
223
+ end
224
+ mock.verify
225
+ assert_equal RokuBuilder::Controller::SUCCESS, code
226
+ end
227
+
228
+ def test_controller_deeplink
229
+ logger = Logger.new("/dev/null")
230
+ target_config = File.join(File.dirname(__FILE__), "test_files", "controller_test", "configure_test.json")
231
+ File.delete(target_config) if File.exists?(target_config)
232
+ FileUtils.cp(File.join(File.dirname(target_config), "valid_config.json"), target_config)
233
+ mock = Minitest::Mock.new
234
+
235
+ code = nil
236
+ options = {deeplink: true, stage: 'production', deeplink_options: "a:b", config: target_config}
237
+ deeplink_config = {
238
+ root_dir: "/dev/null"
239
+ }
240
+ mock.expect(:link, "true", [deeplink_config])
241
+ RokuBuilder::Linker.stub(:new, mock) do
242
+ RokuBuilder::Controller.stub(:check_devices, [0, {device_config: {}, deeplink_config: deeplink_config}]) do
243
+ code = RokuBuilder::Controller.handle_options(options: options, logger: logger)
244
+ end
245
+ end
246
+ mock.verify
247
+ assert_equal RokuBuilder::Controller::SUCCESS, code
248
+ end
249
+ end
250
+
@@ -0,0 +1,153 @@
1
+ require_relative "test_helper.rb"
2
+
3
+ class InspectorTest < Minitest::Test
4
+ def test_inspector_inspect
5
+ connection = Minitest::Mock.new
6
+ faraday = Minitest::Mock.new
7
+ io = Minitest::Mock.new
8
+ response = Minitest::Mock.new
9
+
10
+ device_config = {
11
+ ip: "111.222.333",
12
+ user: "user",
13
+ password: "password",
14
+ logger: Logger.new("/dev/null")
15
+ }
16
+ path = "/plugin_inspect"
17
+ password = "password"
18
+ payload ={
19
+ mysubmit: "Inspect",
20
+ password: password,
21
+ archive: io
22
+ }
23
+ body = "r1.insertCell(0).innerHTML = 'App Name: ';"+
24
+ " r1.insertCell(1).innerHTML = '<div class=\"roku-color-c3\">app_name</div>';"+
25
+ ""+
26
+ " var r2 = table.insertRow(1);"+
27
+ " r2.insertCell(0).innerHTML = 'Dev ID: ';"+
28
+ " r2.insertCell(1).innerHTML = '<div class=\"roku-color-c3\"><font face=\"Courier\">dev_id</font></div>';"+
29
+ " "+
30
+ " var dd = new Date(628232400);"+
31
+ " var ddStr = \"\";"+
32
+ " ddStr += (dd.getMonth()+1);"+
33
+ " ddStr += \"/\";"+
34
+ " ddStr += dd.getDate();"+
35
+ " ddStr += \"/\";"+
36
+ " ddStr += dd.getFullYear();"+
37
+ " ddStr += \" \";"+
38
+ " ddStr += dd.getHours();"+
39
+ " ddStr += \":\";"+
40
+ " ddStr += dd.getMinutes();"+
41
+ " ddStr += \":\";"+
42
+ " ddStr += dd.getSeconds(); "+
43
+ " "+
44
+ " var r3 = table.insertRow(2);"+
45
+ " r3.insertCell(0).innerHTML = 'Creation Date: ';"+
46
+ " r3.insertCell(1).innerHTML = '<div class=\"roku-color-c3\">'+ddStr+'</div>';"+
47
+ " "+
48
+ " var r4 = table.insertRow(3);"+
49
+ " r4.insertCell(0).innerHTML = 'dev.zip: ';"+
50
+ " r4.insertCell(1).innerHTML = '<div class=\"roku-color-c3\"><font face=\"Courier\">dev_zip</font></div>';"
51
+
52
+ connection.expect(:post, response) do |arg1, arg2|
53
+ assert_equal path, arg1
54
+ assert_equal payload[:mysubmit], arg2[:mysubmit]
55
+ assert_equal payload[:password], arg2[:passwd]
56
+ assert payload[:archive] === arg2[:archive]
57
+ end
58
+ faraday.expect(:request, nil, [:digest, device_config[:user], device_config[:password]])
59
+ faraday.expect(:request, nil, [:multipart])
60
+ faraday.expect(:request, nil, [:url_encoded])
61
+ faraday.expect(:adapter, nil, [Faraday.default_adapter])
62
+ response.expect(:body, body)
63
+ response.expect(:body, body)
64
+ response.expect(:body, body)
65
+ response.expect(:body, body)
66
+ response.expect(:body, body)
67
+
68
+
69
+ package_info = {}
70
+ inspector = RokuBuilder::Inspector.new(**device_config)
71
+ Faraday.stub(:new, connection, faraday) do
72
+ Faraday::UploadIO.stub(:new, io) do
73
+ package_info = inspector.inspect(pkg: "pkg/path", password: password)
74
+ end
75
+ end
76
+
77
+ assert_equal "app_name", package_info[:app_name]
78
+ assert_equal "dev_id", package_info[:dev_id]
79
+ assert_equal Time.at(628232400).to_s, package_info[:creation_date]
80
+ assert_equal "dev_zip", package_info[:dev_zip]
81
+
82
+ connection.verify
83
+ faraday.verify
84
+ io.verify
85
+ response.verify
86
+ end
87
+
88
+ def test_screencapture
89
+ connection = Minitest::Mock.new
90
+ faraday = Minitest::Mock.new
91
+ response = Minitest::Mock.new
92
+ io = Minitest::Mock.new
93
+
94
+ device_config = {
95
+ ip: "111.222.333",
96
+ user: "user",
97
+ password: "password",
98
+ logger: Logger.new("/dev/null")
99
+ }
100
+ screencapture_config = {
101
+ out_folder: "out/folder/path",
102
+ out_file: nil
103
+ }
104
+ path = "/plugin_inspect"
105
+ password = "password"
106
+ payload ={
107
+ mysubmit: "Screenshot",
108
+ password: password,
109
+ archive: io
110
+ }
111
+ body = "<hr /><img src=\"pkgs/dev.jpg?time=1455629573\">"
112
+ connection.expect(:post, response) do |arg1, arg2|
113
+ assert_equal path, arg1
114
+ assert_equal payload[:mysubmit], arg2[:mysubmit]
115
+ assert_equal payload[:password], arg2[:passwd]
116
+ assert payload[:archive] === arg2[:archive]
117
+ end
118
+ faraday.expect(:request, nil, [:digest, device_config[:user], device_config[:password]])
119
+ faraday.expect(:request, nil, [:multipart])
120
+ faraday.expect(:request, nil, [:url_encoded])
121
+ faraday.expect(:adapter, nil, [Faraday.default_adapter])
122
+ response.expect(:body, body)
123
+ response.expect(:body, body)
124
+
125
+
126
+ path2 = "pkgs/dev.jpg?time=1455629573"
127
+ body2 = "<screencapture>"
128
+ connection.expect(:get, response, [path2])
129
+ faraday.expect(:request, nil, [:digest, device_config[:user], device_config[:password]])
130
+ faraday.expect(:adapter, nil, [Faraday.default_adapter])
131
+ response.expect(:body, body2)
132
+ response.expect(:success?, true)
133
+ io.expect("write", nil, [body2])
134
+
135
+
136
+ success = false
137
+ inspector = RokuBuilder::Inspector.new(**device_config)
138
+ Faraday.stub(:new, connection, faraday) do
139
+ Faraday::UploadIO.stub(:new, io) do
140
+ File.stub(:open, nil, io) do
141
+ success = inspector.screencapture(**screencapture_config)
142
+ end
143
+ end
144
+ end
145
+
146
+ assert success
147
+
148
+ connection.verify
149
+ faraday.verify
150
+ io.verify
151
+ response.verify
152
+ end
153
+ end
@@ -0,0 +1,88 @@
1
+ require_relative "test_helper.rb"
2
+
3
+ class KeyerTest < Minitest::Test
4
+ def test_keyer_dev_id
5
+ connection = Minitest::Mock.new
6
+ faraday = Minitest::Mock.new
7
+ response = Minitest::Mock.new
8
+
9
+ device_config = {
10
+ ip: "111.222.333",
11
+ user: "user",
12
+ password: "password",
13
+ logger: Logger.new("/dev/null")
14
+ }
15
+ path = "/plugin_package"
16
+ body = "v class=\"roku-font-5\"><label>Your Dev ID: &nbsp;</label> dev_id<hr></div>"
17
+
18
+ connection.expect(:get, response, [path])
19
+ faraday.expect(:request, nil, [:digest, device_config[:user], device_config[:password]])
20
+ faraday.expect(:adapter, nil, [Faraday.default_adapter])
21
+ response.expect(:body, body)
22
+ response.expect(:body, body)
23
+
24
+
25
+ package_info = {}
26
+ dev_id = nil
27
+ keyer = RokuBuilder::Keyer.new(**device_config)
28
+ Faraday.stub(:new, connection, faraday) do
29
+ dev_id = keyer.dev_id
30
+ end
31
+
32
+ assert_equal "dev_id", dev_id
33
+
34
+ connection.verify
35
+ faraday.verify
36
+ response.verify
37
+ end
38
+
39
+ def test_keyer_rekey_changed
40
+ connection = Minitest::Mock.new
41
+ faraday = Minitest::Mock.new
42
+ io = Minitest::Mock.new
43
+ response = Minitest::Mock.new
44
+
45
+ device_config = {
46
+ ip: "111.222.333",
47
+ user: "user",
48
+ password: "password",
49
+ logger: Logger.new("/dev/null")
50
+ }
51
+ path = "/plugin_inspect"
52
+ password = "password"
53
+ payload ={
54
+ mysubmit: "Rekey",
55
+ password: password,
56
+ archive: io
57
+ }
58
+
59
+ connection.expect(:post, response) do |arg1, arg2|
60
+ assert_equal path, arg1
61
+ assert_equal payload[:mysubmit], arg2[:mysubmit]
62
+ assert_equal payload[:password], arg2[:passwd]
63
+ assert payload[:archive] === arg2[:archive]
64
+ end
65
+ faraday.expect(:request, nil, [:digest, device_config[:user], device_config[:password]])
66
+ faraday.expect(:request, nil, [:multipart])
67
+ faraday.expect(:request, nil, [:url_encoded])
68
+ faraday.expect(:adapter, nil, [Faraday.default_adapter])
69
+
70
+ dev_id = Proc.new { Random.rand(100) }
71
+ keyer = RokuBuilder::Keyer.new(**device_config)
72
+ key_changed = nil
73
+ Faraday.stub(:new, connection, faraday) do
74
+ Faraday::UploadIO.stub(:new, io) do
75
+ keyer.stub(:dev_id, dev_id) do
76
+ key_changed = keyer.rekey(keyed_pkg: "pkg/path", password: password)
77
+ end
78
+ end
79
+ end
80
+
81
+ assert key_changed
82
+
83
+ connection.verify
84
+ faraday.verify
85
+ io.verify
86
+ response.verify
87
+ end
88
+ end