boxen-linux 2.7.1

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