5757import argparse
5858import json
5959import os
60+ import random
6061import re
6162import subprocess
6263import sys
164165# Check currently supported models and versions with the following commands:
165166# gcloud firebase test android models list
166167# gcloud firebase test ios models list
168+
169+ # For each device type, one entry from the list will be used for each
170+ # run. If there is only one device type listed, it will be chosen by
171+ # default.
172+ #
173+ # Note: All entries in a given list must have the same type, (ftl or virtual).
167174TEST_DEVICES = {
168- "android_target" : {"type" : "ftl" , "device" : "model=blueline,version=28" },
169- "android_latest" : {"type" : "ftl" , "device" : "model=oriole,version=33" },
170- "emulator_ftl_target" : {"type" : "ftl" , "device" : "model=Pixel2,version=28" },
171- "emulator_ftl_latest" : {"type" : "ftl" , "device" : "model=Pixel2.arm,version=32" },
172- "emulator_target" : {"type" : "virtual" , "image" :"system-images;android-30;google_apis;x86_64" },
173- "emulator_latest" : {"type" : "virtual" , "image" :"system-images;android-32;google_apis;x86_64" },
174- "emulator_32bit" : {"type" : "virtual" , "image" :"system-images;android-30;google_apis;x86" },
175- "ios_min" : {"type" : "ftl" , "device" : "model=iphone8,version=14.7" },
176- "ios_target" : {"type" : "ftl" , "device" : "model=iphone13pro,version=15.7" },
177- "ios_latest" : {"type" : "ftl" , "device" : "model=iphone11pro,version=16.6" },
178- "simulator_min" : {"type" : "virtual" , "name" :"iPhone 8" , "version" :"15.2" },
179- "simulator_target" : {"type" : "virtual" , "name" :"iPhone 8" , "version" :"16.1" },
180- "simulator_latest" : {"type" : "virtual" , "name" :"iPhone 11" , "version" :"16.1" },
181- "tvos_simulator" : {"type" : "virtual" , "name" :"Apple TV" , "version" :"16.1" },
175+ "android_target" : [
176+ {"type" : "ftl" , "device" : "model=blueline,version=28" }, # Pixel 3
177+ {"type" : "ftl" , "device" : "model=dreamlte,version=28" }, # Galaxy S8
178+ {"type" : "ftl" , "device" : "model=gts3lltevzw,version=28" }, # Galaxy Tab S3
179+ {"type" : "ftl" , "device" : "model=vivo_1906,version=28" }, # vivo 1906
180+ {"type" : "ftl" , "device" : "model=SH-01L,version=28" }, # AQUOS sense2 SH-01L
181+ {"type" : "ftl" , "device" : "model=PD1901,version=28" }, # VIVO 1901
182+ ],
183+ "android_latest" : [
184+ {"type" : "ftl" , "device" : "model=oriole,version=33" }, # Pixel 6
185+ {"type" : "ftl" , "device" : "model=panther,version=33" }, # Pixel 7
186+ {"type" : "ftl" , "device" : "model=lynx,version=33" }, # Pixel 7a
187+ {"type" : "ftl" , "device" : "model=cheetah,version=33" }, # Pixel 7 Pro
188+ {"type" : "ftl" , "device" : "model=felix,version=33" }, # Pixel Fold
189+ {"type" : "ftl" , "device" : "model=tangorpro,version=33" }, # Pixel Tablet
190+ {"type" : "ftl" , "device" : "model=gts8uwifi,version=33" }, # Galaxy Tab S8 Ultra
191+ {"type" : "ftl" , "device" : "model=b0q,version=33" }, # Galaxy S22 Ultra
192+ {"type" : "ftl" , "device" : "model=b4q,version=33" }, # Galaxy Z Flip4
193+ ],
194+ "emulator_ftl_target" : [
195+ {"type" : "ftl" , "device" : "model=Pixel2,version=28" },
196+ {"type" : "ftl" , "device" : "model=Pixel2.arm,version=28" },
197+ {"type" : "ftl" , "device" : "model=MediumPhone.arm,version=28" },
198+ {"type" : "ftl" , "device" : "model=MediumTablet.arm,version=28" },
199+ {"type" : "ftl" , "device" : "model=SmallPhone.arm,version=28" },
200+ ],
201+ "emulator_ftl_latest" : [
202+ {"type" : "ftl" , "device" : "model=Pixel2.arm,version=32" },
203+ {"type" : "ftl" , "device" : "model=MediumPhone.arm,version=32" },
204+ {"type" : "ftl" , "device" : "model=MediumTablet.arm,version=32" },
205+ {"type" : "ftl" , "device" : "model=SmallPhone.arm,version=32" },
206+ ],
207+ "emulator_target" : [ {"type" : "virtual" , "image" :"system-images;android-30;google_apis;x86_64" } ],
208+ "emulator_latest" : [ {"type" : "virtual" , "image" :"system-images;android-32;google_apis;x86_64" } ],
209+ "emulator_32bit" : [ {"type" : "virtual" , "image" :"system-images;android-30;google_apis;x86" } ],
210+ "ios_min" : [
211+ # Slightly different OS versions because of limited FTL selection.
212+ {"type" : "ftl" , "device" : "model=iphone8,version=14.7" },
213+ {"type" : "ftl" , "device" : "model=iphone11pro,version=14.7" },
214+ {"type" : "ftl" , "device" : "model=iphone12pro,version=14.8" },
215+ ],
216+ "ios_target" : [
217+ # Slightly different OS versions because of limited FTL selection.
218+ {"type" : "ftl" , "device" : "model=iphone13pro,version=15.7" },
219+ {"type" : "ftl" , "device" : "model=iphone8,version=15.7" },
220+ {"type" : "ftl" , "device" : "model=ipadmini4,version=15.4" },
221+ ],
222+ "ios_latest" : [
223+ {"type" : "ftl" , "device" : "model=iphone14pro,version=16.6" },
224+ {"type" : "ftl" , "device" : "model=iphone11pro,version=16.6" },
225+ {"type" : "ftl" , "device" : "model=iphone8,version=16.6" },
226+ {"type" : "ftl" , "device" : "model=ipad10,version=16.6" },
227+ ],
228+ "simulator_min" : [ {"type" : "virtual" , "name" :"iPhone 8" , "version" :"15.2" } ],
229+ "simulator_target" : [ {"type" : "virtual" , "name" :"iPhone 8" , "version" :"16.1" } ],
230+ "simulator_latest" : [ {"type" : "virtual" , "name" :"iPhone 11" , "version" :"16.1" } ],
231+ "tvos_simulator" : [ {"type" : "virtual" , "name" :"Apple TV" , "version" :"16.1" } ],
182232}
183233
234+ # Easy accesssor for getting a TEST_DEVICES entry. Note that once a device model
235+ # is chosen on a specific machine, it will be maintained on that same machine.
236+ def get_test_device (device_type ):
237+ """Get a TEST_DEVICES entry for the given device type.
238+
239+ If there is more than one entry listed for the given device type, one will be
240+ selected randomly. Once a selection is made for a given device_type, the same
241+ selection will be returned on subsequent calls.
242+
243+ Args:
244+ device_type(str): Device type (key for TEST_DEVICES dictionary)
245+
246+ Returns:
247+ A single entry from TEST_DEVICES (dictionary), or None if the key is not
248+ found.
249+
250+ """
251+ device_entry = TEST_DEVICES .get (device_type )
252+ if not isinstance (device_entry , list ):
253+ # If None or just a dictionary (not in an array)
254+ return device_entry
255+ return random .choice (device_entry )
184256
185257
186258def get_value (workflow , test_matrix , parm_key , config_parms_only = False ):
@@ -208,7 +280,7 @@ def get_value(workflow, test_matrix, parm_key, config_parms_only=False):
208280 if test_matrix and test_matrix in workflow_block ["matrix" ]:
209281 if parm_key in workflow_block ["matrix" ][test_matrix ]:
210282 return workflow_block ["matrix" ][test_matrix ][parm_key ]
211-
283+
212284 return workflow_block [parm_type_key ][parm_key ]
213285
214286 else :
@@ -223,8 +295,8 @@ def filter_devices(devices, device_type):
223295 """ Filter device by device_type
224296 """
225297 device_type = device_type .replace ("real" ,"ftl" )
226- filtered_value = filter (lambda device : TEST_DEVICES . get (device ).get ("type" ) in device_type , devices )
227- return list (filtered_value )
298+ filtered_value = filter (lambda device : get_test_device (device ).get ("type" ) in device_type , devices )
299+ return list (filtered_value )
228300
229301
230302def print_value (value ):
@@ -343,7 +415,7 @@ def filter_platforms_on_apis(platforms, apis):
343415 supported_apis = [api for api in apis if config .get_api (api ).tvos_target ]
344416 if not supported_apis :
345417 platforms .remove ("tvOS" )
346-
418+
347419 return platforms
348420
349421
@@ -361,11 +433,14 @@ def main():
361433 return
362434
363435 if args .get_device_type :
364- print (TEST_DEVICES . get (args .parm_key ).get ("type" ))
365- return
436+ print (get_test_device (args .parm_key ).get ("type" ))
437+ return
366438 if args .get_ftl_device :
367- print (TEST_DEVICES .get (args .parm_key ).get ("device" ))
368- return
439+ print (get_test_device (args .parm_key ).get ("device" ))
440+ return
441+ if args .get_ftl_device_list :
442+ print (";" .join ([entry .get ("device" ) for entry in TEST_DEVICES .get (args .parm_key )]))
443+ return
369444
370445 if args .expanded :
371446 test_matrix = EXPANDED_KEY
@@ -395,8 +470,10 @@ def parse_cmdline_args():
395470 parser .add_argument ('-o' , '--override' , help = 'Override existing value with provided value' )
396471 parser .add_argument ('-get_device_type' , action = 'store_true' , help = 'Get the device type, used with -k $device' )
397472 parser .add_argument ('-get_ftl_device' , action = 'store_true' , help = 'Get the ftl test device, used with -k $device' )
473+ parser .add_argument ('-get_ftl_device_list' , action = 'store_true' ,
474+ help = 'Get the FTL device list (semicolon-delimited) for the given -k $device' )
398475 parser .add_argument ('-t' , '--device_type' , default = ['real' , 'virtual' ], help = 'Test on which type of mobile devices' )
399- parser .add_argument ('--apis' , default = PARAMETERS ["integration_tests" ]["config" ]["apis" ],
476+ parser .add_argument ('--apis' , default = PARAMETERS ["integration_tests" ]["config" ]["apis" ],
400477 help = 'Exclude platform based on apis. Certain platform does not support all apis. e.g. tvOS does not support messaging' )
401478 args = parser .parse_args ()
402479 return args
0 commit comments