@@ -88,11 +88,12 @@ def self.run(params)
88
88
test_devices =
89
89
get_value_from_value_or_file ( params [ :test_devices ] , params [ :test_devices_file ] )
90
90
if present? ( test_devices )
91
- UI . message ( "🤖 Starting automated tests. Note: This feature is in beta." )
91
+ test_cases =
92
+ string_to_array ( get_value_from_value_or_file ( params [ :test_case_ids ] , params [ :test_case_ids_file ] ) ) &.map { |id | "#{ app_name } /testCases/#{ id } " }
92
93
test_password = test_password_from_params ( params )
93
- release_test = test_release ( alpha_client , release , test_devices , params [ :test_username ] , test_password , params [ :test_username_resource ] , params [ :test_password_resource ] )
94
+ release_tests = test_release ( alpha_client , release , test_devices , test_cases , params [ :test_username ] , test_password , params [ :test_username_resource ] , params [ :test_password_resource ] )
94
95
unless params [ :test_non_blocking ]
95
- poll_test_finished ( alpha_client , release_test . name )
96
+ poll_test_finished ( alpha_client , release_tests )
96
97
end
97
98
end
98
99
@@ -359,7 +360,10 @@ def self.distribute_release(client, release, request)
359
360
end
360
361
end
361
362
362
- def self . test_release ( alpha_client , release , test_devices , username = nil , password = nil , username_resource = nil , password_resource = nil )
363
+ def self . test_release ( alpha_client , release , test_devices , test_cases , username = nil , password = nil , username_resource = nil , password_resource = nil )
364
+ if present? ( test_cases ) && ( !username_resource . nil? || !password_resource . nil? )
365
+ UI . user_error! ( "Password and username resource names are not supported for the AI testing agent." )
366
+ end
363
367
if username_resource . nil? ^ password_resource . nil?
364
368
UI . user_error! ( "Username and password resource names for automated tests need to be specified together." )
365
369
end
@@ -401,37 +405,60 @@ def self.test_release(alpha_client, release, test_devices, username = nil, passw
401
405
)
402
406
end
403
407
404
- release_test =
405
- Google ::Apis ::FirebaseappdistributionV1alpha ::GoogleFirebaseAppdistroV1alphaReleaseTest . new (
406
- login_credential : login_credential ,
407
- device_executions : device_executions
408
- )
409
- alpha_client . create_project_app_release_test ( release . name , release_test )
408
+ UI . message ( "🤖 Starting automated tests. Note: This feature is in beta." )
409
+ release_tests = [ ]
410
+ if present? ( test_cases )
411
+ test_cases . each do |tc |
412
+ release_test =
413
+ Google ::Apis ::FirebaseappdistributionV1alpha ::GoogleFirebaseAppdistroV1alphaReleaseTest . new (
414
+ login_credential : login_credential ,
415
+ device_executions : device_executions ,
416
+ test_case : tc
417
+ )
418
+ release_tests . push ( alpha_client . create_project_app_release_test ( release . name , release_test ) )
419
+ end
420
+ else
421
+ release_test =
422
+ Google ::Apis ::FirebaseappdistributionV1alpha ::GoogleFirebaseAppdistroV1alphaReleaseTest . new (
423
+ login_credential : login_credential ,
424
+ device_executions : device_executions
425
+ )
426
+ release_tests . push ( alpha_client . create_project_app_release_test ( release . name , release_test ) )
427
+ end
428
+ release_tests
410
429
rescue Google ::Apis ::Error => err
411
430
UI . crash! ( err )
412
431
end
413
432
414
- def self . poll_test_finished ( alpha_client , release_test_name )
433
+ def self . poll_test_finished ( alpha_client , release_tests )
434
+ release_test_names = release_tests . map ( &:name )
415
435
TEST_MAX_POLLING_RETRIES . times do
416
- UI . message ( "⏳ The automated test results are pending." )
436
+ UI . message ( "⏳ #{ release_test_names . size } automated test results are pending." )
417
437
sleep ( TEST_POLLING_INTERVAL_SECONDS )
418
- release_test = alpha_client . get_project_app_release_test ( release_test_name )
419
- if release_test . device_executions . all? { |e | e . state == 'PASSED' }
420
- UI . success ( "✅ Passed automated test(s)." )
421
- return
422
- end
423
- release_test . device_executions . each do |de |
424
- case de . state
425
- when 'PASSED' , 'IN_PROGRESS'
426
- next
427
- when 'FAILED'
428
- UI . test_failure! ( "Automated test failed for #{ device_to_s ( de . device ) } : #{ de . failed_reason } ." )
429
- when 'INCONCLUSIVE'
430
- UI . test_failure! ( "Automated test inconclusive for #{ device_to_s ( de . device ) } : #{ de . inconclusive_reason } ." )
438
+ release_test_names . delete_if do |release_test_name |
439
+ release_test = alpha_client . get_project_app_release_test ( release_test_name )
440
+ if release_test . device_executions . all? { |e | e . state == 'PASSED' }
441
+ true
431
442
else
432
- UI . test_failure! ( "Unsupported automated test state for #{ device_to_s ( de . device ) } : #{ de . state } ." )
443
+ release_test . device_executions . each do |de |
444
+ case de . state
445
+ when 'PASSED' , 'IN_PROGRESS'
446
+ next
447
+ when 'FAILED'
448
+ UI . test_failure! ( "Automated test failed for #{ device_to_s ( de . device ) } : #{ de . failed_reason } ." )
449
+ when 'INCONCLUSIVE'
450
+ UI . test_failure! ( "Automated test inconclusive for #{ device_to_s ( de . device ) } : #{ de . inconclusive_reason } ." )
451
+ else
452
+ UI . test_failure! ( "Unsupported automated test state for #{ device_to_s ( de . device ) } : #{ de . state } ." )
453
+ end
454
+ end
455
+ false
433
456
end
434
457
end
458
+ if release_test_names . empty?
459
+ UI . success ( "✅ Passed automated test(s)." )
460
+ return
461
+ end
435
462
end
436
463
UI . test_failure! ( "It took longer than expected to process your test, please try again." )
437
464
end
@@ -580,6 +607,16 @@ def self.available_options
580
607
optional : false ,
581
608
default_value : false ,
582
609
type : Boolean ) ,
610
+ FastlaneCore ::ConfigItem . new ( key : :test_case_ids ,
611
+ env_name : "FIREBASEAPPDISTRO_TEST_CASE_IDS" ,
612
+ description : "Test Case IDs, separated by commas. Note: This feature is in beta" ,
613
+ optional : true ,
614
+ type : String ) ,
615
+ FastlaneCore ::ConfigItem . new ( key : :test_case_ids_file ,
616
+ env_name : "FIREBASEAPPDISTRO_TEST_CASE_IDS_FILE" ,
617
+ description : "Path to file with containing Test Case IDs, separated by commas or newlines. Note: This feature is in beta" ,
618
+ optional : true ,
619
+ type : String ) ,
583
620
584
621
# Auth
585
622
FastlaneCore ::ConfigItem . new ( key : :firebase_cli_token ,
0 commit comments