Skip to content

Commit

Permalink
Refactor run and add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
greeneca committed Jun 12, 2017
1 parent 028b7fa commit ec85a77
Show file tree
Hide file tree
Showing 10 changed files with 161 additions and 48 deletions.
82 changes: 47 additions & 35 deletions lib/roku_builder.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,26 +35,38 @@
module RokuBuilder
# Run the builder
# @param options [Hash] The options hash
def self.run
def self.run(options: nil)
@@options = nil
setup_plugins
options = Options.new
options.validate
initialize_logger(options: options)
if options[:debug]
execute(options: options)
setup_options(options: options)
return unless @@options
initialize_logger
if @@options[:debug]
execute
else
begin
execute(options: options)
execute
rescue StandardError => e
Logger.instance.fatal "#{e.class}: #{e.message}"
end
end
end

def self.execute(options:)
config = load_config(options: options)
check_devices(options: options, config: config)
execute_command(options: options, config: config)
def self.setup_options(options:)
begin
@@options = Options.new(options: options)
@@options.validate
rescue InvalidOptions => e
Logger.instance.fatal "#{e.class}: #{e.message}"
@@options = nil
return
end
end

def self.execute
load_config
check_devices
execute_command
end

def self.plugins
Expand Down Expand Up @@ -82,7 +94,8 @@ def self.process_plugins
@@plugins ||= []
@@plugins.sort! {|a,b| a.to_s <=> b.to_s}
unless @@plugins.count == @@plugins.uniq.count
raise ImplementationError, "Duplicate plugins"
duplicates = @@plugins.select{ |e| @@plugins.count(e) > 1 }.uniq
raise ImplementationError, "Duplicate plugins: #{duplicates.join(", ")}"
end
@@plugins.each do |plugin|
plugin.dependencies.each do |dependency|
Expand All @@ -94,38 +107,37 @@ def self.process_plugins
end
end

def self.initialize_logger(options:)
if options[:debug]
def self.initialize_logger
if @@options[:debug]
Logger.set_debug
elsif options[:verbose]
elsif @@options[:verbose]
Logger.set_info
else
Logger.set_warn
end
end

def self.load_config(options:)
config = Config.new(options: options)
config.configure
unless options[:configure] and not options[:edit_params]
config.load
config.validate
config.parse
def self.load_config
@@config = Config.new(options: @@options)
@@config.configure
unless @@options[:configure] and not @@options[:edit_params]
@@config.load
@@config.validate
@@config.parse
end
config
end

def self.check_devices(options:, config:)
if options.device_command?
def self.check_devices
if @@options.device_command?
ping = Net::Ping::External.new
host = config.parsed[:device_config][:ip]
host = @@config.parsed[:device_config][:ip]
return if ping.ping? host, 1, 0.2, 1
raise DeviceError, "Device not online" if options[:device_given]
config.raw[:devices].each_pair {|key, value|
raise DeviceError, "Device not online" if @@options[:device_given]
@@config.raw[:devices].each_pair {|key, value|
unless key == :default
host = value[:ip]
if ping.ping? host, 1, 0.2, 1
config.parsed[:device_config] = value
@@config.parsed[:device_config] = value
Logger.instance.warn("Default device offline, choosing Alternate")
return
end
Expand All @@ -135,16 +147,16 @@ def self.check_devices(options:, config:)
end
end

def self.execute_command(options:, config:)
def self.execute_command
@@plugins.each do |plugin|
if plugin.commands.keys.include?(options.command)
if plugin.commands.keys.include?(@@options.command)
stager = nil
if plugin.commands[options.command][:stage]
stager = Stager.new(config: config, options: options)
if plugin.commands[@@options.command][:stage]
stager = Stager.new(config: @@config, options: @@options)
stager.stage
end
instance = plugin.new(config: config)
instance.send(options.command, {options: options})
instance = plugin.new(config: @@config)
instance.send(@@options.command, {options: @@options})
stager.unstage if stager
end
end
Expand Down
3 changes: 3 additions & 0 deletions test/roku_builder/test_config_parser.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@

module RokuBuilder
class ConfigParserTest < Minitest::Test
def setup
Logger.set_testing
end
def test_manifest_config
options = build_options({
validate: true,
Expand Down
3 changes: 3 additions & 0 deletions test/roku_builder/test_config_validator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@

module RokuBuilder
class ConfigValidatorTest < Minitest::Test
def setup
Logger.set_testing
end

def test_config_manager_validate_devices
config = good_config
Expand Down
32 changes: 32 additions & 0 deletions test/roku_builder/test_files/roku_builder_test/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{
"devices": {
"default": "roku",
"roku": {
"ip": "111.222.333.444",
"user": "user",
"password": "pass"
}
},
"projects": {
"default": "p1",
"p1": {
"directory": "/tmp",
"folders": ["resources","source"],
"files": ["manifest"],
"app_name": "app",
"stage_method": "git",
"stages":{
"production": {
"branch": "master",
"key": {
"keyed_pkg": "/tmp/package.pkg",
"password": "password"
}
}
}
}
},
"input_mappings": {
"a": ["home", "Home"]
}
}
1 change: 1 addition & 0 deletions test/roku_builder/test_manifest.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ def setup
@config = Config.new(options: options)
@config.instance_variable_set(:@parsed, {root_dir: @root_dir})
FileUtils.cp(File.join(@root_dir, "manifest_template"), File.join(@root_dir, "manifest"))
Logger.set_testing
end
def teardown
path = File.join(@config.parsed[:root_dir], "manifest")
Expand Down
1 change: 1 addition & 0 deletions test/roku_builder/test_options.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ module RokuBuilder
class OptionsTest < Minitest::Test
def setup
RokuBuilder.class_variable_set(:@@plugins, [])
Logger.set_testing
end
def teardown
RokuBuilder.class_variable_set(:@@plugins, [])
Expand Down
3 changes: 3 additions & 0 deletions test/roku_builder/test_options_plugins.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@

module RokuBuilder
class OptionsPluginTest < Minitest::Test
def setup
Logger.set_testing
end
def test_options_plugins_parse
RokuBuilder.class_variable_set(:@@plugins, nil)
parser = Minitest::Mock.new()
Expand Down
3 changes: 3 additions & 0 deletions test/roku_builder/test_plugin.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@

module RokuBuilder
class PluginTest < Minitest::Test
def setup
Logger.set_testing
end
def test_module_commands_fail
assert_raises ImplementationError do
TestClass.commands
Expand Down
78 changes: 65 additions & 13 deletions test/roku_builder/test_roku_builder.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,65 @@ def setup
@config = Config.new(options: @options)
@config.instance_variable_set(:@config, @raw)
@config.instance_variable_set(:@parsed, @parsed)
RokuBuilder.class_variable_set(:@@options, @options)
RokuBuilder.class_variable_set(:@@config, @config)
end
def teardown
@ping.verify
RokuBuilder.class_variable_set(:@@plugins, [])
end

def test_roku_builder_run
config = File.join(test_files_path(RokuBuilderTest), "config.json")
RokuBuilder.run(options: {validate: true, config: config})
end
def test_roku_builder_run_stage
config = File.join(test_files_path(RokuBuilderTest), "config.json")
commands = Minitest::Mock.new
commands.expect(:call, {validate: {stage: true}})
commands.expect(:call, {validate: {stage: true}})
commands.expect(:call, {validate: {stage: true}})
commands.expect(:call, {validate: {stage: true}})
Core.stub(:commands, commands) do
RokuBuilder.run(options: {validate: true, config: config})
end
end
def test_roku_builder_run_debug
config = File.join(test_files_path(RokuBuilderTest), "config.json")
RokuBuilder.run(options: {validate: true, debug: true, config: config})
end
def test_roku_builder_run_bad_options
RokuBuilder.class_variable_set(:@@plugins, [])
logger = Minitest::Mock.new
logger.expect(:fatal, nil, ["RokuBuilder::InvalidOptions: Specify at least one command"])
Logger.class_variable_set(:@@instance, logger)
RokuBuilder.run(options: {working: true})
logger.verify
Logger.set_testing
end
def test_roku_builder_run_bad_options_debug
config = File.join(test_files_path(RokuBuilderTest), "config.json")
RokuBuilder.class_variable_set(:@@plugins, [])
RokuBuilder.setup_plugins
register_plugins(Packager)
assert_raises DeviceError do
RokuBuilder.run(options: {package: true, in: "/in/path", debug: true, config: config})
end
end
def test_roku_builder_run_bad_config
config = File.join(test_files_path(RokuBuilderTest), "missing_config.json")
logger = Minitest::Mock.new
logger.expect(:level=, nil, [::Logger::WARN])
logger.expect(:fatal, nil, ["ArgumentError: Missing Config"])
Logger.class_variable_set(:@@instance, logger)
RokuBuilder.run(options: {validate: true, config: config})
logger.verify
Logger.set_testing
end
def test_roku_builder_check_devices_good
Net::Ping::External.stub(:new, @ping) do
@ping.expect(:ping?, true, [@parsed[:device_config][:ip], 1, 0.2, 1])
RokuBuilder.check_devices(options: @options, config: @config)
RokuBuilder.check_devices
end
end
def test_roku_builder_check_devices_no_devices
Expand All @@ -42,15 +91,15 @@ def test_roku_builder_check_devices_no_devices
@ping.expect(:ping?, false, [@raw[:devices][:a][:ip], 1, 0.2, 1])
@ping.expect(:ping?, false, [@raw[:devices][:b][:ip], 1, 0.2, 1])
assert_raises DeviceError do
RokuBuilder.check_devices(options: @options, config: @config)
RokuBuilder.check_devices
end
end
end
def test_roku_builder_check_devices_changed_device
Net::Ping::External.stub(:new, @ping) do
@ping.expect(:ping?, false, [@parsed[:device_config][:ip], 1, 0.2, 1])
@ping.expect(:ping?, true, [@raw[:devices][:a][:ip], 1, 0.2, 1])
RokuBuilder.check_devices(options: @options, config: @config)
RokuBuilder.check_devices
assert_equal @raw[:devices][:a][:ip], @config.parsed[:device_config][:ip]
end
end
Expand All @@ -59,18 +108,19 @@ def test_roku_builder_check_devices_bad_device
@options[:device_given] = true
@ping.expect(:ping?, false, [@parsed[:device_config][:ip], 1, 0.2, 1])
assert_raises DeviceError do
RokuBuilder.check_devices(options: @options, config: @config)
RokuBuilder.check_devices
end
end
end
def test_roku_builder_check_devices
Net::Ping::External.stub(:new, @ping) do
@options = build_options({validate: true, device_given: false, working: true})
RokuBuilder.check_devices(options: @options, config: @config)
RokuBuilder.class_variable_set(:@@options, @options)
RokuBuilder.check_devices
end
end

def test_roku_builder_run_debug
def test_roku_builder_logger_debug
tests = [
{options: {debug: true}, method: :set_debug},
{options: {verbose: true}, method: :set_info},
Expand All @@ -81,7 +131,8 @@ def test_roku_builder_run_debug
logger.expect(:call, nil)

Logger.stub(test[:method], logger) do
RokuBuilder.initialize_logger(options: test[:options])
RokuBuilder.class_variable_set(:@@options, test[:options])
RokuBuilder.initialize_logger
end

logger.verify
Expand Down Expand Up @@ -141,10 +192,10 @@ def test_roku_builder_plugins_dependencies_missing
end
end
def test_roku_builder_plugins_missing_command_method
RokuBuilder.register_plugin(TestPlugin4)
assert_raises ImplementationError do
RokuBuilder.process_plugins
end
RokuBuilder.register_plugin(TestPlugin4)
assert_raises ImplementationError do
RokuBuilder.process_plugins
end
end
def test_roku_builder_load_config
config = Minitest::Mock.new
Expand All @@ -153,8 +204,9 @@ def test_roku_builder_load_config
config.expect(:validate, nil)
config.expect(:parse, nil)
Config.stub(:new, config) do
returned = RokuBuilder.load_config(options: {})
assert config === returned
RokuBuilder.class_variable_set(:@@options, {})
RokuBuilder.load_config
assert config === RokuBuilder.class_variable_get(:@@config)
end
config.verify
end
Expand Down
3 changes: 3 additions & 0 deletions test/roku_builder/test_stager.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@

module RokuBuilder
class StagerTest < Minitest::Test
def setup
Logger.set_testing
end

def build_config_options(options)
@options = build_options(options)
Expand Down

0 comments on commit ec85a77

Please sign in to comment.