mirror of
https://github.com/ARM-software/workload-automation.git
synced 2025-06-20 23:36:02 +01:00
fw/workload: Introduce max / min versions for apks
Allow specifying a maximum and minimum version of an APK to be used for a workload.
This commit is contained in:
wa/framework
@ -24,7 +24,7 @@ from wa.framework.exception import ResourceError
|
|||||||
from wa.framework.configuration import settings
|
from wa.framework.configuration import settings
|
||||||
from wa.utils import log
|
from wa.utils import log
|
||||||
from wa.utils.misc import get_object_name
|
from wa.utils.misc import get_object_name
|
||||||
from wa.utils.types import enum, list_or_string, prioritylist
|
from wa.utils.types import enum, list_or_string, prioritylist, version_tuple
|
||||||
|
|
||||||
|
|
||||||
SourcePriority = enum(['package', 'remote', 'lan', 'local',
|
SourcePriority = enum(['package', 'remote', 'lan', 'local',
|
||||||
@ -142,10 +142,12 @@ class ApkFile(Resource):
|
|||||||
|
|
||||||
def __init__(self, owner, variant=None, version=None,
|
def __init__(self, owner, variant=None, version=None,
|
||||||
package=None, uiauto=False, exact_abi=False,
|
package=None, uiauto=False, exact_abi=False,
|
||||||
supported_abi=None):
|
supported_abi=None, min_version=None, max_version=None):
|
||||||
super(ApkFile, self).__init__(owner)
|
super(ApkFile, self).__init__(owner)
|
||||||
self.variant = variant
|
self.variant = variant
|
||||||
self.version = version
|
self.version = version
|
||||||
|
self.max_version = max_version
|
||||||
|
self.min_version = min_version
|
||||||
self.package = package
|
self.package = package
|
||||||
self.uiauto = uiauto
|
self.uiauto = uiauto
|
||||||
self.exact_abi = exact_abi
|
self.exact_abi = exact_abi
|
||||||
@ -158,11 +160,15 @@ class ApkFile(Resource):
|
|||||||
def match(self, path):
|
def match(self, path):
|
||||||
name_matches = True
|
name_matches = True
|
||||||
version_matches = True
|
version_matches = True
|
||||||
|
version_range_matches = True
|
||||||
package_matches = True
|
package_matches = True
|
||||||
abi_matches = True
|
abi_matches = True
|
||||||
uiauto_matches = uiauto_test_matches(path, self.uiauto)
|
uiauto_matches = uiauto_test_matches(path, self.uiauto)
|
||||||
if self.version:
|
if self.version:
|
||||||
version_matches = apk_version_matches(path, self.version)
|
version_matches = apk_version_matches(path, self.version)
|
||||||
|
if self.max_version or self.min_version:
|
||||||
|
version_range_matches = apk_version_matches_range(path, self.min_version,
|
||||||
|
self.max_version)
|
||||||
if self.variant:
|
if self.variant:
|
||||||
name_matches = file_name_matches(path, self.variant)
|
name_matches = file_name_matches(path, self.variant)
|
||||||
if self.package:
|
if self.package:
|
||||||
@ -171,8 +177,8 @@ class ApkFile(Resource):
|
|||||||
abi_matches = apk_abi_matches(path, self.supported_abi,
|
abi_matches = apk_abi_matches(path, self.supported_abi,
|
||||||
self.exact_abi)
|
self.exact_abi)
|
||||||
return name_matches and version_matches and \
|
return name_matches and version_matches and \
|
||||||
uiauto_matches and package_matches and \
|
version_range_matches and uiauto_matches \
|
||||||
abi_matches
|
and package_matches and abi_matches
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
text = '<{}\'s apk'.format(self.owner)
|
text = '<{}\'s apk'.format(self.owner)
|
||||||
@ -283,6 +289,27 @@ def apk_version_matches(path, version):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def apk_version_matches_range(path, min_version=None, max_version=None):
|
||||||
|
info = ApkInfo(path)
|
||||||
|
return range_version_matching(info.version_name, min_version, max_version)
|
||||||
|
|
||||||
|
|
||||||
|
def range_version_matching(apk_version, min_version=None, max_version=None):
|
||||||
|
if not apk_version:
|
||||||
|
return False
|
||||||
|
apk_version = version_tuple(apk_version)
|
||||||
|
|
||||||
|
if max_version:
|
||||||
|
max_version = version_tuple(max_version)
|
||||||
|
if apk_version > max_version:
|
||||||
|
return False
|
||||||
|
if min_version:
|
||||||
|
min_version = version_tuple(min_version)
|
||||||
|
if apk_version < min_version:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
def loose_version_matching(config_version, apk_version):
|
def loose_version_matching(config_version, apk_version):
|
||||||
config_version = version_tuple(config_version)
|
config_version = version_tuple(config_version)
|
||||||
apk_version = version_tuple(apk_version)
|
apk_version = version_tuple(apk_version)
|
||||||
|
@ -26,7 +26,8 @@ from devlib.utils.android import ApkInfo
|
|||||||
|
|
||||||
from wa.framework.plugin import TargetedPlugin, Parameter
|
from wa.framework.plugin import TargetedPlugin, Parameter
|
||||||
from wa.framework.resource import (ApkFile, ReventFile,
|
from wa.framework.resource import (ApkFile, ReventFile,
|
||||||
File, loose_version_matching)
|
File, loose_version_matching,
|
||||||
|
range_version_matching)
|
||||||
from wa.framework.exception import WorkloadError, ConfigError
|
from wa.framework.exception import WorkloadError, ConfigError
|
||||||
from wa.utils.types import ParameterDict, list_or_string, version_tuple
|
from wa.utils.types import ParameterDict, list_or_string, version_tuple
|
||||||
from wa.utils.revent import ReventRecorder
|
from wa.utils.revent import ReventRecorder
|
||||||
@ -212,6 +213,16 @@ class ApkWorkload(Workload):
|
|||||||
description="""
|
description="""
|
||||||
The version of the package to be used.
|
The version of the package to be used.
|
||||||
"""),
|
"""),
|
||||||
|
Parameter('max_version', kind=str,
|
||||||
|
default=None,
|
||||||
|
description="""
|
||||||
|
The maximum version of the package to be used.
|
||||||
|
"""),
|
||||||
|
Parameter('min_version', kind=str,
|
||||||
|
default=None,
|
||||||
|
description="""
|
||||||
|
The minimum version of the package to be used.
|
||||||
|
"""),
|
||||||
Parameter('variant', kind=str,
|
Parameter('variant', kind=str,
|
||||||
default=None,
|
default=None,
|
||||||
description="""
|
description="""
|
||||||
@ -287,7 +298,15 @@ class ApkWorkload(Workload):
|
|||||||
exact_abi=self.exact_abi,
|
exact_abi=self.exact_abi,
|
||||||
prefer_host_package=self.prefer_host_package,
|
prefer_host_package=self.prefer_host_package,
|
||||||
clear_data_on_reset=self.clear_data_on_reset,
|
clear_data_on_reset=self.clear_data_on_reset,
|
||||||
activity=self.activity)
|
activity=self.activity,
|
||||||
|
min_version=self.min_version,
|
||||||
|
max_version=self.max_version)
|
||||||
|
|
||||||
|
def validate(self):
|
||||||
|
if self.min_version and self.max_version:
|
||||||
|
if version_tuple(self.min_version) > version_tuple(self.max_version):
|
||||||
|
msg = 'Cannot specify min version ({}) greater than max version ({})'
|
||||||
|
raise ConfigError(msg.format(self.min_version, self.max_version))
|
||||||
|
|
||||||
@once_per_instance
|
@once_per_instance
|
||||||
def initialize(self, context):
|
def initialize(self, context):
|
||||||
@ -678,12 +697,14 @@ class PackageHandler(object):
|
|||||||
def __init__(self, owner, install_timeout=300, version=None, variant=None,
|
def __init__(self, owner, install_timeout=300, version=None, variant=None,
|
||||||
package_name=None, strict=False, force_install=False, uninstall=False,
|
package_name=None, strict=False, force_install=False, uninstall=False,
|
||||||
exact_abi=False, prefer_host_package=True, clear_data_on_reset=True,
|
exact_abi=False, prefer_host_package=True, clear_data_on_reset=True,
|
||||||
activity=None):
|
activity=None, min_version=None, max_version=None):
|
||||||
self.logger = logging.getLogger('apk')
|
self.logger = logging.getLogger('apk')
|
||||||
self.owner = owner
|
self.owner = owner
|
||||||
self.target = self.owner.target
|
self.target = self.owner.target
|
||||||
self.install_timeout = install_timeout
|
self.install_timeout = install_timeout
|
||||||
self.version = version
|
self.version = version
|
||||||
|
self.min_version = min_version
|
||||||
|
self.max_version = max_version
|
||||||
self.variant = variant
|
self.variant = variant
|
||||||
self.package_name = package_name
|
self.package_name = package_name
|
||||||
self.strict = strict
|
self.strict = strict
|
||||||
@ -750,7 +771,9 @@ class PackageHandler(object):
|
|||||||
version=self.version,
|
version=self.version,
|
||||||
package=self.package_name,
|
package=self.package_name,
|
||||||
exact_abi=self.exact_abi,
|
exact_abi=self.exact_abi,
|
||||||
supported_abi=self.supported_abi),
|
supported_abi=self.supported_abi,
|
||||||
|
min_version=self.min_version,
|
||||||
|
max_version=self.max_version),
|
||||||
strict=self.strict)
|
strict=self.strict)
|
||||||
else:
|
else:
|
||||||
available_packages = []
|
available_packages = []
|
||||||
@ -760,7 +783,9 @@ class PackageHandler(object):
|
|||||||
version=self.version,
|
version=self.version,
|
||||||
package=package,
|
package=package,
|
||||||
exact_abi=self.exact_abi,
|
exact_abi=self.exact_abi,
|
||||||
supported_abi=self.supported_abi),
|
supported_abi=self.supported_abi,
|
||||||
|
min_version=self.min_version,
|
||||||
|
max_version=self.max_version),
|
||||||
strict=self.strict)
|
strict=self.strict)
|
||||||
if apk_file:
|
if apk_file:
|
||||||
available_packages.append(apk_file)
|
available_packages.append(apk_file)
|
||||||
@ -781,12 +806,17 @@ class PackageHandler(object):
|
|||||||
if self.target.package_is_installed(package):
|
if self.target.package_is_installed(package):
|
||||||
installed_versions.append(package)
|
installed_versions.append(package)
|
||||||
|
|
||||||
if self.version:
|
if self.version or self.min_version or self.max_version:
|
||||||
matching_packages = []
|
matching_packages = []
|
||||||
for package in installed_versions:
|
for package in installed_versions:
|
||||||
package_version = self.target.get_package_version(package)
|
package_version = self.target.get_package_version(package)
|
||||||
for v in list_or_string(self.version):
|
if self.version:
|
||||||
if loose_version_matching(v, package_version):
|
for v in list_or_string(self.version):
|
||||||
|
if loose_version_matching(v, package_version):
|
||||||
|
matching_packages.append(package)
|
||||||
|
else:
|
||||||
|
if range_version_matching(package_version, self.min_version,
|
||||||
|
self.max_version):
|
||||||
matching_packages.append(package)
|
matching_packages.append(package)
|
||||||
if len(matching_packages) == 1:
|
if len(matching_packages) == 1:
|
||||||
self.package_name = matching_packages[0]
|
self.package_name = matching_packages[0]
|
||||||
|
Reference in New Issue
Block a user