@@ -88,11 +88,12 @@ def self.run(params)
8888 test_devices =
8989 get_value_from_value_or_file ( params [ :test_devices ] , params [ :test_devices_file ] )
9090 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 } " }
9293 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 ] )
9495 unless params [ :test_non_blocking ]
95- poll_test_finished ( alpha_client , release_test . name )
96+ poll_test_finished ( alpha_client , release_tests )
9697 end
9798 end
9899
@@ -359,7 +360,10 @@ def self.distribute_release(client, release, request)
359360 end
360361 end
361362
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
363367 if username_resource . nil? ^ password_resource . nil?
364368 UI . user_error! ( "Username and password resource names for automated tests need to be specified together." )
365369 end
@@ -401,37 +405,60 @@ def self.test_release(alpha_client, release, test_devices, username = nil, passw
401405 )
402406 end
403407
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
410429 rescue Google ::Apis ::Error => err
411430 UI . crash! ( err )
412431 end
413432
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 )
415435 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." )
417437 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
431442 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
433456 end
434457 end
458+ if release_test_names . empty?
459+ UI . success ( "✅ Passed automated test(s)." )
460+ return
461+ end
435462 end
436463 UI . test_failure! ( "It took longer than expected to process your test, please try again." )
437464 end
@@ -580,6 +607,16 @@ def self.available_options
580607 optional : false ,
581608 default_value : false ,
582609 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 ) ,
583620
584621 # Auth
585622 FastlaneCore ::ConfigItem . new ( key : :firebase_cli_token ,
0 commit comments