sauce 0.4.3 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/job.rb +20 -6
- data/lib/rest.rb +9 -2
- data/lib/tunnel.rb +35 -18
- data/test/debug.rb +3 -26
- data/test/monitor_jobs.rb +13 -0
- data/test/test_jobs.rb +44 -37
- data/test/test_tunnels.rb +43 -7
- metadata +25 -16
- data/test/irb_boot.rb +0 -7
- data/test/test_jobs_old.rb +0 -58
- data/test/test_videos.rb +0 -83
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.5.0
|
data/lib/job.rb
CHANGED
@@ -49,7 +49,10 @@ module Sauce
|
|
49
49
|
# Misnomer: Gets the most recent 100 jobs
|
50
50
|
# TODO: Allow/automate paging
|
51
51
|
def self.all(options={})
|
52
|
-
|
52
|
+
url = "jobs"
|
53
|
+
url += "?full=true" if options[:full] #unless options[:id_only]
|
54
|
+
responses = @@client[url].get
|
55
|
+
responses = JSON.parse responses.to_s
|
53
56
|
return responses.collect{|response| Sauce::Job.new(response)}
|
54
57
|
end
|
55
58
|
|
@@ -65,7 +68,10 @@ module Sauce
|
|
65
68
|
end
|
66
69
|
|
67
70
|
#puts "GET-URL: #{@@client.url}jobs/#{id}"
|
68
|
-
|
71
|
+
response = @@client["jobs/#{id}"].get
|
72
|
+
|
73
|
+
# TODO: Return nil if bad response
|
74
|
+
Sauce::Job.new JSON.parse(response.to_s)
|
69
75
|
end
|
70
76
|
|
71
77
|
# Creates an instance representing a job.
|
@@ -75,7 +81,7 @@ module Sauce
|
|
75
81
|
|
76
82
|
# Retrieves the latest information on this job from the Sauce Labs' server
|
77
83
|
def refresh!
|
78
|
-
response = JSON.parse @@client["jobs/#{@id}"].get
|
84
|
+
response = JSON.parse @@client["jobs/#{@id}"].get.body
|
79
85
|
#puts "\tjob refresh with: #{response}"
|
80
86
|
build! response
|
81
87
|
self
|
@@ -83,10 +89,14 @@ module Sauce
|
|
83
89
|
|
84
90
|
# Save/update the current information for the job
|
85
91
|
def save
|
86
|
-
|
92
|
+
#puts "Saving job:\n -X PUT #{@@client['jobs']}/#{@id} -H 'Content-Type: application/json' -d '#{self.to_json}'"
|
93
|
+
response = @@client["jobs/#{@id}"].put(self.to_json,
|
94
|
+
{:content_type => :json,
|
95
|
+
:accept => :json}).body
|
96
|
+
JSON.parse(response)
|
87
97
|
end
|
88
98
|
|
89
|
-
def
|
99
|
+
def to_json(options={})
|
90
100
|
json = {
|
91
101
|
:id => @id,
|
92
102
|
:owner => @owner,
|
@@ -108,7 +118,7 @@ module Sauce
|
|
108
118
|
options[:except].each { |key| json.delete(key) } if options[:except]
|
109
119
|
json = json.select { |key,value| options[:only].include? key } if options[:only]
|
110
120
|
|
111
|
-
return json
|
121
|
+
return json.to_json
|
112
122
|
end
|
113
123
|
|
114
124
|
def delete
|
@@ -119,6 +129,10 @@ module Sauce
|
|
119
129
|
|
120
130
|
# Sets all internal variables from a hash
|
121
131
|
def build!(options)
|
132
|
+
#puts "\tBuild with: #{options.inspect}"
|
133
|
+
# Massage JSON
|
134
|
+
options.each { |key,value| options[key] = false if options[key] == "false" }
|
135
|
+
|
122
136
|
@id = options["id"]
|
123
137
|
@owner = options["owner"]
|
124
138
|
@status = options["status"]
|
data/lib/rest.rb
CHANGED
@@ -7,7 +7,8 @@ module Sauce
|
|
7
7
|
class BadAccessError < StandardError; end #:nodoc
|
8
8
|
class MisconfiguredError < StandardError; end #:nodoc
|
9
9
|
|
10
|
-
attr_accessor :username, :access_key, :client
|
10
|
+
attr_accessor :username, :access_key, :client
|
11
|
+
attr_accessor :protocol, :host, :port, :api_path, :api_version, :ip, :api_url
|
11
12
|
attr_accessor :tunnels, :jobs
|
12
13
|
|
13
14
|
def initialize(options)
|
@@ -15,8 +16,14 @@ module Sauce
|
|
15
16
|
@access_key = options[:access_key]
|
16
17
|
@ip = options[:ip]
|
17
18
|
|
19
|
+
@protocol = options[:protocol] || "http"
|
20
|
+
@host = options[:host] || "saucelabs.com"
|
21
|
+
@port = options[:port] || 80
|
22
|
+
@api_path = options[:api_path] || "rest"
|
23
|
+
@api_version= options[:api_version] || 1
|
24
|
+
|
18
25
|
raise MisconfiguredError if @username.nil? or @access_key.nil?
|
19
|
-
@api_url = "
|
26
|
+
@api_url = "#{@protocol}://#{@username}:#{@access_key}@#{@host}:#{@port}/#{@api_path}/v#{@api_version}/#{@username}/"
|
20
27
|
@client = RestClient::Resource.new @api_url
|
21
28
|
|
22
29
|
@tunnels = Sauce::Tunnel
|
data/lib/tunnel.rb
CHANGED
@@ -49,7 +49,7 @@ module Sauce
|
|
49
49
|
end
|
50
50
|
|
51
51
|
def self.all
|
52
|
-
responses = JSON.parse @@client[:tunnels].get
|
52
|
+
responses = JSON.parse @@client[:tunnels].get.body
|
53
53
|
return responses.collect{|response| Sauce::Tunnel.new(response)}
|
54
54
|
end
|
55
55
|
|
@@ -59,7 +59,7 @@ module Sauce
|
|
59
59
|
|
60
60
|
# Creates a new tunnel machine
|
61
61
|
def self.create(options)
|
62
|
-
response = JSON.parse @@client[:tunnels].post(options.to_json, :content_type => 'application/json')
|
62
|
+
response = JSON.parse @@client[:tunnels].post(options.to_json, :content_type => 'application/json').body
|
63
63
|
#puts response.inspect
|
64
64
|
Tunnel.new response
|
65
65
|
end
|
@@ -72,13 +72,13 @@ module Sauce
|
|
72
72
|
# Hits the destroy url for this tunnel, and then refreshes. Keep in mind it takes some time to completely teardown a tunnel.
|
73
73
|
def destroy
|
74
74
|
close_gateway
|
75
|
-
response = @@client["tunnels/#{@id}"].delete
|
75
|
+
response = @@client["tunnels/#{@id}"].delete.body
|
76
76
|
refresh!
|
77
77
|
end
|
78
78
|
|
79
79
|
# Retrieves the latest information on this tunnel from the Sauce Labs' server
|
80
80
|
def refresh!
|
81
|
-
response = JSON.parse @@client["tunnels/#{@id}"].get
|
81
|
+
response = JSON.parse @@client["tunnels/#{@id}"].get.body
|
82
82
|
#puts "\Tunnel refresh with: #{response.inspect}"
|
83
83
|
build! response
|
84
84
|
self
|
@@ -118,7 +118,7 @@ module Sauce
|
|
118
118
|
# Sauce Labs' server will say hello on port 1025 as a sanity check. If no hello, something is wrong.
|
119
119
|
# TODO: Make it say hello on port 1025. Currently a hack.
|
120
120
|
def says_hello?(options={})
|
121
|
-
return false unless self.status == "running"
|
121
|
+
return false unless self.status == "running" and not @host.nil?
|
122
122
|
|
123
123
|
# TODO: Read from options if necessary
|
124
124
|
connection = {}
|
@@ -128,8 +128,6 @@ module Sauce
|
|
128
128
|
connection[:telnet_mode] = true
|
129
129
|
connection[:timeout] = 10
|
130
130
|
|
131
|
-
#puts "telnet: #{connection.inspect}"
|
132
|
-
|
133
131
|
host = Net::Telnet::new("Host" => connection[:host],
|
134
132
|
"Port" => connection[:port],
|
135
133
|
"Prompt" => connection[:prompt],
|
@@ -199,22 +197,41 @@ module Sauce
|
|
199
197
|
not @thread.nil?
|
200
198
|
end
|
201
199
|
|
200
|
+
# Returns a json representation of the current state of the tunnel object
|
201
|
+
def to_json(options={})
|
202
|
+
json = {
|
203
|
+
:id => @id,
|
204
|
+
:owner => @owner,
|
205
|
+
:status => @status,
|
206
|
+
:host => @host,
|
207
|
+
:creation_time => @creation_time,
|
208
|
+
:start_time => @start_time,
|
209
|
+
:end_time => @end_time,
|
210
|
+
:domain_name => @domain_names
|
211
|
+
}
|
212
|
+
|
213
|
+
options[:except].each { |key| json.delete(key) } if options[:except]
|
214
|
+
json = json.select { |key,value| options[:only].include? key } if options[:only]
|
215
|
+
|
216
|
+
return json
|
217
|
+
end
|
218
|
+
|
202
219
|
protected
|
203
220
|
|
204
221
|
# Sets all internal variables from a hash
|
205
222
|
def build!(options)
|
223
|
+
options = options["tunnel"] unless options["tunnel"].nil?
|
206
224
|
#puts "\tBuild with #{options.inspect}"
|
207
|
-
@status = options["
|
208
|
-
@owner = options["
|
209
|
-
@id = options["
|
210
|
-
@
|
211
|
-
@
|
212
|
-
@
|
213
|
-
@
|
214
|
-
@
|
215
|
-
|
216
|
-
|
217
|
-
raise NoIDError if @id.nil? or @id.empty?
|
225
|
+
@status = options["status"]
|
226
|
+
@owner = options["owner"]
|
227
|
+
@id = options["id"]
|
228
|
+
@host = options["host"]
|
229
|
+
@creation_time = options["creation_time"]
|
230
|
+
@start_time = options["start_time"]
|
231
|
+
@end_time = options["end_time"]
|
232
|
+
@domain_names = options["domain_names"]
|
233
|
+
|
234
|
+
raise NoIDError if @id.nil?
|
218
235
|
end
|
219
236
|
end
|
220
237
|
end
|
data/test/debug.rb
CHANGED
@@ -1,34 +1,11 @@
|
|
1
|
-
require '
|
1
|
+
require 'helper'
|
2
2
|
|
3
3
|
c = Sauce::Client.new(:username => "sgrove",
|
4
|
-
:access_key => "
|
5
|
-
:ip => "67.188.3.10")
|
6
|
-
|
7
|
-
=begin
|
8
|
-
t = c.tunnels.first
|
4
|
+
:access_key => "4c592ce3-8f45-4cd6-8e3e-65b9f0b173d0")
|
9
5
|
|
10
6
|
c.destroy_all_tunnels
|
11
7
|
t = c.create_tunnel('DomainNames' => ["111.111.111.111"])
|
12
8
|
|
13
9
|
puts c.tunnels.inspect
|
14
|
-
=end
|
15
|
-
|
16
|
-
t = c.tunnels.first
|
17
|
-
|
18
|
-
if t.nil?
|
19
|
-
puts "Starting a new tunnel"
|
20
|
-
t = c.tunnels.create("DomainNames" => ["sgrove.tst"])
|
21
|
-
until t.status == "running"
|
22
|
-
print "." ; STDOUT.flush
|
23
|
-
t.refresh!
|
24
|
-
sleep 1
|
25
|
-
end
|
26
|
-
end
|
27
10
|
|
28
|
-
|
29
|
-
t.open_gateway
|
30
|
-
|
31
|
-
puts "Checking to see if thread is running."
|
32
|
-
puts t.still_running?
|
33
|
-
puts t.thread.inspect
|
34
|
-
t.thread.join if t.still_running?
|
11
|
+
c.destroy_all_tunnels
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'yaml'
|
3
|
+
$: << "../lib/"
|
4
|
+
require 'sauce'
|
5
|
+
|
6
|
+
account = YAML.load_file("account.yml")
|
7
|
+
|
8
|
+
client = Sauce::Client.new(:username => account["username"],
|
9
|
+
:access_key => account["access_key"])
|
10
|
+
|
11
|
+
jobs = client.jobs.all
|
12
|
+
|
13
|
+
puts jobs.inspect
|
data/test/test_jobs.rb
CHANGED
@@ -1,20 +1,27 @@
|
|
1
1
|
require 'helper'
|
2
2
|
require 'json'
|
3
|
+
require 'yaml'
|
3
4
|
|
4
5
|
class TestSauce < Test::Unit::TestCase
|
5
6
|
context "A V1 jobs instance" do
|
6
7
|
setup do
|
7
8
|
# Create this file and put in your details to run the tests
|
8
|
-
account = YAML.load_file "
|
9
|
+
account = YAML.load_file "account2.yml"
|
9
10
|
@username = account["username"]
|
10
11
|
@access_key = account["access_key"]
|
11
12
|
@ip = account["ip"]
|
12
13
|
@client = Sauce::Client.new(:username => @username,
|
13
|
-
:access_key => @access_key
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
:access_key => @access_key,
|
15
|
+
:protocol => account["protocol"],
|
16
|
+
:host => account["host"],
|
17
|
+
:port => account["port"],
|
18
|
+
:api_path => account["api_path"],
|
19
|
+
:api_version => account["api_version"])
|
20
|
+
|
21
|
+
#@example_data = YAML.load_file('example_data.yml')
|
22
|
+
end
|
17
23
|
|
24
|
+
=begin
|
18
25
|
should "initialize with passed variables" do
|
19
26
|
client = Sauce::Client.new(:username => "test_user",
|
20
27
|
:access_key => "abc123")
|
@@ -24,7 +31,7 @@ class TestSauce < Test::Unit::TestCase
|
|
24
31
|
assert_equal "501aca56282545a9a21ad2fc592b03fa", job.id
|
25
32
|
assert_equal "joe", job.owner
|
26
33
|
assert_equal "complete", job.status
|
27
|
-
assert_equal "job-
|
34
|
+
assert_equal "job-example-fixture", job.name
|
28
35
|
|
29
36
|
assert_equal "firefox", job.browser
|
30
37
|
assert_equal "3.5.", job.browser_version
|
@@ -40,55 +47,56 @@ class TestSauce < Test::Unit::TestCase
|
|
40
47
|
assert_equal false, job.public
|
41
48
|
assert_equal ["test", "example", "python_is_fun"], job.tags
|
42
49
|
end
|
50
|
+
=end
|
43
51
|
|
44
|
-
# Note:
|
52
|
+
# Note: Relies on server-side data fixture
|
45
53
|
should "retrieve and parse a job via the api" do
|
46
|
-
job = @client.jobs.find("
|
54
|
+
job = @client.jobs.find("gem-test-job")
|
47
55
|
|
48
|
-
assert_equal "
|
49
|
-
assert_equal "
|
56
|
+
assert_equal "gem-test-job", job.id
|
57
|
+
assert_equal "sah", job.owner
|
50
58
|
assert_equal "complete", job.status
|
51
|
-
assert_equal "job-
|
59
|
+
assert_equal "job-example-fixture", job.name
|
52
60
|
|
53
|
-
assert_equal "
|
61
|
+
assert_equal "Firefox", job.browser
|
54
62
|
assert_equal "3.5.", job.browser_version
|
55
63
|
assert_equal "Windows 2003", job.os
|
56
64
|
|
57
|
-
assert_equal
|
58
|
-
assert_equal
|
59
|
-
assert_equal
|
65
|
+
assert_equal 1266030817, job.creation_time
|
66
|
+
assert_equal 1266030833, job.start_time
|
67
|
+
assert_equal 1266030871, job.end_time
|
60
68
|
|
61
|
-
assert_equal "http://saucelabs.com/
|
62
|
-
assert_equal "http://saucelabs.com/
|
69
|
+
assert_equal "http://saucelabs.com/jobs/gem-test-job/video.flv", job.video_url
|
70
|
+
assert_equal "http://saucelabs.com/jobs/gem-test-job/selenium-server.log", job.log_url
|
63
71
|
|
64
72
|
assert_equal false, job.public
|
65
|
-
assert_equal [
|
73
|
+
assert_equal ['test', 'equal', 'multilingualism is fun'], job.tags
|
66
74
|
end
|
67
75
|
|
68
76
|
should "update writable properties" do
|
69
|
-
job = @client.jobs.find("
|
77
|
+
job = @client.jobs.find("gem-test-job")
|
70
78
|
|
71
79
|
# Make sure it's in the expected condition before changing
|
72
80
|
assert_equal false, job.public
|
73
|
-
assert_equal ["test", "
|
74
|
-
assert_equal "job-
|
81
|
+
assert_equal ["test", "equal", "multilingualism is fun"], job.tags
|
82
|
+
assert_equal "job-example-fixture", job.name
|
75
83
|
|
76
84
|
job.public = true
|
77
85
|
job.tags = ["changed", "updated", "ruby_is_also_fun"]
|
78
|
-
job.name = "changed-job-name"
|
86
|
+
job.name = "changed-job-name"
|
79
87
|
job.save
|
80
88
|
|
81
89
|
# Fresh copy of the same job
|
82
|
-
job2 = @client.jobs.find("
|
90
|
+
job2 = @client.jobs.find("gem-test-job")
|
83
91
|
|
84
|
-
assert_equal true,
|
85
|
-
assert_equal ["changed", "updated", "ruby_is_also_fun"],
|
86
|
-
assert_equal "changed-job-name",
|
92
|
+
assert_equal true, job2.public
|
93
|
+
assert_equal ["changed", "updated", "ruby_is_also_fun"], job2.tags
|
94
|
+
assert_equal "changed-job-name", job2.name
|
87
95
|
|
88
96
|
# Return the job to its original state and check it out
|
89
97
|
job.public = false
|
90
|
-
job.tags = ["test", "example", "
|
91
|
-
job.name = "job-
|
98
|
+
job.tags = ["test", "example", "multilingualism is fun"]
|
99
|
+
job.name = "job-example-fixture"
|
92
100
|
job.save
|
93
101
|
|
94
102
|
# Check to see if the change took
|
@@ -99,40 +107,39 @@ class TestSauce < Test::Unit::TestCase
|
|
99
107
|
end
|
100
108
|
|
101
109
|
should "not update read-only properties" do
|
102
|
-
job = @client.jobs.find("
|
110
|
+
job = @client.jobs.find("gem-test-job")
|
103
111
|
|
104
112
|
# Make sure it's in the expected condition before changing
|
105
113
|
assert_equal "complete", job.status
|
106
|
-
assert_equal "
|
107
|
-
assert_equal "
|
114
|
+
assert_equal "sah", job.owner
|
115
|
+
assert_equal "Windows 2003", job.os
|
108
116
|
|
109
117
|
job.status = "groggy"
|
110
118
|
job.owner = "sjobs"
|
111
119
|
job.os = "darwin" # In a perfect world...
|
112
120
|
assert_equal "groggy", job.status
|
113
|
-
assert_equal "
|
121
|
+
assert_equal "sjobs", job.owner
|
114
122
|
assert_equal "darwin", job.os
|
115
123
|
job.save
|
116
124
|
|
117
125
|
# Changes should go away when refreshed
|
118
126
|
job.refresh!
|
119
127
|
assert_equal "complete", job.status
|
120
|
-
assert_equal "
|
121
|
-
assert_equal "
|
128
|
+
assert_equal "sah", job.owner
|
129
|
+
assert_equal "Windows 2003", job.os
|
122
130
|
end
|
123
131
|
|
124
132
|
should "list the 100 most recent jobs" do
|
125
133
|
jobs = @client.jobs.all
|
126
134
|
|
127
|
-
assert_equal
|
135
|
+
assert_equal 2, jobs.count
|
128
136
|
end
|
129
137
|
|
130
|
-
should "show
|
138
|
+
should "show job listings with full job information if requested" do
|
131
139
|
flunk "TODO: implement this"
|
132
140
|
end
|
133
141
|
|
134
142
|
def teardown
|
135
|
-
@client.tunnels.destroy
|
136
143
|
end
|
137
144
|
end
|
138
145
|
end
|
data/test/test_tunnels.rb
CHANGED
@@ -1,22 +1,29 @@
|
|
1
1
|
require 'helper'
|
2
|
+
require 'yaml'
|
2
3
|
|
3
4
|
class TestSauce < Test::Unit::TestCase
|
4
5
|
context "A V1 tunnel instance" do
|
5
6
|
setup do
|
6
7
|
# Create this file and put in your details to run the tests
|
7
|
-
account = YAML.load_file "
|
8
|
+
account = YAML.load_file "account2.yml"
|
8
9
|
@username = account["username"]
|
9
10
|
@access_key = account["access_key"]
|
10
11
|
@ip = account["ip"]
|
11
12
|
@client = Sauce::Client.new(:username => @username,
|
12
|
-
:access_key => @access_key
|
13
|
+
:access_key => @access_key,
|
14
|
+
:ip => @ip,
|
15
|
+
:protocol => account["protocol"],
|
16
|
+
:host => account["host"],
|
17
|
+
:port => account["port"])
|
18
|
+
|
19
|
+
#STDOUT.puts @client.api_url
|
13
20
|
@client.tunnels.destroy_all
|
14
21
|
end
|
15
22
|
|
16
23
|
should "initialize with passed variables" do
|
17
24
|
client = Sauce::Client.new(:username => "test_user",
|
18
25
|
:access_key => "abc123")
|
19
|
-
assert_equal "
|
26
|
+
assert_equal "http://test_user:abc123@saucelabs.com:80/rest/v1/test_user/", client.api_url
|
20
27
|
end
|
21
28
|
|
22
29
|
should "create a tunnel with the current user" do
|
@@ -26,6 +33,14 @@ class TestSauce < Test::Unit::TestCase
|
|
26
33
|
assert_equal @username, tunnel.owner
|
27
34
|
end
|
28
35
|
|
36
|
+
should "error if a tunnel is created without domain names" do
|
37
|
+
flunk "TODO: Implement this"
|
38
|
+
tunnel = @client.tunnels.create('DomainNames' => [])
|
39
|
+
tunnel.refresh!
|
40
|
+
assert_not_nil tunnel
|
41
|
+
assert_equal @username, tunnel.owner
|
42
|
+
end
|
43
|
+
|
29
44
|
should "list current tunnels" do
|
30
45
|
@client.tunnels.create('DomainNames' => ["192.168.0.111"])
|
31
46
|
@client.tunnels.create('DomainNames' => ["192.168.0.112"])
|
@@ -38,7 +53,7 @@ class TestSauce < Test::Unit::TestCase
|
|
38
53
|
should "destroy a tunnel" do
|
39
54
|
tunnel = @client.tunnels.create('DomainNames' => ["192.168.0.114"])
|
40
55
|
tunnel.destroy
|
41
|
-
|
56
|
+
assert ["terminated", "halting"].include?(tunnel.status)
|
42
57
|
end
|
43
58
|
|
44
59
|
should "destroy all tunnels" do
|
@@ -49,12 +64,15 @@ class TestSauce < Test::Unit::TestCase
|
|
49
64
|
@client.tunnels.destroy_all
|
50
65
|
|
51
66
|
@client.tunnels.all.each do |tunnel|
|
52
|
-
|
67
|
+
# This could be failing because the tunnels are already dead. Our servers too fast?
|
68
|
+
tunnel.refresh!
|
69
|
+
assert ["terminated", "halting"].include? tunnel.status
|
53
70
|
end
|
54
71
|
end
|
55
72
|
|
56
73
|
should "say hello on port 1025 if healthy" do
|
57
|
-
tunnel = @client.tunnels.create('DomainNames' => [
|
74
|
+
tunnel = @client.tunnels.create('DomainNames' => ["192.168.0.118"])
|
75
|
+
|
58
76
|
|
59
77
|
max_retries = 30
|
60
78
|
retries = 0
|
@@ -69,8 +87,26 @@ class TestSauce < Test::Unit::TestCase
|
|
69
87
|
tunnel.destroy # cleanup
|
70
88
|
end
|
71
89
|
|
90
|
+
should "have a host if finished booting" do
|
91
|
+
tunnel = @client.tunnels.create('DomainNames' => ["192.168.0.119"])
|
92
|
+
|
93
|
+
max_retries = 30
|
94
|
+
retries = 0
|
95
|
+
until tunnel.status == "running" or retries >= max_retries
|
96
|
+
sleep 5
|
97
|
+
retries += 1
|
98
|
+
tunnel.refresh!
|
99
|
+
end
|
100
|
+
|
101
|
+
tunnel.refresh!
|
102
|
+
|
103
|
+
assert_not_nil tunnel.host
|
104
|
+
|
105
|
+
tunnel.destroy # cleanup
|
106
|
+
end
|
107
|
+
|
72
108
|
should "not attempt to telnet if status is not running" do
|
73
|
-
tunnel = @client.tunnels.create('DomainNames' => [
|
109
|
+
tunnel = @client.tunnels.create('DomainNames' => ["192.168.0.119"])
|
74
110
|
|
75
111
|
tunnel.status = "booting"
|
76
112
|
assert_equal false, tunnel.says_hello?
|
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sauce
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 5
|
8
|
+
- 0
|
9
|
+
version: 0.5.0
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- Sean Grove
|
@@ -9,29 +14,33 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date: 2010-03-
|
17
|
+
date: 2010-03-16 00:00:00 -07:00
|
13
18
|
default_executable:
|
14
19
|
dependencies:
|
15
20
|
- !ruby/object:Gem::Dependency
|
16
21
|
name: thoughtbot-shoulda
|
17
|
-
|
18
|
-
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
24
|
requirements:
|
21
25
|
- - ">="
|
22
26
|
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
23
29
|
version: "0"
|
24
|
-
|
30
|
+
type: :development
|
31
|
+
version_requirements: *id001
|
25
32
|
- !ruby/object:Gem::Dependency
|
26
33
|
name: rest-client
|
27
|
-
|
28
|
-
|
29
|
-
version_requirements: !ruby/object:Gem::Requirement
|
34
|
+
prerelease: false
|
35
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
30
36
|
requirements:
|
31
37
|
- - ">="
|
32
38
|
- !ruby/object:Gem::Version
|
39
|
+
segments:
|
40
|
+
- 0
|
33
41
|
version: "0"
|
34
|
-
|
42
|
+
type: :development
|
43
|
+
version_requirements: *id002
|
35
44
|
description: A ruby interface to Sauce Labs' services. Start/stop tunnels, retrieve Selenium logs, access video replays, etc.
|
36
45
|
email: sean@saucelabs.com
|
37
46
|
executables: []
|
@@ -69,26 +78,26 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
69
78
|
requirements:
|
70
79
|
- - ">="
|
71
80
|
- !ruby/object:Gem::Version
|
81
|
+
segments:
|
82
|
+
- 0
|
72
83
|
version: "0"
|
73
|
-
version:
|
74
84
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
85
|
requirements:
|
76
86
|
- - ">="
|
77
87
|
- !ruby/object:Gem::Version
|
88
|
+
segments:
|
89
|
+
- 0
|
78
90
|
version: "0"
|
79
|
-
version:
|
80
91
|
requirements: []
|
81
92
|
|
82
93
|
rubyforge_project:
|
83
|
-
rubygems_version: 1.3.
|
94
|
+
rubygems_version: 1.3.6
|
84
95
|
signing_key:
|
85
96
|
specification_version: 3
|
86
97
|
summary: Ruby access to Sauce Labs' features
|
87
98
|
test_files:
|
88
99
|
- test/debug.rb
|
89
100
|
- test/helper.rb
|
90
|
-
- test/
|
101
|
+
- test/monitor_jobs.rb
|
91
102
|
- test/test_jobs.rb
|
92
|
-
- test/test_jobs_old.rb
|
93
103
|
- test/test_tunnels.rb
|
94
|
-
- test/test_videos.rb
|
data/test/irb_boot.rb
DELETED
data/test/test_jobs_old.rb
DELETED
@@ -1,58 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
require 'json'
|
3
|
-
|
4
|
-
class TestSauce < Test::Unit::TestCase
|
5
|
-
context "A jobs instance" do
|
6
|
-
setup do
|
7
|
-
# Create this file and put in your details to run the tests
|
8
|
-
account = YAML.load_file "live_account.yml"
|
9
|
-
@username = account["username"]
|
10
|
-
@access_key = account["access_key"]
|
11
|
-
@ip = account["ip"]
|
12
|
-
@client = Sauce::Client.new(:username => @username,
|
13
|
-
:access_key => @access_key)
|
14
|
-
end
|
15
|
-
|
16
|
-
should "initialize with passed variables" do
|
17
|
-
job_json = JSON.parse '{"BrowserVersion": "3.", "Name": "example_job/name.rb", "_rev": "5-228269313", "CreationTime": 1266698090, "AssignmentTime": 1266698097, "Server": "192.168.0.1:4443", "AssignedTo": "f663372ba04444ce8cb3e6f61503f304", "ChefStartTime": 1266698101, "EndTime": 1266698139, "Type": "job", "Interactive": "true", "Status": "complete", "SeleniumServerLogUploadRequest": {"bucket": "sauce-userdata", "key": "sgrove/6337fe576deba0ba278dc1b5dfceac5f/selenium-server.log"}, "Tags": ["tag_1", "tag_2"], "ResultId": "6337fe576deba0ba278dc1b5dfceac5f", "AttachmentRequests": {}, "ModificationTime": 1266698139, "Browser": "firefox", "StartTime": 1266698101, "Owner": "sgrove", "_id": "01fc48caba6d15b46fad79e1b0562bbe", "OS": "Linux", "VideoUploadRequest": {"bucket": "sauce-userdata", "key": "sgrove/6337fe576deba0ba278dc1b5dfceac5f/video.flv"}}'
|
18
|
-
|
19
|
-
client = Sauce::Client.new(:username => "test_user",
|
20
|
-
:access_key => "abc123")
|
21
|
-
|
22
|
-
job = client.jobs.new(job_json)
|
23
|
-
|
24
|
-
assert_equal "sgrove", job.owner
|
25
|
-
assert_equal "01fc48caba6d15b46fad79e1b0562bbe", job.id
|
26
|
-
assert_equal "example_job/name.rb", job.name
|
27
|
-
assert_equal "5-228269313", job._rev
|
28
|
-
assert_equal "192.168.0.1:4443", job.server
|
29
|
-
assert_equal "f663372ba04444ce8cb3e6f61503f304", job.assigned_to
|
30
|
-
|
31
|
-
assert_equal "job", job.sauce_type
|
32
|
-
assert_equal "true", job.interactive
|
33
|
-
assert_equal "complete", job.status
|
34
|
-
assert_equal ["tag_1", "tag_2"], job.tags
|
35
|
-
assert_equal "6337fe576deba0ba278dc1b5dfceac5f", job.result_id
|
36
|
-
|
37
|
-
# TODO: Buckets
|
38
|
-
#assert_equal , job.selenium_server_log_upload_request
|
39
|
-
#assert_equal , job.attachment_requests
|
40
|
-
#assert_equal , job.videoupload_request
|
41
|
-
|
42
|
-
assert_equal "Linux", job.os
|
43
|
-
assert_equal "firefox", job.browser
|
44
|
-
assert_equal "3.", job.browser_version
|
45
|
-
|
46
|
-
assert_equal 1266698090, job.creation_time
|
47
|
-
assert_equal 1266698097, job.assignment_time
|
48
|
-
assert_equal 1266698101, job.chef_start_time
|
49
|
-
assert_equal 1266698139, job.end_time
|
50
|
-
assert_equal 1266698139, job.modification_time
|
51
|
-
assert_equal 1266698101, job.start_time
|
52
|
-
end
|
53
|
-
|
54
|
-
def teardown
|
55
|
-
@client.tunnels.destroy
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
data/test/test_videos.rb
DELETED
@@ -1,83 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
|
3
|
-
class TestSauce < Test::Unit::TestCase
|
4
|
-
context "A Client instance" do
|
5
|
-
setup do
|
6
|
-
# Create this file and put in your details to run the tests
|
7
|
-
account = YAML.load_file "live_account.yml"
|
8
|
-
@username = account["username"]
|
9
|
-
@access_key = account["access_key"]
|
10
|
-
@ip = account["ip"]
|
11
|
-
@client = Sauce::Client.new(:username => @username,
|
12
|
-
:access_key => @access_key)
|
13
|
-
@client.tunnels.destroy
|
14
|
-
end
|
15
|
-
|
16
|
-
should "initialize with passed variables" do
|
17
|
-
client = Sauce::Client.new(:username => "test_user",
|
18
|
-
:access_key => "abc123")
|
19
|
-
assert_equal client.api_url, "https://test_user:abc123@saucelabs.com/rest/test_user/"
|
20
|
-
end
|
21
|
-
|
22
|
-
should "create a tunnel with the current user" do
|
23
|
-
tunnel = @client.tunnels.create('DomainNames' => ["192.168.0.110"])
|
24
|
-
tunnel.refresh!
|
25
|
-
assert_not_nil tunnel
|
26
|
-
assert_equal @username, tunnel.owner
|
27
|
-
end
|
28
|
-
|
29
|
-
should "list current tunnels" do
|
30
|
-
@client.tunnels.create('DomainNames' => ["192.168.0.111"])
|
31
|
-
@client.tunnels.create('DomainNames' => ["192.168.0.112"])
|
32
|
-
@client.tunnels.create('DomainNames' => ["192.168.0.113"])
|
33
|
-
|
34
|
-
tunnels = @client.tunnels.all
|
35
|
-
assert_equal 3, tunnels.select{|t| t.status != "halting"}.count
|
36
|
-
end
|
37
|
-
|
38
|
-
should "destroy a tunnel" do
|
39
|
-
tunnel = @client.tunnels.create('DomainNames' => ["192.168.0.114"])
|
40
|
-
tunnel.destroy
|
41
|
-
assert_equal "halting", tunnel.status
|
42
|
-
end
|
43
|
-
|
44
|
-
should "destroy all tunnels" do
|
45
|
-
tunnel = @client.tunnels.create('DomainNames' => ["192.168.0.115"])
|
46
|
-
tunnel = @client.tunnels.create('DomainNames' => ["192.168.0.116"])
|
47
|
-
tunnel = @client.tunnels.create('DomainNames' => ["192.168.0.117"])
|
48
|
-
|
49
|
-
@client.tunnels.destroy
|
50
|
-
|
51
|
-
@client.tunnels.all.each do |tunnel|
|
52
|
-
assert_equal "halting", tunnel.status
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
should "say hello on port 1025 if healthy" do
|
57
|
-
tunnel = @client.tunnels.create('DomainNames' => [@ip])
|
58
|
-
|
59
|
-
max_retries = 30
|
60
|
-
retries = 0
|
61
|
-
until tunnel.status == "running" or retries >= max_retries
|
62
|
-
sleep 5
|
63
|
-
retries += 1
|
64
|
-
tunnel.refresh!
|
65
|
-
end
|
66
|
-
|
67
|
-
assert_equal true, tunnel.says_hello?
|
68
|
-
|
69
|
-
tunnel.destroy # cleanup
|
70
|
-
end
|
71
|
-
|
72
|
-
should "not attempt to telnet if status is not running" do
|
73
|
-
tunnel = @client.tunnels.create('DomainNames' => [@ip])
|
74
|
-
|
75
|
-
tunnel.status = "booting"
|
76
|
-
assert_equal false, tunnel.says_hello?
|
77
|
-
end
|
78
|
-
|
79
|
-
def teardown
|
80
|
-
@client.tunnels.destroy
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|