sauce 0.4.3 → 0.5.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/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
|