Skip to content

Commit

Permalink
Add an integration test for Android rules.
Browse files Browse the repository at this point in the history
Currently only building them is tested, not running them or mobile-install, but it's still a good start.

--
MOS_MIGRATED_REVID=102237496
  • Loading branch information
lberki authored and damienmg committed Sep 3, 2015
1 parent 494eca9 commit 678ba23
Show file tree
Hide file tree
Showing 10 changed files with 335 additions and 15 deletions.
5 changes: 5 additions & 0 deletions BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,8 @@ filegroup(
name = "git",
srcs = glob([".git/**"]),
)

filegroup(
name = "dummy",
visibility = ["//visibility:public"],
)
1 change: 1 addition & 0 deletions BUILD.glob
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
filegroup(name="all", srcs=["."], visibility=["//visibility:public"])
25 changes: 25 additions & 0 deletions WORKSPACE
Original file line number Diff line number Diff line change
Expand Up @@ -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",
)
5 changes: 5 additions & 0 deletions compile.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 3 additions & 0 deletions src/test/shell/bazel/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,9 @@ filegroup(
"//third_party/java/jdk/langtools:srcs",
"//tools:srcs",
],
visibility = [
"//src/test/shell/bazel:__subpackages__",
],
)

sh_test(
Expand Down
18 changes: 18 additions & 0 deletions src/test/shell/bazel/android/BUILD
Original file line number Diff line number Diff line change
@@ -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",
],
)
169 changes: 169 additions & 0 deletions src/test/shell/bazel/android/android_integration_test.sh
Original file line number Diff line number Diff line change
@@ -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"
Loading

0 comments on commit 678ba23

Please sign in to comment.