diff options
25 files changed, 0 insertions, 1382 deletions
diff --git a/Android.bp b/Android.bp deleted file mode 100644 index 0ac28da..0000000 --- a/Android.bp +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (C) 2017 The Android Open Source Project -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// A static library containing all the source needed by a Time Zone Data app. -package { - default_applicable_licenses: ["Android-Apache-2.0"], -} - -java_library { - name: "time_zone_distro_provider", - - srcs: ["src/main/**/*.java"], - optimize: { - proguard_flags_files: ["proguard.cfg"], - }, - static_libs: [ - "time_zone_distro_unbundled", - "androidx.annotation_annotation", - ], - sdk_version: "system_current", -} diff --git a/Android.mk b/Android.mk deleted file mode 100644 index 4c33620..0000000 --- a/Android.mk +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright (C) 2017 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Intentionally left empty to hide oem_template/*/Android.mk @@ -1,2 +0,0 @@ -# Bug component: 25699 -include platform/libcore:/OWNERS @@ -1,9 +0,0 @@ -This directory contains code associated with the "Time Zone Data" app, which is a mechanism -for updating time zone rules data on device without needing a full OTA: it is delivered via -OEM-specific signed .apk files. - -The code/files beneath this directory are maintained by Android developers and intended to be -OEM-independent. - -See the oem_template directory for files / directory structures that OEMs are expected to copy -elsewhere and configure. diff --git a/oem_template/README.oem b/oem_template/README.oem deleted file mode 100644 index 94c0e4d..0000000 --- a/oem_template/README.oem +++ /dev/null @@ -1,8 +0,0 @@ -This directory contains an example / suggested structure for OEMs. -Contained within is code for implementing the time zone update feature. - -OEMs are expected to copy the sub-dirs under this directory to appropriate places in their own repos -and customize. - -Further instructions for OEMs can be found by searching for the string "OEM-INSTRUCTION" in the files -beneath this directory. diff --git a/oem_template/data_app/Android.mk b/oem_template/data_app/Android.mk deleted file mode 100644 index dc53ee3..0000000 --- a/oem_template/data_app/Android.mk +++ /dev/null @@ -1,32 +0,0 @@ -# Copyright (C) 2017 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Targets for creating the real signed versions of the time zone data app. - -LOCAL_PATH := $(call my-dir) - -OEM_APP_PATH := $(LOCAL_PATH) - -# Target to build the "real" time zone data app. -include $(CLEAR_VARS) -LOCAL_ASSET_DIR := system/timezone/output_data/distro -TIME_ZONE_DATA_APP_SUFFIX := - -# OEM-INSTRUCTION: OEMs should come up with a suitable versioning strategy. -TIME_ZONE_DATA_APP_VERSION_CODE := 10 -TIME_ZONE_DATA_APP_VERSION_NAME := 10 - -include $(OEM_APP_PATH)/build_oem_data_app.mk - -include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/oem_template/data_app/AndroidManifest.xml b/oem_template/data_app/AndroidManifest.xml deleted file mode 100644 index 1f4046c..0000000 --- a/oem_template/data_app/AndroidManifest.xml +++ /dev/null @@ -1,62 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - --> -<!-- OEM-INSTRUCTION: Change the package attribute to something OEM-specific. --> -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="CHANGE"> - - <!-- - OEM-INSTRUCTION: Change these to match the platform release the app is - for and update for every platform release to ensure the app is only - installed on the release it is targeted for. Typically, all values should - be the same unless two Android releases use the same distro format - version. - - Your app version code strategy and the version of the app included in the - system image should be chosen to prevent older versions of the app being - installed on newer Android devices. - minSdkVersion will prevent newer versions of the app being installed on - older devices. - maxSdkVersion is not used by the device, but can be used by app stores to - prevent the app being shown to users of newer devices. - --> - <uses-sdk android:minSdkVersion="CHANGE" - android:targetSdkVersion="CHANGE" - android:maxSdkVersion="CHANGE" /> - - <!-- - OEM-INSTRUCTION: Optionally restrict the app to an OEM-specific feature, - or remove the element entirely. - --> - <uses-feature - android:name="CHANGE" - android:required="true"/> - - <application - android:allowBackup="false" - android:label="@string/app_name"> - - <provider - android:name="com.android.timezone.data.TimeZoneRulesDataProvider" - android:authorities="com.android.timezone" - android:grantUriPermissions="true" - android:readPermission="android.permission.UPDATE_TIME_ZONE_RULES" - android:exported="true"> - <meta-data android:name="android.timezoneprovider.OPERATION" - android:value="INSTALL"/> - </provider> - </application> -</manifest> diff --git a/oem_template/data_app/README.oem b/oem_template/data_app/README.oem deleted file mode 100644 index f288adf..0000000 --- a/oem_template/data_app/README.oem +++ /dev/null @@ -1,28 +0,0 @@ -This file originates from package/apps/TimeZoneData/oem_template/data_app. - -OEM-INSTRUCTION See below for the purpose of this directory and changes OEMs must make. - -This directory contains a suggested structure for building an OEM version of Time Zone Data app -(real and test versions). - -For example, you can copy it - -cp -r data_app ${ANDROID_BUILD_TOP}/vendor/oemcorp/apps/TimeZoneData - -Where <oemcorp> is your company name. - -...then read / change all the things marked with OEM-INSTRUCTION. - -The intended use is for inclusion in a tapas build to generate .apks. The targets define the -real version of the app, and some test versions that can be used by the supplied xTS tests. - -The generated .apks are expected to be signed and checked in as "prebuilts" for the system -image and for xTS testing. - -The main, signed .apk can also be uploaded to an app store and used to update existing -devices. - -See oem_template/data_app_prebuilts for rules that can be used to include the prebuilts in -the system image and tests. - -See oem_template/xts for rules that can be used for xTS testing. diff --git a/oem_template/data_app/build_oem_data_app.mk b/oem_template/data_app/build_oem_data_app.mk deleted file mode 100644 index 0cb2bc0..0000000 --- a/oem_template/data_app/build_oem_data_app.mk +++ /dev/null @@ -1,59 +0,0 @@ -# Copyright (C) 2017 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# An .mk include file that contains the boilerplate needed to build real and -# test, OEM-specific Time Zone Data apps. -# -# Users should set: -# OEM_APP_PATH - the location of the OEM directory for the app, e.g. one that -# contains the app res/ dir. -# TIME_ZONE_DATA_APP_SUFFIX - the suffix to apply to the package name. Can be -# empty, or contain things like _test1 for test .apk files. -# TIME_ZONE_DATA_APP_VERSION_CODE - the version code for the .apk. -# TIME_ZONE_DATA_APP_VERSION_NAME - the version name for the .apk. -# LOCAL_COMPATIBILITY_SUITE - if the package is to be included in xTS tests. -# -LOCAL_MODULE_TAGS := optional - -# All src comes from an AOSP static library. -LOCAL_STATIC_JAVA_LIBRARIES := time_zone_distro_provider - -# All resources come from the vendor-specific dirs. -LOCAL_RESOURCE_DIR := $(OEM_APP_PATH)/res - -# Ensure the app can be unbundled by only depending on System APIs. -LOCAL_SDK_VERSION := system_current - -LOCAL_FULL_MANIFEST_FILE := $(OEM_APP_PATH)/AndroidManifest.xml - -LOCAL_PACKAGE_NAME := TimeZoneData$(TIME_ZONE_DATA_APP_SUFFIX) -LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 -LOCAL_LICENSE_CONDITIONS := notice - -LOCAL_AAPT_FLAGS := --version-code $(TIME_ZONE_DATA_APP_VERSION_CODE) \ - --version-name $(TIME_ZONE_DATA_APP_VERSION_NAME) - -# OEM-INSTRUCTION: Modify the name, s/oemcorp/<Your company name>/ -LOCAL_MODULE_OWNER := oemcorp - -# The app build is expected to generate a prebuilt, so do not place the app in -# the system image. -LOCAL_UNINSTALLABLE_MODULE := true - -LOCAL_PRODUCT_MODULE := true - -# OEM-INSTRUCTION: Configure your own certificate. -LOCAL_CERTIFICATE := - -include $(BUILD_PACKAGE) diff --git a/oem_template/data_app/res/values/strings.xml b/oem_template/data_app/res/values/strings.xml deleted file mode 100644 index 19a5e45..0000000 --- a/oem_template/data_app/res/values/strings.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - --> - -<resources> - <!-- OEM-INSTRUCTION: Modify the name. This will appear in Settings / apps and app stores. - OEMs will usually want to provide translations too. - --> - <string name="app_name">OEM Corp Time Zone Data</string> -</resources> diff --git a/oem_template/data_app/testing/Android.mk b/oem_template/data_app/testing/Android.mk deleted file mode 100644 index f82f1db..0000000 --- a/oem_template/data_app/testing/Android.mk +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright (C) 2017 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Targets for creating signed test versions of the time zone data app that can be used for -# manual testing and / or xts-type tests. - -LOCAL_PATH := $(call my-dir) - -# Paths used to find files shared with AOSP. -aosp_test_data_path := system/timezone/testing/data - -# Target to build the "test 1" time zone data app. -include $(CLEAR_VARS) -LOCAL_ASSET_DIR := $(aosp_test_data_path)/test1/output_data/distro -TIME_ZONE_DATA_APP_SUFFIX := _test1 - -# OEM-INSTRUCTION: OEMs should come up with a suitable versioning strategy and this version should -# be guaranteed newer than the "real" app. -TIME_ZONE_DATA_APP_VERSION_CODE := 15 -TIME_ZONE_DATA_APP_VERSION_NAME := test1 - -# When built, explicitly put it in the data partition since this is for tests, not the system image. -LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS) - -include $(LOCAL_PATH)/build_oem_test_data_app.mk - - -# Target to build the "test 2" time zone data app. -include $(CLEAR_VARS) -LOCAL_ASSET_DIR := $(aosp_test_data_path)/test2/output_data/distro -TIME_ZONE_DATA_APP_SUFFIX := _test2 - -# OEM-INSTRUCTION: OEMs should come up with a suitable versioning strategy and this version should -# be guaranteed newer than the "real" app. -TIME_ZONE_DATA_APP_VERSION_CODE := 20 -TIME_ZONE_DATA_APP_VERSION_NAME := test2 - -# When built, explicitly put it in the data partition since this is for tests, not the system image. -LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS) - -include $(LOCAL_PATH)/build_oem_test_data_app.mk - -# Tidy up variables. -aosp_test_data_path := diff --git a/oem_template/data_app/testing/build_oem_test_data_app.mk b/oem_template/data_app/testing/build_oem_test_data_app.mk deleted file mode 100644 index 309c726..0000000 --- a/oem_template/data_app/testing/build_oem_test_data_app.mk +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright (C) 2017 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# An .mk include file that contains the boilerplate needed to build test, -# OEM-specific Time Zone Data apps. -# -# Users should set: -# TIME_ZONE_DATA_APP_SUFFIX - the suffix to apply to the package name. -# Should contain things like _test1 for test .apk files. -# TIME_ZONE_DATA_APP_VERSION_CODE - the version code for the .apk. -# TIME_ZONE_DATA_APP_VERSION_NAME - the version name for the .apk. -# - -OEM_APP_PATH := $(LOCAL_PATH)/.. -include $(OEM_APP_PATH)/build_oem_data_app.mk diff --git a/oem_template/data_app_prebuilt/Android.mk b/oem_template/data_app_prebuilt/Android.mk deleted file mode 100644 index ab09e4d..0000000 --- a/oem_template/data_app_prebuilt/Android.mk +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright (C) 2017 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Targets for including the real signed versions of the time zone data app. - -LOCAL_PATH := $(call my-dir) - -# Defines the TimeZoneDataPrebuilt prebuilt target. -include $(CLEAR_VARS) -TIME_ZONE_DATA_APP_SUFFIX := -include $(LOCAL_PATH)/include_app_prebuilt.mk - -include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/oem_template/data_app_prebuilt/README.oem b/oem_template/data_app_prebuilt/README.oem deleted file mode 100644 index 0ce548f..0000000 --- a/oem_template/data_app_prebuilt/README.oem +++ /dev/null @@ -1,21 +0,0 @@ -This file originates from package/apps/TimeZoneData/oem_template/data_app_prebuilt. - -OEM-INSTRUCTION See below for the purpose of this directory and changes OEMs must make. - -This directory contains a suggested structure for including prebuilt .apks in the -system image and tests. - -For example, you can copy it - -cp -r data_app_prebuilt ${ANDROID_BUILD_TOP}/vendor/oemcorp/apps/TimeZoneDataPrebuilt - -Where <oemcorp> is your company name. - -...then read / change all the things marked with OEM-INSTRUCTION. - -The intended use is to include .apk artifacts built using the oem_template/data_app. - -The targets define includes the real version of the app, and some test versions that can be -used by the supplied xTS tests. - -See oem_template/xts for rules that can be used for xTS testing. diff --git a/oem_template/data_app_prebuilt/include_app_prebuilt.mk b/oem_template/data_app_prebuilt/include_app_prebuilt.mk deleted file mode 100644 index ec9939a..0000000 --- a/oem_template/data_app_prebuilt/include_app_prebuilt.mk +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright (C) 2017 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# An .mk include file that contains the boilerplate needed to include real and -# test, OEM-specific Time Zone Data app prebuilts. -# -# Users should set: -# TIME_ZONE_DATA_APP_SUFFIX - the suffix to apply to the package name. Can be -# empty, or contain things like _test1 for test .apk files. -# LOCAL_COMPATIBILITY_SUITE - if the package is to be included in xTS tests. -# - -LOCAL_MODULE := TimeZoneDataPrebuilt$(TIME_ZONE_DATA_APP_SUFFIX) -LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 -LOCAL_LICENSE_CONDITIONS := notice -LOCAL_SRC_FILES := TimeZoneData$(TIME_ZONE_DATA_APP_SUFFIX).apk -LOCAL_OVERRIDES_PACKAGES := TimeZoneData$(TIME_ZONE_DATA_APP_SUFFIX) -LOCAL_MODULE_TAGS := optional - -# OEM-INSTRUCTION: Change this -LOCAL_MODULE_OWNER := oemcorp -LOCAL_PRIVILEGED_MODULE := true -LOCAL_PRODUCT_MODULE := true - -LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) -LOCAL_MODULE_CLASS := APPS -# OEM-INSTRUCTION: Change this to match your app-specific signing certificate. -LOCAL_CERTIFICATE := - -# If LOCAL_COMPATIBILITY_SUITE is set this also copies the APK to the appropriate xTS directory -# and so this .mk can be used for prod and test targets. -include $(BUILD_PREBUILT) diff --git a/oem_template/data_app_prebuilt/testing/Android.mk b/oem_template/data_app_prebuilt/testing/Android.mk deleted file mode 100644 index 9096088..0000000 --- a/oem_template/data_app_prebuilt/testing/Android.mk +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright (C) 2017 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Targets for including testing versions of the time zone data app needed -# by xTS tests. - -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) -TIME_ZONE_DATA_APP_SUFFIX := _test1 -include $(LOCAL_PATH)/include_test_prebuilt.mk - -include $(CLEAR_VARS) -TIME_ZONE_DATA_APP_SUFFIX := _test2 -include $(LOCAL_PATH)/include_test_prebuilt.mk diff --git a/oem_template/data_app_prebuilt/testing/include_test_prebuilt.mk b/oem_template/data_app_prebuilt/testing/include_test_prebuilt.mk deleted file mode 100644 index b3b5b7c..0000000 --- a/oem_template/data_app_prebuilt/testing/include_test_prebuilt.mk +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright (C) 2017 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# An .mk include file that contains the boilerplate needed to include test, -# OEM-specific Time Zone Data app prebuilts. -# -# Users should set: -# TIME_ZONE_DATA_APP_SUFFIX - the suffix to apply to the package name. -# Should contain things like _test1 for test .apk files. -# - -PREBUILT_PATH := $(LOCAL_PATH)/.. - -# Turn off pre-opting. We want these to be installable. -LOCAL_DEX_PREOPT := false - -# OEM-INSTRUCTION: Change this to match your OEM-specific test suite. -# If a value is here the .apk will automatically be included in the associated -# test suite build, e.g. if there is an oem-specific tradefed suite called "OTS", -# then put ots here. -# Required for the xTS TimeZoneUpdateHostTest to pass because it needs correctly -# signed OEM-specific apks available to work. -LOCAL_COMPATIBILITY_SUITE := - -include $(PREBUILT_PATH)/include_app_prebuilt.mk - diff --git a/oem_template/xts/Android.mk b/oem_template/xts/Android.mk deleted file mode 100644 index d5ceeeb..0000000 --- a/oem_template/xts/Android.mk +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright (C) 2017 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -# OEM-INSTRUCTION: OEMs should change this. -LOCAL_COMPATIBILITY_SUITE := xts - -# OEM-INSTRUCTION: OEMs should change this -LOCAL_MODULE := XtsTimeZoneTestCases -LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 -LOCAL_LICENSE_CONDITIONS := notice - -LOCAL_STATIC_JAVA_LIBRARIES := time_zone_data_app_testing - -include $(BUILD_HOST_JAVA_LIBRARY) diff --git a/oem_template/xts/AndroidTest.xml b/oem_template/xts/AndroidTest.xml deleted file mode 100644 index 5fa472a..0000000 --- a/oem_template/xts/AndroidTest.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (c) 2017 Google Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<configuration description="Config for PTS Time Zone test cases"> - <test class="com.android.compatibility.common.tradefed.testtype.JarHostTest" > - <!-- OEM-INSTRUCTION: Change this to match the target name in Android.mk --> - <option name="jar" value="XtsTimeZoneTestCases.jar" /> - <!-- OEM-INSTRUCTION: Change this to match the package name of the data app --> - <option name="set-option" value="oem-data-app-package-name:com.oemcorp.android.timezone.data" /> - <!-- OEM-INSTRUCTION: Change this to match the name of the target used to include the test .apks --> - <!-- - This has to match the name of the .apk files included in the test - suite. For example, if the value below is "oem-data-app-apk-prefix:TimeZoneData" - the test will look for TimeZoneData_test1.apk and TimeZoneData_test2.apk, etc. during tests. - --> - <option name="set-option" value="oem-data-app-apk-prefix:TimeZoneData" /> - </test> -</configuration> diff --git a/oem_template/xts/README.oem b/oem_template/xts/README.oem deleted file mode 100644 index a20045b..0000000 --- a/oem_template/xts/README.oem +++ /dev/null @@ -1,13 +0,0 @@ -This file originates from package/apps/TimeZoneData/oem_template/xts. - -OEM-INSTRUCTION See below for the purpose of this directory and changes to make. - -This directory contains a suggested structure for CTS-like host-side tests for checking the -time zone update feature has been integrated properly. - -These tests are not included in CTS because the OEM must perform their own feature -integration and sign their own TimeZoneData app; no CTS-provided TimeZoneData app would be -installable on an OEM's device. - -To pass, OEMs must provide their own OEM-specific signed time zone data app .apks under the -correct package name and configure the test config. diff --git a/proguard.cfg b/proguard.cfg deleted file mode 100644 index 714cc85..0000000 --- a/proguard.cfg +++ /dev/null @@ -1,3 +0,0 @@ --keep class com.android.timezone.data.** { *; } --dontobfuscate --verbose diff --git a/src/main/com/android/timezone/data/TimeZoneRulesDataProvider.java b/src/main/com/android/timezone/data/TimeZoneRulesDataProvider.java deleted file mode 100644 index b524fce..0000000 --- a/src/main/com/android/timezone/data/TimeZoneRulesDataProvider.java +++ /dev/null @@ -1,336 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.timezone.data; - -import com.android.timezone.distro.DistroException; -import com.android.timezone.distro.DistroVersion; -import com.android.timezone.distro.TimeZoneDistro; - -import android.content.ContentProvider; -import android.content.ContentValues; -import android.content.Context; -import android.content.pm.PackageManager; -import android.content.pm.ProviderInfo; -import android.content.res.AssetManager; -import android.database.AbstractCursor; -import android.database.Cursor; -import android.net.Uri; -import android.os.Bundle; -import android.os.ParcelFileDescriptor; -import android.os.UserHandle; -import android.provider.TimeZoneRulesDataContract; -import android.provider.TimeZoneRulesDataContract.Operation; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import static android.content.res.AssetManager.ACCESS_STREAMING; - -/** - * A basic implementation of a time zone data provider that can be used by OEMs to implement - * an APK asset-based solution for time zone updates. - */ -public final class TimeZoneRulesDataProvider extends ContentProvider { - - static final String TAG = "TimeZoneRulesDataProvider"; - - private static final String METADATA_KEY_OPERATION = "android.timezoneprovider.OPERATION"; - - private static final Set<String> KNOWN_COLUMN_NAMES; - private static final Map<String, Class<?>> KNOWN_COLUMN_TYPES; - - static { - Set<String> columnNames = new HashSet<>(); - columnNames.add(Operation.COLUMN_TYPE); - columnNames.add(Operation.COLUMN_DISTRO_MAJOR_VERSION); - columnNames.add(Operation.COLUMN_DISTRO_MINOR_VERSION); - columnNames.add(Operation.COLUMN_RULES_VERSION); - columnNames.add(Operation.COLUMN_REVISION); - KNOWN_COLUMN_NAMES = Collections.unmodifiableSet(columnNames); - - Map<String, Class<?>> columnTypes = new HashMap<>(); - columnTypes.put(Operation.COLUMN_TYPE, String.class); - columnTypes.put(Operation.COLUMN_DISTRO_MAJOR_VERSION, Integer.class); - columnTypes.put(Operation.COLUMN_DISTRO_MINOR_VERSION, Integer.class); - columnTypes.put(Operation.COLUMN_RULES_VERSION, String.class); - columnTypes.put(Operation.COLUMN_REVISION, Integer.class); - KNOWN_COLUMN_TYPES = Collections.unmodifiableMap(columnTypes); - } - - private final Map<String, Object> mColumnData = new HashMap<>(); - - @Override - public boolean onCreate() { - return true; - } - - @Override - public void attachInfo(Context context, ProviderInfo info) { - super.attachInfo(context, info); - - // The time zone update process should run as the system user exclusively as it's a - // system feature, not user dependent. - UserHandle currentUserHandle = android.os.Process.myUserHandle(); - if (!currentUserHandle.isSystem()) { - throw new SecurityException("ContentProvider is supposed to run as the system user," - + " instead user=" + currentUserHandle); - } - - // Confirm our security - if (!TimeZoneRulesDataContract.AUTHORITY.equals(info.authority)) { - // The authority looked for by the time zone updater is fixed. - throw new SecurityException( - "android:authorities must be \"" + TimeZoneRulesDataContract.AUTHORITY + "\""); - } - if (!info.grantUriPermissions) { - throw new SecurityException("Provider must grant uri permissions"); - } - if (!info.exported) { - // The content provider is accessed directly so must be exported. - throw new SecurityException("android:exported must be \"true\""); - } - if (info.pathPermissions != null || info.writePermission != null) { - // Use readPermission only to implement permissions. - throw new SecurityException("Use android:readPermission only"); - } - if (!android.Manifest.permission.UPDATE_TIME_ZONE_RULES.equals(info.readPermission)) { - // Writing is not supported. - throw new SecurityException("android:readPermission must be set to \"" - + android.Manifest.permission.UPDATE_TIME_ZONE_RULES - + "\" is: " + info.readPermission); - } - - // info.metadata is not filled in by default. Must ask for it again. - final ProviderInfo infoWithMetadata = context.getPackageManager() - .resolveContentProvider(info.authority, PackageManager.GET_META_DATA); - Bundle metaData = infoWithMetadata.metaData; - if (metaData == null) { - throw new SecurityException("meta-data must be set"); - } - - // Work out what the operation type is. - String type; - try { - type = getMandatoryMetaDataString(metaData, METADATA_KEY_OPERATION); - mColumnData.put(Operation.COLUMN_TYPE, type); - } catch (IllegalArgumentException e) { - throw new SecurityException(METADATA_KEY_OPERATION + " meta-data not set."); - } - - // Fill in version information if this is an install operation. - if (Operation.TYPE_INSTALL.equals(type)) { - // Extract the version information from the distro. - InputStream distroBytesInputStream; - try { - distroBytesInputStream = context.getAssets().open(TimeZoneDistro.FILE_NAME); - } catch (IOException e) { - throw new SecurityException( - "Unable to open asset: " + TimeZoneDistro.FILE_NAME, e); - } - TimeZoneDistro distro = new TimeZoneDistro(distroBytesInputStream); - try { - DistroVersion distroVersion = distro.getDistroVersion(); - mColumnData.put(Operation.COLUMN_DISTRO_MAJOR_VERSION, - distroVersion.formatMajorVersion); - mColumnData.put(Operation.COLUMN_DISTRO_MINOR_VERSION, - distroVersion.formatMinorVersion); - mColumnData.put(Operation.COLUMN_RULES_VERSION, distroVersion.rulesVersion); - mColumnData.put(Operation.COLUMN_REVISION, distroVersion.revision); - } catch (IOException | DistroException e) { - throw new SecurityException("Invalid asset: " + TimeZoneDistro.FILE_NAME, e); - } - - } - } - - @Override - public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, - @Nullable String[] selectionArgs, @Nullable String sortOrder) { - if (!Operation.CONTENT_URI.equals(uri)) { - return null; - } - final List<String> projectionList = Arrays.asList(projection); - if (projection != null && !KNOWN_COLUMN_NAMES.containsAll(projectionList)) { - throw new UnsupportedOperationException( - "Only " + KNOWN_COLUMN_NAMES + " columns supported."); - } - - return new AbstractCursor() { - @Override - public int getCount() { - return 1; - } - - @Override - public String[] getColumnNames() { - return projectionList.toArray(new String[0]); - } - - @Override - public int getType(int column) { - String columnName = projectionList.get(column); - Class<?> columnJavaType = KNOWN_COLUMN_TYPES.get(columnName); - if (columnJavaType == String.class) { - return Cursor.FIELD_TYPE_STRING; - } else if (columnJavaType == Integer.class) { - return Cursor.FIELD_TYPE_INTEGER; - } else { - throw new UnsupportedOperationException( - "Unsupported type: " + columnJavaType + " for " + columnName); - } - } - - @Override - public String getString(int column) { - checkPosition(); - String columnName = projectionList.get(column); - if (KNOWN_COLUMN_TYPES.get(columnName) != String.class) { - throw new UnsupportedOperationException(); - } - return (String) mColumnData.get(columnName); - } - - @Override - public short getShort(int column) { - checkPosition(); - throw new UnsupportedOperationException(); - } - - @Override - public int getInt(int column) { - checkPosition(); - String columnName = projectionList.get(column); - if (KNOWN_COLUMN_TYPES.get(columnName) != Integer.class) { - throw new UnsupportedOperationException(); - } - return (Integer) mColumnData.get(columnName); - } - - @Override - public long getLong(int column) { - return getInt(column); - } - - @Override - public float getFloat(int column) { - throw new UnsupportedOperationException(); - } - - @Override - public double getDouble(int column) { - checkPosition(); - throw new UnsupportedOperationException(); - } - - @Override - public boolean isNull(int column) { - checkPosition(); - return column != 0; - } - }; - } - - @Override - public ParcelFileDescriptor openFile(@NonNull Uri uri, @NonNull String mode) - throws FileNotFoundException { - if (!Operation.CONTENT_URI.equals(uri)) { - throw new FileNotFoundException("Unknown URI: " + uri); - } - if (!"r".equals(mode)) { - throw new FileNotFoundException("Only read-only access supported."); - } - - // We cannot return the asset ParcelFileDescriptor from - // assets.openFd(name).getParcelFileDescriptor() here as the receiver in the reading - // process gets a ParcelFileDescriptor pointing at the whole .apk. Instead, we extract - // the asset file we want to storage then wrap that in a ParcelFileDescriptor. - File distroFile = null; - try { - distroFile = File.createTempFile("distro", null, getContext().getFilesDir()); - - AssetManager assets = getContext().getAssets(); - try (InputStream is = assets.open(TimeZoneDistro.FILE_NAME, ACCESS_STREAMING); - FileOutputStream fos = new FileOutputStream(distroFile, false /* append */)) { - copy(is, fos); - } - - return ParcelFileDescriptor.open(distroFile, ParcelFileDescriptor.MODE_READ_ONLY); - } catch (IOException e) { - throw new RuntimeException("Unable to copy distro asset file", e); - } finally { - if (distroFile != null) { - // Even if we have an open file descriptor pointing at the file it should be safe to - // delete because of normal Unix file behavior. Deleting here avoids leaking any - // storage. - distroFile.delete(); - } - } - } - - @Override - public String getType(@NonNull Uri uri) { - return null; - } - - @Override - public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) { - throw new UnsupportedOperationException(); - } - - @Override - public int delete(@NonNull Uri uri, @Nullable String selection, - @Nullable String[] selectionArgs) { - throw new UnsupportedOperationException(); - } - - @Override - public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, - @Nullable String[] selectionArgs) { - throw new UnsupportedOperationException(); - } - - private static String getMandatoryMetaDataString(Bundle metaData, String key) { - if (!metaData.containsKey(key)) { - throw new SecurityException("No metadata with key " + key + " found."); - } - return metaData.getString(key); - } - - /** - * Copies all of the bytes from {@code in} to {@code out}. Neither stream is closed. - */ - private static void copy(InputStream in, OutputStream out) throws IOException { - byte[] buffer = new byte[8192]; - int c; - while ((c = in.read(buffer)) != -1) { - out.write(buffer, 0, c); - } - } -} diff --git a/testing/README b/testing/README deleted file mode 100644 index d4ebe2e..0000000 --- a/testing/README +++ /dev/null @@ -1,4 +0,0 @@ -This directory contains files associated with testing the Time Zone update feature. - -xts/ - Libraries to support automated testing of the Time Zone update feature. - diff --git a/testing/xts/Android.bp b/testing/xts/Android.bp deleted file mode 100644 index 735a1c5..0000000 --- a/testing/xts/Android.bp +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (C) 2017 The Android Open Source Project -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// A testing support library for testing time zone updates on real devices. -// OEMs can include this as a "_STATIC_" dependency and anything else needed to integrate with their -// own test suite. At runtime the libs below (or a superset) must be present. - -package { - default_applicable_licenses: ["Android-Apache-2.0"], -} - -java_library_host { - name: "time_zone_data_app_testing", - srcs: ["src/**/*.java"], - libs: [ - "cts-tradefed", - "tradefed", - "compatibility-host-util", - ], -} diff --git a/testing/xts/src/com/android/timezone/xts/TimeZoneUpdateHostTest.java b/testing/xts/src/com/android/timezone/xts/TimeZoneUpdateHostTest.java deleted file mode 100644 index 6cd63a9..0000000 --- a/testing/xts/src/com/android/timezone/xts/TimeZoneUpdateHostTest.java +++ /dev/null @@ -1,431 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.timezone.xts; - -import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper; -import com.android.tradefed.build.IBuildInfo; -import com.android.tradefed.config.Option; -import com.android.tradefed.device.ITestDevice; -import com.android.tradefed.log.LogUtil; -import com.android.tradefed.testtype.DeviceJUnit4ClassRunner; -import com.android.tradefed.testtype.IBuildReceiver; -import com.android.tradefed.testtype.IDeviceTest; -import com.android.tradefed.util.FileUtil; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.io.File; -import java.util.function.BooleanSupplier; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -/** - * Class for host-side tests that the time zone rules update feature works as intended. This is - * intended to give confidence to OEMs that they have implemented / configured the OEM parts of the - * feature correctly. - * - * <p>There are two main operations involved in time zone updates: - * <ol> - * <li>Package installs/uninstalls - asynchronously stage operations for install</li> - * <li>Reboots - perform the staged operations / delete bad installed data</li> - * </ol> - * Both these operations are time consuming and there's a degree of non-determinism involved. - * - * <p>A "clean" device can also be in one of two main states depending on whether it has been wiped - * and/or rebooted before this test runs: - * <ul> - * <li>A device may have nothing staged / installed in /data/misc/zoneinfo at all.</li> - * <li>A device may have the time zone data from the default system image version of the time - * zone data app staged or installed.</li> - * </ul> - * This test attempts to handle both of these cases. - * - */ -@RunWith(DeviceJUnit4ClassRunner.class) -public class TimeZoneUpdateHostTest implements IDeviceTest, IBuildReceiver { - - // These must match equivalent values in RulesManagerService dumpsys code. - private static final String STAGED_OPERATION_NONE = "None"; - private static final String STAGED_OPERATION_INSTALL = "Install"; - private static final String STAGED_OPERATION_UNINSTALL = "Uninstall"; - private static final String INSTALL_STATE_INSTALLED = "Installed"; - - private IBuildInfo mBuildInfo; - private ITestDevice mDevice; - private File mTempDir; - - @Option(name = "oem-data-app-package-name", - description="The OEM-specific package name for the data app", - mandatory = true) - private String mOemDataAppPackageName; - - private String getTimeZoneDataPackageName() { - assertNotNull(mOemDataAppPackageName); - return mOemDataAppPackageName; - } - - @Option(name = "oem-data-app-apk-prefix", - description="The OEM-specific APK name for the data app test files, e.g." - + "for TimeZoneDataOemCorp_test1.apk the prefix would be" - + "\"TimeZoneDataOemCorp\"", - mandatory = true) - private String mOemDataAppApkPrefix; - - private String getTimeZoneDataApkName(String testId) { - assertNotNull(mOemDataAppApkPrefix); - return mOemDataAppApkPrefix + "_" + testId + ".apk"; - } - - @Override - public void setBuild(IBuildInfo buildInfo) { - mBuildInfo = buildInfo; - } - - @Override - public void setDevice(ITestDevice device) { - mDevice = device; - } - - @Override - public ITestDevice getDevice() { - return mDevice; - } - - @Before - public void setUp() throws Exception { - createTempDir(); - resetDeviceToClean(); - } - - @After - public void tearDown() throws Exception { - resetDeviceToClean(); - deleteTempDir(); - } - - private void createTempDir() throws Exception { - mTempDir = File.createTempFile("timeZoneUpdateTest", null); - assertTrue(mTempDir.delete()); - assertTrue(mTempDir.mkdir()); - } - - private void deleteTempDir() throws Exception { - FileUtil.recursiveDelete(mTempDir); - } - - /** - * Reset the device to having no installed time zone data outside of the /system/priv-app - * version that came with the system image. - */ - private void resetDeviceToClean() throws Exception { - // If this fails the data app isn't present on device. No point in starting. - assertTrue(getTimeZoneDataPackageName() + " not installed", - isPackageInstalled(getTimeZoneDataPackageName())); - - // Reboot as needed to apply any staged operation. - if (!STAGED_OPERATION_NONE.equals(getStagedOperationType())) { - rebootDeviceAndWaitForRestart(); - } - - // A "clean" device means no time zone data .apk installed in /data at all, try to get to - // that state. - for (int i = 0; i < 2; i++) { - logDeviceTimeZoneState(); - - // Even if there's no distro installed, there may be an updated APK installed, so try to - // remove it unconditionally. - String errorCode = uninstallPackage(getTimeZoneDataPackageName()); - if (errorCode != null) { - // Failed to uninstall, which we take to mean the device is "clean". - break; - } - // Success, meaning there was an APK that could be uninstalled. - // If there is a distro installed we need wait for the distro uninstall that should now - // become staged. - boolean distroIsInstalled = INSTALL_STATE_INSTALLED.equals(getCurrentInstallState()); - if (distroIsInstalled) { - // It may take a short while before we can detect anything: the package manager - // should have triggered an intent, and the PackageTracker has to receive that and - // send its own intent, which then has to be acted on before we could detect an - // operation in progress. We expect the device eventually to get to the staged state - // "UNINSTALL", meaning it will try to revert to no distro installed on next boot. - waitForStagedUninstall(); - - rebootDeviceAndWaitForRestart(); - } else { - // There was an apk installed, but no time zone distro was installed. It was - // probably a "bad" .apk that was rejected. The update app will request an uninstall - // anyway just to be sure, so we'll give it a chance to do that before continuing - // otherwise we could get an "operation in progress" later on when we're not - // expecting it. - Thread.sleep(10000); - } - } - assertActiveRulesVersion(getBaseRulesVersion()); - assertEquals(STAGED_OPERATION_NONE, getStagedOperationType()); - } - - @Test - public void testInstallNewerRulesVersion() throws Exception { - // This information must match the rules version in test1: IANA version=2030a, revision=1 - String test1VersionInfo = "2030a,1"; - - // Confirm the staged / install state before we start. - assertFalse(test1VersionInfo.equals(getCurrentInstalledVersion())); - assertEquals(STAGED_OPERATION_NONE, getStagedOperationType()); - - File appFile = getTimeZoneDataApkFile("test1"); - getDevice().installPackage(appFile, true /* reinstall */); - - waitForStagedInstall(test1VersionInfo); - - // Confirm the install state hasn't changed. - assertFalse(test1VersionInfo.equals(getCurrentInstalledVersion())); - - // Now reboot, and the staged version should become the installed version. - rebootDeviceAndWaitForRestart(); - - // After reboot, check the state. - assertEquals(STAGED_OPERATION_NONE, getStagedOperationType()); - assertEquals(INSTALL_STATE_INSTALLED, getCurrentInstallState()); - assertEquals(test1VersionInfo, getCurrentInstalledVersion()); - } - - @Test - public void testInstallNewerRulesVersion_secondaryUser() throws Exception { - ITestDevice device = getDevice(); - if (!device.isMultiUserSupported()) { - // Just pass on non-multi-user devices. - return; - } - - int userId = device.createUser("TimeZoneTest", false /* guest */, false /* ephemeral */); - try { - - // This information must match the rules version in test1: IANA version=2030a, revision=1 - String test1VersionInfo = "2030a,1"; - - // Confirm the staged / install state before we start. - assertFalse(test1VersionInfo.equals(getCurrentInstalledVersion())); - assertEquals(STAGED_OPERATION_NONE, getStagedOperationType()); - - File appFile = getTimeZoneDataApkFile("test1"); - - // Install the app for the test user. It should still all work. - device.installPackageForUser(appFile, true /* reinstall */, userId); - - waitForStagedInstall(test1VersionInfo); - - // Confirm the install state hasn't changed. - assertFalse(test1VersionInfo.equals(getCurrentInstalledVersion())); - - // Now reboot, and the staged version should become the installed version. - rebootDeviceAndWaitForRestart(); - - // After reboot, check the state. - assertEquals(STAGED_OPERATION_NONE, getStagedOperationType()); - assertEquals(INSTALL_STATE_INSTALLED, getCurrentInstallState()); - assertEquals(test1VersionInfo, getCurrentInstalledVersion()); - } - finally { - // If this fails, the device may be left in a bad state. - device.removeUser(userId); - } - } - - @Test - public void testInstallOlderRulesVersion() throws Exception { - File appFile = getTimeZoneDataApkFile("test2"); - getDevice().installPackage(appFile, true /* reinstall */); - - // The attempt to install a version of the data that is older than the version in the system - // image should be rejected and nothing should be staged. There's currently no way (short of - // looking at logs) to tell this has happened, but combined with other tests and given a - // suitable delay it gives us some confidence that the attempt has been made and it was - // rejected. - - Thread.sleep(30000); - - assertEquals(STAGED_OPERATION_NONE, getStagedOperationType()); - } - - private void rebootDeviceAndWaitForRestart() throws Exception { - log("Rebooting device"); - getDevice().reboot(); - } - - private void logDeviceTimeZoneState() throws Exception { - log("Initial device state: " + dumpEntireTimeZoneStatusToString()); - } - - private static void log(String msg) { - LogUtil.CLog.i(msg); - } - - private void assertActiveRulesVersion(String expectedRulesVersion) throws Exception { - // Dumpsys reports the version reported by ICU, ZoneInfoDb and TimeZoneFinder and they - // should always match. - String expectedActiveRulesVersion = - expectedRulesVersion + "," + expectedRulesVersion + "," + expectedRulesVersion; - - String actualActiveRulesVersion = - waitForNoOperationInProgressAndReturn(StateType.ACTIVE_RULES_VERSION); - assertEquals(expectedActiveRulesVersion, actualActiveRulesVersion); - } - - private String getCurrentInstalledVersion() throws Exception { - return waitForNoOperationInProgressAndReturn(StateType.CURRENTLY_INSTALLED_VERSION); - } - - private String getCurrentInstallState() throws Exception { - return waitForNoOperationInProgressAndReturn(StateType.CURRENT_INSTALL_STATE); - } - - private String getStagedInstallVersion() throws Exception { - return waitForNoOperationInProgressAndReturn(StateType.STAGED_INSTALL_VERSION); - } - - private String getStagedOperationType() throws Exception { - return waitForNoOperationInProgressAndReturn(StateType.STAGED_OPERATION_TYPE); - } - - private String getBaseRulesVersion() throws Exception { - return waitForNoOperationInProgressAndReturn(StateType.BASE_RULES_VERSION); - } - - private boolean isOperationInProgress() { - try { - String operationInProgressString = - getDeviceTimeZoneState(StateType.OPERATION_IN_PROGRESS); - return Boolean.parseBoolean(operationInProgressString); - } catch (Exception e) { - throw new AssertionError("Failed to read staged status", e); - } - } - - private String waitForNoOperationInProgressAndReturn(StateType stateType) throws Exception { - waitForCondition(() -> !isOperationInProgress()); - return getDeviceTimeZoneState(stateType); - } - - private void waitForStagedUninstall() throws Exception { - waitForCondition(() -> isStagedUninstall()); - } - - private void waitForStagedInstall(String versionString) throws Exception { - waitForCondition(() -> isStagedInstall(versionString)); - } - - private boolean isStagedUninstall() { - try { - return getStagedOperationType().equals(STAGED_OPERATION_UNINSTALL); - } catch (Exception e) { - throw new AssertionError("Failed to read staged status", e); - } - } - - private boolean isStagedInstall(String versionString) { - try { - return getStagedOperationType().equals(STAGED_OPERATION_INSTALL) - && getStagedInstallVersion().equals(versionString); - } catch (Exception e) { - throw new AssertionError("Failed to read staged status", e); - } - } - - private static void waitForCondition(BooleanSupplier condition) throws Exception { - int count = 0; - boolean lastResult; - while (!(lastResult = condition.getAsBoolean()) && count++ < 120) { - Thread.sleep(1000); - } - // Some conditions may not be stable so using the lastResult instead of - // condition.getAsBoolean() ensures we understand why we exited the loop. - assertTrue("Failed condition: " + condition, lastResult); - } - - private enum StateType { - OPERATION_IN_PROGRESS, - BASE_RULES_VERSION, - CURRENT_INSTALL_STATE, - CURRENTLY_INSTALLED_VERSION, - STAGED_OPERATION_TYPE, - STAGED_INSTALL_VERSION, - ACTIVE_RULES_VERSION; - - public String getFormatStateChar() { - // This switch must match values in com.android.server.timezone.RulesManagerService. - switch (this) { - case OPERATION_IN_PROGRESS: - return "p"; - case BASE_RULES_VERSION: - return "b"; - case CURRENT_INSTALL_STATE: - return "c"; - case CURRENTLY_INSTALLED_VERSION: - return "i"; - case STAGED_OPERATION_TYPE: - return "o"; - case STAGED_INSTALL_VERSION: - return "t"; - case ACTIVE_RULES_VERSION: - return "a"; - default: - throw new AssertionError("Unknown state type: " + this); - } - } - } - - private String getDeviceTimeZoneState(StateType stateType) throws Exception { - String output = getDevice().executeShellCommand( - "dumpsys timezone -format_state " + stateType.getFormatStateChar()); - assertNotNull(output); - // Output will be "Foo: bar\n". We want the "bar". - String value = output.split(":")[1]; - return value.substring(1, value.length() - 1); - } - - private String dumpEntireTimeZoneStatusToString() throws Exception { - String output = getDevice().executeShellCommand("dumpsys timezone"); - assertNotNull(output); - return output; - } - - private File getTimeZoneDataApkFile(String testId) throws Exception { - CompatibilityBuildHelper buildHelper = new CompatibilityBuildHelper(mBuildInfo); - String fileName = getTimeZoneDataApkName(testId); - return buildHelper.getTestFile(fileName); - } - - private boolean isPackageInstalled(String pkg) throws Exception { - for (String installedPackage : getDevice().getInstalledPackageNames()) { - if (pkg.equals(installedPackage)) { - return true; - } - } - return false; - } - - private String uninstallPackage(String packageName) throws Exception { - return getDevice().uninstallPackage(packageName); - } -} |