xamarin-test-cloud 0.9.38 → 0.10.0.pre1
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.
- checksums.yaml +4 -4
- data/lib/xamarin-test-cloud/cli.rb +94 -125
- data/lib/xamarin-test-cloud/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d7e86b25f55da1aec8b4504629b006f925762f04
|
4
|
+
data.tar.gz: 8a161091309905209563051db183d9ea35075a52
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7c8d729ac9bcac1faa00092cf01311eb240b877bb5e6d62ff87ba727c5d62b932fe1245890902f7f12d546cd3fa38ccf6c99d9ab8ff7ce03440c85aabd26e0b5
|
7
|
+
data.tar.gz: e8950226872229fdff8d0646cf5f226aea24cc85b83af2da7ab06eb7e9d232d46ac871aa4543dfcda38fae108ee1424512ed24c0d7dff719a77e3d0725b48a78
|
@@ -11,7 +11,12 @@ require 'tmpdir'
|
|
11
11
|
require 'fileutils'
|
12
12
|
require 'retriable'
|
13
13
|
require 'xamarin-test-cloud/version'
|
14
|
+
require 'securerandom'
|
14
15
|
|
16
|
+
trap "SIGINT" do
|
17
|
+
puts "Exiting"
|
18
|
+
exit 10
|
19
|
+
end
|
15
20
|
|
16
21
|
module XamarinTestCloud
|
17
22
|
|
@@ -21,11 +26,28 @@ module XamarinTestCloud
|
|
21
26
|
class CLI < Thor
|
22
27
|
include Thor::Actions
|
23
28
|
|
24
|
-
attr_accessor :
|
29
|
+
attr_accessor :app, :api_key, :appname, :test_parameters,
|
25
30
|
:workspace, :config, :profile, :skip_config_check, :dry_run,
|
26
31
|
:device_selection, :pretty, :async, :priority, :endpoint_path,
|
27
32
|
:locale, :series,
|
28
|
-
:dsym
|
33
|
+
:dsym, :session_id
|
34
|
+
|
35
|
+
def self.exit_on_failure?
|
36
|
+
true
|
37
|
+
end
|
38
|
+
|
39
|
+
def initialize(*args)
|
40
|
+
self.session_id = SecureRandom.hex
|
41
|
+
begin
|
42
|
+
r = JSON.parse(http_post("check_version", {args: ARGV}))
|
43
|
+
if r["error_message"]
|
44
|
+
puts r["error_message"]
|
45
|
+
exit 1
|
46
|
+
end
|
47
|
+
rescue
|
48
|
+
end
|
49
|
+
super(*args)
|
50
|
+
end
|
29
51
|
|
30
52
|
FILE_UPLOAD_ENDPOINT = 'upload2'
|
31
53
|
FORM_URL_ENCODED_ENDPOINT = 'upload'
|
@@ -44,11 +66,6 @@ module XamarinTestCloud
|
|
44
66
|
desc 'submit <APP> <API_KEY>', 'Submits your app and test suite to Xamarin Test Cloud'
|
45
67
|
|
46
68
|
|
47
|
-
method_option :host,
|
48
|
-
:desc => 'Test Cloud host to submit to',
|
49
|
-
:aliases => '-h', :type => :string,
|
50
|
-
:default => (ENV['XTC_ENDPOINT'] || 'https://testcloud.xamarin.com/ci')
|
51
|
-
|
52
69
|
method_option 'app-name',
|
53
70
|
:desc => 'App name to create or add test to',
|
54
71
|
:aliases => '-a',
|
@@ -61,12 +78,6 @@ module XamarinTestCloud
|
|
61
78
|
:required => true,
|
62
79
|
:type => :string
|
63
80
|
|
64
|
-
method_option 'app-explorer',
|
65
|
-
:desc => 'Explore using AppExplorer only (no Calabash)',
|
66
|
-
:aliases => '-e',
|
67
|
-
:type => :boolean,
|
68
|
-
:default => false
|
69
|
-
|
70
81
|
method_option 'test-parameters',
|
71
82
|
:desc => 'Test parameters (e.g., -params username:nat@xamarin.com password:xamarin)',
|
72
83
|
:aliases => '-params',
|
@@ -131,8 +142,6 @@ module XamarinTestCloud
|
|
131
142
|
|
132
143
|
def submit(app, api_key)
|
133
144
|
|
134
|
-
self.host = options[:host]
|
135
|
-
|
136
145
|
self.pretty = options[:pretty]
|
137
146
|
|
138
147
|
app_path = File.expand_path(app)
|
@@ -170,8 +179,6 @@ module XamarinTestCloud
|
|
170
179
|
|
171
180
|
device_selection_data = validate_device_selection
|
172
181
|
|
173
|
-
self.app_explorer = options['app-explorer']
|
174
|
-
|
175
182
|
self.locale = options['locale']
|
176
183
|
|
177
184
|
self.series = options['series']
|
@@ -188,17 +195,12 @@ module XamarinTestCloud
|
|
188
195
|
end
|
189
196
|
end
|
190
197
|
|
191
|
-
|
192
198
|
workspace_path = options[:workspace] || File.expand_path('.')
|
193
199
|
|
194
|
-
unless
|
195
|
-
|
196
|
-
raise ValidationError, "Provided workspace: #{workspace_path} is not a directory."
|
197
|
-
end
|
200
|
+
unless File.directory?(workspace_path)
|
201
|
+
raise ValidationError, "Provided workspace: #{workspace_path} is not a directory."
|
198
202
|
end
|
199
203
|
|
200
|
-
|
201
|
-
|
202
204
|
workspace_basename = File.basename(workspace_path)
|
203
205
|
if workspace_basename.downcase == 'features'
|
204
206
|
self.workspace = File.expand_path(File.join(workspace_path,'..'))
|
@@ -210,37 +212,31 @@ module XamarinTestCloud
|
|
210
212
|
self.workspace = File.join(self.workspace, File::Separator)
|
211
213
|
|
212
214
|
|
213
|
-
unless self.
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
raise ValidationError, "Unable to find features folder in #{self.workspace}"
|
220
|
-
end
|
215
|
+
unless File.directory?(File.join(self.workspace, 'features'))
|
216
|
+
log_header "Did not find features folder in workspace #{self.workspace}"
|
217
|
+
puts "Either run the test-cloud command from the directory containing your features"
|
218
|
+
puts "or use the --workspace option to refer to this directory"
|
219
|
+
puts "See also test-cloud help submit"
|
220
|
+
raise ValidationError, "Unable to find features folder in #{self.workspace}"
|
221
221
|
end
|
222
222
|
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
raise ValidationError, "#{default_config} detected but no profile selected."
|
234
|
-
end
|
223
|
+
parse_and_set_config_and_profile
|
224
|
+
unless self.skip_config_check
|
225
|
+
default_config = File.join(self.workspace,'config','cucumber.yml')
|
226
|
+
if File.exist?(default_config) && self.config.nil?
|
227
|
+
log_header 'Warning: Detected cucumber.yml config file, but no --config specified'
|
228
|
+
puts "Please specify --config #{default_config}"
|
229
|
+
puts 'and specify a profile via --profile'
|
230
|
+
puts 'If you know what you are doing you can skip this check with'
|
231
|
+
puts '--skip-config-check'
|
232
|
+
raise ValidationError, "#{default_config} detected but no profile selected."
|
235
233
|
end
|
236
234
|
end
|
237
235
|
|
238
|
-
|
239
236
|
if debug?
|
240
237
|
puts "Host = #{self.host}"
|
241
238
|
puts "App = #{self.app}"
|
242
239
|
puts "App Name = #{self.app}"
|
243
|
-
puts "AppExplorer = #{self.app_explorer}"
|
244
240
|
puts "TestParams = #{self.test_parameters}"
|
245
241
|
puts "API Key = #{self.api_key}"
|
246
242
|
puts "Device Selection = #{self.device_selection}"
|
@@ -303,50 +299,23 @@ module XamarinTestCloud
|
|
303
299
|
def wait_for_job(id)
|
304
300
|
while(true)
|
305
301
|
status_json = retriable :tries => 60, :interval => 10 do
|
306
|
-
JSON.parse(http_post("
|
302
|
+
JSON.parse(http_post("status_v3", {'id' => id, 'api_key' => api_key}))
|
307
303
|
end
|
308
304
|
|
309
|
-
|
310
|
-
|
311
|
-
puts
|
312
|
-
if debug?
|
313
|
-
log "Status JSON result"
|
314
|
-
puts status_json
|
315
|
-
end
|
316
|
-
log_header "Test Summary"
|
317
|
-
calabash_data = status_json["calabash_data"]
|
318
|
-
|
319
|
-
if calabash_data
|
320
|
-
failed = calabash_data["scenarios"]["failed"].to_i
|
321
|
-
puts "Total scenarios: #{calabash_data["scenarios"]["total"]}"
|
322
|
-
puts "#{calabash_data["scenarios"]["passed"]} passed"
|
323
|
-
puts "#{failed} failed"
|
324
|
-
puts "Total steps: #{calabash_data["steps"]["total"]}"
|
325
|
-
|
326
|
-
puts ""
|
327
|
-
puts "Test Report:"
|
328
|
-
puts status_json['share_link']
|
329
|
-
if failed > 0
|
330
|
-
exit 1
|
331
|
-
end
|
332
|
-
end
|
333
|
-
exit 0
|
305
|
+
if debug?
|
306
|
+
log "Status JSON result:"
|
307
|
+
puts status_json
|
334
308
|
end
|
335
309
|
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
end
|
343
|
-
exit 1
|
344
|
-
end
|
345
|
-
if debug?
|
346
|
-
sleep 1
|
347
|
-
else
|
348
|
-
sleep 10
|
310
|
+
wait_time = (Integer status_json["wait_time"] rescue nil) || 10
|
311
|
+
wait_time = 1 if debug?
|
312
|
+
log status_json["message"]
|
313
|
+
|
314
|
+
if status_json["exit_code"]
|
315
|
+
exit Integer status_json["exit_code"]
|
349
316
|
end
|
317
|
+
|
318
|
+
sleep wait_time
|
350
319
|
end
|
351
320
|
end
|
352
321
|
|
@@ -373,30 +342,27 @@ module XamarinTestCloud
|
|
373
342
|
end
|
374
343
|
start_at = Time.now
|
375
344
|
|
376
|
-
|
377
|
-
server = verify_app_and_extract_test_server
|
345
|
+
server = verify_app_and_extract_test_server
|
378
346
|
|
379
|
-
|
347
|
+
log_header('Checking for Gemfile')
|
380
348
|
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
349
|
+
if File.exist?(workspace_gemfile)
|
350
|
+
FileUtils.cp workspace_gemfile, tmpdir
|
351
|
+
FileUtils.cp workspace_gemfile_lock, tmpdir if File.exist?(workspace_gemfile_lock)
|
352
|
+
else
|
353
|
+
copy_default_gemfile(File.join(tmpdir, "Gemfile"), server)
|
354
|
+
end
|
387
355
|
|
388
|
-
|
356
|
+
log_header('Packaging')
|
389
357
|
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
end
|
358
|
+
ENV['BUNDLE_GEMFILE'] = File.join(tmpdir, "Gemfile")
|
359
|
+
FileUtils.cd(self.workspace) do
|
360
|
+
unless system('bundle package --all')
|
361
|
+
log_and_abort 'Bundler failed. Please check command: bundle package'
|
395
362
|
end
|
396
|
-
log_header('Verifying dependencies')
|
397
|
-
verify_dependencies(tmpdir)
|
398
363
|
end
|
399
|
-
|
364
|
+
log_header('Verifying dependencies')
|
365
|
+
verify_dependencies(tmpdir)
|
400
366
|
|
401
367
|
if dry_run
|
402
368
|
log_header('Dry run only')
|
@@ -415,7 +381,6 @@ module XamarinTestCloud
|
|
415
381
|
'device_selection' => device_selection_data,
|
416
382
|
'app' => self.appname,
|
417
383
|
'test_parameters' => self.test_parameters,
|
418
|
-
'app_explorer' => self.app_explorer,
|
419
384
|
'locale' => self.locale,
|
420
385
|
'series' => self.series,
|
421
386
|
'api_key' => api_key,
|
@@ -659,30 +624,25 @@ module XamarinTestCloud
|
|
659
624
|
def all_files(tmpdir)
|
660
625
|
dir = workspace
|
661
626
|
|
662
|
-
|
663
|
-
files = []
|
664
|
-
else
|
665
|
-
files = Dir.glob(File.join("#{dir}features", '**', '*'))
|
666
|
-
|
667
|
-
if File.directory?("#{dir}playback")
|
668
|
-
files += Dir.glob(File.join("#{dir}playback", '*'))
|
669
|
-
end
|
627
|
+
files = Dir.glob(File.join("#{dir}features", '**', '*'))
|
670
628
|
|
671
|
-
|
672
|
-
|
673
|
-
|
629
|
+
if File.directory?("#{dir}playback")
|
630
|
+
files += Dir.glob(File.join("#{dir}playback", '*'))
|
631
|
+
end
|
674
632
|
|
675
|
-
|
633
|
+
if config
|
634
|
+
files << config
|
635
|
+
end
|
676
636
|
|
677
|
-
|
678
|
-
files += Dir.glob("#{workspace}Gemfile")
|
679
|
-
files += Dir.glob("#{workspace}Gemfile.lock")
|
680
|
-
end
|
637
|
+
files += Dir.glob(File.join(tmpdir,"vendor", 'cache', '*'))
|
681
638
|
|
682
|
-
|
683
|
-
|
684
|
-
|
639
|
+
if workspace and workspace.strip != ''
|
640
|
+
files += Dir.glob("#{workspace}Gemfile")
|
641
|
+
files += Dir.glob("#{workspace}Gemfile.lock")
|
642
|
+
end
|
685
643
|
|
644
|
+
if is_android?
|
645
|
+
files << test_server_path
|
686
646
|
end
|
687
647
|
|
688
648
|
{:feature_prefix => dir, :workspace_prefix => workspace, :files => files.find_all { |file_or_dir| File.file? file_or_dir }}
|
@@ -694,8 +654,13 @@ module XamarinTestCloud
|
|
694
654
|
end
|
695
655
|
end
|
696
656
|
|
657
|
+
def host
|
658
|
+
ENV['XTC_ENDPOINT'] || 'https://testcloud.xamarin.com/ci'
|
659
|
+
end
|
660
|
+
|
697
661
|
def http_post(address, args = {}, &block)
|
698
662
|
args['uploader_version'] = XamarinTestCloud::VERSION
|
663
|
+
args['session_id'] = session_id
|
699
664
|
exec_options = {}
|
700
665
|
if ENV['XTC_USERNAME'] && ENV['XTC_PASSWORD']
|
701
666
|
exec_options[:user] = ENV['XTC_USERNAME']
|
@@ -758,8 +723,12 @@ module XamarinTestCloud
|
|
758
723
|
|
759
724
|
|
760
725
|
def log(message)
|
761
|
-
|
762
|
-
|
726
|
+
if message.is_a? Array
|
727
|
+
message.each{ |m| log(m)}
|
728
|
+
else
|
729
|
+
puts "#{Time.now } #{message}"
|
730
|
+
$stdout.flush
|
731
|
+
end
|
763
732
|
end
|
764
733
|
|
765
734
|
def log_header(message)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xamarin-test-cloud
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0.pre1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Karl Krukow
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-11-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: thor
|
@@ -164,12 +164,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
164
164
|
version: '0'
|
165
165
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
166
166
|
requirements:
|
167
|
-
- - '
|
167
|
+
- - '>'
|
168
168
|
- !ruby/object:Gem::Version
|
169
|
-
version:
|
169
|
+
version: 1.3.1
|
170
170
|
requirements: []
|
171
171
|
rubyforge_project:
|
172
|
-
rubygems_version: 2.
|
172
|
+
rubygems_version: 2.1.10
|
173
173
|
signing_key:
|
174
174
|
specification_version: 4
|
175
175
|
summary: Command-line interface to Xamarin Test Cloud
|