aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/test/java/com/google/devtools/build
diff options
context:
space:
mode:
authorGravatar yiyu <yiyu@google.com>2017-07-04 13:21:59 -0400
committerGravatar John Cater <jcater@google.com>2017-07-05 10:58:34 -0400
commita5c3862fefe7dc73849eec119d664ae3a44b6507 (patch)
tree27e2c73352da4164e9f5c99718402b4155d5dd60 /src/test/java/com/google/devtools/build
parent05fb2f847aa7a7e32b674f309025b86e374986fc (diff)
implement py_runtime rule
* A user can use the py_runtime by `--python_top` flag, where the py_runtime can contain either: + an absolute path of a Python interpreter + a checked-in Python interpreter * A user can also use `--python_path` to point to a Python interpreter in an absolute path directly. PiperOrigin-RevId: 160901921
Diffstat (limited to 'src/test/java/com/google/devtools/build')
-rw-r--r--src/test/java/com/google/devtools/build/lib/bazel/rules/python/BazelPyRuntimeTest.java163
1 files changed, 163 insertions, 0 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/python/BazelPyRuntimeTest.java b/src/test/java/com/google/devtools/build/lib/bazel/rules/python/BazelPyRuntimeTest.java
new file mode 100644
index 0000000000..1a7d460ed0
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/python/BazelPyRuntimeTest.java
@@ -0,0 +1,163 @@
+// 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.bazel.rules.python;
+
+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.util.BuildViewTestCase;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/**
+ * Unit tests for {@link BazelPyRuntime}.
+ */
+@RunWith(JUnit4.class)
+public final class BazelPyRuntimeTest extends BuildViewTestCase {
+
+ @Rule
+ public ExpectedException thrown = ExpectedException.none();
+
+ @Before
+ public final void setup() throws Exception {
+ scratch.file(
+ "py/BUILD",
+ "py_runtime(",
+ " name='py-2.7',",
+ " files = [",
+ " 'py-2.7/bin/python',",
+ " 'py-2.7/lib/libpython2.7.a',",
+ " ],",
+ " interpreter='py-2.7/bin/python',",
+ ")",
+ "",
+ "py_runtime(",
+ " name='py-3.6',",
+ " files = [],",
+ " interpreter_path='/opt/pyenv/versions/3.6.0/bin/python',",
+ ")",
+ "",
+ "py_runtime(",
+ " name='err-interpreter-and-path-both-set',",
+ " files = [],",
+ " interpreter='py-2.7/bin/python',",
+ " interpreter_path='/opt/pyenv/versions/3.6.0/bin/python',",
+ ")",
+ "",
+ "py_runtime(",
+ " name='err-interpreter-and-path-both-unset',",
+ " files = [],",
+ ")",
+ "",
+ "py_runtime(",
+ " name='err-path-not-absolute',",
+ " files = [],",
+ " interpreter_path='py-2.7/bin/python',",
+ ")",
+ "",
+ "py_runtime(",
+ " name='err-non-empty-files-with-path-absolute',",
+ " files = [",
+ " 'py-err/bin/python',",
+ " 'py-err/lib/libpython2.7.a',",
+ " ],",
+ " interpreter_path='/opt/pyenv/versions/3.6.0/bin/python',",
+ ")"
+ );
+
+ }
+
+ @Test
+ public void testCheckedInPyRuntime() throws Exception {
+ useConfiguration("--python_top=//py:py-2.7");
+ ConfiguredTarget target = getConfiguredTarget("//py:py-2.7");
+
+ assertThat(
+ ActionsTestUtil.prettyArtifactNames(
+ target.getProvider(BazelPyRuntimeProvider.class).files()))
+ .containsExactly("py/py-2.7/bin/python", "py/py-2.7/lib/libpython2.7.a");
+ assertThat(
+ target.getProvider(BazelPyRuntimeProvider.class).interpreter().getExecPathString())
+ .isEqualTo("py/py-2.7/bin/python");
+ assertThat(target.getProvider(BazelPyRuntimeProvider.class).interpreterPath())
+ .isEqualTo("");
+ }
+
+ @Test
+ public void testAbsolutePathPyRuntime() throws Exception {
+ useConfiguration("--python_top=//py:py-3.6");
+ ConfiguredTarget target = getConfiguredTarget("//py:py-3.6");
+
+ assertThat(
+ ActionsTestUtil.prettyArtifactNames(
+ target.getProvider(BazelPyRuntimeProvider.class).files()))
+ .isEmpty();
+ assertThat(
+ target.getProvider(BazelPyRuntimeProvider.class).interpreter())
+ .isNull();
+ assertThat(target.getProvider(BazelPyRuntimeProvider.class).interpreterPath())
+ .isEqualTo("/opt/pyenv/versions/3.6.0/bin/python");
+ }
+
+ @Test
+ public void testErrorWithInterpreterAndPathBothSet() throws Exception {
+ useConfiguration("--python_top=//py:err-interpreter-and-path-both-set");
+ try {
+ getConfiguredTarget("//py:err-interpreter-and-path-both-set");
+ } catch (Error e) {
+ assertThat(e.getMessage())
+ .contains("interpreter and interpreter_path cannot be set at the same time.");
+ }
+ }
+
+ @Test
+ public void testErrorWithInterpreterAndPathBothUnset() throws Exception {
+ useConfiguration("--python_top=//py:err-interpreter-and-path-both-unset");
+ try {
+ getConfiguredTarget("//py:err-interpreter-and-path-both-unset");
+ } catch (Error e) {
+ assertThat(e.getMessage())
+ .contains("interpreter and interpreter_path cannot be empty at the same time.");
+ }
+ }
+
+ @Test
+ public void testErrorWithPathNotAbsolute() throws Exception {
+ useConfiguration("--python_top=//py:err-path-not-absolute");
+ try {
+ getConfiguredTarget("//py:err-path-not-absolute");
+ } catch (Error e) {
+ assertThat(e.getMessage())
+ .contains("must be an absolute path.");
+ }
+ }
+
+ @Test
+ public void testPyRuntimeWithError() throws Exception {
+ useConfiguration("--python_top=//py:err-non-empty-files-with-path-absolute");
+ try {
+ getConfiguredTarget("//py:err-non-empty-files-with-path-absolute");
+ } catch (Error e) {
+ assertThat(e.getMessage())
+ .contains("interpreter with an absolute path requires files to be empty.");
+ }
+ }
+
+}