roku_builder 3.3.2

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