Class: Applitools::Connectivity::ServerConnector
- Inherits:
-
Object
- Object
- Applitools::Connectivity::ServerConnector
show all
- Extended by:
- Helpers
- Defined in:
- lib/applitools/connectivity/server_connector.rb
Constant Summary
collapse
- DEFAULT_SERVER_URL =
'https://eyesapi.applitools.com/'.freeze
- SSL_CERT =
File.join(File.dirname(File.expand_path(__FILE__)), '../../../certs/cacert.pem').to_s.freeze
- DEFAULT_TIMEOUT =
300
- API_SESSIONS =
'/api/sessions'.freeze
- API_SESSIONS_RUNNING =
API_SESSIONS + '/running/'.freeze
- API_SINGLE_TEST =
API_SESSIONS + '/'.freeze
- RENDER_INFO_PATH =
API_SESSIONS + '/renderinfo'.freeze
- RENDER =
'/render'.freeze
- RESOURCES_SHA_256 =
'/resources/sha256/'.freeze
- RENDER_STATUS =
'/render-status'.freeze
- CLOSE_BATCH =
'/api/sessions/batches/%s/close/bypointerid'.freeze
- HTTP_STATUS_CODES =
{
created: 201,
accepted: 202,
ok: 200,
gone: 410
}.freeze
- RETRY_DELAY =
0.5
- RETRY_STEP_FACTOR =
1.5
- RETRY_MAX_DELAY =
5
Instance Attribute Summary collapse
Instance Method Summary
collapse
-
#close_batch(batch_id) ⇒ Object
-
#download_resource(url, ua_string = nil) ⇒ Object
-
#initialize(url = nil) ⇒ ServerConnector
constructor
A new instance of ServerConnector.
-
#match_single_window(data) ⇒ Object
-
#match_single_window_data(data) ⇒ Object
-
#match_window(session, data) ⇒ Object
-
#post_dom_json(dom_data) ⇒ Object
-
#render(service_url, access_key, requests) ⇒ Object
-
#render_put_resource(service_url, access_key, resource, render) ⇒ Object
-
#render_status_by_id(service_url, access_key, running_renders_json) ⇒ Object
-
#rendering_info ⇒ Object
-
#set_proxy(uri, user = nil, password = nil) ⇒ Object
-
#start_session(session_start_info) ⇒ Object
-
#stop_session(session, aborted = nil, save = false) ⇒ Object
Methods included from Helpers
abstract_attr_accessor, abstract_method, env_variable, environment_attribute, environment_variables
Constructor Details
Returns a new instance of ServerConnector.
39
40
41
|
# File 'lib/applitools/connectivity/server_connector.rb', line 39
def initialize(url = nil)
self.server_url = url
end
|
Instance Attribute Details
#endpoint_url ⇒ Object
Returns the value of attribute endpoint_url.
35
36
37
|
# File 'lib/applitools/connectivity/server_connector.rb', line 35
def endpoint_url
@endpoint_url
end
|
#proxy ⇒ Object
Returns the value of attribute proxy.
36
37
38
|
# File 'lib/applitools/connectivity/server_connector.rb', line 36
def proxy
@proxy
end
|
#server_url ⇒ Object
Returns the value of attribute server_url.
34
35
36
|
# File 'lib/applitools/connectivity/server_connector.rb', line 34
def server_url
@server_url
end
|
Instance Method Details
#close_batch(batch_id) ⇒ Object
130
131
132
133
134
135
136
137
138
139
140
141
|
# File 'lib/applitools/connectivity/server_connector.rb', line 130
def close_batch(batch_id)
if 'true'.casecmp(ENV['APPLITOOLS_DONT_CLOSE_BATCHES'] || '') == 0
return Applitools::EyesLogger.info(
'APPLITOOLS_DONT_CLOSE_BATCHES environment variable set to true. Doing nothing.'
) && false
end
Applitools::ArgumentGuard.not_nil(batch_id, 'batch_id')
Applitools::EyesLogger.info("Called with #{batch_id}")
url = CLOSE_BATCH % batch_id
response = delete(URI.join(endpoint_url, url))
Applitools::EyesLogger.info "delete batch is done with #{response.status} status"
end
|
#download_resource(url, ua_string = nil) ⇒ Object
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
# File 'lib/applitools/connectivity/server_connector.rb', line 107
def download_resource(url, ua_string = nil)
Applitools::EyesLogger.debug "Fetching #{url}..."
resp_proc = proc do |u|
Faraday::Connection.new(
u,
ssl: { ca_file: SSL_CERT },
proxy: @proxy.nil? ? nil : @proxy.to_hash
).send(:get) do |req|
req.options.timeout = DEFAULT_TIMEOUT
req.['Accept-Encoding'] = 'identity'
req.['User-Agent'] = ua_string if ua_string
end
end
response = resp_proc.call(url)
redirect_count = 10
while response.status == 301 && redirect_count > 0
redirect_count -= 1
response = resp_proc.call(response.['location'])
end
Applitools::EyesLogger.debug 'Done!'
response
end
|
#match_single_window(data) ⇒ Object
209
210
211
212
|
# File 'lib/applitools/connectivity/server_connector.rb', line 209
def match_single_window(data)
res = match_single_window_data(data)
Applitools::TestResults.new Oj.load(res.body)
end
|
#match_single_window_data(data) ⇒ Object
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
|
# File 'lib/applitools/connectivity/server_connector.rb', line 181
def match_single_window_data(data)
json_data = Oj.dump(data.to_hash).force_encoding('BINARY')
body = [json_data.length].pack('L>') + json_data + data.screenshot
begin
Applitools::EyesLogger.debug 'Sending match data...'
res = long_post(
@single_check_endpoint_url,
content_type: 'application/octet-stream',
body: body,
query: { agent_id: data.agent_id }
)
rescue Errno::EWOULDBLOCK, Faraday::ConnectionFailed
@delays ||= request_delay(RETRY_DELAY, RETRY_STEP_FACTOR, RETRY_MAX_DELAY)
begin
sleep @delays.next
rescue StopIteration
raise Applitools::UnknownNetworkStackError.new('Unknown network stack error')
end
res = match_single_window_data(data)
ensure
@delays = nil
end
raise Applitools::EyesError.new("Request failed: #{res.status} #{res.} #{res.body}") unless res.success?
res
end
|
#match_window(session, data) ⇒ Object
165
166
167
168
169
170
171
172
173
174
175
|
# File 'lib/applitools/connectivity/server_connector.rb', line 165
def match_window(session, data)
json_data = Oj.dump(Applitools::Utils.camelcase_hash_keys(data.to_hash)).force_encoding('BINARY')
body = [json_data.length].pack('L>') + json_data + data.screenshot
Applitools::EyesLogger.debug 'Sending match data...'
Applitools::EyesLogger.debug json_data
res = long_post(URI.join(endpoint_url, session.id.to_s), content_type: 'application/octet-stream', body: body)
raise Applitools::EyesError.new("Request failed: #{res.status} #{res.}") unless res.success?
Applitools::MatchResult.new Oj.load(res.body)
end
|
#post_dom_json(dom_data) ⇒ Object
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
|
# File 'lib/applitools/connectivity/server_connector.rb', line 235
def post_dom_json(dom_data)
Applitools::EyesLogger.debug 'About to send captured DOM...'
request_body = dom_data
Applitools::EyesLogger.debug request_body
processed_request_body = yield(request_body) if block_given?
res = post(
endpoint_url + 'data',
body: processed_request_body.nil? ? request_body : processed_request_body,
content_type: 'application/octet-stream'
)
Applitools::EyesLogger.debug 'Done!'
raise Applitools::EyesError.new("Request failed: #{res.status} #{res.body}") unless res.success?
Applitools::EyesLogger.debug 'Server response headers:'
Applitools::EyesLogger.debug res..inspect
res.['location']
end
|
#render(service_url, access_key, requests) ⇒ Object
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
# File 'lib/applitools/connectivity/server_connector.rb', line 51
def render(service_url, access_key, requests)
uri = URI(service_url)
uri.path = RENDER
response = dummy_post(
uri,
body: requests.json,
headers: {
'X-Auth-Token' => access_key
},
timeout: 10
)
unless response.status == HTTP_STATUS_CODES[:ok]
raise Applitools::EyesError, "Error render processing (#{response.status}, #{response.body})"
end
Oj.load response.body
end
|
#render_put_resource(service_url, access_key, resource, render) ⇒ Object
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
# File 'lib/applitools/connectivity/server_connector.rb', line 68
def render_put_resource(service_url, access_key, resource, render)
uri = URI(service_url)
uri.path = RESOURCES_SHA_256 + resource.hash
Applitools::EyesLogger.debug("PUT resource: (#{resource.url}) - #{uri}")
response = dummy_put(
uri,
body: resource.content,
content_type: resource.content_type,
headers: {
'X-Auth-Token' => access_key
},
query: { 'render-id' => render['renderId'] }
)
unless response.status == HTTP_STATUS_CODES[:ok]
raise Applitools::EyesError, "Error putting resource: #{response.status}, #{response.body}"
end
resource.hash
end
|
#render_status_by_id(service_url, access_key, running_renders_json) ⇒ Object
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
# File 'lib/applitools/connectivity/server_connector.rb', line 88
def render_status_by_id(service_url, access_key, running_renders_json)
uri = URI(service_url)
uri.path = RENDER_STATUS
response = dummy_post(
uri,
body: running_renders_json,
content_type: 'application/json',
headers: {
'X-Auth-Token' => access_key
},
timeout: 2
)
unless response.status == HTTP_STATUS_CODES[:ok]
raise Applitools::EyesError, "Error getting server status, #{response.status} #{response.body}"
end
Oj.load(response.body)
end
|
#rendering_info ⇒ Object
43
44
45
46
47
48
49
|
# File 'lib/applitools/connectivity/server_connector.rb', line 43
def rendering_info
response = get(server_url + RENDER_INFO_PATH, content_type: 'application/json')
unless response.status == HTTP_STATUS_CODES[:ok]
raise Applitools::EyesError, "Error getting render info (#{response.status}})"
end
Oj.load response.body
end
|
#set_proxy(uri, user = nil, password = nil) ⇒ Object
153
154
155
|
# File 'lib/applitools/connectivity/server_connector.rb', line 153
def set_proxy(uri, user = nil, password = nil)
self.proxy = Proxy.new uri, user, password
end
|
#start_session(session_start_info) ⇒ Object
214
215
216
217
218
219
220
221
222
223
224
225
|
# File 'lib/applitools/connectivity/server_connector.rb', line 214
def start_session(session_start_info)
request_body = Oj.dump(
startInfo: Applitools::Utils.camelcase_hash_keys(session_start_info.to_hash)
)
res = post(
endpoint_url, body: request_body
)
raise Applitools::EyesError.new("Request failed: #{res.status} #{res.body} #{request_body}") unless res.success?
response = Oj.load(res.body)
Applitools::Session.new(response['id'], response['url'], res.status == HTTP_STATUS_CODES[:created])
end
|
#stop_session(session, aborted = nil, save = false) ⇒ Object
227
228
229
230
231
232
233
|
# File 'lib/applitools/connectivity/server_connector.rb', line 227
def stop_session(session, aborted = nil, save = false)
res = long_delete(URI.join(endpoint_url, session.id.to_s), query: { aborted: aborted, updateBaseline: save })
raise Applitools::EyesError.new("Request failed: #{res.status}") unless res.success?
response = Oj.load(res.body)
Applitools::TestResults.new(response)
end
|