Revision control
Copy as Markdown
#!/usr/bin/env python3
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# Purpose: Run various smoke tests against this application-services working tree.
# Requirements:
# - python
# - application-services built and working.
# For the mac builds:
# - xcpretty (`gem install xcpretty`)
# - xcode + xcodebuild + xcodetools setup and running (a successful build of the firefox-ios repository)
# Arguments:
# --action => Can be either `run-tests` (default) or `build-without-testing`
# --use_local_firefox_ios => Use a local firefox-ios repository instead (at the provided path).
# --verbose => Includes the stdout of subprocesses (like the xcodebuild output, or other bootstrapping scripts)
# --allow-clears => Clear existing uniffi bindings, swift files, and so on during the various build processes.
# --use-local-firefox-ios => Use a local copy of firefox-ios instead of cloning it for iOS tests. Exclusive with `remote-ios-repo-url`
# --remote-ios-repo-url => Clone a different firefox-ios repository for iOS tests. Exclusive with `use-local-firefox-ios`
# --ios-scheme => The scheme to run for iOS tests. Likely: `Fennec` (default) or `Firefox`
# --ios-test-plan => The test plan to test with for iOS tests. Likely: `Smoketest` (default) or `FullFunctionalTestPlan`
import argparse
import time
from shared import err_msg, step_msg
from build_against_hnt import build_against_hnt
from build_against_fenix import build_against_fenix
from build_against_ios import build_against_ios
parser = argparse.ArgumentParser(
description="Run groups of tests against this application-services working tree."
)
group = parser.add_mutually_exclusive_group()
parser.add_argument(
"--firefox-dir",
required=True,
help="Path to existing bootstrapped `mozilla-central` directory.",
)
parser.add_argument(
"--verbose",
help="Display subprocess logs for compilation processes (off by default).",
action=argparse.BooleanOptionalAction,
)
parser.add_argument(
"--allow-clears",
help="Clear existing uniffi bindings, swift files, and so on during the various build processes (what gets cleared varies per platform test).",
action=argparse.BooleanOptionalAction,
)
parser.add_argument(
"--action",
required=True,
choices=["run-tests", "build-without-testing"],
help="Run the following action for target's test",
)
# iOS arguments to pass down
group = parser.add_mutually_exclusive_group()
group.add_argument(
"--use-local-firefox-ios",
metavar="LOCAL_IOS_REPO_PATH",
help="Use a local copy of firefox-ios instead of cloning it for iOS tests. Exclusive with `remote-ios-repo-url`",
)
group.add_argument(
"--remote-ios-repo-url",
metavar="REMOTE_REPO_PATH",
help="Clone a different firefox-ios repository for iOS tests. Exclusive with `use-local-firefox-ios`",
)
parser.add_argument(
"--ios-scheme",
help="The scheme to run for iOS tests. Likely: `Fennec` (default) or `Firefox`",
default="Fennec",
)
parser.add_argument(
"--ios-test-plan",
help="The test plan to test with for iOS tests. Likely: `Smoketest` (default) or `FullFunctionalTestPlan`",
default="Smoketest",
)
# HNT argument to pass down
parser.add_argument(
"--hnt-test",
help="Name of the test file to run, as if you were running `./mach test ARG`.",
)
# Fenix arguments to pass down
parser.add_argument(
"--prefix-ff",
help="Prefix name to pass to mozilla-central gradlew compilation to reduce the amount needing to build or test. For example: `geckoview`, `fenix`, `focus`.",
default="fenix",
)
args = parser.parse_args()
firefox_dir = args.firefox_dir
verbose = args.verbose if args.verbose else False
allow_clears = args.allow_clears
action = args.action
local_firefox_ios = args.use_local_firefox_ios
remote_ios_repo_url = args.remote_ios_repo_url
ios_scheme = args.ios_scheme
ios_test_plan = args.ios_test_plan
hnt_test = args.hnt_test
prefix_ff = args.prefix_ff
# Build against iOS
start_time_ios = time.time()
success_ios = build_against_ios(
local_firefox_ios,
remote_ios_repo_url,
ios_scheme,
ios_test_plan,
clear_previous_bindings=allow_clears,
clean_ios_caches=allow_clears,
verbose=verbose,
action=action,
)
time_diff_ios = time.time() - start_time_ios
# Build against Fenix
start_time_fenix = time.time()
success_fenix = build_against_fenix(
firefox_dir,
None,
prefix_ff,
prefix_as=None,
clear_bindings=allow_clears,
verbose=verbose,
action=action,
)
time_diff_fenix = time.time() - start_time_fenix
# Build against Desktop
start_time_hnt = time.time()
success_hnt = build_against_hnt(firefox_dir, None, True, hnt_test=hnt_test, verbose=verbose, action=action)
time_diff_hnt = time.time() - start_time_hnt
did_tests_string = "" if action != "run-tests" else " (and tested)"
do_tests_string = "" if action != "run-tests" else " (and test)"
step_msg("Finished building. Results:")
if success_ios:
step_msg(
f"Successfully built{did_tests_string} against iOS (elapsed {time_diff_ios:.2f}s)"
)
else:
err_msg(
f"Failed to build{do_tests_string} against iOS (elapsed {time_diff_ios:.2f}s)"
)
if success_fenix:
step_msg(
f"Successfully built{did_tests_string} against Fenix (elapsed {time_diff_fenix:.2f}s)"
)
else:
err_msg(
f"Failed to build{do_tests_string} against Fenix (elapsed {time_diff_fenix:.2f}s)"
)
if success_hnt:
step_msg(
f"Successfully built{did_tests_string} against HNT (elapsed {time_diff_hnt:.2f}s)"
)
else:
err_msg(
f"Failed to build{do_tests_string} against HNT (elapsed {time_diff_hnt:.2f}s)"
)