ui_tests.py (4189B)
1 # This Source Code Form is subject to the terms of the Mozilla Public 2 # License, v. 2.0. If a copy of the MPL was not distributed with this 3 # file, You can obtain one at http://mozilla.org/MPL/2.0/. 4 5 import os 6 7 from taskgraph.transforms.base import TransformSequence 8 9 transforms = TransformSequence() 10 11 12 _ANDROID_TASK_NAME_PREFIX = "android-" 13 14 15 @transforms.add 16 def set_component_attribute(config, tasks): 17 for task in tasks: 18 component_name = task.pop("component", None) 19 if not component_name: 20 task_name = task["name"] 21 if task_name.startswith(_ANDROID_TASK_NAME_PREFIX): 22 component_name = task_name[len(_ANDROID_TASK_NAME_PREFIX) :] 23 else: 24 raise NotImplementedError( 25 f"Cannot determine component name from task {task_name}" 26 ) 27 28 attributes = task.setdefault("attributes", {}) 29 attributes["component"] = component_name 30 31 yield task 32 33 34 @transforms.add 35 def define_ui_test_command_line(config, tasks): 36 def apk_path(component_fragment, variant, apk_filename): 37 return os.path.join( 38 "/builds/worker/workspace/obj-build", 39 "gradle/build", 40 f"mobile/android/android-components/{component_fragment}", 41 f"outputs/apk/{variant}", 42 apk_filename, 43 ) 44 45 for task in tasks: 46 component = task["attributes"]["component"] 47 flank_config = "components/arm.yml" 48 49 apk_app, apk_test = None, None 50 51 if component == "samples-browser": 52 # Case 2: Exact match for "samples-browser" – gecko paths with "-debug" 53 apk_app = apk_path( 54 "samples/browser", "gecko/debug", "samples-browser-gecko-debug.apk" 55 ) 56 apk_test = apk_path( 57 "samples/browser", 58 "androidTest/gecko/debug", 59 "samples-browser-gecko-debug-androidTest.apk", 60 ) 61 62 elif component.startswith("samples-"): 63 # Case 3: Other samples-* (e.g., samples-glean) 64 sample = component.replace("samples-", "") 65 apk_app = apk_path( 66 f"samples/{sample}", "debug", f"samples-{sample}-debug.apk" 67 ) 68 apk_test = apk_path( 69 f"samples/{sample}", 70 "androidTest/debug", 71 f"samples-{sample}-debug-androidTest.apk", 72 ) 73 74 elif "-" in component: 75 # Case 1a: Component with dash (e.g., feature-share → components/feature/share) 76 category, submodule = component.split("-", 1) 77 apk_app = apk_path( 78 "samples/browser", "gecko/debug", "samples-browser-gecko-debug.apk" 79 ) 80 apk_test = apk_path( 81 f"components/{category}/{submodule}", 82 "androidTest/debug", 83 f"{component}-debug-androidTest.apk", 84 ) 85 86 else: 87 # Case 1b: Component with no dash (e.g., browser → components/browser/engine-gecko) 88 apk_app = apk_path( 89 "samples/browser", "gecko/debug", "samples-browser-gecko-debug.apk" 90 ) 91 apk_test = apk_path( 92 f"components/{component}/engine-gecko", 93 "androidTest/debug", 94 "browser-engine-gecko-debug-androidTest.apk", 95 ) 96 97 run = task.setdefault("run", {}) 98 post_gradlew = run.setdefault("post-gradlew", []) 99 post_gradlew.append([ 100 "python3", 101 "taskcluster/scripts/tests/test-lab.py", 102 flank_config, 103 apk_app, 104 "--apk_test", 105 apk_test, 106 ]) 107 108 yield task 109 110 111 @transforms.add 112 def define_treeherder_symbol(config, tasks): 113 for task in tasks: 114 treeherder = task.setdefault("treeherder") 115 treeherder.setdefault("symbol", f"{task['attributes']['component']}(unit)") 116 117 yield task 118 119 120 @transforms.add 121 def define_description(config, tasks): 122 for task in tasks: 123 task.setdefault( 124 "description", 125 f"Run unit/ui tests on device for {task['attributes']['component']}", 126 ) 127 yield task