libandroidfw_tests: package test data correctly

- Convert to use soong, which allows bundling test data with benchmarks.
- Also separate libandroidfw_benchmarks so that it doesn't depend
on gtest.

Test: manual
Change-Id: I45bd222fafa87172c77b7f5bb2a7a89ddca72361
This commit is contained in:
Adam Lesinski
2017-10-11 16:50:37 -07:00
parent df043ee75c
commit 873ef0e230
11 changed files with 246 additions and 269 deletions

View File

@@ -14,15 +14,27 @@
// libandroidfw is partially built for the host (used by obbtool, aapt, and others)
cc_library {
name: "libandroidfw",
host_supported: true,
cc_defaults {
name: "libandroidfw_defaults",
cflags: [
"-Wall",
"-Werror",
"-Wunused",
"-Wunreachable-code",
],
target: {
windows: {
// The Windows compiler warns incorrectly for value initialization with {}.
cppflags: ["-Wno-missing-field-initializers"],
},
host: {
cflags: ["-DSTATIC_ANDROIDFW_FOR_TOOLS"],
},
},
}
cc_library {
name: "libandroidfw",
defaults: ["libandroidfw_defaults"],
host_supported: true,
srcs: [
"ApkAssets.cpp",
"Asset.cpp",
@@ -67,7 +79,6 @@ cc_library {
},
},
host: {
cflags: ["-DSTATIC_ANDROIDFW_FOR_TOOLS"],
shared: {
enabled: false,
},
@@ -84,9 +95,82 @@ cc_library {
},
windows: {
enabled: true,
cppflags: ["-Wno-missing-field-initializers"], // The Windows compiler warns
// incorrectly for value
// initialization with {}.
},
},
}
common_test_libs = [
"libandroidfw",
"libbase",
"libcutils",
"libutils",
"libziparchive",
]
cc_test {
name: "libandroidfw_tests",
host_supported: true,
defaults: ["libandroidfw_defaults"],
cppflags: [
// This is to suppress warnings/errors from gtest
"-Wno-unnamed-type-template-args",
],
srcs: [
// Helpers/infra for testing.
"tests/CommonHelpers.cpp",
"tests/TestHelpers.cpp",
"tests/TestMain.cpp",
// Actual tests.
"tests/ApkAssets_test.cpp",
"tests/AppAsLib_test.cpp",
"tests/Asset_test.cpp",
"tests/AssetManager2_test.cpp",
"tests/AttributeFinder_test.cpp",
"tests/AttributeResolution_test.cpp",
"tests/ByteBucketArray_test.cpp",
"tests/Config_test.cpp",
"tests/ConfigLocale_test.cpp",
"tests/Idmap_test.cpp",
"tests/LoadedArsc_test.cpp",
"tests/ResourceUtils_test.cpp",
"tests/ResTable_test.cpp",
"tests/Split_test.cpp",
"tests/StringPiece_test.cpp",
"tests/Theme_test.cpp",
"tests/TypeWrappers_test.cpp",
"tests/ZipUtils_test.cpp",
],
target: {
android: {
srcs: [
"tests/BackupData_test.cpp",
"tests/ObbFile_test.cpp",
],
shared_libs: common_test_libs + ["libui"],
},
host: {
static_libs: common_test_libs + ["liblog", "libz"],
},
},
data: ["tests/data/**/*.apk"],
}
cc_benchmark {
name: "libandroidfw_benchmarks",
defaults: ["libandroidfw_defaults"],
srcs: [
// Helpers/infra for benchmarking.
"tests/BenchMain.cpp",
"tests/BenchmarkHelpers.cpp",
"tests/CommonHelpers.cpp",
// Actual benchmarks.
"tests/AssetManager2_bench.cpp",
"tests/SparseEntry_bench.cpp",
"tests/Theme_bench.cpp",
],
shared_libs: common_test_libs,
data: ["tests/data/**/*.apk"],
}

View File

@@ -1,24 +0,0 @@
# Copyright (C) 2010 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.
LOCAL_PATH:= $(call my-dir)
# Include subdirectory makefiles
# ============================================================
# If we're building with ONE_SHOT_MAKEFILE (mm, mmm), then what the framework
# team really wants is to build the stuff defined by this makefile.
ifeq (,$(ONE_SHOT_MAKEFILE))
include $(call first-makefiles-under,$(LOCAL_PATH))
endif

View File

@@ -1,126 +0,0 @@
#
# Copyright (C) 2014 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.
#
# ==========================================================
# Setup some common variables for the different build
# targets here.
# ==========================================================
LOCAL_PATH:= $(call my-dir)
testFiles := \
ApkAssets_test.cpp \
AppAsLib_test.cpp \
Asset_test.cpp \
AssetManager2_test.cpp \
AttributeFinder_test.cpp \
AttributeResolution_test.cpp \
ByteBucketArray_test.cpp \
Config_test.cpp \
ConfigLocale_test.cpp \
Idmap_test.cpp \
LoadedArsc_test.cpp \
ResourceUtils_test.cpp \
ResTable_test.cpp \
Split_test.cpp \
StringPiece_test.cpp \
TestHelpers.cpp \
TestMain.cpp \
Theme_test.cpp \
TypeWrappers_test.cpp \
ZipUtils_test.cpp
benchmarkFiles := \
AssetManager2_bench.cpp \
BenchMain.cpp \
BenchmarkHelpers.cpp \
SparseEntry_bench.cpp \
TestHelpers.cpp \
Theme_bench.cpp
androidfw_test_cflags := \
-Wall \
-Werror \
-Wunused \
-Wunreachable-code \
-Wno-missing-field-initializers
# gtest is broken.
androidfw_test_cflags += -Wno-unnamed-type-template-args
# ==========================================================
# Build the host tests: libandroidfw_tests
# ==========================================================
include $(CLEAR_VARS)
LOCAL_MODULE := libandroidfw_tests
LOCAL_CFLAGS := $(androidfw_test_cflags)
LOCAL_SRC_FILES := $(testFiles)
LOCAL_STATIC_LIBRARIES := \
libandroidfw \
libbase \
libutils \
libcutils \
liblog \
libz \
libziparchive
LOCAL_PICKUP_FILES := $(LOCAL_PATH)/data
include $(BUILD_HOST_NATIVE_TEST)
# ==========================================================
# Build the device tests: libandroidfw_tests
# ==========================================================
ifneq ($(SDK_ONLY),true)
include $(CLEAR_VARS)
LOCAL_MODULE := libandroidfw_tests
LOCAL_CFLAGS := $(androidfw_test_cflags)
LOCAL_SRC_FILES := $(testFiles) \
BackupData_test.cpp \
ObbFile_test.cpp \
LOCAL_SHARED_LIBRARIES := \
libandroidfw \
libbase \
libcutils \
libutils \
libui \
libziparchive
LOCAL_PICKUP_FILES := $(LOCAL_PATH)/data
include $(BUILD_NATIVE_TEST)
# ==========================================================
# Build the device benchmarks: libandroidfw_benchmarks
# ==========================================================
include $(CLEAR_VARS)
LOCAL_MODULE := libandroidfw_benchmarks
LOCAL_CFLAGS := $(androidfw_test_cflags)
LOCAL_SRC_FILES := $(benchmarkFiles)
LOCAL_STATIC_LIBRARIES := \
libgoogle-benchmark
LOCAL_SHARED_LIBRARIES := \
libandroidfw \
libbase \
libcutils \
libutils \
libziparchive
LOCAL_PICKUP_FILES := $(LOCAL_PATH)/data
include $(BUILD_NATIVE_TEST)
endif # Not SDK_ONLY

View File

@@ -23,7 +23,6 @@
#include "androidfw/ResourceTypes.h"
#include "BenchmarkHelpers.h"
#include "TestHelpers.h"
#include "data/basic/R.h"
#include "data/libclient/R.h"
#include "data/styles/R.h"

View File

@@ -18,7 +18,7 @@
#include "benchmark/benchmark.h"
#include "TestHelpers.h"
#include "BenchmarkHelpers.h"
int main(int argc, char** argv) {
::benchmark::Initialize(&argc, argv);

View File

@@ -14,21 +14,22 @@
* limitations under the License.
*/
#ifndef TESTS_BENCHMARKHELPERS_H_
#define TESTS_BENCHMARKHELPERS_H_
#ifndef ANDROIDFW_TESTS_BENCHMARKHELPERS_H
#define ANDROIDFW_TESTS_BENCHMARKHELPERS_H
#include <string>
#include <vector>
#include "androidfw/ResourceTypes.h"
#include "benchmark/benchmark.h"
#include "androidfw/ResourceTypes.h"
#include "CommonHelpers.h"
namespace android {
void GetResourceBenchmarkOld(const std::vector<std::string>& paths, const ResTable_config* config,
uint32_t resid, benchmark::State& state);
uint32_t resid, ::benchmark::State& state);
} // namespace android
#endif /* TESTS_BENCHMARKHELPERS_H_ */
#endif // ANDROIDFW_TESTS_BENCHMARKHELPERS_H

View File

@@ -0,0 +1,65 @@
/*
* 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.
*/
#include "CommonHelpers.h"
#include <iostream>
#include "android-base/file.h"
#include "android-base/logging.h"
#include "android-base/strings.h"
namespace android {
static std::string sTestDataPath;
void InitializeTest(int* argc, char** argv) {
// Set the default test data path to be the executable path directory + data.
SetTestDataPath(base::GetExecutableDirectory() + "/tests/data");
for (int i = 1; i < *argc; i++) {
const std::string arg = argv[i];
if (base::StartsWith(arg, "--testdata=")) {
SetTestDataPath(arg.substr(strlen("--testdata=")));
for (int j = i; j != *argc; j++) {
argv[j] = argv[j + 1];
}
--(*argc);
--i;
} else if (arg == "-h" || arg == "--help") {
std::cerr << "\nAdditional options specific to this test:\n"
" --testdata=[PATH]\n"
" Specify the location of test data used within the tests.\n";
exit(1);
}
}
}
void SetTestDataPath(const std::string& path) {
sTestDataPath = path;
}
const std::string& GetTestDataPath() {
CHECK(!sTestDataPath.empty()) << "no test data path set.";
return sTestDataPath;
}
std::string GetStringFromPool(const ResStringPool* pool, uint32_t idx) {
String8 str = pool->string8ObjectAt(idx);
return std::string(str.string(), str.length());
}
} // namespace android

View File

@@ -0,0 +1,57 @@
/*
* 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.
*/
#ifndef ANDROIDFW_TEST_COMMON_HELPERS_H
#define ANDROIDFW_TEST_COMMON_HELPERS_H
#include <ostream>
#include <string>
#include "androidfw/ResourceTypes.h"
#include "utils/String16.h"
#include "utils/String8.h"
namespace android {
void InitializeTest(int* argc, char** argv);
enum { MAY_NOT_BE_BAG = false };
void SetTestDataPath(const std::string& path);
const std::string& GetTestDataPath();
std::string GetStringFromPool(const ResStringPool* pool, uint32_t idx);
static inline bool operator==(const ResTable_config& a, const ResTable_config& b) {
return a.compare(b) == 0;
}
static inline ::std::ostream& operator<<(::std::ostream& out, const String8& str) {
return out << str.string();
}
static inline ::std::ostream& operator<<(::std::ostream& out, const String16& str) {
return out << String8(str).string();
}
static inline ::std::ostream& operator<<(::std::ostream& out, const ResTable_config& c) {
return out << c.toString();
}
} // namespace android
#endif // ANDROIDFW_TEST_COMMON_HELPERS_H

View File

@@ -18,7 +18,6 @@
#include "androidfw/ResourceTypes.h"
#include "BenchmarkHelpers.h"
#include "TestHelpers.h"
#include "data/sparse/R.h"
namespace sparse = com::android::sparse;

View File

@@ -16,67 +16,22 @@
#include "TestHelpers.h"
#include <libgen.h>
#include <unistd.h>
#include <memory>
#include <string>
#include "android-base/file.h"
#include "android-base/logging.h"
#include "android-base/strings.h"
#include "ziparchive/zip_archive.h"
using ::testing::AssertionFailure;
using ::testing::AssertionResult;
using ::testing::AssertionSuccess;
namespace android {
static std::string sTestDataPath;
// Extract the directory of the current executable path.
static std::string GetExecutableDir() {
const std::string path = base::GetExecutablePath();
std::unique_ptr<char, decltype(&std::free)> mutable_path = {strdup(path.c_str()), std::free};
std::string executable_dir = dirname(mutable_path.get());
return executable_dir;
}
void InitializeTest(int* argc, char** argv) {
// Set the default test data path to be the executable path directory.
SetTestDataPath(GetExecutableDir());
for (int i = 1; i < *argc; i++) {
const std::string arg = argv[i];
if (base::StartsWith(arg, "--testdata=")) {
SetTestDataPath(arg.substr(strlen("--testdata=")));
for (int j = i; j != *argc; j++) {
argv[j] = argv[j + 1];
}
--(*argc);
--i;
} else if (arg == "-h" || arg == "--help") {
std::cerr << "\nAdditional options specific to this test:\n"
" --testdata=[PATH]\n"
" Specify the location of test data used within the tests.\n";
exit(1);
}
}
}
void SetTestDataPath(const std::string& path) { sTestDataPath = path; }
const std::string& GetTestDataPath() {
CHECK(!sTestDataPath.empty()) << "no test data path set.";
return sTestDataPath;
}
::testing::AssertionResult ReadFileFromZipToString(const std::string& zip_path,
const std::string& file,
std::string* out_contents) {
AssertionResult ReadFileFromZipToString(const std::string& zip_path, const std::string& file,
std::string* out_contents) {
out_contents->clear();
::ZipArchiveHandle handle;
int32_t result = OpenArchive(zip_path.c_str(), &handle);
if (result != 0) {
return ::testing::AssertionFailure() << "Failed to open zip '" << zip_path
<< "': " << ::ErrorCodeString(result);
return AssertionFailure() << "Failed to open zip '" << zip_path
<< "': " << ::ErrorCodeString(result);
}
::ZipString name(file.c_str());
@@ -84,8 +39,8 @@ const std::string& GetTestDataPath() {
result = ::FindEntry(handle, name, &entry);
if (result != 0) {
::CloseArchive(handle);
return ::testing::AssertionFailure() << "Could not find file '" << file << "' in zip '"
<< zip_path << "' : " << ::ErrorCodeString(result);
return AssertionFailure() << "Could not find file '" << file << "' in zip '" << zip_path
<< "' : " << ::ErrorCodeString(result);
}
out_contents->resize(entry.uncompressed_length);
@@ -94,41 +49,36 @@ const std::string& GetTestDataPath() {
out_contents->size());
if (result != 0) {
::CloseArchive(handle);
return ::testing::AssertionFailure() << "Failed to extract file '" << file << "' from zip '"
<< zip_path << "': " << ::ErrorCodeString(result);
return AssertionFailure() << "Failed to extract file '" << file << "' from zip '" << zip_path
<< "': " << ::ErrorCodeString(result);
}
::CloseArchive(handle);
return ::testing::AssertionSuccess();
return AssertionSuccess();
}
::testing::AssertionResult IsStringEqual(const ResTable& table, uint32_t resource_id,
const char* expected_str) {
AssertionResult IsStringEqual(const ResTable& table, uint32_t resource_id,
const char* expected_str) {
Res_value val;
ssize_t block = table.getResource(resource_id, &val, MAY_NOT_BE_BAG);
if (block < 0) {
return ::testing::AssertionFailure() << "could not find resource";
return AssertionFailure() << "could not find resource";
}
if (val.dataType != Res_value::TYPE_STRING) {
return ::testing::AssertionFailure() << "resource is not a string";
return AssertionFailure() << "resource is not a string";
}
const ResStringPool* pool = table.getTableStringBlock(block);
if (pool == NULL) {
return ::testing::AssertionFailure() << "table has no string pool for block " << block;
return AssertionFailure() << "table has no string pool for block " << block;
}
const String8 actual_str = pool->string8ObjectAt(val.data);
if (String8(expected_str) != actual_str) {
return ::testing::AssertionFailure() << actual_str.string();
return AssertionFailure() << actual_str.string();
}
return ::testing::AssertionSuccess() << actual_str.string();
}
std::string GetStringFromPool(const ResStringPool* pool, uint32_t idx) {
String8 str = pool->string8ObjectAt(idx);
return std::string(str.string(), str.length());
return AssertionSuccess() << actual_str.string();
}
} // namespace android

View File

@@ -14,53 +14,25 @@
* limitations under the License.
*/
#ifndef TEST_HELPERS_H_
#define TEST_HELPERS_H_
#ifndef ANDROIDFW_TEST_TESTHELPERS_H
#define ANDROIDFW_TEST_TESTHELPERS_H
#include <ostream>
#include <string>
#include <vector>
#include "androidfw/ResourceTypes.h"
#include "gtest/gtest.h"
#include "utils/String16.h"
#include "utils/String8.h"
static inline ::std::ostream& operator<<(::std::ostream& out, const android::String8& str) {
return out << str.string();
}
static inline ::std::ostream& operator<<(::std::ostream& out, const android::String16& str) {
return out << android::String8(str).string();
}
#include "CommonHelpers.h"
namespace android {
void InitializeTest(int* argc, char** argv);
enum { MAY_NOT_BE_BAG = false };
void SetTestDataPath(const std::string& path);
const std::string& GetTestDataPath();
::testing::AssertionResult ReadFileFromZipToString(const std::string& zip_path,
const std::string& file,
std::string* out_contents);
static inline bool operator==(const ResTable_config& a, const ResTable_config& b) {
return a.compare(b) == 0;
}
static inline ::std::ostream& operator<<(::std::ostream& out, const ResTable_config& c) {
return out << c.toString().string();
}
::testing::AssertionResult IsStringEqual(const ResTable& table, uint32_t resource_id,
const char* expected_str);
std::string GetStringFromPool(const ResStringPool* pool, uint32_t idx);
} // namespace android
#endif // TEST_HELPERS_H_
#endif // ANDROIDFW_TEST_TESTHELPERS_H