aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--BUILD5
-rw-r--r--BUILD.glob1
-rw-r--r--WORKSPACE25
-rwxr-xr-xcompile.sh5
-rw-r--r--src/test/shell/bazel/BUILD3
-rw-r--r--src/test/shell/bazel/android/BUILD18
-rwxr-xr-xsrc/test/shell/bazel/android/android_integration_test.sh169
-rwxr-xr-xsrc/test/shell/bazel/test-setup.sh108
-rwxr-xr-xsrc/test/shell/bazel/testenv.sh7
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/incrementaldeployment/BUILD9
10 files changed, 335 insertions, 15 deletions
diff --git a/BUILD b/BUILD
index 0081bc6752..d34269b456 100644
--- a/BUILD
+++ b/BUILD
@@ -4,3 +4,8 @@ filegroup(
name = "git",
srcs = glob([".git/**"]),
)
+
+filegroup(
+ name = "dummy",
+ visibility = ["//visibility:public"],
+)
diff --git a/BUILD.glob b/BUILD.glob
new file mode 100644
index 0000000000..aeb40086af
--- /dev/null
+++ b/BUILD.glob
@@ -0,0 +1 @@
+filegroup(name="all", srcs=["."], visibility=["//visibility:public"])
diff --git a/WORKSPACE b/WORKSPACE
index b4ee4e467a..ff17d5f52c 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -55,3 +55,28 @@ new_http_archive(
sha256 = "0d471e672fac5a450ae5507b335fda2efc0b22ea9fb7f215c6a9c466dafa2661",
build_file = "tools/build_rules/rust/rust-darwin-x86_64.BUILD",
)
+
+# In order to run the Android integration tests, uncomment these rules, point
+# them to the Android NDK and the SDK, and point the bind rules under them
+# to @repository//:all.
+# new_local_repository(
+# name = "globbed_android_sdk",
+# path = "/usr/local/google/home/lberki/android/android-sdk-linux",
+# build_file = "BUILD.glob"
+# )
+#
+# new_local_repository(
+# name = "globbed_android_ndk",
+# path = "/usr/local/google/home/lberki/android/android-ndk",
+# build_file = "BUILD.glob"
+# )
+
+bind(
+ name = "android_sdk_for_testing",
+ actual = "//:dummy",
+)
+
+bind(
+ name = "android_ndk_for_testing",
+ actual = "//:dummy",
+)
diff --git a/compile.sh b/compile.sh
index 1b2af73803..3f7a27d4f6 100755
--- a/compile.sh
+++ b/compile.sh
@@ -161,6 +161,11 @@ fi
if [ $DO_TESTS ]; then
new_step "Running tests"
display "."
+
+ if grep -sq '^ *actual = "//:dummy"' WORKSPACE; then
+ display "$WARNING Android SDK or NDK are not set in the WORKSPACE file. Android tests will not be run."
+ fi
+
[ -n "$JAVAC_VERSION" ] || get_java_version
if [[ ! "${BAZEL_TEST_FILTERS-}" =~ "-jdk8" ]] \
&& [ "8" -gt ${JAVAC_VERSION#*.} ]; then
diff --git a/src/test/shell/bazel/BUILD b/src/test/shell/bazel/BUILD
index 8bc52c8bba..fff3bb4cbf 100644
--- a/src/test/shell/bazel/BUILD
+++ b/src/test/shell/bazel/BUILD
@@ -58,6 +58,9 @@ filegroup(
"//third_party/java/jdk/langtools:srcs",
"//tools:srcs",
],
+ visibility = [
+ "//src/test/shell/bazel:__subpackages__",
+ ],
)
sh_test(
diff --git a/src/test/shell/bazel/android/BUILD b/src/test/shell/bazel/android/BUILD
new file mode 100644
index 0000000000..3e3e4285c1
--- /dev/null
+++ b/src/test/shell/bazel/android/BUILD
@@ -0,0 +1,18 @@
+sh_test(
+ name = "android_integration_test",
+ srcs = ["android_integration_test.sh"],
+ data = [
+ "//src/test/shell/bazel:test-deps",
+ # These targets should point to a filegroup with one single item: the
+ # root directory of the NDK and the SDK. Note that this is incorrect,
+ # but since they contain files with names that are not legal Bazel
+ # labels, there isn't really a better option.
+ "//external:android_ndk_for_testing",
+ "//external:android_sdk_for_testing",
+ "//src/tools/android/java/com/google/devtools/build/android:AarGeneratorAction_deploy.jar",
+ "//src/tools/android/java/com/google/devtools/build/android:AndroidResourceProcessingAction_deploy.jar",
+ "//src/tools/android/java/com/google/devtools/build/android/incrementaldeployment:srcs",
+ "//src/tools/android/java/com/google/devtools/build/android/ziputils:mapper_deploy.jar",
+ "//src/tools/android/java/com/google/devtools/build/android/ziputils:reducer_deploy.jar",
+ ],
+)
diff --git a/src/test/shell/bazel/android/android_integration_test.sh b/src/test/shell/bazel/android/android_integration_test.sh
new file mode 100755
index 0000000000..97440a3e30
--- /dev/null
+++ b/src/test/shell/bazel/android/android_integration_test.sh
@@ -0,0 +1,169 @@
+#!/bin/bash
+#
+# Copyright 2015 Google Inc. All rights reserved.
+#
+# 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.
+
+# Load test environment
+source $(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/../test-setup.sh \
+ || { echo "test-setup.sh not found!" >&2; exit 1; }
+
+function test_android_binary() {
+ create_new_workspace
+ setup_android_support
+
+ mkdir -p java/bazel
+ cat > java/bazel/BUILD <<EOF
+android_library(
+ name = "lib",
+ srcs = ["Lib.java"],
+)
+
+android_binary(
+ name = "bin",
+ srcs = [
+ "MainActivity.java",
+ "Jni.java",
+ ],
+ legacy_native_support = 0,
+ manifest = "AndroidManifest.xml",
+ deps = [
+ ":lib",
+ ":jni"
+ ],
+)
+
+cc_library(
+ name = "jni",
+ srcs = ["jni.cc"],
+ deps = [":jni_dep"],
+)
+
+cc_library(
+ name = "jni_dep",
+ srcs = ["jni_dep.cc"],
+)
+
+EOF
+
+ cat > java/bazel/AndroidManifest.xml <<EOF
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="bazel.android"
+ android:versionCode="1"
+ android:versionName="1.0" >
+
+ <uses-sdk
+ android:minSdkVersion="21"
+ android:targetSdkVersion="21" />
+
+ <application
+ android:label="Bazel Test App" >
+ <activity
+ android:name="bazel.MainActivity"
+ android:label="Bazel" >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+</manifest>
+EOF
+
+ cat > java/bazel/Lib.java <<EOF
+package bazel;
+
+public class Lib {
+ public static String message() {
+ return "Hello Lib";
+ }
+}
+EOF
+
+ cat > java/bazel/Jni.java <<EOF
+package bazel;
+
+public class Jni {
+ public static native String hello();
+}
+
+EOF
+ cat > java/bazel/MainActivity.java <<EOF
+package bazel;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class MainActivity extends Activity {
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ }
+}
+EOF
+
+ cat > java/bazel/jni_dep.h <<EOF
+#pragma once
+
+#include <jni.h>
+
+jstring NewStringLatin1(JNIEnv *env, const char *str);
+EOF
+
+ cat > java/bazel/jni_dep.cc <<EOF
+#include "java/bazel/jni_dep.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+jstring NewStringLatin1(JNIEnv *env, const char *str) {
+ int len = strlen(str);
+ jchar *str1;
+ str1 = reinterpret_cast<jchar *>(malloc(len * sizeof(jchar)));
+
+ for (int i = 0; i < len; i++) {
+ str1[i] = (unsigned char)str[i];
+ }
+ jstring result = env->NewString(str1, len);
+ free(str1);
+ return result;
+}
+EOF
+
+ cat > java/bazel/jni.cc <<EOF
+#include <jni.h>
+
+#include "java/bazel/jni_dep.h"
+
+const char* hello = "Hello JNI";
+
+extern "C" JNIEXPORT jstring JNICALL
+Java_bazel_Jni_hello(JNIEnv *env, jclass clazz) {
+ return NewStringLatin1(env, hello);
+}
+EOF
+
+ bazel build //java/bazel:bin || fail "build failed"
+}
+
+if [[ ! -r "${TEST_SRCDIR}/external/globbed_android_ndk/RELEASE.TXT" ]]; then
+ echo "Not running Android tests due to lack of an Android NDK."
+ exit 0
+fi
+
+if [[ ! -r "${TEST_SRCDIR}/external/globbed_android_sdk/SDK Readme.txt" ]]; then
+ echo "Not running Android tests due to lack of an Android SDK."
+ exit 0
+fi
+
+run_suite "Android integration tests"
diff --git a/src/test/shell/bazel/test-setup.sh b/src/test/shell/bazel/test-setup.sh
index 2c14ce8c00..1388a9ca49 100755
--- a/src/test/shell/bazel/test-setup.sh
+++ b/src/test/shell/bazel/test-setup.sh
@@ -46,37 +46,72 @@ function bazel() {
}
function setup_android_support() {
- cat > tools/android/BUILD <<EOF
+ ANDROID_TOOLS=$PWD/android_tools
+ mkdir -p ${ANDROID_TOOLS}/tools/android
+
+ ln -s "${aargenerator_path}" ${ANDROID_TOOLS}/tools/android/aargenerator.jar
+ ln -s "${androidresourceprocessor_path}" ${ANDROID_TOOLS}/tools/android/androidresourceprocessor.jar
+ ln -s "${dexmapper_path}" ${ANDROID_TOOLS}/tools/android/dexmapper.jar
+ ln -s "${dexreducer_path}" ${ANDROID_TOOLS}/tools/android/dexreducer.jar
+
+ mkdir -p ${ANDROID_TOOLS}/src/tools/android/java/com/google/devtools/build/android/incrementaldeployment
+ cp -RL "${incrementaldeployment_path}"/* ${ANDROID_TOOLS}/src/tools/android/java/com/google/devtools/build/android/incrementaldeployment
+
+ cat > ${ANDROID_TOOLS}/src/tools/android/java/com/google/devtools/build/android/incrementaldeployment/BUILD <<EOF
+package(default_visibility = ["//visibility:public"])
+
+android_library(
+ name = "incremental_stub_application",
+ srcs = [
+ "IncrementalClassLoader.java",
+ "StubApplication.java",
+ ],
+)
+
+android_library(
+ name = "incremental_split_stub_application",
+ srcs = ["Placeholder.java"],
+)
+EOF
+
+ rm -rf ${ANDROID_TOOLS}/tools/android/BUILD.bazel
+ cat > ${ANDROID_TOOLS}/tools/android/BUILD <<EOF
package(default_visibility = ["//visibility:public"])
filegroup(name = "sdk")
android_library(
name = "incremental_stub_application",
+ deps = ["//src/tools/android/java/com/google/devtools/build/android/incrementaldeployment:incremental_stub_application"],
)
android_library(
name = "incremental_split_stub_application",
+ deps = ["//src/tools/android/java/com/google/devtools/build/android/incrementaldeployment:incremental_split_stub_application"],
)
-sh_binary(
+java_binary(
name = "aar_generator",
- srcs = ["fail.sh"],
+ srcs = ["aargenerator.jar"],
+ main_class = "com.google.devtools.build.android.AarGeneratorAction",
)
-sh_binary(
+java_binary(
name = "resources_processor",
- srcs = ["fail.sh"],
+ srcs = ["androidresourceprocessor.jar"],
+ main_class = "com.google.devtools.build.android.AndroidResourceProcessingAction",
)
-sh_binary(
+java_binary(
name = "merge_dexzips",
- srcs = ["fail.sh"],
+ srcs = ["dexreducer.jar"],
+ main_class = "com.google.devtools.build.android.ziputils.DexReducer",
)
-sh_binary(
+java_binary(
name = "shuffle_jars",
- srcs = ["fail.sh"],
+ srcs = ["dexmapper.jar"],
+ main_class = "com.google.devtools.build.android.ziputils.DexMapper",
)
sh_binary(
@@ -95,6 +130,11 @@ sh_binary(
)
sh_binary(
+ name = "build_split_manifest",
+ srcs = ["fail.sh"],
+)
+
+sh_binary(
name = "incremental_install",
srcs = ["fail.sh"],
)
@@ -110,13 +150,13 @@ sh_binary(
)
EOF
- cat > tools/android/fail.sh <<EOF
+ cat > $ANDROID_TOOLS/tools/android/fail.sh <<EOF
#!/bin/bash
exit 1
EOF
- chmod +x tools/android/fail.sh
+ chmod +x $ANDROID_TOOLS/tools/android/fail.sh
mkdir -p third_party/java/jarjar
cat > third_party/java/jarjar/BUILD <<EOF
@@ -135,6 +175,50 @@ exit 1
EOF
chmod +x third_party/java/jarjar/fail.sh
+
+ ANDROID_NDK=$PWD/android_ndk
+ ANDROID_SDK=$PWD/android_sdk
+
+ # TODO(bazel-team): This hard-codes the name of the Android repository in
+ # the WORKSPACE file of Bazel. Change this once external repositories have
+ # their own defined names under which they are mounted.
+ NDK_SRCDIR=$TEST_SRCDIR/external/globbed_android_ndk
+ SDK_SRCDIR=$TEST_SRCDIR/external/globbed_android_sdk
+
+ mkdir -p $ANDROID_NDK
+ mkdir -p $ANDROID_SDK
+
+ for i in $NDK_SRCDIR/*; do
+ if [[ "$(basename $i)" != "BUILD" ]]; then
+ ln -s "$i" "$ANDROID_NDK/$(basename $i)"
+ fi
+ done
+
+ for i in $SDK_SRCDIR/*; do
+ if [[ "$(basename $i)" != "BUILD" ]]; then
+ ln -s "$i" "$ANDROID_SDK/$(basename $i)"
+ fi
+ done
+
+ cat >> WORKSPACE <<EOF
+android_ndk_repository(
+ name = "androidndk",
+ path = "$ANDROID_NDK",
+ api_level = 19
+)
+
+android_sdk_repository(
+ name = "androidsdk",
+ path = "$ANDROID_SDK",
+ build_tools_version = "21.1.1",
+ api_level = 19
+)
+
+android_local_tools_repository(
+ name = "androidtools",
+ path = "$ANDROID_TOOLS"
+)
+EOF
}
function setup_protoc_support() {
@@ -239,8 +323,6 @@ function create_new_workspace() {
ln -s "${genclass_path}" tools/jdk/GenClass_deploy.jar
ln -s "${ijar_path}" tools/jdk/ijar
- setup_android_support
-
touch WORKSPACE
}
diff --git a/src/test/shell/bazel/testenv.sh b/src/test/shell/bazel/testenv.sh
index ec485ff73f..6a1fadf9af 100755
--- a/src/test/shell/bazel/testenv.sh
+++ b/src/test/shell/bazel/testenv.sh
@@ -44,6 +44,13 @@ singlejar_path="${TEST_SRCDIR}/src/java_tools/singlejar/SingleJar_deploy.jar"
genclass_path="${TEST_SRCDIR}/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/genclass/GenClass_deploy.jar"
ijar_path="${TEST_SRCDIR}/third_party/ijar/ijar"
+# Android tooling
+aargenerator_path="${TEST_SRCDIR}/src/tools/android/java/com/google/devtools/build/android/AarGeneratorAction_deploy.jar"
+androidresourceprocessor_path="${TEST_SRCDIR}/src/tools/android/java/com/google/devtools/build/android/AndroidResourceProcessingAction_deploy.jar"
+dexmapper_path="${TEST_SRCDIR}/src/tools/android/java/com/google/devtools/build/android/ziputils/mapper_deploy.jar"
+dexreducer_path="${TEST_SRCDIR}/src/tools/android/java/com/google/devtools/build/android/ziputils/reducer_deploy.jar"
+incrementaldeployment_path="${TEST_SRCDIR}/src/tools/android/java/com/google/devtools/build/android/incrementaldeployment"
+
# iOS and Objective-C tooling
iossim_path="${TEST_SRCDIR}/third_party/iossim/iossim"
actoolzip_path="${TEST_SRCDIR}/src/tools/xcode-common/java/com/google/devtools/build/xcode/actoolzip/actoolzip_deploy.jar"
diff --git a/src/tools/android/java/com/google/devtools/build/android/incrementaldeployment/BUILD b/src/tools/android/java/com/google/devtools/build/android/incrementaldeployment/BUILD
index 4c03182ea6..42b4f1919a 100644
--- a/src/tools/android/java/com/google/devtools/build/android/incrementaldeployment/BUILD
+++ b/src/tools/android/java/com/google/devtools/build/android/incrementaldeployment/BUILD
@@ -1,7 +1,7 @@
package(default_visibility = ["//visibility:public"])
android_library(
- name = "stub_application",
+ name = "incremental_stub_application",
srcs = [
"IncrementalClassLoader.java",
"StubApplication.java",
@@ -9,6 +9,11 @@ android_library(
)
android_library(
- name = "split_stub_application",
+ name = "incremental_split_stub_application",
srcs = ["Placeholder.java"],
)
+
+filegroup(
+ name = "srcs",
+ srcs = glob(["**"]),
+)