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.
- checksums.yaml +7 -0
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +101 -0
- data/Guardfile +21 -0
- data/LICENSE.txt +22 -0
- data/README.md +282 -0
- data/bin/roku +152 -0
- data/config.json.example +28 -0
- data/lib/roku_builder.rb +32 -0
- data/lib/roku_builder/config_manager.rb +157 -0
- data/lib/roku_builder/controller.rb +582 -0
- data/lib/roku_builder/inspector.rb +90 -0
- data/lib/roku_builder/keyer.rb +52 -0
- data/lib/roku_builder/linker.rb +46 -0
- data/lib/roku_builder/loader.rb +197 -0
- data/lib/roku_builder/manifest_manager.rb +63 -0
- data/lib/roku_builder/monitor.rb +62 -0
- data/lib/roku_builder/navigator.rb +107 -0
- data/lib/roku_builder/packager.rb +47 -0
- data/lib/roku_builder/tester.rb +32 -0
- data/lib/roku_builder/util.rb +31 -0
- data/lib/roku_builder/version.rb +4 -0
- data/rakefile +8 -0
- data/roku_builder.gemspec +36 -0
- data/tests/roku_builder/config_manager_test.rb +400 -0
- data/tests/roku_builder/controller_test.rb +250 -0
- data/tests/roku_builder/inspector_test.rb +153 -0
- data/tests/roku_builder/keyer_test.rb +88 -0
- data/tests/roku_builder/linker_test.rb +37 -0
- data/tests/roku_builder/loader_test.rb +153 -0
- data/tests/roku_builder/manifest_manager_test.rb +25 -0
- data/tests/roku_builder/monitor_test.rb +34 -0
- data/tests/roku_builder/navigator_test.rb +72 -0
- data/tests/roku_builder/packager_test.rb +125 -0
- data/tests/roku_builder/test_files/controller_test/load_config_test.json +28 -0
- data/tests/roku_builder/test_files/controller_test/valid_config.json +28 -0
- data/tests/roku_builder/test_files/loader_test/c +0 -0
- data/tests/roku_builder/test_files/loader_test/manifest +0 -0
- data/tests/roku_builder/test_files/loader_test/source/a +0 -0
- data/tests/roku_builder/test_files/loader_test/source/b +0 -0
- data/tests/roku_builder/test_files/manifest_manager_test/manifest_template +2 -0
- data/tests/roku_builder/test_helper.rb +6 -0
- data/tests/roku_builder/tester_test.rb +33 -0
- data/tests/roku_builder/util_test.rb +23 -0
- metadata +286 -0
@@ -0,0 +1,62 @@
|
|
1
|
+
module RokuBuilder
|
2
|
+
|
3
|
+
# Monitor development Logs
|
4
|
+
class Monitor < Util
|
5
|
+
|
6
|
+
# Initialize port config
|
7
|
+
def init()
|
8
|
+
@ports = {
|
9
|
+
main: 8085,
|
10
|
+
sg: 8089,
|
11
|
+
task1: 8090,
|
12
|
+
task2: 8091,
|
13
|
+
task3: 8092,
|
14
|
+
taskX: 8093,
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
# Monitor a development log on the Roku device
|
19
|
+
# @param type [Symbol] The log type to monitor
|
20
|
+
# @param verbose [Boolean] Print status messages.
|
21
|
+
def monitor(type:)
|
22
|
+
telnet_config = {
|
23
|
+
'Host' => @roku_ip_address,
|
24
|
+
'Port' => @ports[type]
|
25
|
+
}
|
26
|
+
waitfor_config = {
|
27
|
+
'Match' => /./,
|
28
|
+
'Timeout' => false
|
29
|
+
}
|
30
|
+
|
31
|
+
thread = Thread.new(telnet_config, waitfor_config) {|telnet_config,waitfor_config|
|
32
|
+
@logger.info "Monitoring #{type} console(#{telnet_config['Port']}) on #{telnet_config['Host'] }"
|
33
|
+
connection = Net::Telnet.new(telnet_config)
|
34
|
+
Thread.current[:connection] = connection
|
35
|
+
all_text = ""
|
36
|
+
while true
|
37
|
+
connection.waitfor(waitfor_config) do |txt|
|
38
|
+
all_text += txt
|
39
|
+
while line = all_text.slice!(/^.*\n/) do
|
40
|
+
puts line
|
41
|
+
end
|
42
|
+
if all_text == "BrightScript Debugger> "
|
43
|
+
print all_text
|
44
|
+
all_text = ""
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
}
|
49
|
+
running = true
|
50
|
+
while running
|
51
|
+
@logger.info "Q to exit"
|
52
|
+
command = gets.chomp
|
53
|
+
if command == "q"
|
54
|
+
thread.exit
|
55
|
+
running = false
|
56
|
+
else
|
57
|
+
thread[:connection].puts(command)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
module RokuBuilder
|
2
|
+
|
3
|
+
# Navigation methods
|
4
|
+
class Navigator < Util
|
5
|
+
|
6
|
+
# Setup navigation commands
|
7
|
+
def init
|
8
|
+
@commands = {
|
9
|
+
up: "Up",
|
10
|
+
down: "Down",
|
11
|
+
right: "Right",
|
12
|
+
left: "Left",
|
13
|
+
select: "Select",
|
14
|
+
back: "Back",
|
15
|
+
home: "Home",
|
16
|
+
rew: "Rev",
|
17
|
+
ff: "Fwd",
|
18
|
+
play: "Play",
|
19
|
+
replay: "InstantReplay"
|
20
|
+
}
|
21
|
+
|
22
|
+
@screens = {
|
23
|
+
platform: [:home, :home, :home, :home, :home, :ff, :play, :rew, :play, :ff],
|
24
|
+
secret: [:home, :home, :home, :home, :home, :ff, :ff, :ff, :rew, :rew],
|
25
|
+
secret2: [:home, :home, :home, :home, :home, :up, :right, :down, :left, :up],
|
26
|
+
channels: [:home, :home, :home, :up, :up, :left, :right, :left, :right, :left],
|
27
|
+
developer: [:home, :home, :home, :up, :up, :right, :left, :right, :left, :right],
|
28
|
+
wifi: [:home, :home, :home, :home, :home, :up, :down, :up, :down, :up],
|
29
|
+
antenna: [:home, :home, :home, :home, :home, :ff, :down, :rew, :down, :ff],
|
30
|
+
bitrate: [:home, :home, :home, :home, :home, :rew, :rew, :rew, :ff, :ff],
|
31
|
+
network: [:home, :home, :home, :home, :home, :right, :left, :right, :left, :right],
|
32
|
+
reboot: [:home, :home, :home, :home, :home, :up, :rew, :rew, :ff, :ff]
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
# Send a navigation command to the roku device
|
37
|
+
# @param command [Symbol] The smbol of the command to send
|
38
|
+
# @return [Boolean] Success
|
39
|
+
def nav(command:)
|
40
|
+
if @commands.has_key?(command)
|
41
|
+
conn = Faraday.new(url: "#{@url}:8060") do |f|
|
42
|
+
f.request :multipart
|
43
|
+
f.request :url_encoded
|
44
|
+
f.adapter Faraday.default_adapter
|
45
|
+
end
|
46
|
+
|
47
|
+
path = "/keypress/#{@commands[command]}"
|
48
|
+
response = conn.post path
|
49
|
+
return response.success?
|
50
|
+
else
|
51
|
+
return false
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Type text on the roku device
|
56
|
+
# @param text [String] The text to type on the device
|
57
|
+
# @return [Boolean] Success
|
58
|
+
def type(text:)
|
59
|
+
conn = Faraday.new(url: "#{@url}:8060") do |f|
|
60
|
+
f.request :multipart
|
61
|
+
f.request :url_encoded
|
62
|
+
f.adapter Faraday.default_adapter
|
63
|
+
end
|
64
|
+
text.split(//).each do |c|
|
65
|
+
path = "/keypress/LIT_#{CGI::escape(c)}"
|
66
|
+
response = conn.post path
|
67
|
+
return false unless response.success?
|
68
|
+
end
|
69
|
+
return true
|
70
|
+
end
|
71
|
+
|
72
|
+
# Show the commands for one of the roku secret screens
|
73
|
+
# @param type [Symbol] The type of screen to show
|
74
|
+
# @return [Boolean] Screen found
|
75
|
+
def screen(type:)
|
76
|
+
if @screens.has_key?(type)
|
77
|
+
display = []
|
78
|
+
count = []
|
79
|
+
@screens[type].each do |command|
|
80
|
+
if display.count > 0 and display[-1] == command
|
81
|
+
count[-1] = count[-1] + 1
|
82
|
+
else
|
83
|
+
display.push(command)
|
84
|
+
count.push(1)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
string = ""
|
88
|
+
display.each_index do |i|
|
89
|
+
if count[i] > 1
|
90
|
+
string = string + @commands[display[i]]+" x "+count[i].to_s+", "
|
91
|
+
else
|
92
|
+
string = string + @commands[display[i]]+", "
|
93
|
+
end
|
94
|
+
end
|
95
|
+
@logger.unknown(string.strip)
|
96
|
+
else
|
97
|
+
return false
|
98
|
+
end
|
99
|
+
true
|
100
|
+
end
|
101
|
+
|
102
|
+
# Show avaiable roku secret screens
|
103
|
+
def screens
|
104
|
+
@screens.keys.each {|screen| @logger.unknown(screen)}
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module RokuBuilder
|
2
|
+
|
3
|
+
# Method of packaging app for submission
|
4
|
+
class Packager < Util
|
5
|
+
|
6
|
+
# Sign and download the currently sideloaded app
|
7
|
+
# @param app_name_version [String] The name and version of the package
|
8
|
+
# @param out_file [String] Location to download signed package to
|
9
|
+
# @param password [String] Password for the devices current key
|
10
|
+
# @return [Boolean] True on package success and download, false otherwise
|
11
|
+
def package(app_name_version:, out_file:, password:)
|
12
|
+
# Sign package
|
13
|
+
path = "/plugin_package"
|
14
|
+
conn = Faraday.new(url: @url) do |f|
|
15
|
+
f.headers['Content-Type'] = Faraday::Request::Multipart.mime_type
|
16
|
+
f.request :digest, @dev_username, @dev_password
|
17
|
+
f.request :multipart
|
18
|
+
f.request :url_encoded
|
19
|
+
f.adapter Faraday.default_adapter
|
20
|
+
end
|
21
|
+
payload = {
|
22
|
+
mysubmit: "Package",
|
23
|
+
app_name: app_name_version,
|
24
|
+
passwd: password,
|
25
|
+
pkg_time: Time.now.to_i
|
26
|
+
}
|
27
|
+
response = conn.post path, payload
|
28
|
+
|
29
|
+
# Check for error
|
30
|
+
failed = /(Failed: [^\.]*\.)/.match(response.body)
|
31
|
+
return failed[1] if failed
|
32
|
+
|
33
|
+
# Download signed package
|
34
|
+
pkg = /<a href="pkgs[^>]*>([^<]*)</.match(response.body)[1]
|
35
|
+
path = "/pkgs/#{pkg}"
|
36
|
+
conn = Faraday.new(url: @url) do |f|
|
37
|
+
f.request :digest, @dev_username, @dev_password
|
38
|
+
f.adapter Faraday.default_adapter
|
39
|
+
end
|
40
|
+
response = conn.get path
|
41
|
+
return false if response.status != 200
|
42
|
+
|
43
|
+
File.open(out_file, 'w+') {|fp| fp.write(response.body)}
|
44
|
+
true
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module RokuBuilder
|
2
|
+
|
3
|
+
# Method for running unit tests
|
4
|
+
# This is intended to be used with the brstest librbary but should work
|
5
|
+
# with other testing libraries
|
6
|
+
class Tester < Util
|
7
|
+
|
8
|
+
# Run tests and report results
|
9
|
+
# @param sideload_config [Hash] The config for sideloading the app
|
10
|
+
def run_tests(sideload_config:)
|
11
|
+
telnet_config ={
|
12
|
+
'Host' => @roku_ip_address,
|
13
|
+
'Port' => 8085
|
14
|
+
}
|
15
|
+
|
16
|
+
loader = Loader.new(**@device_config)
|
17
|
+
connection = Net::Telnet.new(telnet_config)
|
18
|
+
loader.sideload(**sideload_config)
|
19
|
+
|
20
|
+
in_tests = false
|
21
|
+
end_reg = /\*\*\*\*\* ENDING TESTS \*\*\*\*\*/
|
22
|
+
connection.waitfor(end_reg) do |txt|
|
23
|
+
txt.split("\n").each do |line|
|
24
|
+
in_tests = false if line =~ end_reg
|
25
|
+
@logger.unknown line if in_tests
|
26
|
+
in_tests = true if line =~ /\*\*\*\*\* STARTING TESTS \*\*\*\*\*/
|
27
|
+
end
|
28
|
+
end
|
29
|
+
connection.puts("cont\n")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module RokuBuilder
|
2
|
+
|
3
|
+
# Super class for device utilities
|
4
|
+
# This class defines a common initializer and allows subclasses
|
5
|
+
# to define their own secondary initializer
|
6
|
+
class Util
|
7
|
+
|
8
|
+
# Common initializer of device utils
|
9
|
+
# @param ip [String] IP address of roku device
|
10
|
+
# @param user [String] Username for roku device
|
11
|
+
# @param password [String] Password for roku device
|
12
|
+
def initialize(ip:, user:, password:, logger:)
|
13
|
+
@device_config = {
|
14
|
+
ip: ip,
|
15
|
+
user: user,
|
16
|
+
password: password
|
17
|
+
}
|
18
|
+
@roku_ip_address = ip
|
19
|
+
@dev_username = user
|
20
|
+
@dev_password = password
|
21
|
+
@url = "http://#{@roku_ip_address}"
|
22
|
+
@logger = logger
|
23
|
+
init()
|
24
|
+
end
|
25
|
+
|
26
|
+
# Second initializer to be overwriten
|
27
|
+
def init
|
28
|
+
#Override in subclass
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/rakefile
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'roku_builder/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "roku_builder"
|
8
|
+
spec.version = RokuBuilder::VERSION
|
9
|
+
spec.authors = ["greeneca"]
|
10
|
+
spec.email = ["charles.greene@redspace.com"]
|
11
|
+
spec.summary = %q{Build Tool for Roku Apps}
|
12
|
+
spec.description = %q{Allows the user to easily sideload, package, deeplink, test, roku apps.}
|
13
|
+
spec.homepage = ""
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency "rubyzip", "~> 1.1"
|
22
|
+
spec.add_dependency "faraday", "~> 0.9"
|
23
|
+
spec.add_dependency "faraday-digestauth", "~> 0.2"
|
24
|
+
spec.add_dependency "git", "~> 1.2.9"
|
25
|
+
spec.add_dependency "net-ping", "~> 1.7"
|
26
|
+
|
27
|
+
spec.add_development_dependency "bundler", "~> 1.7"
|
28
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
29
|
+
spec.add_development_dependency "byebug", "~> 3.5"
|
30
|
+
spec.add_development_dependency "minitest", "~> 5.8"
|
31
|
+
spec.add_development_dependency "minitest-autotest", "~> 1.0"
|
32
|
+
spec.add_development_dependency "minitest-server", "~> 1.0"
|
33
|
+
spec.add_development_dependency "simplecov", "~> 0.11"
|
34
|
+
spec.add_development_dependency "yard", "~> 0.8.7"
|
35
|
+
spec.add_development_dependency "guard-livereload", "~> 2.5"
|
36
|
+
end
|
@@ -0,0 +1,400 @@
|
|
1
|
+
require_relative "test_helper.rb"
|
2
|
+
|
3
|
+
class ConfigManagerTest < Minitest::Test
|
4
|
+
|
5
|
+
def test_config_manager_read_config
|
6
|
+
logger = Logger.new("/dev/null")
|
7
|
+
config_path = "config/file/path"
|
8
|
+
io = Minitest::Mock.new
|
9
|
+
io.expect(:read, good_config.to_json)
|
10
|
+
config = nil
|
11
|
+
File.stub(:open, io) do
|
12
|
+
config = RokuBuilder::ConfigManager.get_config(config: config_path, logger: logger)
|
13
|
+
end
|
14
|
+
io.verify
|
15
|
+
assert_equal :roku, config[:devices][:default], :roku
|
16
|
+
assert_equal :project1, config[:projects][:default], :project1
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_config_manager_validate_devices
|
20
|
+
logger = Logger.new("/dev/null")
|
21
|
+
config = good_config
|
22
|
+
config[:devices] = nil
|
23
|
+
codes = RokuBuilder::ConfigManager.validate_config(config: config, logger: logger)
|
24
|
+
assert_equal [1], codes
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_config_manager_validate_devices_default
|
28
|
+
logger = Logger.new("/dev/null")
|
29
|
+
config = good_config
|
30
|
+
config[:devices][:default] = nil
|
31
|
+
codes = RokuBuilder::ConfigManager.validate_config(config: config, logger: logger)
|
32
|
+
assert_equal [2], codes
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_config_manager_validate_devices_default_is_symbol
|
36
|
+
logger = Logger.new("/dev/null")
|
37
|
+
config = good_config
|
38
|
+
config[:devices][:default] = "bad"
|
39
|
+
codes = RokuBuilder::ConfigManager.validate_config(config: config, logger: logger)
|
40
|
+
assert_equal [3], codes
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_config_manager_validate_device_ip
|
44
|
+
logger = Logger.new("/dev/null")
|
45
|
+
config = good_config
|
46
|
+
config[:devices][:roku][:ip] = nil
|
47
|
+
codes = RokuBuilder::ConfigManager.validate_config(config: config, logger: logger)
|
48
|
+
assert_equal [7], codes
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_config_manager_validate_device_ip_empty
|
52
|
+
logger = Logger.new("/dev/null")
|
53
|
+
config = good_config
|
54
|
+
config[:devices][:roku][:ip] = ""
|
55
|
+
codes = RokuBuilder::ConfigManager.validate_config(config: config, logger: logger)
|
56
|
+
assert_equal [7], codes
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_config_manager_validate_device_ip_default_value
|
60
|
+
logger = Logger.new("/dev/null")
|
61
|
+
config = good_config
|
62
|
+
config[:devices][:roku][:ip] = "xxx.xxx.xxx.xxx"
|
63
|
+
codes = RokuBuilder::ConfigManager.validate_config(config: config, logger: logger)
|
64
|
+
assert_equal [7], codes
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_config_manager_validate_device_user
|
68
|
+
logger = Logger.new("/dev/null")
|
69
|
+
config = good_config
|
70
|
+
config[:devices][:roku][:user] = nil
|
71
|
+
codes = RokuBuilder::ConfigManager.validate_config(config: config, logger: logger)
|
72
|
+
assert_equal [8], codes
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_config_manager_validate_device_user_empty
|
76
|
+
logger = Logger.new("/dev/null")
|
77
|
+
config = good_config
|
78
|
+
config[:devices][:roku][:user] = ""
|
79
|
+
codes = RokuBuilder::ConfigManager.validate_config(config: config, logger: logger)
|
80
|
+
assert_equal [8], codes
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_config_manager_validate_device_user_default_value
|
84
|
+
logger = Logger.new("/dev/null")
|
85
|
+
config = good_config
|
86
|
+
config[:devices][:roku][:user] = "<username>"
|
87
|
+
codes = RokuBuilder::ConfigManager.validate_config(config: config, logger: logger)
|
88
|
+
assert_equal [8], codes
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_config_manager_validate_device_password
|
92
|
+
logger = Logger.new("/dev/null")
|
93
|
+
config = good_config
|
94
|
+
config[:devices][:roku][:password] = nil
|
95
|
+
codes = RokuBuilder::ConfigManager.validate_config(config: config, logger: logger)
|
96
|
+
assert_equal [9], codes
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_config_manager_validate_device_password_empty
|
100
|
+
logger = Logger.new("/dev/null")
|
101
|
+
config = good_config
|
102
|
+
config[:devices][:roku][:password] = ""
|
103
|
+
codes = RokuBuilder::ConfigManager.validate_config(config: config, logger: logger)
|
104
|
+
assert_equal [9], codes
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_config_manager_validate_device_password_default_value
|
108
|
+
logger = Logger.new("/dev/null")
|
109
|
+
config = good_config
|
110
|
+
config[:devices][:roku][:password] = "<password>"
|
111
|
+
codes = RokuBuilder::ConfigManager.validate_config(config: config, logger: logger)
|
112
|
+
assert_equal [9], codes
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_config_manager_validate_projects
|
116
|
+
logger = Logger.new("/dev/null")
|
117
|
+
config = good_config
|
118
|
+
config[:projects] = nil
|
119
|
+
codes = RokuBuilder::ConfigManager.validate_config(config: config, logger: logger)
|
120
|
+
assert_equal [4], codes
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_config_manager_validate_projects_default
|
124
|
+
logger = Logger.new("/dev/null")
|
125
|
+
config = good_config
|
126
|
+
config[:projects][:default] = nil
|
127
|
+
codes = RokuBuilder::ConfigManager.validate_config(config: config, logger: logger)
|
128
|
+
assert_equal [5], codes
|
129
|
+
end
|
130
|
+
|
131
|
+
def test_config_manager_validate_projects_default_default_value
|
132
|
+
logger = Logger.new("/dev/null")
|
133
|
+
config = good_config
|
134
|
+
config[:projects][:default] = "<project id>".to_sym
|
135
|
+
codes = RokuBuilder::ConfigManager.validate_config(config: config, logger: logger)
|
136
|
+
assert_equal [5], codes
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_config_manager_validate_projects_default_is_symbol
|
140
|
+
logger = Logger.new("/dev/null")
|
141
|
+
config = good_config
|
142
|
+
config[:projects][:default] = "project_id"
|
143
|
+
codes = RokuBuilder::ConfigManager.validate_config(config: config, logger: logger)
|
144
|
+
assert_equal [6], codes
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_config_manager_validate_project_app_name
|
148
|
+
logger = Logger.new("/dev/null")
|
149
|
+
config = good_config
|
150
|
+
config[:projects][:project1][:app_name] = nil
|
151
|
+
codes = RokuBuilder::ConfigManager.validate_config(config: config, logger: logger)
|
152
|
+
assert_equal [10], codes
|
153
|
+
end
|
154
|
+
|
155
|
+
def test_config_manager_validate_project_directory
|
156
|
+
logger = Logger.new("/dev/null")
|
157
|
+
config = good_config
|
158
|
+
config[:projects][:project1][:directory] = nil
|
159
|
+
codes = RokuBuilder::ConfigManager.validate_config(config: config, logger: logger)
|
160
|
+
assert_equal [11], codes
|
161
|
+
end
|
162
|
+
|
163
|
+
def test_config_manager_validate_project_folders
|
164
|
+
logger = Logger.new("/dev/null")
|
165
|
+
config = good_config
|
166
|
+
config[:projects][:project1][:folders] = nil
|
167
|
+
codes = RokuBuilder::ConfigManager.validate_config(config: config, logger: logger)
|
168
|
+
assert_equal [12], codes
|
169
|
+
end
|
170
|
+
|
171
|
+
def test_config_manager_validate_project_folders_is_array
|
172
|
+
logger = Logger.new("/dev/null")
|
173
|
+
config = good_config
|
174
|
+
config[:projects][:project1][:folders] = "Folders"
|
175
|
+
codes = RokuBuilder::ConfigManager.validate_config(config: config, logger: logger)
|
176
|
+
assert_equal [13], codes
|
177
|
+
end
|
178
|
+
|
179
|
+
def test_config_manager_validate_project_files
|
180
|
+
logger = Logger.new("/dev/null")
|
181
|
+
config = good_config
|
182
|
+
config[:projects][:project1][:files] = nil
|
183
|
+
codes = RokuBuilder::ConfigManager.validate_config(config: config, logger: logger)
|
184
|
+
assert_equal [14], codes
|
185
|
+
end
|
186
|
+
|
187
|
+
def test_config_manager_validate_project_filess_is_array
|
188
|
+
logger = Logger.new("/dev/null")
|
189
|
+
config = good_config
|
190
|
+
config[:projects][:project1][:files] = "Files"
|
191
|
+
codes = RokuBuilder::ConfigManager.validate_config(config: config, logger: logger)
|
192
|
+
assert_equal [15], codes
|
193
|
+
end
|
194
|
+
|
195
|
+
def test_config_manager_edit_ip
|
196
|
+
logger = Logger.new("/dev/null")
|
197
|
+
config_path = "config/file/path"
|
198
|
+
args = {
|
199
|
+
config: config_path,
|
200
|
+
options: "ip:192.168.0.200",
|
201
|
+
device: :roku,
|
202
|
+
project: nil,
|
203
|
+
stage: nil,
|
204
|
+
logger: logger
|
205
|
+
}
|
206
|
+
new_config = good_config
|
207
|
+
new_config[:devices][:roku][:ip] = "192.168.0.200"
|
208
|
+
|
209
|
+
io = Minitest::Mock.new
|
210
|
+
io.expect(:read, good_config.to_json)
|
211
|
+
io.expect(:write, nil, [JSON.pretty_generate(new_config)])
|
212
|
+
io.expect(:close, nil)
|
213
|
+
config = nil
|
214
|
+
File.stub(:open, io) do
|
215
|
+
RokuBuilder::ConfigManager.edit_config(**args)
|
216
|
+
end
|
217
|
+
io.verify
|
218
|
+
end
|
219
|
+
|
220
|
+
def test_config_manager_edit_user
|
221
|
+
logger = Logger.new("/dev/null")
|
222
|
+
config_path = "config/file/path"
|
223
|
+
args = {
|
224
|
+
config: config_path,
|
225
|
+
options: "user:new_user",
|
226
|
+
device: "roku",
|
227
|
+
project: nil,
|
228
|
+
stage: nil,
|
229
|
+
logger: logger
|
230
|
+
}
|
231
|
+
new_config = good_config
|
232
|
+
new_config[:devices][:roku][:user] = "new_user"
|
233
|
+
|
234
|
+
io = Minitest::Mock.new
|
235
|
+
io.expect(:read, good_config.to_json)
|
236
|
+
io.expect(:write, nil, [JSON.pretty_generate(new_config)])
|
237
|
+
io.expect(:close, nil)
|
238
|
+
config = nil
|
239
|
+
File.stub(:open, io) do
|
240
|
+
RokuBuilder::ConfigManager.edit_config(**args)
|
241
|
+
end
|
242
|
+
io.verify
|
243
|
+
end
|
244
|
+
|
245
|
+
def test_config_manager_edit_password
|
246
|
+
logger = Logger.new("/dev/null")
|
247
|
+
config_path = "config/file/path"
|
248
|
+
args = {
|
249
|
+
config: config_path,
|
250
|
+
options: "password:new_password",
|
251
|
+
device: nil,
|
252
|
+
project: nil,
|
253
|
+
stage: nil,
|
254
|
+
logger: logger
|
255
|
+
}
|
256
|
+
new_config = good_config
|
257
|
+
new_config[:devices][:roku][:password] = "new_password"
|
258
|
+
|
259
|
+
io = Minitest::Mock.new
|
260
|
+
io.expect(:read, good_config.to_json)
|
261
|
+
io.expect(:write, nil, [JSON.pretty_generate(new_config)])
|
262
|
+
io.expect(:close, nil)
|
263
|
+
config = nil
|
264
|
+
File.stub(:open, io) do
|
265
|
+
RokuBuilder::ConfigManager.edit_config(**args)
|
266
|
+
end
|
267
|
+
io.verify
|
268
|
+
end
|
269
|
+
|
270
|
+
def test_config_manager_edit_app_name
|
271
|
+
logger = Logger.new("/dev/null")
|
272
|
+
config_path = "config/file/path"
|
273
|
+
args = {
|
274
|
+
config: config_path,
|
275
|
+
options: "app_name:new name",
|
276
|
+
device: nil,
|
277
|
+
project: :project1,
|
278
|
+
stage: nil,
|
279
|
+
logger: logger
|
280
|
+
}
|
281
|
+
new_config = good_config
|
282
|
+
new_config[:projects][:project1][:app_name] = "new name"
|
283
|
+
|
284
|
+
io = Minitest::Mock.new
|
285
|
+
io.expect(:read, good_config.to_json)
|
286
|
+
io.expect(:write, nil, [JSON.pretty_generate(new_config)])
|
287
|
+
io.expect(:close, nil)
|
288
|
+
config = nil
|
289
|
+
File.stub(:open, io) do
|
290
|
+
RokuBuilder::ConfigManager.edit_config(**args)
|
291
|
+
end
|
292
|
+
io.verify
|
293
|
+
end
|
294
|
+
|
295
|
+
def test_config_manager_edit_directory
|
296
|
+
logger = Logger.new("/dev/null")
|
297
|
+
config_path = "config/file/path"
|
298
|
+
args = {
|
299
|
+
config: config_path,
|
300
|
+
options: "directory:new/directory/path",
|
301
|
+
device: nil,
|
302
|
+
project: "project1",
|
303
|
+
stage: nil,
|
304
|
+
logger: logger
|
305
|
+
}
|
306
|
+
new_config = good_config
|
307
|
+
new_config[:projects][:project1][:directory] = "new/directory/path"
|
308
|
+
|
309
|
+
io = Minitest::Mock.new
|
310
|
+
io.expect(:read, good_config.to_json)
|
311
|
+
io.expect(:write, nil, [JSON.pretty_generate(new_config)])
|
312
|
+
io.expect(:close, nil)
|
313
|
+
config = nil
|
314
|
+
File.stub(:open, io) do
|
315
|
+
RokuBuilder::ConfigManager.edit_config(**args)
|
316
|
+
end
|
317
|
+
io.verify
|
318
|
+
end
|
319
|
+
|
320
|
+
def test_config_manager_edit_branch
|
321
|
+
logger = Logger.new("/dev/null")
|
322
|
+
config_path = "config/file/path"
|
323
|
+
args = {
|
324
|
+
config: config_path,
|
325
|
+
options: "branch:new-branch",
|
326
|
+
device: nil,
|
327
|
+
project: nil,
|
328
|
+
stage: :production,
|
329
|
+
logger: logger
|
330
|
+
}
|
331
|
+
new_config = good_config
|
332
|
+
new_config[:projects][:project1][:stages][:production][:branch] = "new-branch"
|
333
|
+
|
334
|
+
io = Minitest::Mock.new
|
335
|
+
io.expect(:read, good_config.to_json)
|
336
|
+
io.expect(:write, nil, [JSON.pretty_generate(new_config)])
|
337
|
+
io.expect(:close, nil)
|
338
|
+
config = nil
|
339
|
+
File.stub(:open, io) do
|
340
|
+
RokuBuilder::ConfigManager.edit_config(**args)
|
341
|
+
end
|
342
|
+
io.verify
|
343
|
+
end
|
344
|
+
|
345
|
+
def test_config_manager_edit_default_stage
|
346
|
+
logger = Logger.new("/dev/null")
|
347
|
+
config_path = "config/file/path"
|
348
|
+
args = {
|
349
|
+
config: config_path,
|
350
|
+
options: "branch:new-branch",
|
351
|
+
device: nil,
|
352
|
+
project: nil,
|
353
|
+
stage: nil,
|
354
|
+
logger: logger
|
355
|
+
}
|
356
|
+
new_config = good_config
|
357
|
+
new_config[:projects][:project1][:stages][:production][:branch] = "new-branch"
|
358
|
+
|
359
|
+
io = Minitest::Mock.new
|
360
|
+
io.expect(:read, good_config.to_json)
|
361
|
+
io.expect(:write, nil, [JSON.pretty_generate(new_config)])
|
362
|
+
io.expect(:close, nil)
|
363
|
+
config = nil
|
364
|
+
File.stub(:open, io) do
|
365
|
+
RokuBuilder::ConfigManager.edit_config(**args)
|
366
|
+
end
|
367
|
+
io.verify
|
368
|
+
end
|
369
|
+
|
370
|
+
def good_config
|
371
|
+
{
|
372
|
+
devices: {
|
373
|
+
default: :roku,
|
374
|
+
roku: {
|
375
|
+
ip: "192.168.0.100",
|
376
|
+
user: "user",
|
377
|
+
password: "password"
|
378
|
+
}
|
379
|
+
},
|
380
|
+
projects: {
|
381
|
+
default: :project1,
|
382
|
+
project1: {
|
383
|
+
directory: "<path/to/repo>",
|
384
|
+
folders: ["resources","source"],
|
385
|
+
files: ["manifest"],
|
386
|
+
app_name: "<app name>",
|
387
|
+
stages:{
|
388
|
+
production: {
|
389
|
+
branch: "production",
|
390
|
+
key: {
|
391
|
+
keyed_pkg: "<path/to/signed/pkg>",
|
392
|
+
password: "<password for pkg>"
|
393
|
+
}
|
394
|
+
}
|
395
|
+
}
|
396
|
+
}
|
397
|
+
}
|
398
|
+
}
|
399
|
+
end
|
400
|
+
end
|