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,40 @@
1
+ require 'boxen/test'
2
+ require 'boxen/preflight/directories'
3
+
4
+ class BoxenPreflightDirectoriesTest < Boxen::Test
5
+ class TestConfig
6
+ def user; "foobar"; end
7
+ def homedir; "foobar"; end
8
+ end
9
+
10
+ def setup
11
+ @config = TestConfig.new
12
+ end
13
+
14
+ def test_not_okay_if_homedir_group_wrong
15
+ directories = Boxen::Preflight::Directories.new(@config)
16
+ directories.stubs(:homedir_group).returns(false)
17
+ refute directories.ok?
18
+ end
19
+
20
+ def test_not_okay_if_homedir_owner_wrong
21
+ directories = Boxen::Preflight::Directories.new(@config)
22
+ directories.stubs(:homedir_owner).returns(false)
23
+ refute directories.ok?
24
+ end
25
+
26
+ def test_not_okay_unless_homedir_exists
27
+ directories = Boxen::Preflight::Directories.new(@config)
28
+ directories.stubs(:homedir_directory_exists?).returns(false)
29
+ refute directories.ok?
30
+ end
31
+
32
+ def test_okay_if_allchecks_fine
33
+ directories = Boxen::Preflight::Directories.new(@config)
34
+ directories.stubs(:homedir_directory_exists?).returns(true)
35
+ directories.stubs(:homedir_owner).returns("foobar")
36
+ directories.stubs(:homedir_group).returns("staff")
37
+
38
+ assert directories.ok?
39
+ end
40
+ end
@@ -0,0 +1,217 @@
1
+ require "boxen/test"
2
+ require "boxen/flags"
3
+
4
+ class BoxenFlagsTest < Boxen::Test
5
+ def test_apply
6
+ config = mock do
7
+ expects(:debug=).with true
8
+
9
+ stubs(:fde?).returns true
10
+ expects(:fde=).with false
11
+
12
+ expects(:homedir=).with "homedir"
13
+ expects(:logfile=).with "logfile"
14
+ expects(:login=).with "login"
15
+ expects(:token=).with "token"
16
+ expects(:pretend=).with true
17
+ expects(:profile=).with true
18
+ expects(:future_parser=).with true
19
+ expects(:report=).with true
20
+ expects(:graph=).with true
21
+ expects(:srcdir=).with "srcdir"
22
+ expects(:stealth=).with true
23
+ expects(:user=).with "user"
24
+ expects(:color=).with true
25
+ end
26
+
27
+ # Do our best to frob every switch.
28
+
29
+ flags = Boxen::Flags.new "--debug", "--help", "--login", "login",
30
+ "--no-fde", "--no-pull", "--no-issue", "--noop",
31
+ "--pretend", "--profile", "--future-parser", "--report", "--graph", "--projects",
32
+ "--user", "user", "--homedir", "homedir", "--srcdir", "srcdir",
33
+ "--logfile", "logfile", "--token", "token"
34
+
35
+ assert_same config, flags.apply(config)
36
+ end
37
+
38
+ def test_args
39
+ config = flags "--debug", "foo"
40
+ assert_equal %w(foo), config.args
41
+ end
42
+
43
+ def test_debug
44
+ refute flags.debug?
45
+ assert flags("--debug").debug?
46
+ end
47
+
48
+ def test_env?
49
+ refute flags.env?
50
+ assert flags("--env").env?
51
+ end
52
+
53
+ def test_help
54
+ refute flags.help?
55
+
56
+ %w(--help -h -?).each do |flag|
57
+ assert flags(flag).help?
58
+ end
59
+ end
60
+
61
+ def test_disable_services?
62
+ refute flags.disable_services?
63
+ assert flags("--disable-services").disable_services?
64
+ end
65
+
66
+ def test_enable_services?
67
+ refute flags.enable_services?
68
+ assert flags("--enable-services").enable_services?
69
+ end
70
+
71
+ def test_list_services?
72
+ refute flags.list_services?
73
+ assert flags("--list-services").list_services?
74
+ end
75
+
76
+ def test_homedir
77
+ assert_nil flags.homedir
78
+ assert_equal "foo", flags("--homedir", "foo").homedir
79
+ end
80
+
81
+ def test_initialize_bad_option
82
+ ex = assert_raises Boxen::Error do
83
+ flags "--bad-option"
84
+ end
85
+
86
+ assert_match "invalid option", ex.message
87
+ assert_match "--bad-option", ex.message
88
+ end
89
+
90
+ def test_initialize_dups
91
+ args = %w(foo)
92
+ config = flags args
93
+
94
+ assert_equal args, config.args
95
+ refute_same args, config.args
96
+ end
97
+
98
+ def test_initialize_empty
99
+ config = flags
100
+ assert_equal [], config.args
101
+ end
102
+
103
+ def test_initialize_flattens
104
+ config = flags "foo", ["bar"]
105
+ assert_equal %w(foo bar), config.args
106
+ end
107
+
108
+ def test_initialize_nils
109
+ config = flags "foo", nil, "bar"
110
+ assert_equal %w(foo bar), config.args
111
+ end
112
+
113
+ def test_initialize_strings
114
+ config = flags :foo, [:bar]
115
+ assert_equal %w(foo bar), config.args
116
+ end
117
+
118
+ def test_logfile
119
+ assert_nil flags.logfile
120
+ assert_equal "foo", flags("--logfile", "foo").logfile
121
+ end
122
+
123
+ def test_login
124
+ assert_nil flags.login
125
+ assert_equal "jbarnette", flags("--login", "jbarnette").login
126
+ end
127
+
128
+ def test_no_fde
129
+ assert flags.fde?
130
+ refute flags("--no-fde").fde?
131
+ end
132
+
133
+ def test_no_pull_is_a_noop
134
+ flags "--no-pull"
135
+ end
136
+
137
+ def test_parse
138
+ config = flags
139
+ config.parse "--debug", "foo"
140
+
141
+ assert config.debug?
142
+ assert_equal %w(foo), config.args
143
+ end
144
+
145
+ def test_token
146
+ assert_nil flags.token
147
+ assert_equal "foo", flags("--token", "foo").token
148
+ end
149
+
150
+ def test_token_missing_value
151
+ ex = assert_raises Boxen::Error do
152
+ flags "--token"
153
+ end
154
+
155
+ assert_match "missing argument", ex.message
156
+ end
157
+
158
+ def test_pretend
159
+ refute flags.pretend?
160
+ assert flags("--noop").pretend?
161
+ assert flags("--pretend").pretend?
162
+ end
163
+
164
+ def test_profile
165
+ refute flags.profile?
166
+ assert flags("--profile").profile?
167
+ end
168
+
169
+ def test_future_parser
170
+ refute flags.future_parser?
171
+ assert flags("--future-parser").future_parser?
172
+ end
173
+
174
+ def test_report
175
+ refute flags.report?
176
+ assert flags("--report").report?
177
+ end
178
+
179
+ def test_graph
180
+ refute flags.graph?
181
+ assert flags("--graph").graph?
182
+ end
183
+
184
+ def test_projects
185
+ refute flags.projects?
186
+ assert flags("--projects").projects?
187
+ end
188
+
189
+ def test_srcdir
190
+ assert_nil flags.srcdir
191
+ assert_equal "foo", flags("--srcdir", "foo").srcdir
192
+ end
193
+
194
+ def test_stealth
195
+ refute flags.stealth?
196
+ assert flags("--no-issue").stealth?
197
+ assert flags("--stealth").stealth?
198
+ end
199
+
200
+ def test_user
201
+ assert_equal "jbarnette", flags("--user", "jbarnette").user
202
+ end
203
+
204
+ def test_user_missing_value
205
+ ex = assert_raises Boxen::Error do
206
+ flags "--user"
207
+ end
208
+
209
+ assert_match "missing argument", ex.message
210
+ end
211
+
212
+ # Create an instance of Boxen::Flags with optional `args`.
213
+
214
+ def flags(*args)
215
+ Boxen::Flags.new *args
216
+ end
217
+ end
@@ -0,0 +1,294 @@
1
+ require "boxen/test"
2
+ require "boxen/hook/github_issue"
3
+
4
+ class Boxen::Config
5
+ attr_writer :api
6
+ end
7
+
8
+ class BoxenHookGitHubIssueTest < 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::GitHubIssue.new @config, @checkout, @puppet, @result
15
+ end
16
+
17
+ def test_enabled
18
+ original = ENV['BOXEN_ISSUES_ENABLED']
19
+
20
+ ENV['BOXEN_ISSUES_ENABLED'] = nil
21
+ refute @hook.enabled?
22
+
23
+ ENV['BOXEN_ISSUES_ENABLED'] = 'duh'
24
+ assert @hook.enabled?
25
+
26
+ ENV['BOXEN_ISSUES_ENABLED'] = original
27
+ end
28
+
29
+ def test_perform
30
+ @hook.stubs(:enabled?).returns(false)
31
+ @config.stubs(:stealth?).returns(true)
32
+ @config.stubs(:pretend?).returns(true)
33
+ @checkout.stubs(:master?).returns(false)
34
+ @config.stubs(:login).returns(nil)
35
+
36
+ refute @hook.perform?
37
+
38
+ @hook.stubs(:enabled?).returns(true)
39
+ refute @hook.perform?
40
+
41
+ @config.stubs(:stealth?).returns(false)
42
+ refute @hook.perform?
43
+
44
+ @config.stubs(:pretend?).returns(false)
45
+ refute @hook.perform?
46
+
47
+ @checkout.stubs(:master?).returns(true)
48
+ refute @hook.perform?
49
+
50
+ @config.stubs(:login).returns('')
51
+ refute @hook.perform?
52
+
53
+ @config.stubs(:login).returns('somelogin')
54
+ assert @hook.perform?
55
+ end
56
+
57
+ def test_compare_url
58
+ @config.reponame = repo = 'org/repo'
59
+ sha = 'deadbeef'
60
+ @checkout.expects(:sha).returns(sha)
61
+
62
+ expected = "https://github.com/#{repo}/compare/#{sha}...master"
63
+ assert_equal expected, @hook.compare_url
64
+ end
65
+
66
+ def test_compare_url_ghurl
67
+ @config.reponame = repo = 'org/repo'
68
+ @config.ghurl = 'https://git.foo.com'
69
+ sha = 'deadbeef'
70
+ @checkout.expects(:sha).returns(sha)
71
+
72
+ expected = "https://git.foo.com/#{repo}/compare/#{sha}...master"
73
+ assert_equal expected, @hook.compare_url
74
+ end
75
+
76
+ def test_hostname
77
+ @hook.expects(:"`").with("hostname").returns "whatevs.local\n"
78
+ assert_equal "whatevs.local", @hook.hostname
79
+ end
80
+
81
+ def test_initialize
82
+ hook = Boxen::Hook::GitHubIssue.new :config, :checkout, :puppet, :result
83
+ assert_equal :config, hook.config
84
+ assert_equal :checkout, hook.checkout
85
+ assert_equal :puppet, hook.puppet
86
+ assert_equal :result, hook.result
87
+ end
88
+
89
+ def test_os
90
+ @hook.expects(:"`").with("sw_vers -productVersion").returns "11.1.1\n"
91
+ assert_equal "11.1.1", @hook.os
92
+ end
93
+
94
+ def test_shell
95
+ val = ENV['SHELL']
96
+
97
+ ENV['SHELL'] = '/bin/crush'
98
+ assert_equal "/bin/crush", @hook.shell
99
+
100
+ ENV['SHELL'] = val
101
+ end
102
+
103
+ def test_record_failure
104
+ @hook.stubs(:issues?).returns(true)
105
+
106
+ details = 'Everything went wrong.'
107
+ @hook.stubs(:failure_details).returns(details)
108
+
109
+ @config.reponame = repo = 'some/repo'
110
+ @config.user = user = 'hapless'
111
+
112
+ @hook.failure_label = label = 'boom'
113
+
114
+ @config.api = api = mock('api')
115
+ api.expects(:create_issue).with(repo, "Failed for #{user}", details, :labels => [label])
116
+
117
+ @hook.record_failure
118
+ end
119
+
120
+ def test_record_failure_no_issues
121
+ @hook.stubs(:issues?).returns(false)
122
+
123
+ @config.api = api = mock('api')
124
+ api.expects(:create_issue).never
125
+
126
+ @hook.record_failure
127
+ end
128
+
129
+ def test_failure_label
130
+ default = 'failure'
131
+ assert_equal default, @hook.failure_label
132
+
133
+ @hook.failure_label = label = 'oops'
134
+ assert_equal label, @hook.failure_label
135
+
136
+ @hook.failure_label = nil
137
+ assert_equal default, @hook.failure_label
138
+ end
139
+
140
+ def test_ongoing_label
141
+ default = 'ongoing'
142
+ assert_equal default, @hook.ongoing_label
143
+
144
+ @hook.ongoing_label = label = 'checkit'
145
+ assert_equal label, @hook.ongoing_label
146
+
147
+ @hook.ongoing_label = nil
148
+ assert_equal default, @hook.ongoing_label
149
+ end
150
+
151
+ def test_failure_details
152
+ sha = 'decafbad'
153
+ @checkout.stubs(:sha).returns(sha)
154
+ hostname = 'cools.local'
155
+ @hook.stubs(:hostname).returns(hostname)
156
+ shell = '/bin/ksh'
157
+ @hook.stubs(:shell).returns(shell)
158
+ os = '11.1.1'
159
+ @hook.stubs(:os).returns(os)
160
+ log = "so\nmany\nthings\nto\nreport"
161
+ @hook.stubs(:log).returns(log)
162
+
163
+ @config.reponame = repo = 'some/repo'
164
+ compare = @hook.compare_url
165
+ changes = 'so many changes'
166
+ @checkout.stubs(:changes).returns(changes)
167
+
168
+ commands = %w[/path/to/puppet apply stuff_and_things]
169
+ @puppet.stubs(:command).returns(commands)
170
+ command = commands.join(' ')
171
+
172
+ @config.logfile = logfile = '/path/to/logfile.txt'
173
+
174
+ details = @hook.failure_details
175
+
176
+ assert_match sha, details
177
+ assert_match hostname, details
178
+ assert_match shell, details
179
+ assert_match os, details
180
+ assert_match compare, details
181
+ assert_match changes, details
182
+ assert_match command, details
183
+ assert_match logfile, details
184
+ assert_match log, details
185
+ end
186
+
187
+ def test_log
188
+ @config.logfile = logfile = '/path/to/logfile.txt'
189
+
190
+ log = 'a bunch of log data'
191
+ File.expects(:read).with(logfile).returns(log)
192
+
193
+ assert_equal log, @hook.log
194
+ end
195
+
196
+
197
+ Issue = Struct.new(:number, :labels) do
198
+ def labels
199
+ self[:labels] || []
200
+ end
201
+ end
202
+ Label = Struct.new(:name)
203
+
204
+ def test_close_failures
205
+ @hook.stubs(:issues?).returns(true)
206
+
207
+ @config.reponame = repo = 'some/repo'
208
+
209
+ issues = Array.new(3) { |i| Issue.new(i*2 + 2) }
210
+ @hook.stubs(:failures).returns(issues)
211
+
212
+ sha = 'decafbad'
213
+ @checkout.stubs(:sha).returns(sha)
214
+
215
+ @config.api = api = mock('api')
216
+ issues.each do |issue|
217
+ api.expects(:add_comment).with(repo, issue.number, "Succeeded at version #{sha}.")
218
+ api.expects(:close_issue).with(repo, issue.number)
219
+ end
220
+
221
+ @hook.close_failures
222
+ end
223
+
224
+ def test_close_failures_no_issues
225
+ @hook.stubs(:issues?).returns(false)
226
+
227
+ @hook.expects(:failures).never
228
+
229
+ @config.api = api = mock('api')
230
+ api.expects(:add_comment).never
231
+ api.expects(:close_issue).never
232
+
233
+ @hook.close_failures
234
+ end
235
+
236
+ def test_failures
237
+ @hook.stubs(:issues?).returns(true)
238
+
239
+ @config.reponame = repo = 'some/repo'
240
+ @config.login = user = 'hapless'
241
+
242
+ @hook.failure_label = fail_label = 'ouch'
243
+ @hook.ongoing_label = goon_label = 'goon'
244
+
245
+ fail_l = Label.new(fail_label)
246
+ goon_l = Label.new(goon_label)
247
+ pop_l = Label.new('popcorn')
248
+
249
+ issues = [
250
+ Issue.new(0, [fail_l]),
251
+ Issue.new(1, [fail_l, pop_l]),
252
+ Issue.new(2, [fail_l, goon_l]),
253
+ Issue.new(3, [fail_l, Label.new('bang')]),
254
+ Issue.new(4, [fail_l, goon_l, pop_l]),
255
+ ]
256
+
257
+ @config.api = api = mock('api')
258
+ api.expects(:list_issues).with(repo, :state => 'open', :labels => fail_label, :creator => user).returns(issues)
259
+
260
+ assert_equal issues.values_at(0,1,3), @hook.failures
261
+ end
262
+
263
+ def test_failures_no_issues
264
+ @hook.stubs(:issues?).returns(false)
265
+
266
+ @config.api = api = mock('api')
267
+ api.expects(:list_issues).never
268
+
269
+ assert_equal [], @hook.failures
270
+ end
271
+
272
+ RepoInfo = Struct.new(:has_issues)
273
+ def test_issues?
274
+ @config.reponame = repo = 'some/repo'
275
+
276
+ repo_info = RepoInfo.new(true)
277
+
278
+ @config.api = api = mock('api')
279
+ api.stubs(:repository).with(repo).returns(repo_info)
280
+ assert @hook.issues?
281
+
282
+ repo_info = RepoInfo.new(false)
283
+ api.stubs(:repository).with(repo).returns(repo_info)
284
+ refute @hook.issues?
285
+
286
+ @config.stubs(:reponame) # to ensure the returned value is nil
287
+ api.stubs(:repository).returns(RepoInfo.new(true))
288
+ refute @hook.issues?
289
+
290
+ @config.stubs(:reponame).returns('boxen/our-boxen') # our main public repo
291
+ api.stubs(:repository).returns(RepoInfo.new(true))
292
+ refute @hook.issues?
293
+ end
294
+ end