boxen-linux 2.7.1

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 (70) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.travis.yml +7 -0
  4. data/Gemfile +2 -0
  5. data/LICENSE +20 -0
  6. data/README.md +50 -0
  7. data/boxen.gemspec +26 -0
  8. data/lib/boxen/check.rb +72 -0
  9. data/lib/boxen/checkout.rb +25 -0
  10. data/lib/boxen/cli.rb +63 -0
  11. data/lib/boxen/config.rb +330 -0
  12. data/lib/boxen/error.rb +4 -0
  13. data/lib/boxen/flags.rb +272 -0
  14. data/lib/boxen/hook.rb +47 -0
  15. data/lib/boxen/hook/github_issue.rb +120 -0
  16. data/lib/boxen/hook/web.rb +56 -0
  17. data/lib/boxen/keychain.rb +63 -0
  18. data/lib/boxen/postflight.rb +13 -0
  19. data/lib/boxen/postflight/active.rb +16 -0
  20. data/lib/boxen/postflight/env.rb +34 -0
  21. data/lib/boxen/preflight.rb +13 -0
  22. data/lib/boxen/preflight/creds.rb +108 -0
  23. data/lib/boxen/preflight/directories.rb +32 -0
  24. data/lib/boxen/preflight/etc_my_cnf.rb +12 -0
  25. data/lib/boxen/preflight/homebrew.rb +13 -0
  26. data/lib/boxen/preflight/identity.rb +16 -0
  27. data/lib/boxen/preflight/os.rb +33 -0
  28. data/lib/boxen/preflight/rbenv.rb +12 -0
  29. data/lib/boxen/preflight/rvm.rb +12 -0
  30. data/lib/boxen/project.rb +20 -0
  31. data/lib/boxen/puppeteer.rb +122 -0
  32. data/lib/boxen/runner.rb +149 -0
  33. data/lib/boxen/service.rb +58 -0
  34. data/lib/boxen/util.rb +17 -0
  35. data/lib/facter/boxen.rb +34 -0
  36. data/lib/system_timer.rb +13 -0
  37. data/script/Boxen +0 -0
  38. data/script/Boxen-linux +0 -0
  39. data/script/bootstrap +7 -0
  40. data/script/build-keychain-helper +6 -0
  41. data/script/build-keyring-helper +9 -0
  42. data/script/release +38 -0
  43. data/script/tests +10 -0
  44. data/src/keychain-helper.c +85 -0
  45. data/src/keyring-helper.c +86 -0
  46. data/test/boxen/test.rb +7 -0
  47. data/test/boxen_check_test.rb +55 -0
  48. data/test/boxen_checkout_test.rb +42 -0
  49. data/test/boxen_cli_test.rb +39 -0
  50. data/test/boxen_config_test.rb +393 -0
  51. data/test/boxen_directories_test.rb +40 -0
  52. data/test/boxen_flags_test.rb +217 -0
  53. data/test/boxen_hook_github_issue_test.rb +294 -0
  54. data/test/boxen_hook_web_test.rb +58 -0
  55. data/test/boxen_keychain_test.rb +24 -0
  56. data/test/boxen_postflight_active_test.rb +29 -0
  57. data/test/boxen_postflight_env_test.rb +6 -0
  58. data/test/boxen_preflight_creds_test.rb +80 -0
  59. data/test/boxen_preflight_etc_my_cnf_test.rb +10 -0
  60. data/test/boxen_preflight_homebrew_test.rb +10 -0
  61. data/test/boxen_preflight_rvm_test.rb +10 -0
  62. data/test/boxen_project_test.rb +14 -0
  63. data/test/boxen_puppeteer_test.rb +101 -0
  64. data/test/boxen_runner_test.rb +171 -0
  65. data/test/boxen_service_test.rb +39 -0
  66. data/test/boxen_util_test.rb +21 -0
  67. data/test/fixtures/repo/modules/projects/manifests/first-project.pp +0 -0
  68. data/test/fixtures/repo/modules/projects/manifests/second-project.pp +0 -0
  69. data/test/system_timer.rb +10 -0
  70. metadata +279 -0
@@ -0,0 +1,58 @@
1
+ require "boxen/test"
2
+ require "boxen/hook/web"
3
+
4
+ class Boxen::Config
5
+ attr_writer :api
6
+ end
7
+
8
+ class BoxenHookWebTest < Boxen::Test
9
+ def setup
10
+ @config = Boxen::Config.new
11
+ @checkout = Boxen::Checkout.new(@config)
12
+ @puppet = mock 'puppeteer'
13
+ @result = stub 'result', :success? => true
14
+ @hook = Boxen::Hook::Web.new @config, @checkout, @puppet, @result
15
+ end
16
+
17
+ def test_enabled
18
+ original = ENV['BOXEN_WEB_HOOK_URL']
19
+
20
+ ENV['BOXEN_WEB_HOOK_URL'] = nil
21
+ refute @hook.enabled?
22
+
23
+ ENV['BOXEN_WEB_HOOK_URL'] = ''
24
+ refute @hook.enabled?
25
+
26
+ ENV['BOXEN_WEB_HOOK_URL'] = '1'
27
+ assert @hook.enabled?
28
+
29
+ ENV['BOXEN_WEB_HOOK_URL'] = original
30
+ end
31
+
32
+ def test_perform
33
+ @hook.stubs(:enabled?).returns(false)
34
+ refute @hook.perform?
35
+
36
+ @hook.stubs(:enabled?).returns(true)
37
+ assert @hook.perform?
38
+ end
39
+
40
+ def test_run
41
+ @config.stubs(:user).returns('fred')
42
+ @checkout.stubs(:sha).returns('87dbag3')
43
+ @result.stubs(:success?).returns(false)
44
+ now = Time.now
45
+ Time.stubs(:now).returns(now)
46
+
47
+ @hook.stubs(:enabled?).returns(true)
48
+
49
+ @hook.expects(:post_web_hook).with({
50
+ :login => 'fred',
51
+ :sha => '87dbag3',
52
+ :status => 'failure',
53
+ :time => "#{now.utc.to_i}"
54
+ })
55
+
56
+ @hook.run
57
+ end
58
+ end
@@ -0,0 +1,24 @@
1
+ require "boxen/test"
2
+ require "boxen/keychain"
3
+
4
+ class BoxenKeychainTest < Boxen::Test
5
+ def setup
6
+ @keychain = Boxen::Keychain.new('test') if osx?
7
+ end
8
+
9
+ def osx?
10
+ RUBY_PLATFORM.downcase.include?("darwin")
11
+ end
12
+
13
+ def test_get_token
14
+ return skip("Keychain helper is OSX only") unless osx?
15
+ @keychain.expects(:get).with('GitHub API Token').returns('foobar')
16
+ assert_equal 'foobar', @keychain.token
17
+ end
18
+
19
+ def test_set_token
20
+ return skip("Keychain helper is OSX only") unless osx?
21
+ @keychain.expects(:set).with('GitHub API Token', 'foobar').returns('foobar')
22
+ assert_equal 'foobar', @keychain.token=('foobar')
23
+ end
24
+ end
@@ -0,0 +1,29 @@
1
+ require "boxen/test"
2
+ require "boxen/postflight"
3
+
4
+ class BoxenPostflightActiveTest < Boxen::Test
5
+ def setup
6
+ @check = Boxen::Postflight::Active.new :config
7
+ end
8
+
9
+ def test_ok?
10
+ Boxen::Util.expects(:active?).returns true
11
+ assert @check.ok?
12
+ end
13
+
14
+ def test_ok_bad
15
+ Boxen::Util.expects(:active?).returns false
16
+ refute @check.ok?
17
+ end
18
+
19
+ def test_run
20
+ config = stub :envfile => "foo"
21
+ @check = Boxen::Postflight::Active.new config
22
+
23
+ stdout, stderr = capture_io do
24
+ @check.run
25
+ end
26
+
27
+ assert_match "loaded", stderr
28
+ end
29
+ end
@@ -0,0 +1,6 @@
1
+ require "boxen/test"
2
+ require "boxen/postflight"
3
+
4
+ class BoxenPostflightEnvTest < Boxen::Test
5
+
6
+ end
@@ -0,0 +1,80 @@
1
+ require 'boxen/test'
2
+ require 'boxen/config'
3
+ require 'boxen/preflight/creds'
4
+
5
+ class BoxenPreflightCredsTest < Boxen::Test
6
+ def setup
7
+ @config = Boxen::Config.new do |c|
8
+ c.user = 'mojombo'
9
+ c.token = 'sekr3t!'
10
+ end
11
+ ENV.delete("BOXEN_GITHUB_LOGIN")
12
+ ENV.delete("BOXEN_GITHUB_PASSWORD")
13
+ end
14
+
15
+ def test_basic
16
+ preflight = Boxen::Preflight::Creds.new @config
17
+
18
+ error = Octokit::Unauthorized.new
19
+ @config.api.stubs(:user).raises(error)
20
+
21
+ refute preflight.ok?
22
+ end
23
+
24
+ def test_basic_with_otp_challenge
25
+ preflight = Boxen::Preflight::Creds.new @config
26
+
27
+ blank_opt = {:headers => {}}
28
+ good_otp = {:headers => {"X-GitHub-OTP" => "123456"}}
29
+
30
+ error = Octokit::OneTimePasswordRequired.new
31
+ error.stubs(:message).returns("OTP")
32
+
33
+ preflight.tmp_api.expects(:authorizations).with(blank_opt).raises(error)
34
+ preflight.tmp_api.expects(:authorizations).with(good_otp).returns([])
35
+ preflight.tmp_api.expects(:create_authorization).raises(error)
36
+
37
+ preflight.expects(:warn)
38
+ HighLine.any_instance.expects(:ask).returns("123456")
39
+
40
+ preflight.get_tokens
41
+ assert_equal "123456", preflight.otp
42
+ end
43
+
44
+ def test_fetch_login_and_password_when_nothing_is_given_in_env
45
+ # fetches login and password by asking
46
+ preflight = Boxen::Preflight::Creds.new @config
47
+ HighLine.any_instance.expects(:ask).with("GitHub login: ").returns "l"
48
+ HighLine.any_instance.expects(:ask).with("GitHub password: ").returns "p"
49
+ preflight.send(:fetch_login_and_password)
50
+
51
+ assert_equal "l", @config.login
52
+ assert_equal "p", preflight.instance_variable_get(:@password)
53
+ end
54
+
55
+ def test_fetch_password_when_login_is_given_in_env
56
+ # fetches only password by asking
57
+ ENV["BOXEN_GITHUB_LOGIN"] = "l"
58
+ preflight = Boxen::Preflight::Creds.new @config
59
+ preflight.expects(:warn)
60
+ HighLine.any_instance.expects(:ask).with("GitHub login: ").never
61
+ HighLine.any_instance.expects(:ask).with("GitHub password: ").returns "p"
62
+ preflight.send(:fetch_login_and_password)
63
+
64
+ assert_equal "l", @config.login
65
+ assert_equal "p", preflight.instance_variable_get(:@password)
66
+ end
67
+
68
+ def test_fetch_login_when_password_is_given_in_env
69
+ # fetches only login by asking
70
+ ENV["BOXEN_GITHUB_PASSWORD"] = "p"
71
+ preflight = Boxen::Preflight::Creds.new @config
72
+ preflight.expects(:warn)
73
+ HighLine.any_instance.expects(:ask).with("GitHub login: ").returns "l"
74
+ HighLine.any_instance.expects(:ask).with("GitHub password: ").never
75
+ preflight.send(:fetch_login_and_password)
76
+
77
+ assert_equal "l", @config.login
78
+ assert_equal "p", preflight.instance_variable_get(:@password)
79
+ end
80
+ end
@@ -0,0 +1,10 @@
1
+ require 'boxen/test'
2
+ require 'boxen/preflight/etc_my_cnf'
3
+
4
+ class BoxenPreflightEtcMyCnfTest < Boxen::Test
5
+ def test_file_check
6
+ preflight = Boxen::Preflight::EtcMyCnf.new(mock('config'))
7
+ File.expects(:file?).with("/etc/my.cnf").returns(false)
8
+ assert preflight.ok?
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ require 'boxen/test'
2
+ require 'boxen/preflight/homebrew'
3
+
4
+ class BoxenPreflightHomebrewTest < Boxen::Test
5
+ def test_directory_check
6
+ preflight = Boxen::Preflight::Homebrew.new(mock('config'))
7
+ File.expects(:exist?).with("/usr/local/Library/Homebrew").returns(false)
8
+ assert preflight.ok?
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ require 'boxen/test'
2
+ require 'boxen/preflight/rvm'
3
+
4
+ class BoxenPreflightRVMTest < Boxen::Test
5
+ def test_directory_check
6
+ preflight = Boxen::Preflight::RVM.new(mock('config'))
7
+ File.expects(:exist?).with("#{ENV['HOME']}/.rvm").returns(false)
8
+ assert preflight.ok?
9
+ end
10
+ end
@@ -0,0 +1,14 @@
1
+ require "boxen/test"
2
+ require "boxen/project"
3
+
4
+ class BoxenProjectTest < Boxen::Test
5
+ def test_initialize
6
+ project = Boxen::Project.new "foo"
7
+ assert_equal "foo", project.dir
8
+ end
9
+
10
+ def test_name
11
+ project = Boxen::Project.new "foo/bar/baz"
12
+ assert_equal "baz", project.name
13
+ end
14
+ end
@@ -0,0 +1,101 @@
1
+ require "boxen/test"
2
+ require "boxen/puppeteer"
3
+
4
+ class BoxenPuppeteerTest < Boxen::Test
5
+ def test_initialize
6
+ puppet = Boxen::Puppeteer.new :config
7
+ assert_equal :config, puppet.config
8
+ end
9
+
10
+ def test_flags
11
+ config = stub do
12
+ stubs(:homedir).returns "homedir"
13
+ stubs(:logfile).returns "logfile"
14
+ stubs(:profile?).returns true
15
+ stubs(:future_parser?).returns true
16
+ stubs(:puppetdir).returns "puppetdir"
17
+ stubs(:repodir).returns "repodir"
18
+ stubs(:debug?).returns true
19
+ stubs(:pretend?).returns true
20
+ stubs(:report?).returns false
21
+ stubs(:graph?).returns false
22
+ stubs(:color?).returns false
23
+ end
24
+
25
+ puppet = Boxen::Puppeteer.new config
26
+ flags = puppet.flags
27
+
28
+ assert_flag "--debug", flags
29
+ assert_flag "--detailed-exitcodes", flags
30
+ assert_flag "--evaltrace", flags
31
+ assert_flag "--no-report", flags
32
+ assert_flag "--noop", flags
33
+ assert_flag "--summarize", flags
34
+ assert_flag "--color=false", flags
35
+ assert_flag "--parser=future", flags
36
+
37
+ assert_flag_value "--confdir", :anything, flags
38
+ assert_flag_value "--group", "admin", flags
39
+ assert_flag_value "--vardir", :anything, flags
40
+ assert_flag_value "--libdir", :anything, flags
41
+ assert_flag_value "--manifestdir", :anything, flags
42
+ assert_flag_value "--modulepath", :anything, flags
43
+
44
+ assert_flag_value "--hiera_config", "/dev/null", flags
45
+
46
+ assert_flag_value "--logdest", "logfile", flags
47
+ assert_flag_value "--logdest", "console", flags
48
+ end
49
+
50
+ def test_run
51
+ config = stub do
52
+ stubs(:debug?).returns false
53
+ stubs(:homedir).returns "homedir"
54
+ stubs(:logfile).returns "logfile"
55
+ stubs(:pretend?).returns false
56
+ stubs(:profile?).returns false
57
+ stubs(:future_parser?).returns false
58
+ stubs(:report?).returns false
59
+ stubs(:graph?).returns false
60
+ stubs(:puppetdir).returns "puppetdir"
61
+ stubs(:repodir).returns "test/fixtures/repo"
62
+ stubs(:color?).returns true
63
+ end
64
+
65
+ puppet = Boxen::Puppeteer.new config
66
+
67
+ FileUtils.expects(:rm_f).with config.logfile
68
+ FileUtils.expects(:touch).with config.logfile
69
+ FileUtils.expects(:mkdir_p).with File.dirname(config.logfile)
70
+ FileUtils.expects(:mkdir_p).with config.puppetdir
71
+ Boxen::Util.expects(:sudo).with *puppet.command
72
+
73
+ puppet.run
74
+ end
75
+
76
+ def assert_flag(flag, flags)
77
+ assert flags.include?(flag), "Flags must include #{flag}."
78
+ end
79
+
80
+ def assert_flag_value(flag, value, flags)
81
+ pair = [flag, value]
82
+
83
+ found = (0..flags.size).detect do |i|
84
+ candidate = flags[i, pair.size]
85
+ value == :anything ? candidate.size == pair.size : candidate == pair
86
+ end
87
+
88
+ assert found, "Flags must include #{flag} #{value}."
89
+ end
90
+
91
+ def test_status
92
+ status = Boxen::Puppeteer::Status.new(0)
93
+ assert status.success?
94
+
95
+ status = Boxen::Puppeteer::Status.new(2)
96
+ assert status.success?
97
+
98
+ status = Boxen::Puppeteer::Status.new(1)
99
+ refute status.success?
100
+ end
101
+ end
@@ -0,0 +1,171 @@
1
+ require "boxen/test"
2
+ require "boxen/runner"
3
+
4
+ class BoxenRunnerTest < Boxen::Test
5
+ def setup
6
+ @config = Boxen::Config.new
7
+ @flags = Boxen::Flags.new
8
+ @runner = Boxen::Runner.new(@config, @flags)
9
+
10
+ $stdout.stubs(:puts).returns(true)
11
+ $stdout.stubs(:write).returns(true)
12
+ end
13
+
14
+ def test_initialize
15
+ config = Boxen::Config.new
16
+ flags = Boxen::Flags.new
17
+
18
+ runner = Boxen::Runner.new(config, flags)
19
+
20
+ assert_equal config, runner.config
21
+ assert_equal flags, runner.flags
22
+ assert_equal config, runner.puppet.config
23
+ end
24
+
25
+ HookYes = Struct.new(:config, :checkout, :puppet, :result)
26
+ HookNo = Struct.new(:config, :checkout, :puppet, :result)
27
+ def test_report
28
+ runner = Boxen::Runner.new(@config, @flags)
29
+ runner.stubs(:hooks).returns([HookYes, HookNo])
30
+
31
+ hook_yes = stub('HookYes')
32
+ hook_no = stub('HookNo')
33
+
34
+ HookYes.stubs(:new).returns(hook_yes)
35
+ HookNo.stubs(:new).returns(hook_no)
36
+
37
+ hook_yes.expects(:run).once
38
+ hook_no.expects(:run).once
39
+
40
+ runner.report(stub('result'))
41
+ end
42
+
43
+ def test_disable_service
44
+ config = Boxen::Config.new
45
+ flags = Boxen::Flags.new('--disable-service', 'test')
46
+ runner = Boxen::Runner.new config, flags
47
+
48
+ service = mock('service', :disable => true)
49
+ Boxen::Service.stubs(:new).returns(service)
50
+
51
+ assert_raises(SystemExit) do
52
+ runner.process
53
+ end
54
+ end
55
+
56
+ def test_enable_service
57
+ config = Boxen::Config.new
58
+ flags = Boxen::Flags.new('--enable-service', 'test')
59
+ runner = Boxen::Runner.new config, flags
60
+
61
+ service = mock('service', :enable => true)
62
+ Boxen::Service.stubs(:new).returns(service)
63
+
64
+ assert_raises(SystemExit) do
65
+ runner.process
66
+ end
67
+ end
68
+
69
+ def test_restart_service
70
+ config = Boxen::Config.new
71
+ flags = Boxen::Flags.new('--restart-service', 'test')
72
+ runner = Boxen::Runner.new config, flags
73
+
74
+ service = mock('service')
75
+ service.expects(:disable).once
76
+ service.expects(:enable).once
77
+
78
+ Boxen::Service.stubs(:new).returns(service)
79
+
80
+ assert_raises(SystemExit) do
81
+ runner.process
82
+ end
83
+ end
84
+
85
+ def test_disable_services
86
+ config = Boxen::Config.new
87
+ flags = Boxen::Flags.new('--disable-services')
88
+ runner = Boxen::Runner.new config, flags
89
+
90
+ services = Array.new(3) { mock('service', :disable => true) }
91
+ Boxen::Service.stubs(:list).returns(services)
92
+
93
+ assert_raises(SystemExit) do
94
+ runner.process
95
+ end
96
+ end
97
+
98
+ def test_enable_services
99
+ config = Boxen::Config.new
100
+ flags = Boxen::Flags.new('--enable-services')
101
+ runner = Boxen::Runner.new config, flags
102
+
103
+ services = Array.new(3) { mock('service', :enable => true) }
104
+ Boxen::Service.stubs(:list).returns(services)
105
+
106
+ assert_raises(SystemExit) do
107
+ runner.process
108
+ end
109
+ end
110
+
111
+ def test_restart_services
112
+ config = Boxen::Config.new
113
+ flags = Boxen::Flags.new('--restart-services')
114
+ runner = Boxen::Runner.new config, flags
115
+
116
+ services = Array.new(3) { mock('service') }
117
+ services.each do |service|
118
+ service.expects(:disable).once
119
+ service.expects(:enable).once
120
+ end
121
+ Boxen::Service.stubs(:list_enabled).returns(services)
122
+
123
+ assert_raises(SystemExit) do
124
+ runner.process
125
+ end
126
+ end
127
+
128
+ def test_list_services
129
+ config = Boxen::Config.new
130
+ flags = Boxen::Flags.new('--list-services')
131
+ runner = Boxen::Runner.new config, flags
132
+
133
+ Boxen::Service.expects(:list).returns(%w[a list of services])
134
+
135
+ assert_raises(SystemExit) do
136
+ runner.process
137
+ end
138
+ end
139
+
140
+ def test_specify_project
141
+ skip "busted and probably due to be replaced if @jbarnette can fix it"
142
+ fact = 'cli_boxen_projects'
143
+ refute Facter.value(fact)
144
+
145
+ project = 'some_project'
146
+ flags = Boxen::Flags.new(project)
147
+
148
+ runner = Boxen::Runner.new(@config, flags)
149
+ runner.puppet.expects(:run).with().returns(true)
150
+ runner.process
151
+ assert_equal project, Facter.value(fact)
152
+
153
+
154
+ project = 'other_project'
155
+ flags = Boxen::Flags.new('--debug', project)
156
+
157
+ runner = Boxen::Runner.new(@config, flags)
158
+ runner.puppet.expects(:run).with().returns(true)
159
+ runner.process
160
+ assert_equal project, Facter.value(fact)
161
+
162
+
163
+ projects = %w[my cool projects]
164
+ flags = Boxen::Flags.new('--noop', *projects)
165
+
166
+ runner = Boxen::Runner.new(@config, flags)
167
+ runner.puppet.expects(:run).with().returns(true)
168
+ runner.process
169
+ assert_equal projects.join(','), Facter.value(fact)
170
+ end
171
+ end