busser 0.1.0
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.
- data/.cane +0 -0
- data/.gitignore +17 -0
- data/.simplecov +10 -0
- data/.tailor +4 -0
- data/.travis.yml +19 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +9 -0
- data/Guardfile +18 -0
- data/LICENSE +15 -0
- data/README.md +35 -0
- data/Rakefile +38 -0
- data/bin/busser +8 -0
- data/busser.gemspec +39 -0
- data/features/plugin_install_command.feature +26 -0
- data/features/setup_command.feature +17 -0
- data/features/step_definitions/busser_root_steps.rb +65 -0
- data/features/suite_cleanup_command.feature +28 -0
- data/features/suite_path_command.feature +15 -0
- data/features/support/env.rb +40 -0
- data/lib/busser.rb +22 -0
- data/lib/busser/cli.rb +42 -0
- data/lib/busser/command/plugin.rb +39 -0
- data/lib/busser/command/plugin_install.rb +95 -0
- data/lib/busser/command/plugin_list.rb +50 -0
- data/lib/busser/command/setup.rb +93 -0
- data/lib/busser/command/suite.rb +39 -0
- data/lib/busser/command/suite_cleanup.rb +43 -0
- data/lib/busser/command/suite_path.rb +38 -0
- data/lib/busser/command/test.rb +46 -0
- data/lib/busser/helpers.rb +37 -0
- data/lib/busser/plugin.rb +64 -0
- data/lib/busser/runner_plugin.rb +32 -0
- data/lib/busser/thor.rb +50 -0
- data/lib/busser/ui.rb +52 -0
- data/lib/busser/version.rb +21 -0
- data/spec/busser/helpers_spec.rb +42 -0
- data/spec/spec_helper.rb +24 -0
- metadata +319 -0
data/.cane
ADDED
File without changes
|
data/.gitignore
ADDED
data/.simplecov
ADDED
data/.tailor
ADDED
data/.travis.yml
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
language: ruby
|
2
|
+
|
3
|
+
rvm:
|
4
|
+
- 2.0.0
|
5
|
+
- 1.9.3
|
6
|
+
- 1.9.2
|
7
|
+
- ruby-head
|
8
|
+
|
9
|
+
env:
|
10
|
+
- RUBYGEMS_VERSION=2.0.3
|
11
|
+
- RUBYGEMS_VERSION=1.8.25
|
12
|
+
|
13
|
+
before_install:
|
14
|
+
- gem update --system $RUBYGEMS_VERSION
|
15
|
+
- gem --version
|
16
|
+
|
17
|
+
matrix:
|
18
|
+
allow_failures:
|
19
|
+
- rvm: ruby-head
|
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
guard 'minitest' do
|
2
|
+
watch(%r|^spec/(.*)_spec\.rb|)
|
3
|
+
watch(%r|^lib/(.*)([^/]+)\.rb|) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
|
4
|
+
watch(%r|^spec/spec_helper\.rb|) { "spec" }
|
5
|
+
end
|
6
|
+
|
7
|
+
guard 'cucumber' do
|
8
|
+
watch(%r{^features/.+\.feature$})
|
9
|
+
watch(%r{^features/support/.+$}) { 'features' }
|
10
|
+
watch(%r{^features/step_definitions/(.+)_steps\.rb$}) do |m|
|
11
|
+
Dir[File.join("**/#{m[1]}.feature")][0] || 'features'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
guard 'cane' do
|
16
|
+
watch(%r|.*\.rb|)
|
17
|
+
watch('.cane')
|
18
|
+
end
|
data/LICENSE
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
Author:: Fletcher Nichol (<fnichol@nichol.ca>)
|
2
|
+
|
3
|
+
Copyright 2013 Fletcher Nichol
|
4
|
+
|
5
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
you may not use this file except in compliance with the License.
|
7
|
+
You may obtain a copy of the License at
|
8
|
+
|
9
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
|
11
|
+
Unless required by applicable law or agreed to in writing, software
|
12
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
See the License for the specific language governing permissions and
|
15
|
+
limitations under the License.
|
data/README.md
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# Busser
|
2
|
+
|
3
|
+
[](https://travis-ci.org/fnichol/busser)
|
4
|
+
[](https://codeclimate.com/github/fnichol/busser)
|
5
|
+
|
6
|
+
Busser is a test setup and execution framework designed to
|
7
|
+
work on remote nodes whose system dependencies cannot be relied upon, except
|
8
|
+
for an Omnibus installation of Chef. It uses a plugin architecture to add
|
9
|
+
support for different testing strategies such minitest, cucumber, bash, etc.
|
10
|
+
|
11
|
+
## Installation
|
12
|
+
|
13
|
+
Add this line to your application's Gemfile:
|
14
|
+
|
15
|
+
gem 'busser'
|
16
|
+
|
17
|
+
And then execute:
|
18
|
+
|
19
|
+
$ bundle
|
20
|
+
|
21
|
+
Or install it yourself as:
|
22
|
+
|
23
|
+
$ gem install busser
|
24
|
+
|
25
|
+
## Usage
|
26
|
+
|
27
|
+
TODO: Write usage instructions here
|
28
|
+
|
29
|
+
## Contributing
|
30
|
+
|
31
|
+
1. Fork it
|
32
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
33
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
34
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
35
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'cucumber/rake/task'
|
4
|
+
require 'cane/rake_task'
|
5
|
+
require 'tailor/rake_task'
|
6
|
+
|
7
|
+
Rake::TestTask.new(:unit) do |t|
|
8
|
+
t.libs.push "lib"
|
9
|
+
t.test_files = FileList['spec/**/*_spec.rb']
|
10
|
+
t.verbose = true
|
11
|
+
end
|
12
|
+
|
13
|
+
Cucumber::Rake::Task.new(:features) do |t|
|
14
|
+
t.cucumber_opts = ['features', '-x', '--format progress']
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "Run all test suites"
|
18
|
+
task :test => [:unit, :features]
|
19
|
+
|
20
|
+
desc "Run cane to check quality metrics"
|
21
|
+
Cane::RakeTask.new do |cane|
|
22
|
+
cane.canefile = './.cane'
|
23
|
+
end
|
24
|
+
|
25
|
+
Tailor::RakeTask.new
|
26
|
+
|
27
|
+
desc "Display LOC stats"
|
28
|
+
task :stats do
|
29
|
+
puts "\n## Production Code Stats"
|
30
|
+
sh "countloc -r lib"
|
31
|
+
puts "\n## Test Code Stats"
|
32
|
+
sh "countloc -r spec features"
|
33
|
+
end
|
34
|
+
|
35
|
+
desc "Run all quality tasks"
|
36
|
+
task :quality => [:cane, :tailor, :stats]
|
37
|
+
|
38
|
+
task :default => [:test, :quality]
|
data/bin/busser
ADDED
data/busser.gemspec
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'busser/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "busser"
|
8
|
+
spec.version = Busser::VERSION
|
9
|
+
spec.authors = ["Fletcher Nichol"]
|
10
|
+
spec.email = ["fnichol@nichol.ca"]
|
11
|
+
spec.description = %q{Kitchen Busser - Runs tests for projects in test-kitchen}
|
12
|
+
spec.summary = spec.description
|
13
|
+
spec.homepage = "https://github.com/fnichol/busser"
|
14
|
+
spec.license = 'Apache 2.0'
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
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.required_ruby_version = ">= 1.9.1"
|
22
|
+
|
23
|
+
spec.add_dependency 'thor'
|
24
|
+
|
25
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
26
|
+
spec.add_development_dependency "rake"
|
27
|
+
spec.add_development_dependency 'minitest'
|
28
|
+
spec.add_development_dependency 'guard-minitest'
|
29
|
+
spec.add_development_dependency 'mocha'
|
30
|
+
spec.add_development_dependency 'fakefs'
|
31
|
+
spec.add_development_dependency 'aruba'
|
32
|
+
spec.add_development_dependency 'guard-cucumber'
|
33
|
+
|
34
|
+
spec.add_development_dependency 'cane'
|
35
|
+
spec.add_development_dependency 'guard-cane'
|
36
|
+
spec.add_development_dependency 'tailor'
|
37
|
+
spec.add_development_dependency 'simplecov'
|
38
|
+
spec.add_development_dependency 'countloc'
|
39
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
Feature: Plugin install command
|
2
|
+
In order to let user test they way they want to test
|
3
|
+
As a user of Busser
|
4
|
+
I want the ability to install test runner plugins
|
5
|
+
|
6
|
+
Background:
|
7
|
+
Given a sandboxed GEM_HOME directory named "busser-plugin"
|
8
|
+
|
9
|
+
Scenario: Installing a missing plugin
|
10
|
+
When I run `busser plugin install rack`
|
11
|
+
Then the output should contain "Plugin rack installed"
|
12
|
+
And the exit status should be 0
|
13
|
+
And a gem named "rack" is installed
|
14
|
+
|
15
|
+
Scenario: Installing a missing plugin with a version
|
16
|
+
When I run `busser plugin install rack@1.2.8`
|
17
|
+
Then the output should contain "Plugin rack@1.2.8 installed (version 1.2.8)"
|
18
|
+
And the exit status should be 0
|
19
|
+
And a gem named "rack" is installed with version "1.2.8"
|
20
|
+
|
21
|
+
Scenario: Installing a specfic newer version of an existing plugin
|
22
|
+
When I successfully run `busser plugin install rack@1.2.8`
|
23
|
+
And I run `busser plugin install rack@1.3.10`
|
24
|
+
Then the output should contain "Plugin rack@1.3.10 installed (version 1.3.10)"
|
25
|
+
And the exit status should be 0
|
26
|
+
And a gem named "rack" is installed with version "1.3.10"
|
@@ -0,0 +1,17 @@
|
|
1
|
+
Feature: Setup command
|
2
|
+
In order to make Busser self-reliant with little external initialization
|
3
|
+
As a user of Busser
|
4
|
+
I want a command to set up Busser's environment
|
5
|
+
|
6
|
+
Background:
|
7
|
+
Given a test BUSSER_ROOT directory named "busser-setup"
|
8
|
+
And I delete the BUSSER_ROOT directory
|
9
|
+
|
10
|
+
Scenario: Busser home is set up
|
11
|
+
Given I run `busser setup`
|
12
|
+
Then the BUSSER_ROOT directory should exist
|
13
|
+
And a busser binstub file should contain:
|
14
|
+
"""
|
15
|
+
This file was generated by Busser.
|
16
|
+
"""
|
17
|
+
And the exit status should be 0
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'tmpdir'
|
2
|
+
require 'pathname'
|
3
|
+
|
4
|
+
Given(/^a BUSSER_ROOT of "(.*?)"$/) do |busser_root|
|
5
|
+
backup_envvar('BUSSER_ROOT')
|
6
|
+
|
7
|
+
ENV['BUSSER_ROOT'] = busser_root
|
8
|
+
end
|
9
|
+
|
10
|
+
Given(/^a test BUSSER_ROOT directory named "(.*?)"$/) do |name|
|
11
|
+
backup_envvar('BUSSER_ROOT')
|
12
|
+
|
13
|
+
busser_root = Pathname.new(Dir.mktmpdir(name))
|
14
|
+
(busser_root + "suites").mkpath
|
15
|
+
ENV['BUSSER_ROOT'] = busser_root.to_s
|
16
|
+
@busser_root_dirs << busser_root
|
17
|
+
end
|
18
|
+
|
19
|
+
Given(/^I delete the BUSSER_ROOT directory$/) do
|
20
|
+
FileUtils.rm_rf(ENV['BUSSER_ROOT'])
|
21
|
+
end
|
22
|
+
|
23
|
+
Given(/^a suite directory named "(.*?)"$/) do |name|
|
24
|
+
FileUtils.mkdir_p(File.join(ENV['BUSSER_ROOT'], "suites", name))
|
25
|
+
end
|
26
|
+
|
27
|
+
Given(/^a sandboxed GEM_HOME directory named "(.*?)"$/) do |name|
|
28
|
+
backup_envvar('GEM_HOME')
|
29
|
+
backup_envvar('GEM_PATH')
|
30
|
+
|
31
|
+
gem_home = Pathname.new(Dir.mktmpdir(name))
|
32
|
+
ENV['GEM_HOME'] = gem_home.to_s
|
33
|
+
ENV['GEM_PATH'] = [gem_home.to_s, ENV['GEM_PATH']].join(':')
|
34
|
+
@busser_root_dirs << gem_home
|
35
|
+
end
|
36
|
+
|
37
|
+
Then(/^the suite directory named "(.*?)" should not exist$/) do |name|
|
38
|
+
directory = File.join(ENV['BUSSER_ROOT'], "suites", name)
|
39
|
+
check_directory_presence([directory], false)
|
40
|
+
end
|
41
|
+
|
42
|
+
Then(/^a gem named "(.*?)" is installed with version "(.*?)"$/) do |name, version|
|
43
|
+
unbundlerize do
|
44
|
+
run_simple(unescape("gem list #{name} --version #{version} -i"), true, nil)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
Then(/^a gem named "(.*?)" is installed$/) do |name|
|
49
|
+
unbundlerize do
|
50
|
+
run_simple(unescape("gem list #{name} -i"), true, nil)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
Then(/^the BUSSER_ROOT directory should exist$/) do
|
55
|
+
check_directory_presence([ENV['BUSSER_ROOT']], true)
|
56
|
+
end
|
57
|
+
|
58
|
+
Then(/^a busser binstub file should contain:$/) do |partial_content|
|
59
|
+
file = File.join(ENV['BUSSER_ROOT'], %w{bin busser})
|
60
|
+
check_file_content(file, partial_content, true)
|
61
|
+
end
|
62
|
+
|
63
|
+
Then(/^pry me$/) do
|
64
|
+
require 'pry' ; binding.pry
|
65
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
Feature: Suite cleanup command
|
2
|
+
In order to have a fresh suite directory base for each test run
|
3
|
+
As a user of Busser
|
4
|
+
I want a command to clean any suite subdirectories
|
5
|
+
|
6
|
+
Background:
|
7
|
+
Given a test BUSSER_ROOT directory named "busser-suite"
|
8
|
+
|
9
|
+
Scenario: A nonexistent base suite path
|
10
|
+
Given I delete the BUSSER_ROOT directory
|
11
|
+
When I run `busser suite cleanup`
|
12
|
+
Then the output should contain "does not exist"
|
13
|
+
And the exit status should be 0
|
14
|
+
|
15
|
+
Scenario: An empty base suite path
|
16
|
+
When I run `busser suite cleanup`
|
17
|
+
Then the stdout should not contain anything
|
18
|
+
And the exit status should be 0
|
19
|
+
|
20
|
+
Scenario: A base suite path containing suite directories
|
21
|
+
Given a suite directory named "bats"
|
22
|
+
And a suite directory named "minitest"
|
23
|
+
When I run `busser suite cleanup`
|
24
|
+
Then the output should contain "bats"
|
25
|
+
And the output should contain "minitest"
|
26
|
+
And the suite directory named "bats" should not exist
|
27
|
+
And the suite directory named "minitest" should not exist
|
28
|
+
And the exit status should be 0
|
@@ -0,0 +1,15 @@
|
|
1
|
+
Feature: Suite path command
|
2
|
+
In order to determine the directory containing suite tests
|
3
|
+
As a user of Busser
|
4
|
+
I want a command to echo this directory on standard output
|
5
|
+
|
6
|
+
Background:
|
7
|
+
Given a BUSSER_ROOT of "/path/to/busser"
|
8
|
+
|
9
|
+
Scenario: Get base suite path
|
10
|
+
When I successfully run `busser suite path`
|
11
|
+
Then the output should contain exactly "/path/to/busser/suites\n"
|
12
|
+
|
13
|
+
Scenario: Get suite path for a plugin
|
14
|
+
When I successfully run `busser suite path footester`
|
15
|
+
Then the output should contain exactly "/path/to/busser/suites/footester\n"
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
require 'aruba/cucumber'
|
3
|
+
|
4
|
+
SimpleCov.command_name "features"
|
5
|
+
|
6
|
+
Before do
|
7
|
+
@aruba_timeout_seconds = 10
|
8
|
+
@busser_root_dirs = []
|
9
|
+
end
|
10
|
+
|
11
|
+
After do |s|
|
12
|
+
# Tell Cucumber to quit after this scenario is done - if it failed.
|
13
|
+
# This is useful to inspect the 'tmp/aruba' directory before any other
|
14
|
+
# steps are executed and clear it out.
|
15
|
+
Cucumber.wants_to_quit = true if s.failed?
|
16
|
+
|
17
|
+
# Restore environment variables to their original settings, if they have
|
18
|
+
# been saved off
|
19
|
+
ENV.keys.select { |key| key =~ /^_CUKE_/ }.each do |backup_key|
|
20
|
+
ENV[backup_key.sub(/^_CUKE_/, '')] = ENV.delete(backup_key)
|
21
|
+
end
|
22
|
+
|
23
|
+
@busser_root_dirs.each { |dir| FileUtils.rm_rf(dir) }
|
24
|
+
end
|
25
|
+
|
26
|
+
def backup_envvar(key)
|
27
|
+
ENV["_CUKE_#{key}"] = ENV[key]
|
28
|
+
end
|
29
|
+
|
30
|
+
def restore_envvar(key)
|
31
|
+
ENV[key] = ENV.delete("_CUKE_#{key}")
|
32
|
+
end
|
33
|
+
|
34
|
+
def unbundlerize
|
35
|
+
keys = %w[BUNDLER_EDITOR BUNDLE_BIN_PATH BUNDLE_GEMFILE RUBYOPT]
|
36
|
+
|
37
|
+
keys.each { |key| backup_envvar(key) ; ENV.delete(key) }
|
38
|
+
yield
|
39
|
+
keys.each { |key| restore_envvar(key) }
|
40
|
+
end
|
data/lib/busser.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# Author:: Fletcher Nichol (<fnichol@nichol.ca>)
|
4
|
+
#
|
5
|
+
# Copyright (C) 2013, Fletcher Nichol
|
6
|
+
#
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
+
# you may not use this file except in compliance with the License.
|
9
|
+
# You may obtain a copy of the License at
|
10
|
+
#
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
#
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
16
|
+
# See the License for the specific language governing permissions and
|
17
|
+
# limitations under the License.
|
18
|
+
|
19
|
+
require "busser/version"
|
20
|
+
|
21
|
+
module Busser
|
22
|
+
end
|