summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2018-04-03 11:31:37 +0200
committerandroid-build-team Robot <android-build-team-robot@google.com>2018-04-03 11:31:37 +0200
commitf3103cc08b325bbc18cb95f3d1797e59296ce4e6 (patch)
tree96a6c47d7b6a2a1f667a3f69fdb43eb6b905a350
parentSnap for 4693670 from 966fffcd1760038cbfd0680aec7c5792aa1b68a5 to qt-release (diff)
parentMerge "tests: Pick up testdata with LOCAL_TEST_DATA." am: 6b6c21af28 am: 8028dc1ce4 (diff)
downloadandroid_bootable_recovery-f3103cc08b325bbc18cb95f3d1797e59296ce4e6.tar
android_bootable_recovery-f3103cc08b325bbc18cb95f3d1797e59296ce4e6.tar.gz
android_bootable_recovery-f3103cc08b325bbc18cb95f3d1797e59296ce4e6.tar.bz2
android_bootable_recovery-f3103cc08b325bbc18cb95f3d1797e59296ce4e6.tar.lz
android_bootable_recovery-f3103cc08b325bbc18cb95f3d1797e59296ce4e6.tar.xz
android_bootable_recovery-f3103cc08b325bbc18cb95f3d1797e59296ce4e6.tar.zst
android_bootable_recovery-f3103cc08b325bbc18cb95f3d1797e59296ce4e6.zip
-rw-r--r--Android.bp143
-rw-r--r--Android.mk85
-rw-r--r--recovery.cpp4
-rw-r--r--sample_updater/Android.mk2
-rw-r--r--sample_updater/AndroidManifest.xml18
-rw-r--r--sample_updater/res/layout/activity_main.xml20
-rw-r--r--sample_updater/src/com/android/update/ui/SystemUpdateActivity.java68
-rw-r--r--tests/Android.mk50
-rw-r--r--tests/AndroidTest.xml10
-rw-r--r--tests/common/test_constants.h15
-rw-r--r--tests/manual/recovery_test.cpp12
11 files changed, 276 insertions, 151 deletions
diff --git a/Android.bp b/Android.bp
new file mode 100644
index 000000000..6c04504ea
--- /dev/null
+++ b/Android.bp
@@ -0,0 +1,143 @@
+// Copyright (C) 2018 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.
+
+cc_defaults {
+ name: "recovery_defaults",
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ ],
+}
+
+// Generic device that uses ScreenRecoveryUI.
+cc_library_static {
+ name: "librecovery_ui_default",
+
+ defaults: [
+ "recovery_defaults",
+ ],
+
+ srcs: [
+ "default_device.cpp",
+ ],
+}
+
+// The default wear device that uses WearRecoveryUI.
+cc_library_static {
+ name: "librecovery_ui_wear",
+
+ defaults: [
+ "recovery_defaults",
+ ],
+
+ srcs: [
+ "wear_device.cpp",
+ ],
+}
+
+// The default VR device that uses VrRecoveryUI.
+cc_library_static {
+ name: "librecovery_ui_vr",
+
+ defaults: [
+ "recovery_defaults",
+ ],
+
+ srcs: [
+ "vr_device.cpp",
+ ],
+}
+
+cc_library_static {
+ name: "libmounts",
+
+ defaults: [
+ "recovery_defaults",
+ ],
+
+ srcs: [
+ "mounts.cpp",
+ ],
+
+ static_libs: [
+ "libbase",
+ ],
+}
+
+cc_library_static {
+ name: "libverifier",
+
+ defaults: [
+ "recovery_defaults",
+ ],
+
+ srcs: [
+ "asn1_decoder.cpp",
+ "verifier.cpp",
+ ],
+
+ static_libs: [
+ "libbase",
+ "libcrypto",
+ "libcrypto_utils",
+ "libotautil",
+ ],
+}
+
+// The dynamic executable that runs after /data mounts.
+cc_binary {
+ name: "recovery-persist",
+
+ defaults: [
+ "recovery_defaults",
+ ],
+
+ srcs: [
+ "recovery-persist.cpp",
+ "rotate_logs.cpp",
+ ],
+
+ shared_libs: [
+ "libbase",
+ "liblog",
+ ],
+
+ init_rc: [
+ "recovery-persist.rc",
+ ],
+}
+
+// The dynamic executable that runs at init.
+cc_binary {
+ name: "recovery-refresh",
+
+ defaults: [
+ "recovery_defaults",
+ ],
+
+ srcs: [
+ "recovery-refresh.cpp",
+ "rotate_logs.cpp",
+ ],
+
+ shared_libs: [
+ "libbase",
+ "liblog",
+ ],
+
+ init_rc: [
+ "recovery-refresh.rc",
+ ],
+}
diff --git a/Android.mk b/Android.mk
index bc7966aea..88d4b7dfc 100644
--- a/Android.mk
+++ b/Android.mk
@@ -23,17 +23,6 @@ RECOVERY_FSTAB_VERSION := 2
# librecovery_ui_default, which uses ScreenRecoveryUI.
TARGET_RECOVERY_UI_LIB ?= librecovery_ui_default
-# libmounts (static library)
-# ===============================
-include $(CLEAR_VARS)
-LOCAL_SRC_FILES := mounts.cpp
-LOCAL_CFLAGS := \
- -Wall \
- -Werror
-LOCAL_MODULE := libmounts
-LOCAL_STATIC_LIBRARIES := libbase
-include $(BUILD_STATIC_LIBRARY)
-
# librecovery (static library)
# ===============================
include $(CLEAR_VARS)
@@ -49,6 +38,7 @@ ifeq ($(AB_OTA_UPDATER),true)
endif
LOCAL_MODULE := librecovery
+
LOCAL_STATIC_LIBRARIES := \
libminui \
libotautil \
@@ -72,6 +62,7 @@ LOCAL_SRC_FILES := \
LOCAL_CFLAGS := -Wall -Werror
LOCAL_MODULE := librecovery_ui
+
LOCAL_STATIC_LIBRARIES := \
libminui \
libbase
@@ -213,78 +204,6 @@ endif
include $(BUILD_EXECUTABLE)
-# recovery-persist (system partition dynamic executable run after /data mounts)
-# ===============================
-include $(CLEAR_VARS)
-LOCAL_SRC_FILES := \
- recovery-persist.cpp \
- rotate_logs.cpp
-LOCAL_MODULE := recovery-persist
-LOCAL_SHARED_LIBRARIES := liblog libbase
-LOCAL_CFLAGS := -Wall -Werror
-LOCAL_INIT_RC := recovery-persist.rc
-include $(BUILD_EXECUTABLE)
-
-# recovery-refresh (system partition dynamic executable run at init)
-# ===============================
-include $(CLEAR_VARS)
-LOCAL_SRC_FILES := \
- recovery-refresh.cpp \
- rotate_logs.cpp
-LOCAL_MODULE := recovery-refresh
-LOCAL_SHARED_LIBRARIES := liblog libbase
-LOCAL_CFLAGS := -Wall -Werror
-LOCAL_INIT_RC := recovery-refresh.rc
-include $(BUILD_EXECUTABLE)
-
-# libverifier (static library)
-# ===============================
-include $(CLEAR_VARS)
-LOCAL_MODULE := libverifier
-LOCAL_SRC_FILES := \
- asn1_decoder.cpp \
- verifier.cpp
-LOCAL_STATIC_LIBRARIES := \
- libotautil \
- libcrypto_utils \
- libcrypto \
- libbase
-LOCAL_CFLAGS := -Wall -Werror
-include $(BUILD_STATIC_LIBRARY)
-
-# Generic device that uses ScreenRecoveryUI.
-# ===============================
-include $(CLEAR_VARS)
-LOCAL_SRC_FILES := default_device.cpp
-LOCAL_CFLAGS := -Wall -Werror
-
-LOCAL_MODULE := librecovery_ui_default
-
-include $(BUILD_STATIC_LIBRARY)
-
-# Wear default device
-# ===============================
-include $(CLEAR_VARS)
-LOCAL_SRC_FILES := wear_device.cpp
-LOCAL_CFLAGS := -Wall -Werror
-
-# Should match TARGET_RECOVERY_UI_LIB in BoardConfig.mk.
-LOCAL_MODULE := librecovery_ui_wear
-
-include $(BUILD_STATIC_LIBRARY)
-
-# vr headset default device
-# ===============================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := vr_device.cpp
-LOCAL_CFLAGS := -Wall -Werror
-
-# should match TARGET_RECOVERY_UI_LIB set in BoardConfig.mk
-LOCAL_MODULE := librecovery_ui_vr
-
-include $(BUILD_STATIC_LIBRARY)
-
include \
$(LOCAL_PATH)/boot_control/Android.mk \
$(LOCAL_PATH)/minui/Android.mk \
diff --git a/recovery.cpp b/recovery.cpp
index d887d07fb..e266d9312 100644
--- a/recovery.cpp
+++ b/recovery.cpp
@@ -1557,14 +1557,14 @@ int main(int argc, char **argv) {
// to log the update attempt since update_package is non-NULL.
modified_flash = true;
- if (!is_battery_ok()) {
+ if (retry_count == 0 && !is_battery_ok()) {
ui->Print("battery capacity is not enough for installing package, needed is %d%%\n",
BATTERY_OK_PERCENTAGE);
// Log the error code to last_install when installation skips due to
// low battery.
log_failure_code(kLowBattery, update_package);
status = INSTALL_SKIPPED;
- } else if (bootreason_in_blacklist()) {
+ } else if (retry_count == 0 && bootreason_in_blacklist()) {
// Skip update-on-reboot when bootreason is kernel_panic or similar
ui->Print("bootreason is in the blacklist; skip OTA installation\n");
log_failure_code(kBootreasonInBlacklist, update_package);
diff --git a/sample_updater/Android.mk b/sample_updater/Android.mk
index d6764bd01..2b0fcbeec 100644
--- a/sample_updater/Android.mk
+++ b/sample_updater/Android.mk
@@ -22,4 +22,6 @@ LOCAL_PACKAGE_NAME := SystemUpdateApp
LOCAL_SDK_VERSION := system_current
LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
include $(BUILD_PACKAGE)
diff --git a/sample_updater/AndroidManifest.xml b/sample_updater/AndroidManifest.xml
index ccee107bb..66414b5d3 100644
--- a/sample_updater/AndroidManifest.xml
+++ b/sample_updater/AndroidManifest.xml
@@ -14,8 +14,18 @@
limitations under the License.
-->
-<manifest
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- package="com.android.update">
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.update">
+
+ <application android:label="Sample Updater">
+ <activity android:name=".ui.SystemUpdateActivity"
+ android:label="Sample Updater">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+
</manifest>
+
diff --git a/sample_updater/res/layout/activity_main.xml b/sample_updater/res/layout/activity_main.xml
new file mode 100644
index 000000000..bd7d68677
--- /dev/null
+++ b/sample_updater/res/layout/activity_main.xml
@@ -0,0 +1,20 @@
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+</LinearLayout>
diff --git a/sample_updater/src/com/android/update/ui/SystemUpdateActivity.java b/sample_updater/src/com/android/update/ui/SystemUpdateActivity.java
new file mode 100644
index 000000000..e57b1673c
--- /dev/null
+++ b/sample_updater/src/com/android/update/ui/SystemUpdateActivity.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2018 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.update.ui;
+
+import android.app.Activity;
+import android.os.UpdateEngine;
+import android.os.UpdateEngineCallback;
+
+/** Main update activity. */
+public class SystemUpdateActivity extends Activity {
+
+ private UpdateEngine updateEngine;
+ private UpdateEngineCallbackImpl updateEngineCallbackImpl = new UpdateEngineCallbackImpl(this);
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ updateEngine = new UpdateEngine();
+ updateEngine.bind(updateEngineCallbackImpl);
+ }
+
+ @Override
+ public void onPause() {
+ updateEngine.unbind();
+ super.onPause();
+ }
+
+ void onStatusUpdate(int i, float v) {
+ // Handle update engine status update
+ }
+
+ void onPayloadApplicationComplete(int i) {
+ // Handle apply payload completion
+ }
+
+ private static class UpdateEngineCallbackImpl extends UpdateEngineCallback {
+
+ private final SystemUpdateActivity activity;
+
+ public UpdateEngineCallbackImpl(SystemUpdateActivity activity) {
+ this.activity = activity;
+ }
+
+ @Override
+ public void onStatusUpdate(int i, float v) {
+ activity.onStatusUpdate(i, v);
+ }
+
+ @Override
+ public void onPayloadApplicationComplete(int i) {
+ activity.onPayloadApplicationComplete(i);
+ }
+ }
+}
diff --git a/tests/Android.mk b/tests/Android.mk
index 9a71371fa..58cefd226 100644
--- a/tests/Android.mk
+++ b/tests/Android.mk
@@ -45,6 +45,8 @@ LOCAL_SRC_FILES := \
LOCAL_C_INCLUDES := bootable/recovery
LOCAL_SHARED_LIBRARIES := liblog
+LOCAL_TEST_DATA := \
+ $(call find-test-data-in-subdirs, $(LOCAL_PATH), "*", testdata)
include $(BUILD_NATIVE_TEST)
# Manual tests
@@ -61,25 +63,8 @@ LOCAL_SHARED_LIBRARIES := \
liblog \
libpng
-resource_files := $(call find-files-in-subdirs, bootable/recovery, \
- "*_text.png", \
- res-mdpi/images \
- res-hdpi/images \
- res-xhdpi/images \
- res-xxhdpi/images \
- res-xxxhdpi/images \
- )
-
-# The resource image files that will go to $OUT/data/nativetest/recovery.
-testimage_out_path := $(TARGET_OUT_DATA)/nativetest/recovery
-GEN := $(addprefix $(testimage_out_path)/, $(resource_files))
-
-$(GEN): PRIVATE_PATH := $(LOCAL_PATH)
-$(GEN): PRIVATE_CUSTOM_TOOL = cp $< $@
-$(GEN): $(testimage_out_path)/% : bootable/recovery/%
- $(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN)
-
+LOCAL_TEST_DATA := \
+ $(call find-test-data-in-subdirs, bootable/recovery, "*_text.png", res-*)
include $(BUILD_NATIVE_TEST)
# Component tests
@@ -171,29 +156,8 @@ LOCAL_STATIC_LIBRARIES := \
libBionicGtestMain \
$(tune2fs_static_libraries)
-testdata_files := $(call find-subdir-files, testdata/*)
-
-# The testdata files that will go to $OUT/data/nativetest/recovery.
-testdata_out_path := $(TARGET_OUT_DATA)/nativetest/recovery
-GEN := $(addprefix $(testdata_out_path)/, $(testdata_files))
-$(GEN): PRIVATE_PATH := $(LOCAL_PATH)
-$(GEN): PRIVATE_CUSTOM_TOOL = cp $< $@
-$(GEN): $(testdata_out_path)/% : $(LOCAL_PATH)/%
- $(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN)
-
-# A copy of the testdata to be packed into continuous_native_tests.zip.
-testdata_continuous_zip_prefix := \
- $(call intermediates-dir-for,PACKAGING,recovery_component_test)/DATA
-testdata_continuous_zip_path := $(testdata_continuous_zip_prefix)/nativetest/recovery
-GEN := $(addprefix $(testdata_continuous_zip_path)/, $(testdata_files))
-$(GEN): PRIVATE_PATH := $(LOCAL_PATH)
-$(GEN): PRIVATE_CUSTOM_TOOL = cp $< $@
-$(GEN): $(testdata_continuous_zip_path)/% : $(LOCAL_PATH)/%
- $(transform-generated-source)
-LOCAL_GENERATED_SOURCES += $(GEN)
-LOCAL_PICKUP_FILES := $(testdata_continuous_zip_prefix)
-
+LOCAL_TEST_DATA := \
+ $(call find-test-data-in-subdirs, $(LOCAL_PATH), "*", testdata)
include $(BUILD_NATIVE_TEST)
# Host tests
@@ -222,4 +186,6 @@ LOCAL_STATIC_LIBRARIES := \
libBionicGtestMain
LOCAL_SHARED_LIBRARIES := \
liblog
+LOCAL_TEST_DATA := \
+ $(call find-test-data-in-subdirs, $(LOCAL_PATH), "*", testdata)
include $(BUILD_HOST_NATIVE_TEST)
diff --git a/tests/AndroidTest.xml b/tests/AndroidTest.xml
index 3999aa57d..6b86085aa 100644
--- a/tests/AndroidTest.xml
+++ b/tests/AndroidTest.xml
@@ -16,16 +16,18 @@
<configuration description="Config for recovery_component_test and recovery_unit_test">
<target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
<option name="cleanup" value="true" />
- <option name="push" value="recovery_component_test->/data/local/tmp/recovery_component_test" />
- <option name="push" value="recovery_unit_test->/data/local/tmp/recovery_unit_test" />
+ <option name="push" value="recovery_component_test->/data/local/tmp/recovery_component_test/recovery_component_test" />
+ <option name="push" value="testdata->/data/local/tmp/recovery_component_test/testdata" />
+ <option name="push" value="recovery_unit_test->/data/local/tmp/recovery_unit_test/recovery_unit_test" />
+ <option name="push" value="testdata->/data/local/tmp/recovery_unit_test/testdata" />
</target_preparer>
<option name="test-suite-tag" value="apct" />
<test class="com.android.tradefed.testtype.GTest" >
- <option name="native-test-device-path" value="/data/local/tmp" />
+ <option name="native-test-device-path" value="/data/local/tmp/recovery_component_test" />
<option name="module-name" value="recovery_component_test" />
</test>
<test class="com.android.tradefed.testtype.GTest" >
- <option name="native-test-device-path" value="/data/local/tmp" />
+ <option name="native-test-device-path" value="/data/local/tmp/recovery_unit_test" />
<option name="module-name" value="recovery_unit_test" />
</test>
</configuration>
diff --git a/tests/common/test_constants.h b/tests/common/test_constants.h
index 514818e0a..b6c27a754 100644
--- a/tests/common/test_constants.h
+++ b/tests/common/test_constants.h
@@ -17,10 +17,10 @@
#ifndef _OTA_TEST_CONSTANTS_H
#define _OTA_TEST_CONSTANTS_H
-#include <stdlib.h>
-
#include <string>
+#include <android-base/file.h>
+
// Zip entries in ziptest_valid.zip.
static const std::string kATxtContents("abcdefghabcdefgh\n");
static const std::string kBTxtContents("abcdefgh\n");
@@ -32,14 +32,9 @@ static const std::string kATxtSha1Sum("32c96a03dc8cd20097940f351bca6261ee5a1643"
// echo -n -e "abcdefgh\n" | sha1sum
static const std::string kBTxtSha1Sum("e414af7161c9554089f4106d6f1797ef14a73666");
-static std::string from_testdata_base(const std::string& fname) {
-#ifdef __ANDROID__
- static std::string data_root = getenv("ANDROID_DATA");
-#else
- static std::string data_root = std::string(getenv("ANDROID_PRODUCT_OUT")) + "/data";
-#endif
-
- return data_root + "/nativetest/recovery/testdata/" + fname;
+[[maybe_unused]] static std::string from_testdata_base(const std::string& fname) {
+ static std::string exec_dir = android::base::GetExecutableDirectory();
+ return exec_dir + "/testdata/" + fname;
}
#endif // _OTA_TEST_CONSTANTS_H
diff --git a/tests/manual/recovery_test.cpp b/tests/manual/recovery_test.cpp
index 64e3b59e6..224ed5b68 100644
--- a/tests/manual/recovery_test.cpp
+++ b/tests/manual/recovery_test.cpp
@@ -34,7 +34,6 @@
static const std::string myFilename = "/data/misc/recovery/inject.txt";
static const std::string myContent = "Hello World\nWelcome to my recovery\n";
static const std::string kLocale = "zu";
-static const std::string kResourceTestDir = "/data/nativetest/recovery/";
// Failure is expected on systems that do not deliver either the
// recovery-persist or recovery-refresh executables. Tests also require
@@ -108,19 +107,20 @@ static int png_filter(const dirent* de) {
return 1;
}
-// Find out all png files to test under /data/nativetest/recovery/.
+// Find out all the PNG files to test, which stay under the same dir with the executable.
static std::vector<std::string> add_files() {
+ std::string exec_dir = android::base::GetExecutableDirectory();
std::vector<std::string> files;
- for (const std::string& str : image_dir) {
- std::string dir_path = kResourceTestDir + str;
+ for (const std::string& image : image_dir) {
+ std::string dir_path = exec_dir + "/" + image;
dirent** namelist;
int n = scandir(dir_path.c_str(), &namelist, png_filter, alphasort);
if (n == -1) {
- printf("Failed to scan dir %s: %s\n", kResourceTestDir.c_str(), strerror(errno));
+ printf("Failed to scan dir %s: %s\n", exec_dir.c_str(), strerror(errno));
return files;
}
if (n == 0) {
- printf("No file is added for test in %s\n", kResourceTestDir.c_str());
+ printf("No file is added for test in %s\n", exec_dir.c_str());
}
while (n--) {