tddium-old 0.4.7
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/.document +5 -0
- data/CHANGELOG +1 -0
- data/Gemfile +21 -0
- data/Gemfile.lock +70 -0
- data/LICENSE.txt +2 -0
- data/README.rdoc +62 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/bin/tddium-old +16 -0
- data/doc/aws-keypair-example.tiff +0 -0
- data/doc/aws-secgroup-example.tiff +0 -0
- data/lib/spec_storm/action_controller_ext.rb +68 -0
- data/lib/spec_storm/action_view_ext.rb +52 -0
- data/lib/spec_storm/active_record_ext.rb +45 -0
- data/lib/tddium.rb +10 -0
- data/lib/tddium/config.rb +146 -0
- data/lib/tddium/instance.rb +212 -0
- data/lib/tddium/parallel.rb +87 -0
- data/lib/tddium/rails.rb +71 -0
- data/lib/tddium/reporting.rb +42 -0
- data/lib/tddium/ssh.rb +49 -0
- data/lib/tddium/taskalias.rb +21 -0
- data/lib/tddium/tasks.rb +159 -0
- data/lib/tddium_helper.rb +62 -0
- data/lib/tddium_loader.rb +38 -0
- data/parallelrun +295 -0
- data/rails/init.rb +1 -0
- data/tddium-old.gemspec +110 -0
- data/test/helper.rb +31 -0
- data/test/test_config.rb +194 -0
- data/test/test_parallel.rb +47 -0
- data/test/test_tddium.rb +372 -0
- metadata +291 -0
data/rails/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "tddium_loader.rb"
|
data/tddium-old.gemspec
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{tddium-old}
|
8
|
+
s.version = "0.4.7"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Jay Moorthi"]
|
12
|
+
s.date = %q{2011-12-26}
|
13
|
+
s.default_executable = %q{tddium-old}
|
14
|
+
s.description = %q{tddium gets your rspec+selenium tests into the cloud by running them on your VMs}
|
15
|
+
s.email = %q{info@tddium.com}
|
16
|
+
s.executables = ["tddium-old"]
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"LICENSE.txt",
|
19
|
+
"README.rdoc"
|
20
|
+
]
|
21
|
+
s.files = [
|
22
|
+
".document",
|
23
|
+
"CHANGELOG",
|
24
|
+
"Gemfile",
|
25
|
+
"Gemfile.lock",
|
26
|
+
"LICENSE.txt",
|
27
|
+
"README.rdoc",
|
28
|
+
"Rakefile",
|
29
|
+
"VERSION",
|
30
|
+
"doc/aws-keypair-example.tiff",
|
31
|
+
"doc/aws-secgroup-example.tiff",
|
32
|
+
"lib/spec_storm/action_controller_ext.rb",
|
33
|
+
"lib/spec_storm/action_view_ext.rb",
|
34
|
+
"lib/spec_storm/active_record_ext.rb",
|
35
|
+
"lib/tddium.rb",
|
36
|
+
"lib/tddium/config.rb",
|
37
|
+
"lib/tddium/instance.rb",
|
38
|
+
"lib/tddium/parallel.rb",
|
39
|
+
"lib/tddium/rails.rb",
|
40
|
+
"lib/tddium/reporting.rb",
|
41
|
+
"lib/tddium/ssh.rb",
|
42
|
+
"lib/tddium/taskalias.rb",
|
43
|
+
"lib/tddium/tasks.rb",
|
44
|
+
"lib/tddium_helper.rb",
|
45
|
+
"lib/tddium_loader.rb",
|
46
|
+
"parallelrun",
|
47
|
+
"rails/init.rb",
|
48
|
+
"tddium-old.gemspec",
|
49
|
+
"test/helper.rb",
|
50
|
+
"test/test_config.rb",
|
51
|
+
"test/test_parallel.rb",
|
52
|
+
"test/test_tddium.rb"
|
53
|
+
]
|
54
|
+
s.homepage = %q{http://www.tddium.com/}
|
55
|
+
s.require_paths = ["lib"]
|
56
|
+
s.rubygems_version = %q{1.6.2}
|
57
|
+
s.summary = %q{tddium Cloud Test Runner}
|
58
|
+
s.test_files = [
|
59
|
+
"test/helper.rb",
|
60
|
+
"test/test_config.rb",
|
61
|
+
"test/test_parallel.rb",
|
62
|
+
"test/test_tddium.rb"
|
63
|
+
]
|
64
|
+
|
65
|
+
if s.respond_to? :specification_version then
|
66
|
+
s.specification_version = 3
|
67
|
+
|
68
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
69
|
+
s.add_runtime_dependency(%q<highline>, [">= 0"])
|
70
|
+
s.add_runtime_dependency(%q<rspec>, ["< 2.0.0", "> 1.2.6"])
|
71
|
+
s.add_runtime_dependency(%q<parallel>, [">= 0"])
|
72
|
+
s.add_runtime_dependency(%q<selenium-client>, [">= 1.2.18"])
|
73
|
+
s.add_runtime_dependency(%q<fog>, ["= 0.4.0"])
|
74
|
+
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
75
|
+
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
76
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.5.1"])
|
77
|
+
s.add_development_dependency(%q<rcov>, [">= 0"])
|
78
|
+
s.add_development_dependency(%q<mocha>, [">= 0"])
|
79
|
+
s.add_development_dependency(%q<fakefs>, [">= 0.3.1"])
|
80
|
+
s.add_development_dependency(%q<rails>, ["= 2.3.8"])
|
81
|
+
else
|
82
|
+
s.add_dependency(%q<highline>, [">= 0"])
|
83
|
+
s.add_dependency(%q<rspec>, ["< 2.0.0", "> 1.2.6"])
|
84
|
+
s.add_dependency(%q<parallel>, [">= 0"])
|
85
|
+
s.add_dependency(%q<selenium-client>, [">= 1.2.18"])
|
86
|
+
s.add_dependency(%q<fog>, ["= 0.4.0"])
|
87
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
88
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
89
|
+
s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
|
90
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
91
|
+
s.add_dependency(%q<mocha>, [">= 0"])
|
92
|
+
s.add_dependency(%q<fakefs>, [">= 0.3.1"])
|
93
|
+
s.add_dependency(%q<rails>, ["= 2.3.8"])
|
94
|
+
end
|
95
|
+
else
|
96
|
+
s.add_dependency(%q<highline>, [">= 0"])
|
97
|
+
s.add_dependency(%q<rspec>, ["< 2.0.0", "> 1.2.6"])
|
98
|
+
s.add_dependency(%q<parallel>, [">= 0"])
|
99
|
+
s.add_dependency(%q<selenium-client>, [">= 1.2.18"])
|
100
|
+
s.add_dependency(%q<fog>, ["= 0.4.0"])
|
101
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
102
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
103
|
+
s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
|
104
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
105
|
+
s.add_dependency(%q<mocha>, [">= 0"])
|
106
|
+
s.add_dependency(%q<fakefs>, [">= 0.3.1"])
|
107
|
+
s.add_dependency(%q<rails>, ["= 2.3.8"])
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
data/test/helper.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
begin
|
4
|
+
Bundler.setup(:default, :development)
|
5
|
+
rescue Bundler::BundlerError => e
|
6
|
+
$stderr.puts e.message
|
7
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
+
exit e.status_code
|
9
|
+
end
|
10
|
+
require 'test/unit'
|
11
|
+
require 'shoulda'
|
12
|
+
|
13
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
14
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
15
|
+
require 'tddium'
|
16
|
+
|
17
|
+
class Test::Unit::TestCase
|
18
|
+
end
|
19
|
+
|
20
|
+
require 'fakefs'
|
21
|
+
class FakeFS::File::Stat
|
22
|
+
@@themode = 0600
|
23
|
+
def mode
|
24
|
+
return @@themode
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.mode=(newmode)
|
28
|
+
@@themode = newmode
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
data/test/test_config.rb
ADDED
@@ -0,0 +1,194 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright (c) 2010 tddium.com All Rights Reserved
|
3
|
+
=end
|
4
|
+
|
5
|
+
require 'helper'
|
6
|
+
require 'fakefs'
|
7
|
+
require 'fileutils'
|
8
|
+
require 'mocha'
|
9
|
+
|
10
|
+
class TestFileops < Test::Unit::TestCase
|
11
|
+
context "init task" do
|
12
|
+
setup do
|
13
|
+
@path = File.expand_path(get_config_paths[0])
|
14
|
+
end
|
15
|
+
|
16
|
+
context "when ~/.tddium doesn't exist" do
|
17
|
+
setup do
|
18
|
+
FakeFS::FileSystem.clear
|
19
|
+
HighLine.any_instance.stubs(:ask).returns('abc', 'def', 'ghi')
|
20
|
+
@keys = %w(aws_key aws_secret test_pattern key_directory key_name result_directory server_tag ssh_tunnel)
|
21
|
+
init_task
|
22
|
+
end
|
23
|
+
|
24
|
+
should "write ~/.tddium" do
|
25
|
+
assert File.exists?(@path), "#{@path} doesn't exist"
|
26
|
+
end
|
27
|
+
|
28
|
+
should "have the right contents" do
|
29
|
+
f = FakeFS::FileSystem.find(@path)
|
30
|
+
assert f.content.include?('abc'), "Should contain magic string"
|
31
|
+
@keys.each do |field|
|
32
|
+
assert f.content.include?(field), "Should contain #{field}"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
should "write a YAML file with the right fields" do
|
37
|
+
result = YAML::load_file(@path)
|
38
|
+
@keys.each do |field|
|
39
|
+
assert result.has_key?(field.to_sym), "Should contain #{field}"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context "when ~/.tddium exists" do
|
45
|
+
setup do
|
46
|
+
File.new(@path, 'w').write('a')
|
47
|
+
end
|
48
|
+
|
49
|
+
should "print a warning message" do
|
50
|
+
HighLine.expects(:ask).never
|
51
|
+
init_task
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
class TestConfigRead < Test::Unit::TestCase
|
58
|
+
context "read config" do
|
59
|
+
context "file exists" do
|
60
|
+
setup do
|
61
|
+
@path = File.expand_path(get_config_paths[0])
|
62
|
+
end
|
63
|
+
|
64
|
+
should "read config file values into a dict" do
|
65
|
+
File.open(@path, 'w') do |f|
|
66
|
+
f.write <<EOF
|
67
|
+
---
|
68
|
+
:aws_secret: abc
|
69
|
+
:aws_key: abx
|
70
|
+
:test_pattern: **/*_spec.rb
|
71
|
+
EOF
|
72
|
+
end
|
73
|
+
conf = read_config
|
74
|
+
assert_equal conf[:aws_key], 'abx'
|
75
|
+
assert_equal conf[:aws_secret], 'abc'
|
76
|
+
assert_equal conf[:test_pattern], '**/*_spec.rb'
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context "file doesn't exist" do
|
81
|
+
should "return nils" do
|
82
|
+
conf = read_config
|
83
|
+
assert_nil conf[:aws_key]
|
84
|
+
assert_nil conf[:aws_secret]
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context "find_config" do
|
90
|
+
should "check rails root if it's set" do
|
91
|
+
oldroot = ENV['RAILS_ROOT']
|
92
|
+
ENV['RAILS_ROOT'] = '/home/rails'
|
93
|
+
File.expects(:exists?).with('/home/rails/.tddium')
|
94
|
+
File.expects(:exists?).with(File.expand_path('~/.tddium'))
|
95
|
+
File.expects(:exists?).with('.tddium')
|
96
|
+
assert_nil find_config
|
97
|
+
ENV['RAILS_ROOT'] = oldroot
|
98
|
+
end
|
99
|
+
|
100
|
+
should "find rails root file if it's there" do
|
101
|
+
oldroot = ENV['RAILS_ROOT']
|
102
|
+
ENV['RAILS_ROOT'] = '/home/rails'
|
103
|
+
path = get_config_paths[0]
|
104
|
+
assert_equal '/home/rails/.tddium', path
|
105
|
+
File.open(path, 'w') {|f| f.write('a')}
|
106
|
+
assert_equal path, find_config
|
107
|
+
ENV['RAILS_ROOT'] = oldroot
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
class TestKeyFile < Test::Unit::TestCase
|
113
|
+
context "get_keyfile" do
|
114
|
+
setup do
|
115
|
+
@config = {:key_directory => 'dir', :key_name => 'key'}
|
116
|
+
stubs(:read_config => @config).once
|
117
|
+
FakeFS::FileSystem.clear
|
118
|
+
end
|
119
|
+
|
120
|
+
context "no keyfile present" do
|
121
|
+
should "return nil" do
|
122
|
+
STDERR.expects(:puts).once
|
123
|
+
assert_nil get_keyfile
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
context "keyfile wrong perms" do
|
128
|
+
should "return nil" do
|
129
|
+
FileUtils.mkdir_p @config[:key_directory]
|
130
|
+
File.open(key_file_name(@config), 'w') do |f|
|
131
|
+
f.write 'abc'
|
132
|
+
end
|
133
|
+
FakeFS::File::Stat.mode=0644
|
134
|
+
STDERR.expects(:puts).once
|
135
|
+
assert_nil get_keyfile
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
context "keyfile OK" do
|
140
|
+
should "return keyfile name" do
|
141
|
+
@name = key_file_name(@config)
|
142
|
+
FileUtils.mkdir_p @config[:key_directory]
|
143
|
+
File.open(@name, 'w') do |f|
|
144
|
+
f.write 'abc'
|
145
|
+
end
|
146
|
+
FakeFS::File::Stat.mode=0600
|
147
|
+
STDERR.expects(:puts).never
|
148
|
+
assert_equal @name, get_keyfile
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
class TestFiles < Test::Unit::TestCase
|
155
|
+
context "find_test_files" do
|
156
|
+
setup do
|
157
|
+
@config = {:test_pattern => 'a'}
|
158
|
+
stubs(:read_config => @config)
|
159
|
+
end
|
160
|
+
|
161
|
+
should "be callable" do
|
162
|
+
assert find_test_files
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
class TestSpecOpts < Test::Unit::TestCase
|
168
|
+
context "spec_opts" do
|
169
|
+
should "return a list" do
|
170
|
+
stubs(:read_config => CONFIG_DEFAULTS)
|
171
|
+
opts = spec_opts('a')
|
172
|
+
assert opts.is_a?(Array)
|
173
|
+
assert_equal 1, opts.select{|x| /require/.match(x)}.size
|
174
|
+
end
|
175
|
+
|
176
|
+
should "include require_files" do
|
177
|
+
stubs(:read_config => {:require_files => 'a.rb'})
|
178
|
+
opts = spec_opts('a')
|
179
|
+
assert opts.is_a?(Array)
|
180
|
+
assert_equal 2, opts.select{|x| /require/.match(x)}.size
|
181
|
+
end
|
182
|
+
|
183
|
+
should "read TDDIUM_SPEC_OPTS environment" do
|
184
|
+
stubs(:read_config => CONFIG_DEFAULTS)
|
185
|
+
specopts = 'abcdefgh'
|
186
|
+
oldenv = ENV['TDDIUM_SPEC_OPTS']
|
187
|
+
ENV['TDDIUM_SPEC_OPTS'] = specopts
|
188
|
+
opts = spec_opts('a')
|
189
|
+
ENV['TDDIUM_SPEC_OPTS'] = oldenv
|
190
|
+
assert opts.is_a?(Array)
|
191
|
+
assert_equal 1, opts.select{|x| /#{specopts}/.match(x)}.size
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'mocha'
|
3
|
+
require 'fakefs'
|
4
|
+
require 'tddium/parallel'
|
5
|
+
|
6
|
+
class TestParallel < Test::Unit::TestCase
|
7
|
+
context "make_spec_cmd" do
|
8
|
+
should "raise if no result_path specified" do
|
9
|
+
assert_raise RuntimeError do
|
10
|
+
make_spec_cmd([1], 'a', nil)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
should "suppress RSPEC_COLOR if stdout is not tty" do
|
14
|
+
$stdout.stubs(:tty? => false)
|
15
|
+
assert_no_match /RSPEC_COLOR/, make_spec_cmd(['a'], 'a', 'a')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context "test_batches" do
|
20
|
+
setup do
|
21
|
+
@config = {:test_pattern => '*.rb'}
|
22
|
+
stubs(:read_config => @config)
|
23
|
+
@files = %w{a b c d e}
|
24
|
+
@files.each { |f| File.open("#{f}.rb", 'w') { |o| o.write('a') } }
|
25
|
+
end
|
26
|
+
should "find batches" do
|
27
|
+
[1,2,3,4,5,6].each do |n|
|
28
|
+
b = test_batches(n)
|
29
|
+
assert_equal n, b.size
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context "parallel_task" do
|
35
|
+
setup do
|
36
|
+
@batches = [['a', 'b'], ['c']]
|
37
|
+
stubs(:test_batches => @batches)
|
38
|
+
stubs(:execute_command => 'a')
|
39
|
+
end
|
40
|
+
should "run with defaults" do
|
41
|
+
args = mock()
|
42
|
+
args.expects(:with_defaults)
|
43
|
+
args.stubs(:threads => 5, :inspect => 'args', :environment => 'selenium', :result_directory => '.')
|
44
|
+
parallel_task(args)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/test/test_tddium.rb
ADDED
@@ -0,0 +1,372 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright (c) 2010 tddium.com All Rights Reserved
|
3
|
+
=end
|
4
|
+
|
5
|
+
require 'helper'
|
6
|
+
require 'fakefs'
|
7
|
+
require 'fileutils'
|
8
|
+
require 'mocha'
|
9
|
+
|
10
|
+
class FakeFS::File::Stat
|
11
|
+
@@themode = 0600
|
12
|
+
def mode
|
13
|
+
return @@themode
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.mode=(newmode)
|
17
|
+
@@themode = newmode
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class TestEC2 < Test::Unit::TestCase
|
22
|
+
context "start instances" do
|
23
|
+
setup do
|
24
|
+
Fog.mock!
|
25
|
+
@config = {:aws_key => 'abc', :aws_secret => 'def'}
|
26
|
+
stubs(:read_config => @config)
|
27
|
+
stubs(:system => 0)
|
28
|
+
mockstart
|
29
|
+
end
|
30
|
+
|
31
|
+
should "create new EC2 instance with configured key" do
|
32
|
+
server = start_instance
|
33
|
+
assert_equal server.image_id, AMI_NAME
|
34
|
+
assert_equal nil, $tunnel_pid
|
35
|
+
end
|
36
|
+
|
37
|
+
should "not crash if keyfile is not provided"
|
38
|
+
|
39
|
+
should "set SELENIUM_RC_HOST environment variable" do
|
40
|
+
server = start_instance
|
41
|
+
assert_equal server.dns_name, ENV['SELENIUM_RC_HOST']
|
42
|
+
end
|
43
|
+
|
44
|
+
should "set TDDIUM environment variable" do
|
45
|
+
server = start_instance
|
46
|
+
assert_equal '1', ENV['TDDIUM']
|
47
|
+
end
|
48
|
+
|
49
|
+
context "if ssh_tunnel is needed" do
|
50
|
+
setup do
|
51
|
+
@config[:ssh_tunnel] = 1
|
52
|
+
@config[:key_name] = 'sg-keypair'
|
53
|
+
@config[:key_directory] = '.'
|
54
|
+
FakeFS::FileSystem.clear
|
55
|
+
File.open(key_file_name(@config), 'w', 0600) do |f|
|
56
|
+
f.write('foo')
|
57
|
+
end
|
58
|
+
@testpid = 10000
|
59
|
+
Process.stubs(:fork => @testpid)
|
60
|
+
end
|
61
|
+
|
62
|
+
should "set up an ssh tunnel and save its pid" do
|
63
|
+
server = start_instance
|
64
|
+
assert_equal @testpid, $tunnel_pid
|
65
|
+
$tunnel_pid = nil
|
66
|
+
end
|
67
|
+
|
68
|
+
should "set the SELENIUM_RC_HOST environment variable to localhost" do
|
69
|
+
server = start_instance
|
70
|
+
assert_equal 'localhost', ENV['SELENIUM_RC_HOST']
|
71
|
+
$tunnel_pid = nil
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context "stop instance" do
|
77
|
+
setup do
|
78
|
+
Fog.mock!
|
79
|
+
config = {:aws_key => 'abc', :aws_secret => 'def'}
|
80
|
+
stub(:read_config => config)
|
81
|
+
mockstart
|
82
|
+
end
|
83
|
+
|
84
|
+
should "stop instances" do
|
85
|
+
server = start_instance
|
86
|
+
assert server.ready?
|
87
|
+
stop_instance
|
88
|
+
assert server.terminated?
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
context "find_instances" do
|
93
|
+
setup do
|
94
|
+
Fog.mock!
|
95
|
+
config = {:aws_key => 'abc', :aws_secret => 'def'}
|
96
|
+
stub(:read_config => config)
|
97
|
+
end
|
98
|
+
|
99
|
+
should "exist as a method" do
|
100
|
+
find_instances
|
101
|
+
end
|
102
|
+
|
103
|
+
should "not find any instances" do
|
104
|
+
result = find_instances
|
105
|
+
assert_nil result
|
106
|
+
end
|
107
|
+
|
108
|
+
should "find an instance" do
|
109
|
+
mockstart
|
110
|
+
server = start_instance
|
111
|
+
result = find_instances
|
112
|
+
assert_equal server.id, result[0].id
|
113
|
+
end
|
114
|
+
|
115
|
+
should "not filter by tag"
|
116
|
+
end
|
117
|
+
|
118
|
+
context "session_instances" do
|
119
|
+
setup do
|
120
|
+
Fog.mock!
|
121
|
+
config = {:aws_key => 'abc', :aws_secret => 'def'}
|
122
|
+
stub(:read_config => config)
|
123
|
+
stop_all_instances
|
124
|
+
end
|
125
|
+
|
126
|
+
should "exist as a method" do
|
127
|
+
session_instances('a')
|
128
|
+
end
|
129
|
+
|
130
|
+
should "not find any instances" do
|
131
|
+
result = session_instances('b')
|
132
|
+
assert_nil result
|
133
|
+
end
|
134
|
+
|
135
|
+
should "find an instance" do
|
136
|
+
mockstart
|
137
|
+
server = start_instance
|
138
|
+
result = session_instances(@tddium_session)
|
139
|
+
assert_equal server.id, result[0].id
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
context "stopall instances" do
|
144
|
+
setup do
|
145
|
+
Fog.mock!
|
146
|
+
config = {:aws_key => 'abc', :aws_secret => 'def'}
|
147
|
+
stub(:read_config => config)
|
148
|
+
end
|
149
|
+
|
150
|
+
should "exist as a method" do
|
151
|
+
stop_all_instances
|
152
|
+
end
|
153
|
+
|
154
|
+
should "destroy all instances" do
|
155
|
+
instancemock1 = mock().expects(:destroy)
|
156
|
+
instancemock2 = mock().expects(:destroy)
|
157
|
+
instances = [instancemock1, instancemock2]
|
158
|
+
stub(:find_instances => instances)
|
159
|
+
stop_all_instances
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
context "checkstart dev instance" do
|
164
|
+
setup do
|
165
|
+
Fog.mock!
|
166
|
+
config = {:aws_key => 'abc', :aws_secret => 'def'}
|
167
|
+
stub(:read_config => config)
|
168
|
+
mockstart
|
169
|
+
end
|
170
|
+
|
171
|
+
should "exist as a method" do
|
172
|
+
checkstart_dev_instance
|
173
|
+
end
|
174
|
+
|
175
|
+
should "only start 1 instance" do
|
176
|
+
server1 = checkstart_dev_instance
|
177
|
+
server2 = checkstart_dev_instance
|
178
|
+
assert_equal server1.id, server2.id
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
private
|
183
|
+
|
184
|
+
def mockstart
|
185
|
+
httpmock = mock()
|
186
|
+
httpmock.expects(:open_timeout=)
|
187
|
+
httpmock.expects(:read_timeout=)
|
188
|
+
httpmock.expects(:request)
|
189
|
+
Net::HTTP.stubs(:new).returns(httpmock)
|
190
|
+
getmock = mock()
|
191
|
+
Net::HTTP::Get.stubs(:new).returns(getmock)
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
class TestSshTunnel < Test::Unit::TestCase
|
196
|
+
should "have ssh tunnel method" do
|
197
|
+
stubs(:system => true)
|
198
|
+
ssh_tunnel('abc')
|
199
|
+
end
|
200
|
+
|
201
|
+
context "kill_tunnel" do
|
202
|
+
should "kill tunnel" do
|
203
|
+
@testpid = 10000
|
204
|
+
$tunnel_pid = @testpid
|
205
|
+
Process.expects(:kill).with("TERM", @testpid)
|
206
|
+
Process.expects(:waitpid).with(@testpid)
|
207
|
+
kill_tunnel
|
208
|
+
end
|
209
|
+
|
210
|
+
should "not kill if no tunnel" do
|
211
|
+
$tunnel_pid = nil
|
212
|
+
Process.expects(:kill).never
|
213
|
+
kill_tunnel
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
class TestEnvSet < Test::Unit::TestCase
|
219
|
+
context "setup_environment" do
|
220
|
+
setup do
|
221
|
+
@smock = mock()
|
222
|
+
@smock.stubs(:dns_name => 'a')
|
223
|
+
end
|
224
|
+
|
225
|
+
should "always set TDDIUM environment" do
|
226
|
+
setup_environment(@smock)
|
227
|
+
assert_equal ENV['TDDIUM'], '1'
|
228
|
+
end
|
229
|
+
|
230
|
+
should "set RC_HOST to remote if no tunnel" do
|
231
|
+
setup_environment(@smock)
|
232
|
+
assert_equal ENV['SELENIUM_RC_HOST'], @smock.dns_name
|
233
|
+
end
|
234
|
+
|
235
|
+
should "set RC_HOST to localhost if tunnel" do
|
236
|
+
$tunnel_pid = 1
|
237
|
+
setup_environment(@smock)
|
238
|
+
assert_equal ENV['SELENIUM_RC_HOST'], 'localhost'
|
239
|
+
$tunnel_pid = nil
|
240
|
+
end
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
class TestLogRotate < Test::Unit::TestCase
|
245
|
+
context "calling result_directory" do
|
246
|
+
setup do
|
247
|
+
@config = {:result_directory => 'results'}
|
248
|
+
@latest = File.join(@config[:result_directory], 'latest')
|
249
|
+
stubs(:read_config => @config)
|
250
|
+
end
|
251
|
+
context "regardless" do
|
252
|
+
should "return directory name" do
|
253
|
+
x = result_directory
|
254
|
+
assert_equal @latest, x
|
255
|
+
end
|
256
|
+
end
|
257
|
+
context "with no results" do
|
258
|
+
setup do
|
259
|
+
FakeFS::FileSystem.clear
|
260
|
+
end
|
261
|
+
should "create results/latest/" do
|
262
|
+
result_directory
|
263
|
+
assert File.directory?(@latest)
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
context "with existing <results>/latest directory" do
|
268
|
+
setup do
|
269
|
+
FileUtils.mkdir_p @latest
|
270
|
+
end
|
271
|
+
|
272
|
+
should "rotate latest to date-extended directory name" do
|
273
|
+
result_directory
|
274
|
+
files = Dir.glob("#{@config[:result_directory]}/*")
|
275
|
+
assert_equal 2, files.length
|
276
|
+
end
|
277
|
+
|
278
|
+
should "preserve contents of rotated report" do
|
279
|
+
fname = File.join(@latest, 'report.html')
|
280
|
+
File.open(fname, 'w') do |f|
|
281
|
+
f.write('foo')
|
282
|
+
end
|
283
|
+
result_directory
|
284
|
+
assert !File.exists?(fname)
|
285
|
+
files = Dir.glob('**/report.html')
|
286
|
+
assert_equal 1, files.length
|
287
|
+
assert_equal 'foo', File.open(files[0]).read
|
288
|
+
end
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
292
|
+
context "default result path" do
|
293
|
+
setup do
|
294
|
+
@config = {:result_directory => "results"}
|
295
|
+
stubs(:read_config => @config)
|
296
|
+
end
|
297
|
+
should "return the right path" do
|
298
|
+
x = default_report_path
|
299
|
+
expected = File.join(@config[:result_directory], 'latest', REPORT_FILENAME)
|
300
|
+
assert_equal expected, x
|
301
|
+
end
|
302
|
+
end
|
303
|
+
end
|
304
|
+
|
305
|
+
class TestCollectLogs < Test::Unit::TestCase
|
306
|
+
context "no keyfile" do
|
307
|
+
setup do
|
308
|
+
stubs(:get_keyfile => nil)
|
309
|
+
end
|
310
|
+
should "raise an error" do
|
311
|
+
assert_raise RuntimeError do
|
312
|
+
collect_syslog
|
313
|
+
end
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
317
|
+
context "normal mode" do
|
318
|
+
context "no host started" do
|
319
|
+
setup do
|
320
|
+
stubs(:system => true).never
|
321
|
+
stubs(:session_instances => [])
|
322
|
+
stubs(:get_keyfile => 'a')
|
323
|
+
end
|
324
|
+
should "fail gracefully" do
|
325
|
+
collect_syslog
|
326
|
+
end
|
327
|
+
end
|
328
|
+
|
329
|
+
context "host started" do
|
330
|
+
setup do
|
331
|
+
@host = 'somehost'
|
332
|
+
mockinst = mock()
|
333
|
+
mockinst.stubs(:dns_name => @host)
|
334
|
+
stubs(:session_instances => [mockinst])
|
335
|
+
@keyfile = 'keyfile'
|
336
|
+
stubs(:get_keyfile => @keyfile)
|
337
|
+
end
|
338
|
+
should "scp from host" do
|
339
|
+
stubs(:system).twice.with() do |cmd|
|
340
|
+
(cmd =~ /#{@host}/ &&
|
341
|
+
cmd =~ /^scp/ &&
|
342
|
+
cmd =~ /#{@keyfile}/ &&
|
343
|
+
cmd =~ /\.\/selenium-rc.#{@host}/) ||
|
344
|
+
(cmd =~ /#{@host}/ &&
|
345
|
+
cmd =~ /^scp/ &&
|
346
|
+
cmd =~ /#{@keyfile}/ &&
|
347
|
+
cmd =~ /\.\/selenium-hub.#{@host}/)
|
348
|
+
end
|
349
|
+
collect_syslog
|
350
|
+
end
|
351
|
+
|
352
|
+
should "let target directory be specified" do
|
353
|
+
target = 'targetdir'
|
354
|
+
stubs(:system).twice.with() do |cmd|
|
355
|
+
(cmd =~ /#{@host}/ &&
|
356
|
+
cmd =~ /^scp/ &&
|
357
|
+
cmd =~ /#{@keyfile}/ &&
|
358
|
+
cmd =~ /#{target}\/selenium-rc.#{@host}/) ||
|
359
|
+
(cmd =~ /#{@host}/ &&
|
360
|
+
cmd =~ /^scp/ &&
|
361
|
+
cmd =~ /#{@keyfile}/ &&
|
362
|
+
cmd =~ /#{target}\/selenium-hub.#{@host}/)
|
363
|
+
end
|
364
|
+
collect_syslog(target)
|
365
|
+
end
|
366
|
+
end
|
367
|
+
end
|
368
|
+
|
369
|
+
context "dev mode" do
|
370
|
+
should "use dev mode host"
|
371
|
+
end
|
372
|
+
end
|