Home | History | Annotate | Download | only in utils
      1 #!/usr/bin/python
      2 
      3 # Copyright (C) 2009 The Android Open Source Project
      4 #
      5 # Licensed under the Apache License, Version 2.0 (the "License");
      6 # you may not use this file except in compliance with the License.
      7 # You may obtain a copy of the License at
      8 #
      9 #       http://www.apache.org/licenses/LICENSE-2.0
     10 #
     11 # Unless required by applicable law or agreed to in writing, software
     12 # distributed under the License is distributed on an "AS IS" BASIS,
     13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 # See the License for the specific language governing permissions and
     15 # limitations under the License.
     16 
     17 """Module for generating CTS test descriptions and test plans."""
     18 
     19 import glob
     20 import os
     21 import re
     22 import shutil
     23 import string
     24 import subprocess
     25 import sys
     26 import xml.dom.minidom as dom
     27 from cts import tools
     28 from multiprocessing import Pool
     29 
     30 def GetSubDirectories(root):
     31   """Return all directories under the given root directory."""
     32   return [x for x in os.listdir(root) if os.path.isdir(os.path.join(root, x))]
     33 
     34 def ReadFileLines(filePath):
     35   """Reads a file and returns its contents as a line list."""
     36   f = open(filePath, 'r');
     37   lines = [line.strip() for line in f.readlines()]
     38   f.close()
     39   return lines
     40 
     41 def ReadDeqpTestList(testRoot, file):
     42   """Reads a file, converts test names from deqp to CTS format, and returns
     43   its contents as a line list.
     44   """
     45   REPO_ROOT = os.path.join(testRoot, "../../..")
     46   f = open(os.path.join(REPO_ROOT, "external/deqp/android/cts", file), 'r');
     47   lines = [string.join(line.strip().rsplit('.',1),'#') for line in f.readlines()]
     48   f.close()
     49   return lines
     50 
     51 def GetMakeFileVars(makefile_path):
     52   """Extracts variable definitions from the given make file.
     53 
     54   Args:
     55     makefile_path: Path to the make file.
     56 
     57   Returns:
     58     A dictionary mapping variable names to their assigned value.
     59   """
     60   result = {}
     61   pattern = re.compile(r'^\s*([^:#=\s]+)\s*:=\s*(.*?[^\\])$', re.MULTILINE + re.DOTALL)
     62   stream = open(makefile_path, 'r')
     63   content = stream.read()
     64   for match in pattern.finditer(content):
     65     result[match.group(1)] = match.group(2)
     66   stream.close()
     67   return result
     68 
     69 
     70 class CtsBuilder(object):
     71   """Main class for generating test descriptions and test plans."""
     72 
     73   def __init__(self, argv):
     74     """Initialize the CtsBuilder from command line arguments."""
     75     if len(argv) != 6:
     76       print 'Usage: %s <testRoot> <ctsOutputDir> <tempDir> <androidRootDir> <docletPath>' % argv[0]
     77       print ''
     78       print 'testRoot:       Directory under which to search for CTS tests.'
     79       print 'ctsOutputDir:   Directory in which the CTS repository should be created.'
     80       print 'tempDir:        Directory to use for storing temporary files.'
     81       print 'androidRootDir: Root directory of the Android source tree.'
     82       print 'docletPath:     Class path where the DescriptionGenerator doclet can be found.'
     83       sys.exit(1)
     84     self.test_root = sys.argv[1]
     85     self.out_dir = sys.argv[2]
     86     self.temp_dir = sys.argv[3]
     87     self.android_root = sys.argv[4]
     88     self.doclet_path = sys.argv[5]
     89 
     90     self.test_repository = os.path.join(self.out_dir, 'repository/testcases')
     91     self.plan_repository = os.path.join(self.out_dir, 'repository/plans')
     92     self.definedplans_repository = os.path.join(self.android_root, 'cts/tests/plans')
     93 
     94   def GenerateTestDescriptions(self):
     95     """Generate test descriptions for all packages."""
     96     pool = Pool(processes=2)
     97 
     98     # generate test descriptions for android tests
     99     results = []
    100     pool.close()
    101     pool.join()
    102     return sum(map(lambda result: result.get(), results))
    103 
    104   def __WritePlan(self, plan, plan_name):
    105     print 'Generating test plan %s' % plan_name
    106     plan.Write(os.path.join(self.plan_repository, plan_name + '.xml'))
    107 
    108   def GenerateTestPlans(self):
    109     """Generate default test plans."""
    110     # TODO: Instead of hard-coding the plans here, use a configuration file,
    111     # such as test_defs.xml
    112     packages = []
    113     descriptions = sorted(glob.glob(os.path.join(self.test_repository, '*.xml')))
    114     for description in descriptions:
    115       doc = tools.XmlFile(description)
    116       packages.append(doc.GetAttr('TestPackage', 'appPackageName'))
    117     # sort the list to give the same sequence based on name
    118     packages.sort()
    119 
    120     plan = tools.TestPlan(packages)
    121     plan.Exclude('android\.car')
    122     plan.Exclude('android\.performance.*')
    123     self.__WritePlan(plan, 'CTS')
    124     self.__WritePlan(plan, 'CTS-TF')
    125 
    126     plan = tools.TestPlan(packages)
    127     plan.Exclude('android\.car')
    128     plan.Exclude('android\.performance.*')
    129     plan.Exclude('android\.media\.cts\.StreamingMediaPlayerTest.*')
    130     # Test plan to not include media streaming tests
    131     self.__WritePlan(plan, 'CTS-No-Media-Stream')
    132 
    133     plan = tools.TestPlan(packages)
    134     plan.Exclude('android\.car')
    135     plan.Exclude('android\.performance.*')
    136     self.__WritePlan(plan, 'SDK')
    137 
    138     plan.Exclude(r'android\.signature')
    139     plan.Exclude(r'android\.core.*')
    140     self.__WritePlan(plan, 'Android')
    141 
    142     plan = tools.TestPlan(packages)
    143     plan.Include(r'android\.core\.tests.*')
    144     plan.Exclude(r'android\.core\.tests\.libcore\.package\.harmony*')
    145     self.__WritePlan(plan, 'Java')
    146 
    147     # TODO: remove this once the tests are fixed and merged into Java plan above.
    148     plan = tools.TestPlan(packages)
    149     plan.Include(r'android\.core\.tests\.libcore\.package\.harmony*')
    150     self.__WritePlan(plan, 'Harmony')
    151 
    152     plan = tools.TestPlan(packages)
    153     plan.Include(r'android\.core\.vm-tests-tf')
    154     self.__WritePlan(plan, 'VM-TF')
    155 
    156     plan = tools.TestPlan(packages)
    157     plan.Include(r'android\.tests\.appsecurity')
    158     self.__WritePlan(plan, 'AppSecurity')
    159 
    160     # hard-coded white list for PDK plan
    161     plan.Exclude('.*')
    162     plan.Include('android\.aadb')
    163     plan.Include('android\.bluetooth')
    164     plan.Include('android\.graphics.*')
    165     plan.Include('android\.hardware')
    166     plan.Include('android\.media')
    167     plan.Exclude('android\.mediastress')
    168     plan.Include('android\.net')
    169     plan.Include('android\.opengl.*')
    170     plan.Include('android\.renderscript')
    171     plan.Include('android\.telephony')
    172     plan.Include('android\.nativemedia.*')
    173     plan.Include('com\.android\.cts\..*')#TODO(stuartscott): Should PDK have all these?
    174     plan.Exclude('android\.car')
    175     self.__WritePlan(plan, 'PDK')
    176 
    177     temporarily_known_failure_tests = BuildCtsTemporarilyKnownFailureList();
    178     flaky_tests = BuildCtsFlakyTestList()
    179     releasekey_tests = BuildListForReleaseBuildTest()
    180 
    181     # CTS Stable plan
    182     plan = tools.TestPlan(packages)
    183     plan.Exclude('android\.car')
    184     plan.Exclude(r'android\.browser')
    185     for package, test_list in flaky_tests.iteritems():
    186       plan.ExcludeTests(package, test_list)
    187     for package, test_list in releasekey_tests.iteritems():
    188       plan.ExcludeTests(package, test_list)
    189     self.__WritePlan(plan, 'CTS-stable')
    190 
    191     # CTS Flaky plan - list of tests known to be flaky in lab environment
    192     plan = tools.TestPlan(packages)
    193     plan.Exclude('.*')
    194     plan.Include(r'android\.browser')
    195     for package, test_list in flaky_tests.iteritems():
    196       plan.Include(package+'$')
    197       plan.IncludeTests(package, test_list)
    198     self.__WritePlan(plan, 'CTS-flaky')
    199 
    200     small_tests = BuildAospSmallSizeTestList()
    201     medium_tests = BuildAospMediumSizeTestList()
    202     new_test_packages = BuildCtsVettedNewPackagesList()
    203 
    204     # CTS - sub plan for public, small size tests
    205     plan = tools.TestPlan(packages)
    206     plan.Exclude('.*')
    207     for package, test_list in small_tests.iteritems():
    208       plan.Include(package+'$')
    209     plan.Exclude(r'android\.browser')
    210     for package, test_list in flaky_tests.iteritems():
    211       plan.ExcludeTests(package, test_list)
    212     for package, test_list in releasekey_tests.iteritems():
    213       plan.ExcludeTests(package, test_list)
    214     self.__WritePlan(plan, 'CTS-kitkat-small')
    215     self.__WritePlan(plan, 'CTS-public-small')
    216 
    217     # CTS - sub plan for public, medium size tests
    218     plan = tools.TestPlan(packages)
    219     plan.Exclude('.*')
    220     for package, test_list in medium_tests.iteritems():
    221       plan.Include(package+'$')
    222     plan.Exclude(r'android\.browser')
    223     for package, test_list in flaky_tests.iteritems():
    224       plan.ExcludeTests(package, test_list)
    225     for package, test_list in releasekey_tests.iteritems():
    226       plan.ExcludeTests(package, test_list)
    227     self.__WritePlan(plan, 'CTS-kitkat-medium')
    228     self.__WritePlan(plan, 'CTS-public-medium')
    229 
    230     # CTS - sub plan for hardware tests which is public, large
    231     plan = tools.TestPlan(packages)
    232     plan.Exclude('.*')
    233     plan.Include(r'android\.hardware$')
    234     plan.Exclude(r'android\.browser')
    235     for package, test_list in flaky_tests.iteritems():
    236       plan.ExcludeTests(package, test_list)
    237     for package, test_list in releasekey_tests.iteritems():
    238       plan.ExcludeTests(package, test_list)
    239     self.__WritePlan(plan, 'CTS-hardware')
    240 
    241     # CTS - sub plan for camera tests which is public, large
    242     plan = tools.TestPlan(packages)
    243     plan.Exclude('.*')
    244     plan.Include(r'android\.camera$')
    245     misc_camera_tests = BuildCtsMiscCameraList()
    246     for package, test_list in misc_camera_tests.iteritems():
    247       plan.Include(package+'$')
    248       plan.IncludeTests(package, test_list)
    249     for package, test_list in flaky_tests.iteritems():
    250       plan.ExcludeTests(package, test_list)
    251     for package, test_list in releasekey_tests.iteritems():
    252       plan.ExcludeTests(package, test_list)
    253     self.__WritePlan(plan, 'CTS-camera')
    254 
    255     # CTS - sub plan for media tests which is public, large
    256     plan = tools.TestPlan(packages)
    257     plan.Exclude('.*')
    258     plan.Include(r'android\.media$')
    259     plan.Include(r'android\.view$')
    260     plan.Exclude(r'android\.browser')
    261     for package, test_list in flaky_tests.iteritems():
    262       plan.ExcludeTests(package, test_list)
    263     for package, test_list in releasekey_tests.iteritems():
    264       plan.ExcludeTests(package, test_list)
    265     self.__WritePlan(plan, 'CTS-media')
    266 
    267     # CTS - sub plan for mediastress tests which is public, large
    268     plan = tools.TestPlan(packages)
    269     plan.Exclude('.*')
    270     plan.Include(r'android\.mediastress$')
    271     plan.Exclude(r'android\.browser')
    272     for package, test_list in flaky_tests.iteritems():
    273       plan.ExcludeTests(package, test_list)
    274     for package, test_list in releasekey_tests.iteritems():
    275       plan.ExcludeTests(package, test_list)
    276     self.__WritePlan(plan, 'CTS-mediastress')
    277 
    278     # CTS - sub plan for new tests that is vetted for L launch
    279     plan = tools.TestPlan(packages)
    280     plan.Exclude('.*')
    281     for package, test_list in new_test_packages.iteritems():
    282       plan.Include(package+'$')
    283     plan.Exclude(r'android\.browser')
    284     for package, test_list in flaky_tests.iteritems():
    285       plan.ExcludeTests(package, test_list)
    286     for package, test_list in releasekey_tests.iteritems():
    287       plan.ExcludeTests(package, test_list)
    288     self.__WritePlan(plan, 'CTS-l-tests')
    289 
    290     # CTS - sub plan for tests in drawelement packages
    291     plan = tools.TestPlan(packages)
    292     plan.Exclude('.*')
    293     plan.Include(r'com\.drawelements\.')
    294     plan.IncludeTests('com.drawelements.deqp.egl', ReadDeqpTestList(self.test_root, 'mnc/egl-master.txt'))
    295     plan.IncludeTests('com.drawelements.deqp.gles2', ReadDeqpTestList(self.test_root, 'mnc/gles2-master.txt'))
    296     plan.IncludeTests('com.drawelements.deqp.gles3', ReadDeqpTestList(self.test_root, 'mnc/gles3-master.txt'))
    297     plan.IncludeTests('com.drawelements.deqp.gles31', ReadDeqpTestList(self.test_root, 'mnc/gles31-master.txt'))
    298     self.__WritePlan(plan, 'CTS-DEQP')
    299 
    300     plan = tools.TestPlan(packages)
    301     plan.Exclude('.*')
    302     plan.Include(r'com\.drawelements\.')
    303     plan.ExcludeTests('com.drawelements.deqp.egl', ReadDeqpTestList(self.test_root, 'mnc/egl-master.txt'))
    304     plan.ExcludeTests('com.drawelements.deqp.gles2', ReadDeqpTestList(self.test_root, 'mnc/gles2-master.txt'))
    305     plan.ExcludeTests('com.drawelements.deqp.gles3', ReadDeqpTestList(self.test_root, 'mnc/gles3-master.txt'))
    306     plan.ExcludeTests('com.drawelements.deqp.gles31', ReadDeqpTestList(self.test_root, 'mnc/gles31-master.txt'))
    307     self.__WritePlan(plan, 'CTS-DEQP-for-next-rel')
    308 
    309     # CTS - sub plan for new test packages added for staging
    310     plan = tools.TestPlan(packages)
    311     for package, test_list in small_tests.iteritems():
    312       plan.Exclude(package+'$')
    313     for package, test_list in medium_tests.iteritems():
    314       plan.Exclude(package+'$')
    315     for package, tests_list in new_test_packages.iteritems():
    316       plan.Exclude(package+'$')
    317     plan.Exclude(r'com\.drawelements\.')
    318     plan.Exclude(r'android\.hardware$')
    319     plan.Exclude(r'android\.media$')
    320     plan.Exclude(r'android\.view$')
    321     plan.Exclude(r'android\.mediastress$')
    322     plan.Exclude(r'android\.browser')
    323     plan.Exclude('android\.car')
    324     for package, test_list in flaky_tests.iteritems():
    325       plan.ExcludeTests(package, test_list)
    326     for package, test_list in releasekey_tests.iteritems():
    327       plan.ExcludeTests(package, test_list)
    328     self.__WritePlan(plan, 'CTS-m-tests')
    329 
    330 
    331     # CTS - sub plan for new test packages added for staging
    332     plan = tools.TestPlan(packages)
    333     plan.Exclude('.*')
    334     for package, test_list in temporarily_known_failure_tests.iteritems():
    335       plan.Include(package+'$')
    336       plan.IncludeTests(package, test_list)
    337     self.__WritePlan(plan, 'CTS-staging')
    338 
    339     plan = tools.TestPlan(packages)
    340     plan.Exclude('.*')
    341     self.__WritePlan(plan, 'CTS-webview')
    342 
    343     # CTS - sub plan for Security
    344     plan = tools.TestPlan(packages)
    345     plan.Exclude('.*')
    346     plan.Include(r'android\.security$')
    347     plan.Include('android\.host\.jdwpsecurity$')
    348     plan.Include('android\.host\.abioverride$')
    349     self.__WritePlan(plan, 'Security')
    350 
    351 def BuildAospMediumSizeTestList():
    352   """ Construct a defaultdic that lists package names of medium tests
    353       already published to aosp. """
    354   return {
    355       'android.app' : [],
    356       'android.core.tests.libcore.package.libcore' : [],
    357       'android.core.tests.libcore.package.org' : [],
    358       'android.core.vm-tests-tf' : [],
    359       'android.dpi' : [],
    360       'android.host.security' : [],
    361       'android.net' : [],
    362       'android.os' : [],
    363       'android.permission2' : [],
    364       'android.security' : [],
    365       'android.telephony' : [],
    366       'android.webkit' : [],
    367       'android.widget' : [],
    368       'android.browser' : []}
    369 
    370 def BuildAospSmallSizeTestList():
    371   """ Construct a default dict that lists packages names of small tests
    372       already published to aosp. """
    373   return {
    374       'android.aadb' : [],
    375       'android.acceleration' : [],
    376       'android.accessibility' : [],
    377       'android.accessibilityservice' : [],
    378       'android.accounts' : [],
    379       'android.admin' : [],
    380       'android.animation' : [],
    381       'android.appsecurity' : [],
    382       'android.bionic' : [],
    383       'android.bluetooth' : [],
    384       'android.calendarcommon' : [],
    385       'android.content' : [],
    386       'android.core.tests.libcore.package.com' : [],
    387       'android.core.tests.libcore.package.conscrypt' : [],
    388       'android.core.tests.libcore.package.dalvik' : [],
    389       'android.core.tests.libcore.package.sun' : [],
    390       'android.core.tests.libcore.package.tests' : [],
    391       'android.database' : [],
    392       'android.dram' : [],
    393       'android.dreams' : [],
    394       'android.drm' : [],
    395       'android.effect' : [],
    396       'android.filesystem' : [],
    397       'android.gesture' : [],
    398       'android.graphics' : [],
    399       'android.graphics2' : [],
    400       'android.jni' : [],
    401       'android.keystore' : [],
    402       'android.location' : [],
    403       'android.nativemedia.sl' : [],
    404       'android.nativemedia.xa' : [],
    405       'android.ndef' : [],
    406       'android.opengl' : [],
    407       'android.openglperf' : [],
    408       'android.permission' : [],
    409       'android.preference' : [],
    410       'android.preference2' : [],
    411       'android.provider' : [],
    412       'android.renderscript' : [],
    413       'android.rscpp' : [],
    414       'android.rsg' : [],
    415       'android.sax' : [],
    416       'android.server' : [],
    417       'android.signature' : [],
    418       'android.simplecpu' : [],
    419       'android.simpleperf' : [],
    420       'android.speech' : [],
    421       'android.text' : [],
    422       'android.textureview' : [],
    423       'android.theme' : [],
    424       'android.usb' : [],
    425       'android.util' : [],
    426       'android.video' : [],
    427       'com.android.cts.jank' : [],
    428       'com.android.cts.jank2' : [],
    429       'com.android.cts.opengl' : [],
    430       'com.android.cts.ui' : [],
    431       'com.android.cts.uihost' : [],
    432       'zzz.android.monkey' : []}
    433 
    434 def BuildCtsVettedNewPackagesList():
    435   """ Construct a defaultdict that maps package names that is vetted for L. """
    436   return {
    437       'android.JobScheduler' : [],
    438       'android.core.tests.libcore.package.harmony_annotation' : [],
    439       'android.core.tests.libcore.package.harmony_beans' : [],
    440       'android.core.tests.libcore.package.harmony_java_io' : [],
    441       'android.core.tests.libcore.package.harmony_java_lang' : [],
    442       'android.core.tests.libcore.package.harmony_java_math' : [],
    443       'android.core.tests.libcore.package.harmony_java_net' : [],
    444       'android.core.tests.libcore.package.harmony_java_nio' : [],
    445       'android.core.tests.libcore.package.harmony_java_util' : [],
    446       'android.core.tests.libcore.package.harmony_java_text' : [],
    447       'android.core.tests.libcore.package.harmony_javax_security' : [],
    448       'android.core.tests.libcore.package.harmony_logging' : [],
    449       'android.core.tests.libcore.package.harmony_prefs' : [],
    450       'android.core.tests.libcore.package.harmony_sql' : [],
    451       'android.core.tests.libcore.package.jsr166' : [],
    452       'android.core.tests.libcore.package.okhttp' : [],
    453       'android.display' : [],
    454       'android.host.theme' : [],
    455       'android.jdwp' : [],
    456       'android.location2' : [],
    457       'android.print' : [],
    458       'android.renderscriptlegacy' : [],
    459       'android.signature' : [],
    460       'android.tv' : [],
    461       'android.uiautomation' : [],
    462       'android.uirendering' : []}
    463 
    464 def BuildListForReleaseBuildTest():
    465   """ Construct a defaultdict that maps package name to a list of tests
    466       that are expected to pass only when running against a user/release-key build. """
    467   return {
    468       'android.app' : [
    469           'android.app.cts.ActivityManagerTest#testIsRunningInTestHarness',],
    470       'android.dpi' : [
    471           'android.dpi.cts.DefaultManifestAttributesSdkTest#testPackageHasExpectedSdkVersion',],
    472       'android.host.security' : [
    473           'android.cts.security.SELinuxHostTest#testAllEnforcing',
    474           'android.cts.security.SELinuxHostTest#testSuDomain',],
    475       'android.os' : [
    476           'android.os.cts.BuildVersionTest#testReleaseVersion',
    477           'android.os.cts.BuildTest#testIsSecureUserBuild',],
    478       'android.security' : [
    479           'android.security.cts.BannedFilesTest#testNoSu',
    480           'android.security.cts.BannedFilesTest#testNoSuInPath',
    481           'android.security.cts.PackageSignatureTest#testPackageSignatures',
    482           'android.security.cts.SELinuxDomainTest#testSuDomain',],
    483       '' : []}
    484 
    485 def BuildCtsFlakyTestList():
    486   """ Construct a defaultdict that maps package name to a list of tests
    487       that flaky during dev cycle and cause other subsequent tests to fail. """
    488   return {
    489       'android.camera' : [
    490           'android.hardware.cts.CameraTest#testVideoSnapshot',
    491           'android.hardware.cts.CameraGLTest#testCameraToSurfaceTextureMetadata',
    492           'android.hardware.cts.CameraGLTest#testSetPreviewTextureBothCallbacks',
    493           'android.hardware.cts.CameraGLTest#testSetPreviewTexturePreviewCallback',],
    494       'android.media' : [
    495           'android.media.cts.DecoderTest#testCodecResetsH264WithSurface',
    496           'android.media.cts.StreamingMediaPlayerTest#testHLS',],
    497       'android.net' : [
    498           'android.net.cts.ConnectivityManagerTest#testStartUsingNetworkFeature_enableHipri',
    499           'android.net.cts.DnsTest#testDnsWorks',
    500           'android.net.cts.SSLCertificateSocketFactoryTest#testCreateSocket',
    501           'android.net.cts.SSLCertificateSocketFactoryTest#test_createSocket_bind',
    502           'android.net.cts.SSLCertificateSocketFactoryTest#test_createSocket_simple',
    503           'android.net.cts.SSLCertificateSocketFactoryTest#test_createSocket_wrapping',
    504           'android.net.cts.TrafficStatsTest#testTrafficStatsForLocalhost',
    505           'android.net.wifi.cts.NsdManagerTest#testAndroidTestCaseSetupProperly',],
    506       'android.security' : [
    507           'android.security.cts.ListeningPortsTest#testNoRemotelyAccessibleListeningUdp6Ports',
    508           'android.security.cts.ListeningPortsTest#testNoRemotelyAccessibleListeningUdpPorts',],
    509       'android.webkit' : [
    510           'android.webkit.cts.WebViewClientTest#testOnUnhandledKeyEvent',],
    511       'com.android.cts.filesystemperf' : [
    512           'com.android.cts.filesystemperf.RandomRWTest#testRandomRead',
    513           'com.android.cts.filesystemperf.RandomRWTest#testRandomUpdate',],
    514       '' : []}
    515 
    516 def BuildCtsTemporarilyKnownFailureList():
    517   """ Construct a defaultdict that maps package name to a list of tests
    518       that are known failures during dev cycle but expected to be fixed before launch """
    519   return {
    520       'android.alarmclock' : [
    521           'android.alarmclock.cts.DismissAlarmTest#testAll',
    522           'android.alarmclock.cts.SetAlarmTest#testAll',
    523           'android.alarmclock.cts.SnoozeAlarmTest#testAll',
    524       ],
    525       'android.dumpsys' : [
    526           'android.dumpsys.cts.DumpsysHostTest#testBatterystatsOutput',
    527           'android.dumpsys.cts.DumpsysHostTest#testGfxinfoFramestats',
    528       ],
    529       'android.telecom' : [
    530           'android.telecom.cts.ExtendedInCallServiceTest#testAddNewOutgoingCallAndThenDisconnect',
    531           'android.telecom.cts.RemoteConferenceTest#testRemoteConferenceCallbacks_ConferenceableConnections',
    532       ],
    533       'android.transition' : [
    534           'android.transition.cts.ChangeScrollTest#testChangeScroll',
    535       ],
    536       'android.voicesettings' : [
    537           'android.voicesettings.cts.ZenModeTest#testAll',
    538       ],
    539       'android.systemui.cts' : [
    540           'android.systemui.cts.LightStatusBarTests#testLightStatusBarIcons',
    541       ],
    542       'com.android.cts.app.os' : [
    543           'com.android.cts.app.os.OsHostTests#testNonExportedActivities',
    544       ],
    545       'com.android.cts.devicepolicy' : [
    546           'com.android.cts.devicepolicy.MixedDeviceOwnerTest#testPackageInstallUserRestrictions',
    547           'com.android.cts.devicepolicy.MixedProfileOwnerTest#testPackageInstallUserRestrictions',
    548       ],
    549       '' : []}
    550 
    551 def BuildCtsMiscCameraList():
    552   """ Construct a defaultdict that maps package name to a list of tests
    553       that are relevant to camera but does not reside in camera test package """
    554   return {
    555       'android.app' : [
    556           'android.app.cts.SystemFeaturesTest#testCameraFeatures',
    557       ],
    558       'android.permission' : [
    559           'android.permission.cts.CameraPermissionTest',
    560           'android.permission.cts.Camera2PermissionTest',
    561       ],
    562       '' : []}
    563 
    564 def LogGenerateDescription(name):
    565   print 'Generating test description for package %s' % name
    566 
    567 if __name__ == '__main__':
    568   builder = CtsBuilder(sys.argv)
    569   result = builder.GenerateTestDescriptions()
    570   if result != 0:
    571     sys.exit(result)
    572   builder.GenerateTestPlans()
    573