blob: 584f3e04d84fdd7c223590e1080f1c1daa80705b [file] [log] [blame]
#!/bin/bash
#
# Copyright 2015 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.
#
# Test //external mechanisms
#
# Load test environment
src_dir=$(cd "$(dirname ${BASH_SOURCE[0]})" && pwd)
source $src_dir/test-setup.sh \
|| { echo "test-setup.sh not found!" >&2; exit 1; }
source $src_dir/remote_helpers.sh \
|| { echo "remote_helpers.sh not found!" >&2; exit 1; }
function set_up() {
# Set up custom repository directory.
m2=$TEST_TMPDIR/my-m2
rm -rf $m2
mkdir -p $m2
startup_server $m2
}
function tear_down() {
shutdown_server
rm -rf $m2
}
function generate_workspace() {
${bazel_data}/src/tools/generate_workspace/generate_workspace $@
}
# Takes: groupId, artifactId, and version, extra arguments are dependencies.
function make_artifact() {
local groupId=$1;
local artifactId=$2;
local version=$3;
shift; shift; shift;
local pkg_dir=${m2}/${groupId}/${artifactId}/${version}
local pom_file=${pkg_dir}/${artifactId}-${version}.pom
mkdir -p ${pkg_dir}
# Make the pom.xml.
cat > ${pom_file} <<EOF
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>${groupId}</groupId>
<artifactId>${artifactId}</artifactId>
<version>${version}</version>
EOF
if [[ ${#@} > 0 ]]; then
echo ' <dependencies>' >> ${pom_file}
for artifact in $@; do
IFS=':' read -r -a dep <<< "$artifact"
cat >> ${pom_file} << EOF
<dependency>
<groupId>${dep[0]}</groupId>
<artifactId>${dep[1]}</artifactId>
<version>${dep[2]}</version>
</dependency>
EOF
done
echo ' </dependencies>' >> ${pom_file}
fi
echo "</project>" >> ${pom_file}
# Make the jar with one class (we use the groupId for the classname).
cat > $TEST_TMPDIR/$groupId.java <<EOF
public class $groupId {
public static void print() {
System.out.println("$artifactId");
}
}
EOF
local jar_path=$pkg_dir/$artifactId-$version.jar
${bazel_javabase}/bin/javac $TEST_TMPDIR/$groupId.java
${bazel_javabase}/bin/jar cf $jar_path $TEST_TMPDIR/$groupId.class
local sha1=$(shasum $jar_path | awk '{print $1}')
echo -n $sha1 > $jar_path.sha1
echo $sha1
}
function get_workspace_file() {
cat $TEST_log | tail -n 2 | head -n 1
}
function get_build_file() {
cat $TEST_log | tail -n 1
}
function test_pom() {
# Create a maven repo
local sha1=$(make_artifact blorp glorp 1.2.3)
# Create a pom that references the artifacts.
cat > $TEST_TMPDIR/pom.xml <<EOF
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>my</groupId>
<artifactId>thing</artifactId>
<version>1.0</version>
<repositories>
<repository>
<id>my-repo1</id>
<name>a custom repo</name>
<url>http://localhost:$fileserver_port/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>blorp</groupId>
<artifactId>glorp</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
</project>
EOF
generate_workspace --maven_project=$TEST_TMPDIR &> $TEST_log \
|| fail "generating workspace failed"
cat $(cat $TEST_log | tail -n 2 | head -n 1) > ws
cat $(cat $TEST_log | tail -n 1) > build
assert_contains "artifact = \"blorp:glorp:1.2.3\"," ws
assert_contains "repository = \"http://localhost:$fileserver_port/\"," ws
assert_contains "sha1 = \"$sha1\"," ws
assert_contains "\"@blorp_glorp//jar\"," build
assert_contains "name = \"blorp_glorp\"," build
}
function test_pom_exclusions() {
# Create a maven repo
local sha1_guppy=$(make_artifact fish guppy 2.0)
local sha1_trout=$(make_artifact fish trout 4.2)
local sha1_glorp=$(make_artifact blorp glorp 1.2.3 fish:guppy:2.0)
local sha1_mlorp=$(make_artifact blorp mlorp 3.2.1 fish:trout:4.2)
# Create a pom that references the artifacts.
cat > $TEST_TMPDIR/pom.xml <<EOF
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>my</groupId>
<artifactId>thing</artifactId>
<version>1.0</version>
<repositories>
<repository>
<id>my-repo1</id>
<name>a custom repo</name>
<url>http://localhost:$fileserver_port/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>blorp</groupId>
<artifactId>glorp</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>blorp</groupId>
<artifactId>mlorp</artifactId>
<version>3.2.1</version>
<exclusions>
<exclusion>
<groupId>fish</groupId>
<artifactId>trout</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
EOF
generate_workspace --maven_project=$TEST_TMPDIR &> $TEST_log \
|| fail "generating workspace failed"
cat $(cat $TEST_log | tail -n 2 | head -n 1) > ws
cat $(cat $TEST_log | tail -n 1) > build
assert_contains "artifact = \"blorp:glorp:1.2.3\"," ws
assert_contains "repository = \"http://localhost:$fileserver_port/\"," ws
assert_contains "sha1 = \"$sha1_glorp\"," ws
assert_contains "sha1 = \"$sha1_mlorp\"," ws
assert_contains "sha1 = \"$sha1_guppy\"," ws
assert_not_contains "sha1 = \"$sha1_trout\"," ws
assert_contains "\"@blorp_glorp//jar\"," build
assert_contains "\"@blorp_mlorp//jar\"," build
assert_contains "name = \"blorp_glorp\"," build
assert_contains "name = \"blorp_mlorp\"," build
assert_contains "\"@fish_guppy//jar\"," build
assert_not_contains "\"@fish_trout//jar\"," build
}
function test_invalid_pom() {
# No pom file.
rm -f $TEST_TMPDIR/pom.xml
generate_workspace -m $TEST_TMPDIR &> $TEST_log
expect_log "Non-readable POM $TEST_TMPDIR/pom.xml"
# Invalid XML.
cat > $TEST_TMPDIR/pom.xml <<EOF
<project>
EOF
generate_workspace -m $TEST_TMPDIR &> $TEST_log
expect_log "expected end tag </project>"
}
function test_profile() {
cat > $TEST_TMPDIR/pom.xml <<EOF
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>my</groupId>
<artifactId>thing</artifactId>
<version>1.0</version>
<profiles>
<profile>
<id>my-profile</id>
<activation>
<property>
<name>makeThing</name>
<value>thing</value>
</property>
</activation>
</profile>
</profiles>
</project>
EOF
generate_workspace --maven_project=$TEST_TMPDIR &> $TEST_log \
|| fail "generating workspace failed"
}
function test_submodules() {
cat > $TEST_TMPDIR/pom.xml <<EOF
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>xyz</groupId>
<artifactId>a</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<modules>
<module>b1</module>
<module>b2</module>
</modules>
</project>
EOF
# Create submodules, version and group are inherited from parent.
mkdir -p $TEST_TMPDIR/{b1,b2}
cat > $TEST_TMPDIR/b1/pom.xml <<EOF
<project>
<modelVersion>4.0.0</modelVersion>
<artifactId>b1</artifactId>
<parent>
<groupId>xyz</groupId>
<artifactId>a</artifactId>
<version>1.0</version>
</parent>
<dependencies>
<dependency>
<groupId>xyz</groupId>
<artifactId>b2</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</project>
EOF
cat > $TEST_TMPDIR/b2/pom.xml <<EOF
<project>
<modelVersion>4.0.0</modelVersion>
<artifactId>b2</artifactId>
<parent>
<groupId>xyz</groupId>
<artifactId>a</artifactId>
<version>1.0</version>
</parent>
</project>
EOF
generate_workspace -m $TEST_TMPDIR/b1 &> $TEST_log || fail "generate failed"
expect_log "xyz_b2 was defined in $TEST_TMPDIR/b2/pom.xml which isn't a repository URL"
assert_contains "artifact = \"xyz:b2:1.0\"," $(get_workspace_file)
}
run_suite "maven tests"