diff options
author | ajmichael <ajmichael@google.com> | 2017-05-05 04:19:34 +0200 |
---|---|---|
committer | Damien Martin-Guillerez <dmarting@google.com> | 2017-05-05 15:27:23 +0200 |
commit | 14747a8bf2d35846d75ac9058e1b514a89f68f07 (patch) | |
tree | 51693a3aaf6ec6421bc0226355dc0c66a306fce3 /src/test/java/com/google/devtools/build/lib | |
parent | f2528c1b96751692aae233aa839f86d0f887b75f (diff) |
Create new android_device_script_fixture rule.
This rule simply provides a shell script that is run on a device as part of a
test which can come from an input file or as a string command.
It also takes a list of APKs that need to be installed before the fixture can
be run.
Note that this CL does _not_ install the rule in the BazelRuleClassProvider, so
this CL does not make it usable by anyone. Once the other android testing rules are ready, I will install them all.
One small step towards https://github.com/bazelbuild/bazel/issues/903.
RELNOTES: None
PiperOrigin-RevId: 155155984
Diffstat (limited to 'src/test/java/com/google/devtools/build/lib')
3 files changed, 229 insertions, 0 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java index 2811cb6a2a..3b2d2001ac 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java +++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java @@ -27,6 +27,7 @@ import com.google.common.truth.Truth; import com.google.devtools.build.lib.actions.Action; import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.FileProvider; import com.google.devtools.build.lib.analysis.OutputFileConfiguredTarget; @@ -37,6 +38,7 @@ import com.google.devtools.build.lib.rules.android.deployinfo.AndroidDeployInfoO import com.google.devtools.build.lib.rules.java.JavaCompileAction; import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider; import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider.OutputJar; +import com.google.devtools.build.lib.testutil.TestRuleClassProvider; import com.google.devtools.build.lib.util.Preconditions; import java.io.IOException; import java.util.Arrays; @@ -45,6 +47,17 @@ import javax.annotation.Nullable; /** Common methods shared between Android related {@link BuildViewTestCase}s. */ public abstract class AndroidBuildViewTestCase extends BuildViewTestCase { + + @Override + protected ConfiguredRuleClassProvider getRuleClassProvider() { + ConfiguredRuleClassProvider.Builder builder = new ConfiguredRuleClassProvider.Builder(); + TestRuleClassProvider.addStandardRules(builder); + return builder + // TODO(b/35097211): Remove this once the new testing rules are released. + .addRuleDefinition(new AndroidDeviceScriptFixtureRule()) + .build(); + } + protected Iterable<Artifact> getNativeLibrariesInApk(ConfiguredTarget target) { SpawnAction compressedUnsignedApkaction = getCompressedUnsignedApkAction(target); ImmutableList.Builder<Artifact> result = ImmutableList.builder(); diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDeviceScriptFixtureTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDeviceScriptFixtureTest.java new file mode 100644 index 0000000000..6149580254 --- /dev/null +++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDeviceScriptFixtureTest.java @@ -0,0 +1,197 @@ +// Copyright 2017 The Bazel Authors. 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. +package com.google.devtools.build.lib.rules.android; + +import static com.google.common.truth.Truth.assertThat; + +import com.google.devtools.build.lib.actions.util.ActionsTestUtil; +import com.google.devtools.build.lib.analysis.ConfiguredTarget; +import com.google.devtools.build.lib.analysis.actions.FileWriteAction; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** Tests for {@link AndroidDeviceScriptFixture}. */ +@RunWith(JUnit4.class) +public class AndroidDeviceScriptFixtureTest extends AndroidBuildViewTestCase { + + @Before + public void setup() throws Exception { + scratch.file("scripts/BUILD", "exports_files(['my_script.sh'])"); + scratch.file( + "java/com/app/BUILD", + "android_binary(", + " name = 'app',", + " manifest = 'AndroidManifest.xml',", + ")"); + scratch.file( + "java/com/app/support/BUILD", + "android_binary(", + " name = 'support',", + " manifest = 'AndroidManifest.xml',", + ")", + "genrule(", + " name = 'genrule',", + " outs = ['generated.apk'],", + " cmd = 'touch $(OUTS)',", + ")"); + } + + @Test + public void testScriptFixture() throws Exception { + scratch.file( + "javatests/com/app/BUILD", + "android_device_script_fixture(", + " name = 'fixture',", + " script = '//scripts:my_script.sh',", + ")"); + ConfiguredTarget fixture = getConfiguredTarget("//javatests/com/app:fixture"); + assertThat(fixture).isNotNull(); + AndroidDeviceScriptFixtureInfoProvider deviceScriptFixtureInfoProvider = + (AndroidDeviceScriptFixtureInfoProvider) + fixture.get( + AndroidDeviceScriptFixtureInfoProvider.ANDROID_DEVICE_SCRIPT_FIXTURE_INFO.getKey()); + assertThat(deviceScriptFixtureInfoProvider).isNotNull(); + assertThat(deviceScriptFixtureInfoProvider.getFixtureScript()).isNotNull(); + assertThat(deviceScriptFixtureInfoProvider.getFixtureScript().prettyPrint()) + .isEqualTo("scripts/my_script.sh"); + } + + @Test + public void testCommandFixture() throws Exception { + scratch.file( + "javatests/com/app/BUILD", + "android_device_script_fixture(", + " name = 'fixture',", + " cmd = 'some literal command',", + ")"); + ConfiguredTarget fixture = getConfiguredTarget("//javatests/com/app:fixture"); + assertThat(fixture).isNotNull(); + AndroidDeviceScriptFixtureInfoProvider deviceScriptFixtureInfoProvider = + (AndroidDeviceScriptFixtureInfoProvider) + fixture.get( + AndroidDeviceScriptFixtureInfoProvider.ANDROID_DEVICE_SCRIPT_FIXTURE_INFO.getKey()); + assertThat(deviceScriptFixtureInfoProvider).isNotNull(); + assertThat(deviceScriptFixtureInfoProvider.getFixtureScript()).isNotNull(); + assertThat(deviceScriptFixtureInfoProvider.getFixtureScript().prettyPrint()) + .isEqualTo("javatests/com/app/cmd_device_fixtures/fixture/cmd.sh"); + FileWriteAction action = + (FileWriteAction) getGeneratingAction(deviceScriptFixtureInfoProvider.getFixtureScript()); + assertThat(action.getFileContents()).isEqualTo("some literal command"); + } + + @Test + public void testNoScriptOrCommand() throws Exception { + checkError( + "javatests/com/app", + "fixture", + "android_host_service_fixture requires that exactly one of the script and cmd attributes " + + "be specified", + "android_device_script_fixture(", + " name = 'fixture',", + ")"); + } + + @Test + public void testScriptAndCommand() throws Exception { + checkError( + "javatests/com/app", + "fixture", + "android_host_service_fixture requires that exactly one of the script and cmd attributes " + + "be specified", + "android_device_script_fixture(", + " name = 'fixture',", + " script = '//scripts:my_script.sh',", + " cmd = 'some literal command',", + ")"); + } + + @Test + public void testSupportApks() throws Exception { + scratch.file( + "javatests/com/app/BUILD", + "android_device_script_fixture(", + " name = 'fixture',", + " cmd = 'some literal command',", + " support_apks = [", + " '//java/com/app/support',", + " '//java/com/app/support:generated.apk',", + " ],", + ")"); + ConfiguredTarget fixture = getConfiguredTarget("//javatests/com/app:fixture"); + assertThat(fixture).isNotNull(); + AndroidDeviceScriptFixtureInfoProvider deviceScriptFixtureInfoProvider = + (AndroidDeviceScriptFixtureInfoProvider) + fixture.get( + AndroidDeviceScriptFixtureInfoProvider.ANDROID_DEVICE_SCRIPT_FIXTURE_INFO.getKey()); + assertThat(deviceScriptFixtureInfoProvider).isNotNull(); + + assertThat( + ActionsTestUtil.prettyArtifactNames(deviceScriptFixtureInfoProvider.getSupportApks())) + .containsExactly("java/com/app/support/support.apk", "java/com/app/support/generated.apk") + .inOrder(); + } + + @Test + public void testNonSupportedScriptExtension() throws Exception { + scratch.file("javatests/com/app/script.bat"); + checkError( + "javatests/com/app", + "fixture", + "file '//javatests/com/app:script.bat' is misplaced here (expected .sh)", + "android_device_script_fixture(", + " name = 'fixture',", + " script = 'script.bat',", + ")"); + } + + @Test + public void testDaemonIsProvided() throws Exception { + scratch.file( + "javatests/com/app/BUILD", + "android_device_script_fixture(", + " name = 'fixture',", + " cmd = 'some literal command',", + " daemon = 1,", + ")"); + ConfiguredTarget fixture = getConfiguredTarget("//javatests/com/app:fixture"); + assertThat(fixture).isNotNull(); + AndroidDeviceScriptFixtureInfoProvider deviceScriptFixtureInfoProvider = + (AndroidDeviceScriptFixtureInfoProvider) + fixture.get( + AndroidDeviceScriptFixtureInfoProvider.ANDROID_DEVICE_SCRIPT_FIXTURE_INFO.getKey()); + assertThat(deviceScriptFixtureInfoProvider).isNotNull(); + assertThat(deviceScriptFixtureInfoProvider.getDaemon()).isTrue(); + } + + @Test + public void testStrictExitIsProvided() throws Exception { + scratch.file( + "javatests/com/app/BUILD", + "android_device_script_fixture(", + " name = 'fixture',", + " cmd = 'some literal command',", + " strict_exit = 1,", + ")"); + ConfiguredTarget fixture = getConfiguredTarget("//javatests/com/app:fixture"); + assertThat(fixture).isNotNull(); + AndroidDeviceScriptFixtureInfoProvider deviceScriptFixtureInfoProvider = + (AndroidDeviceScriptFixtureInfoProvider) + fixture.get( + AndroidDeviceScriptFixtureInfoProvider.ANDROID_DEVICE_SCRIPT_FIXTURE_INFO.getKey()); + assertThat(deviceScriptFixtureInfoProvider).isNotNull(); + assertThat(deviceScriptFixtureInfoProvider.getStrictExit()).isTrue(); + } +} diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/BUILD b/src/test/java/com/google/devtools/build/lib/rules/android/BUILD index 3d8368d1d7..c438825f59 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/android/BUILD +++ b/src/test/java/com/google/devtools/build/lib/rules/android/BUILD @@ -77,6 +77,24 @@ java_test( ) java_test( + name = "AndroidDeviceScriptFixtureTest", + srcs = ["AndroidDeviceScriptFixtureTest.java"], + deps = [ + ":AndroidBuildViewTestCase", + "//src/main/java/com/google/devtools/build/lib:android-rules", + "//src/main/java/com/google/devtools/build/lib:build-base", + "//src/main/java/com/google/devtools/build/lib:packages-internal", + "//src/main/java/com/google/devtools/build/lib/actions", + "//src/test/java/com/google/devtools/build/lib:actions_testutil", + "//src/test/java/com/google/devtools/build/lib:analysis_testutil", + "//src/test/java/com/google/devtools/build/lib:testutil", + "//third_party:guava", + "//third_party:junit4", + "//third_party:truth", + ], +) + +java_test( name = "AndroidLibraryTest", srcs = ["AndroidLibraryTest.java"], deps = [ @@ -110,6 +128,7 @@ java_library( "//src/main/protobuf:android_deploy_info_java_proto", "//src/test/java/com/google/devtools/build/lib:actions_testutil", "//src/test/java/com/google/devtools/build/lib:analysis_testutil", + "//src/test/java/com/google/devtools/build/lib:testutil", "//third_party:guava", "//third_party:junit4", "//third_party:truth", |