[android][build] core tests - initial setup for rendering tests

This commit is contained in:
Ivo van Dongen
2016-06-23 16:39:27 +02:00
committed by Ivo van Dongen
parent 5ae92de618
commit c810d16f0d
15 changed files with 306 additions and 79 deletions

2
.gitignore vendored
View File

@@ -30,3 +30,5 @@ xcuserdata
/platform/macos/macos.xcworkspace/xcshareddata/macos.xcscmblueprint
/platform/ios/ios.xcworkspace/xcshareddata/ios.xcscmblueprint
/documentation
test/fixtures/api/assets.zip
test/fixtures/storage/assets.zip

2
.mason

Submodule .mason updated: 4fff08aefa...af4a2c693e

View File

@@ -467,8 +467,9 @@ test-node: node
#### Android targets ###########################################################
ANDROID_ENV = platform/android/scripts/toolchain.sh
ANDROID_ABIS = arm-v5 arm-v7 arm-v8 x86 x86-64 mips
MBGL_ANDROID_ENV = platform/android/scripts/toolchain.sh
MBGL_ANDROID_ABIS = arm-v5 arm-v7 arm-v8 x86 x86-64 mips
MBGL_ANDROID_LOCAL_WORK_DIR = /data/local/tmp/core-tests
.PHONY: android-style-code
android-style-code:
@@ -481,7 +482,7 @@ build/android-$1/$(BUILDTYPE): $(BUILD_DEPS)
mkdir -p build/android-$1/$(BUILDTYPE)
build/android-$1/$(BUILDTYPE)/toolchain.cmake: platform/android/scripts/toolchain.sh build/android-$1/$(BUILDTYPE)
$(ANDROID_ENV) $1 > build/android-$1/$(BUILDTYPE)/toolchain.cmake
$(MBGL_ANDROID_ENV) $1 > build/android-$1/$(BUILDTYPE)/toolchain.cmake
build/android-$1/$(BUILDTYPE)/Makefile: build/android-$1/$(BUILDTYPE)/toolchain.cmake platform/android/config.cmake
cd build/android-$1/$(BUILDTYPE) && cmake ../../.. -G Ninja \
@@ -490,6 +491,10 @@ build/android-$1/$(BUILDTYPE)/Makefile: build/android-$1/$(BUILDTYPE)/toolchain.
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
-DMBGL_PLATFORM=android
.PHONY: android-test-lib-$1
android-test-lib-$1: build/android-$1/$(BUILDTYPE)/Makefile
$(NINJA) $(NINJA_ARGS) -j$(JOBS) -C build/android-$1/$(BUILDTYPE) mbgl-test-stripped
.PHONY: android-lib-$1
android-lib-$1: build/android-$1/$(BUILDTYPE)/Makefile
$(NINJA) $(NINJA_ARGS) -j$(JOBS) -C build/android-$1/$(BUILDTYPE) all
@@ -498,6 +503,37 @@ android-lib-$1: build/android-$1/$(BUILDTYPE)/Makefile
android-$1: android-lib-$1
cd platform/android && ./gradlew --parallel --max-workers=$(JOBS) assemble$(BUILDTYPE)
run-android-core-test-$1: android-lib-$1 android-test-lib-$1
# Compile main sources and extract the classes (using the test app to get all transitive dependencies in one place)
cd platform/android && ./gradlew assembleDebug
unzip -o platform/android/MapboxGLAndroidSDKTestApp/build/outputs/apk/MapboxGLAndroidSDKTestApp-debug.apk classes.dex -d build/android-$1/$(BUILDTYPE)
#Compile Test runner
find platform/android/src/test -name "*.java" > build/android-$1/$(BUILDTYPE)/java-sources.txt
javac -sourcepath platform/android/src/test -d build/android-$1/$(BUILDTYPE) -source 1.7 -target 1.7 @build/android-$1/$(BUILDTYPE)/java-sources.txt
#Combine and dex
cd build/android-$1/$(BUILDTYPE) && $(ANDROID_HOME)/build-tools/25.0.0/dx --dex --output=test.jar *.class classes.dex
#Ensure clean state on the device
adb shell "rm -Rf $(MBGL_ANDROID_LOCAL_WORK_DIR) && mkdir -p $(MBGL_ANDROID_LOCAL_WORK_DIR)/test"
# Generate zipped asset files
cd test/fixtures/api && zip -r assets.zip assets && cd -
cd test/fixtures/storage && zip -r assets.zip assets && cd -
#Push all needed files to the device
adb push build/android-$1/$(BUILDTYPE)/test.jar $(MBGL_ANDROID_LOCAL_WORK_DIR) > /dev/null 2>&1
adb push test/fixtures $(MBGL_ANDROID_LOCAL_WORK_DIR)/test > /dev/null 2>&1
adb push build/android-$1/$(BUILDTYPE)/stripped/libmapbox-gl.so $(MBGL_ANDROID_LOCAL_WORK_DIR) > /dev/null 2>&1
adb push build/android-$1/$(BUILDTYPE)/stripped/libmbgl-test.so $(MBGL_ANDROID_LOCAL_WORK_DIR) > /dev/null 2>&1
#Kick off the tests
adb shell "export LD_LIBRARY_PATH=/system/lib:$(MBGL_ANDROID_LOCAL_WORK_DIR) && cd $(MBGL_ANDROID_LOCAL_WORK_DIR) && dalvikvm32 -cp $(MBGL_ANDROID_LOCAL_WORK_DIR)/test.jar Main"
#Gather the results
adb shell "cd $(MBGL_ANDROID_LOCAL_WORK_DIR) && tar -cvzf results.tgz test/fixtures/* > /dev/null 2>&1"
adb pull $(MBGL_ANDROID_LOCAL_WORK_DIR)/results.tgz build/android-$1/$(BUILDTYPE)/ > /dev/null 2>&1
.PHONY: run-android-$1
run-android-$1: android-$1
cd platform/android && ./gradlew :MapboxGLAndroidSDKTestApp:installDebug && adb shell am start -n com.mapbox.mapboxsdk.testapp/.activity.FeatureOverviewActivity
@@ -505,7 +541,7 @@ run-android-$1: android-$1
apackage: android-lib-$1
endef
$(foreach abi,$(ANDROID_ABIS),$(eval $(call ANDROID_RULES,$(abi))))
$(foreach abi,$(MBGL_ANDROID_ABIS),$(eval $(call ANDROID_RULES,$(abi))))
.PHONY: android
android: android-arm-v7

View File

@@ -1,5 +1,7 @@
add_definitions(-DMBGL_USE_GLES2=1)
include(cmake/test-files.cmake)
#Include to use build specific variables
include(${CMAKE_CURRENT_BINARY_DIR}/toolchain.cmake)
@@ -15,6 +17,9 @@ mason_use(libpng VERSION 1.6.25)
mason_use(libzip VERSION 1.1.3)
mason_use(nunicode VERSION 1.7.1)
mason_use(sqlite VERSION 3.14.2)
mason_use(gtest VERSION 1.7.0)
## mbgl core ##
macro(mbgl_platform_core)
@@ -52,12 +57,72 @@ macro(mbgl_platform_core)
PRIVATE platform/default/png_reader.cpp
PRIVATE platform/default/jpeg_reader.cpp
# Headless view
# TODO
# Thread pool
PRIVATE platform/default/mbgl/util/default_thread_pool.cpp
PRIVATE platform/default/mbgl/util/default_thread_pool.cpp
PRIVATE platform/default/mbgl/util/default_thread_pool.hpp
# Conversion C++ -> Java
platform/android/src/conversion/constant.hpp
platform/android/src/conversion/conversion.hpp
platform/android/src/style/conversion/function.hpp
platform/android/src/style/conversion/property_value.hpp
platform/android/src/style/conversion/types.hpp
platform/android/src/style/conversion/types_string_values.hpp
# Style conversion Java -> C++
platform/android/src/style/android_conversion.hpp
platform/android/src/style/conversion/geojson.hpp
platform/android/src/style/value.cpp
platform/android/src/style/value.hpp
platform/android/src/style/conversion/url_or_tileset.hpp
# Style
platform/android/src/style/layers/background_layer.cpp
platform/android/src/style/layers/background_layer.hpp
platform/android/src/style/layers/circle_layer.cpp
platform/android/src/style/layers/circle_layer.hpp
platform/android/src/style/layers/custom_layer.cpp
platform/android/src/style/layers/custom_layer.hpp
platform/android/src/style/layers/fill_layer.cpp
platform/android/src/style/layers/fill_layer.hpp
platform/android/src/style/layers/layer.cpp
platform/android/src/style/layers/layer.hpp
platform/android/src/style/layers/layers.cpp
platform/android/src/style/layers/layers.hpp
platform/android/src/style/layers/line_layer.cpp
platform/android/src/style/layers/line_layer.hpp
platform/android/src/style/layers/raster_layer.cpp
platform/android/src/style/layers/raster_layer.hpp
platform/android/src/style/layers/symbol_layer.cpp
platform/android/src/style/layers/symbol_layer.hpp
platform/android/src/style/sources/geojson_source.cpp
platform/android/src/style/sources/geojson_source.hpp
platform/android/src/style/sources/source.cpp
platform/android/src/style/sources/source.hpp
platform/android/src/style/sources/sources.cpp
platform/android/src/style/sources/sources.hpp
platform/android/src/style/sources/raster_source.cpp
platform/android/src/style/sources/raster_source.hpp
platform/android/src/style/sources/vector_source.cpp
platform/android/src/style/sources/vector_source.hpp
# Connectivity
platform/android/src/connectivity_listener.cpp
platform/android/src/connectivity_listener.hpp
# Native map
platform/android/src/native_map_view.cpp
platform/android/src/native_map_view.hpp
# Main jni bindings
platform/android/src/attach_env.cpp
platform/android/src/attach_env.hpp
platform/android/src/java_types.cpp
platform/android/src/java_types.hpp
# Main entry point
platform/android/src/jni.hpp
platform/android/src/jni.cpp
)
target_include_directories(mbgl-core
@@ -71,6 +136,7 @@ macro(mbgl_platform_core)
target_add_mason_package(mbgl-core PUBLIC libzip)
target_add_mason_package(mbgl-core PUBLIC geojson)
target_add_mason_package(mbgl-core PUBLIC jni.hpp)
target_add_mason_package(mbgl-core PUBLIC rapidjson)
target_compile_options(mbgl-core
PRIVATE -fvisibility=hidden
@@ -91,71 +157,12 @@ macro(mbgl_platform_core)
)
endmacro()
## Main library ##
add_library(mapbox-gl SHARED
# Conversion C++ -> Java
platform/android/src/conversion/constant.hpp
platform/android/src/conversion/conversion.hpp
platform/android/src/style/conversion/function.hpp
platform/android/src/style/conversion/property_value.hpp
platform/android/src/style/conversion/types.hpp
platform/android/src/style/conversion/types_string_values.hpp
# Style conversion Java -> C++
platform/android/src/style/android_conversion.hpp
platform/android/src/style/conversion/geojson.hpp
platform/android/src/style/value.cpp
platform/android/src/style/value.hpp
platform/android/src/style/conversion/url_or_tileset.hpp
# Style
platform/android/src/style/layers/background_layer.cpp
platform/android/src/style/layers/background_layer.hpp
platform/android/src/style/layers/circle_layer.cpp
platform/android/src/style/layers/circle_layer.hpp
platform/android/src/style/layers/custom_layer.cpp
platform/android/src/style/layers/custom_layer.hpp
platform/android/src/style/layers/fill_layer.cpp
platform/android/src/style/layers/fill_layer.hpp
platform/android/src/style/layers/layer.cpp
platform/android/src/style/layers/layer.hpp
platform/android/src/style/layers/layers.cpp
platform/android/src/style/layers/layers.hpp
platform/android/src/style/layers/line_layer.cpp
platform/android/src/style/layers/line_layer.hpp
platform/android/src/style/layers/raster_layer.cpp
platform/android/src/style/layers/raster_layer.hpp
platform/android/src/style/layers/symbol_layer.cpp
platform/android/src/style/layers/symbol_layer.hpp
platform/android/src/style/sources/geojson_source.cpp
platform/android/src/style/sources/geojson_source.hpp
platform/android/src/style/sources/source.cpp
platform/android/src/style/sources/source.hpp
platform/android/src/style/sources/sources.cpp
platform/android/src/style/sources/sources.hpp
platform/android/src/style/sources/raster_source.cpp
platform/android/src/style/sources/raster_source.hpp
platform/android/src/style/sources/vector_source.cpp
platform/android/src/style/sources/vector_source.hpp
# Native map
platform/android/src/native_map_view.cpp
platform/android/src/native_map_view.hpp
# Connectivity
platform/android/src/connectivity_listener.cpp
platform/android/src/connectivity_listener.hpp
# Main jni bindings
platform/android/src/jni.cpp
platform/android/src/jni.hpp
platform/android/src/attach_env.cpp
platform/android/src/attach_env.hpp
platform/android/src/java_types.cpp
platform/android/src/java_types.hpp
platform/android/src/main.cpp
)
target_add_mason_package(mapbox-gl PUBLIC rapidjson)
target_compile_options(mapbox-gl
PRIVATE -fvisibility=hidden
PRIVATE -ffunction-sections
@@ -168,6 +175,62 @@ target_link_libraries(mapbox-gl
PUBLIC -Wl,--gc-sections
)
## Test library ##
add_library(mbgl-test SHARED
# Actual tests
${MBGL_TEST_FILES}
# Main test entry point
platform/android/src/test/main.jni.cpp
)
target_sources(mbgl-test
# Headless view
PRIVATE platform/default/mbgl/gl/headless_backend.cpp
PRIVATE platform/default/mbgl/gl/headless_backend.hpp
PRIVATE platform/default/mbgl/gl/offscreen_view.cpp
PRIVATE platform/default/mbgl/gl/offscreen_view.hpp
PRIVATE platform/linux/src/headless_backend_egl.cpp
PRIVATE platform/linux/src/headless_display_egl.cpp
)
target_compile_options(mbgl-test
PRIVATE -fvisibility=hidden
PRIVATE -Os
)
target_compile_definitions(mbgl-test
PRIVATE MBGL_ASSET_ZIP=1
)
target_include_directories(mbgl-test
PRIVATE include
PRIVATE src # TODO: eliminate
PRIVATE test/include
PRIVATE test/src
PRIVATE platform/default
PRIVATE ${MBGL_GENERATED}/include
)
target_link_libraries(mbgl-test
PRIVATE mbgl-core
)
target_add_mason_package(mbgl-test PRIVATE geometry)
target_add_mason_package(mbgl-test PRIVATE variant)
target_add_mason_package(mbgl-test PRIVATE unique_resource)
target_add_mason_package(mbgl-test PRIVATE rapidjson)
target_add_mason_package(mbgl-test PRIVATE gtest)
target_add_mason_package(mbgl-test PRIVATE pixelmatch)
target_add_mason_package(mbgl-test PRIVATE boost)
target_add_mason_package(mbgl-test PRIVATE geojson)
target_add_mason_package(mbgl-test PRIVATE geojsonvt)
## Custom layer example ##
add_library(example-custom-layer SHARED
platform/android/src/example_custom_layer.cpp
)
@@ -184,6 +247,8 @@ target_link_libraries(example-custom-layer
PUBLIC -Wl,--gc-sections
)
## Strip and copy ##
set(ANDROID_SDK_PROJECT_DIR ${CMAKE_SOURCE_DIR}/platform/android/MapboxGLAndroidSDK)
set(ANDROID_JNI_TARGET_DIR ${ANDROID_SDK_PROJECT_DIR}/src/main/jniLibs/${ANDROID_JNIDIR}/)
set(ANDROID_ASSETS_TARGET_DIR ${ANDROID_SDK_PROJECT_DIR}/src/main/assets/)
@@ -203,8 +268,17 @@ add_custom_target(copy-files
COMMAND ${STRIP_COMMAND} $<TARGET_FILE:example-custom-layer> -o ${ANDROID_TEST_APP_JNI_TARGET_DIR}$<TARGET_FILE_NAME:example-custom-layer>
)
add_custom_target(mbgl-test-stripped
DEPENDS mapbox-gl
DEPENDS mbgl-test
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/stripped
COMMAND ${STRIP_COMMAND} $<TARGET_FILE:mapbox-gl> -o ${CMAKE_CURRENT_BINARY_DIR}/stripped/$<TARGET_FILE_NAME:mapbox-gl>
COMMAND ${STRIP_COMMAND} $<TARGET_FILE:mbgl-test> -o ${CMAKE_CURRENT_BINARY_DIR}/stripped/$<TARGET_FILE_NAME:mbgl-test>
)
add_custom_target(_all ALL
DEPENDS mapbox-gl
DEPENDS mbgl-test
DEPENDS example-custom-layer
DEPENDS copy-files
)

View File

@@ -1703,9 +1703,12 @@ void updateOfflineRegionMetadata(JNIEnv *env, jni::jobject* offlineRegion_, jni:
// Offline calls end
}
} // anonymous
extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) {
namespace mbgl {
namespace android {
void registerNatives(JavaVM *vm) {
theJVM = vm;
jni::JNIEnv& env = jni::GetEnv(*vm, jni::jni_version_1_6);
@@ -1988,6 +1991,7 @@ extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) {
char release[PROP_VALUE_MAX] = "";
__system_property_get("ro.build.version.release", release);
androidRelease = std::string(release);
return JNI_VERSION_1_6;
}
} // android
} // mbgl

View File

@@ -23,6 +23,8 @@ extern jmethodID onSnapshotReadyId;
extern bool attach_jni_thread(JavaVM* vm, JNIEnv** env, std::string threadName);
extern void detach_jni_thread(JavaVM* vm, JNIEnv** env, bool detach);
extern void registerNatives(JavaVM* vm);
}
}
} //android
} //mbgl

View File

@@ -0,0 +1,9 @@
#include "jni.hpp"
#include <jni/jni.hpp>
extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *) {
assert(vm != nullptr);
mbgl::android::registerNatives(vm);
return JNI_VERSION_1_6;
}

View File

@@ -0,0 +1,15 @@
public class Main {
public native void runAllTests();
public static void main(String[] args) throws Exception {
//Load the tests
System.loadLibrary("mbgl-test");
//Run the tests
new Main().runAllTests();
//Exit explicitly otherwise dalvikvm won't quit
System.exit(0);
}
}

View File

@@ -0,0 +1,76 @@
#include "../jni.hpp"
#include <android/log.h>
#include <jni/jni.hpp>
#include <mbgl/util/logging.hpp>
#include <mbgl/test.hpp>
#pragma clang diagnostic ignored "-Wunused-parameter"
#define MAKE_NATIVE_METHOD(name, sig) jni::MakeNativeMethod<decltype(name), name>( #name, sig )
namespace {
/**
* JNI Bound to Main#runAllTests()
*/
void runAllTests(JNIEnv *env, jni::jobject* obj) {
mbgl::Log::Info(mbgl::Event::JNI, "Starting tests");
mbgl::runTests(0, nullptr);
}
}
// JNI Bindings to stub the android.util.Log implementation
static jboolean isLoggable(JNIEnv* env, jni::jobject* clazz, jni::jstring* tag, jint level) {
return true;
}
static jint println_native(JNIEnv* env, jni::jobject* clazz, jint bufID, jint priority, jni::jstring* jtag, jni::jstring* jmessage) {
if (jtag == nullptr || jmessage == nullptr) {
return false;
}
std::string tag = jni::Make<std::string>(*env, jni::String(jtag));
std::string message = jni::Make<std::string>(*env, jni::String(jmessage));
return __android_log_print(priority, tag.c_str(), "%s", message.c_str());
}
static jint logger_entry_max_payload_native(JNIEnv* env, jni::jobject* clazz) {
return static_cast<jint>(4068);
}
// Main entry point
extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) {
//Load the main library jni bindings
mbgl::Log::Info(mbgl::Event::JNI, "Registering main JNI Methods");
mbgl::android::registerNatives(vm);
//Load the test library jni bindings
mbgl::Log::Info(mbgl::Event::JNI, "Registering test JNI Methods");
jni::JNIEnv& env = jni::GetEnv(*vm, jni::jni_version_1_6);
//Main class (entry point for tests from dalvikvm)
struct Main { static constexpr auto Name() { return "Main"; } };
jni::RegisterNatives(env, jni::Class<Main>::Find(env), MAKE_NATIVE_METHOD(runAllTests, "()V"));
//Bindings for system classes
struct Log { static constexpr auto Name() { return "android/util/Log"; } };
try {
jni::RegisterNatives(env, jni::Class<Log>::Find(env),
MAKE_NATIVE_METHOD(isLoggable, "(Ljava/lang/String;I)Z"),
MAKE_NATIVE_METHOD(logger_entry_max_payload_native, "()I"),
MAKE_NATIVE_METHOD(println_native, "(IILjava/lang/String;Ljava/lang/String;)I")
);
} catch (jni::PendingJavaException ex) {
env.ThrowNew(jni::JavaErrorClass(env), "Could not register Log mocks");
}
return JNI_VERSION_1_6;
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -109,7 +109,13 @@ TEST(Transform, IntegerZoom) {
auto checkIntegerZoom = [&transform](uint8_t zoomInt, double zoom) {
double scale = transform.getState().zoomScale(zoom);
transform.setScale(scale);
#if __ANDROID__
// Android uses log(x) / M_LN2 instead of log2(x) because the latter
// is _broken in ARMv5 - that approach being less precise than log2(x).
ASSERT_NEAR(transform.getScale(), scale, 0.0001);
#else
ASSERT_DOUBLE_EQ(transform.getScale(), scale);
#endif
ASSERT_NEAR(transform.getZoom(), zoom, 0.0001);
ASSERT_EQ(transform.getState().getIntegerZoom(), zoomInt);
ASSERT_NEAR(transform.getState().getZoomFraction(), zoom - zoomInt, 0.0001);

View File

@@ -4,7 +4,10 @@
#include <TargetConditionals.h>
#endif
#if TARGET_OS_IOS
#if __ANDROID__
#define TEST_READ_ONLY 0
#define TEST_HAS_SERVER 0
#elif TARGET_OS_IOS
#define TEST_READ_ONLY 1
#define TEST_HAS_SERVER 0
#else

View File

@@ -27,7 +27,7 @@ TEST(AssetFileSource, Load) {
AssetFileSource fs(getFileSourceRoot());
// iOS seems to run out of file descriptors...
#if TARGET_OS_IPHONE
#if TARGET_OS_IPHONE || __ANDROID__
unsigned numThreads = 30;
#else
unsigned numThreads = 50;