/*
* Copyright 2016-present Facebook, Inc.
*
* 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.facebook.buck.maven;
import com.facebook.buck.io.ProjectFilesystem;
import com.facebook.buck.jvm.java.JavaLibrary;
import com.facebook.buck.jvm.java.JavaLibraryBuilder;
import com.facebook.buck.jvm.java.MavenPublishable;
import com.facebook.buck.model.BuildTarget;
import com.facebook.buck.model.BuildTargetFactory;
import com.facebook.buck.parser.NoSuchBuildTargetException;
import com.facebook.buck.rules.BuildRuleResolver;
import com.facebook.buck.rules.DefaultTargetNodeToBuildRuleTransformer;
import com.facebook.buck.rules.SourcePathResolver;
import com.facebook.buck.rules.SourcePathRuleFinder;
import com.facebook.buck.rules.TargetGraph;
import com.facebook.buck.rules.TargetNode;
import com.facebook.buck.testutil.FakeProjectFilesystem;
import com.facebook.buck.testutil.TargetGraphFactory;
import com.google.common.collect.ImmutableSet;
import java.nio.file.Paths;
import java.util.Optional;
import org.eclipse.aether.deployment.DeploymentException;
import org.hamcrest.Matchers;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
public class PublisherTest {
private static final String MVN_COORDS_A = "com.facebook.buck.maven:a:jar:42";
private static final String MVN_COORDS_B = "com.facebook.buck.maven:b:jar:10";
@Rule public ExpectedException expectedException = ExpectedException.none();
private Publisher publisher;
@Before
public void setUp() {
ProjectFilesystem filesystem = new FakeProjectFilesystem();
publisher =
new Publisher(
filesystem,
/* remoteRepoUrl */ Optional.empty(),
/* username */ Optional.empty(),
/* password */ Optional.empty(),
/* dryRun */ true);
}
@Test
public void errorRaisedForDuplicateFirstOrderDeps()
throws DeploymentException, NoSuchBuildTargetException {
// Construct a graph that looks like this. A and B have maven coordinates set.
// A B
// \ /
// C
BuildTarget publishableTargetA =
BuildTargetFactory.newInstance("//:a").withFlavors(JavaLibrary.MAVEN_JAR);
BuildTarget publishableTargetB =
BuildTargetFactory.newInstance("//:b").withFlavors(JavaLibrary.MAVEN_JAR);
BuildTarget targetC = BuildTargetFactory.newInstance("//:c");
TargetNode<?, ?> depNode =
JavaLibraryBuilder.createBuilder(targetC).addSrc(Paths.get("c.java")).build();
TargetNode<?, ?> publishableANode =
JavaLibraryBuilder.createBuilder(publishableTargetA)
.addSrc(Paths.get("a.java"))
.setMavenCoords(MVN_COORDS_A)
.addDep(targetC)
.build();
TargetNode<?, ?> publishableBNode =
JavaLibraryBuilder.createBuilder(publishableTargetB)
.addSrc(Paths.get("b.java"))
.setMavenCoords(MVN_COORDS_B)
.addDep(targetC)
.build();
TargetGraph targetGraph =
TargetGraphFactory.newInstance(depNode, publishableANode, publishableBNode);
BuildRuleResolver resolver =
new BuildRuleResolver(targetGraph, new DefaultTargetNodeToBuildRuleTransformer());
SourcePathResolver pathResolver = new SourcePathResolver(new SourcePathRuleFinder(resolver));
MavenPublishable publishableA = (MavenPublishable) resolver.requireRule(publishableTargetA);
MavenPublishable publishableB = (MavenPublishable) resolver.requireRule(publishableTargetB);
expectedException.expect(DeploymentException.class);
expectedException.expectMessage(
Matchers.containsString(targetC.getUnflavoredBuildTarget().getFullyQualifiedName()));
expectedException.expectMessage(
Matchers.containsString(
publishableTargetA.getUnflavoredBuildTarget().getFullyQualifiedName()));
expectedException.expectMessage(
Matchers.containsString(
publishableTargetB.getUnflavoredBuildTarget().getFullyQualifiedName()));
publisher.publish(pathResolver, ImmutableSet.of(publishableA, publishableB));
}
@Test
public void errorRaisedForDuplicateFirstOrderAndTransitiveDep()
throws DeploymentException, NoSuchBuildTargetException {
// Construct a graph that looks like this. A and B have maven coordinates set.
// A B
// | |
// C |
// \ /
// D
BuildTarget publishableTargetA =
BuildTargetFactory.newInstance("//:a").withFlavors(JavaLibrary.MAVEN_JAR);
BuildTarget publishableTargetB =
BuildTargetFactory.newInstance("//:b").withFlavors(JavaLibrary.MAVEN_JAR);
BuildTarget targetC = BuildTargetFactory.newInstance("//:c");
BuildTarget targetD = BuildTargetFactory.newInstance("//:d");
TargetNode<?, ?> transitiveDepNode =
JavaLibraryBuilder.createBuilder(targetD).addSrc(Paths.get("d.java")).build();
TargetNode<?, ?> depNode =
JavaLibraryBuilder.createBuilder(targetC)
.addSrc(Paths.get("c.java"))
.addDep(targetD)
.build();
TargetNode<?, ?> publishableANode =
JavaLibraryBuilder.createBuilder(publishableTargetA)
.addSrc(Paths.get("a.java"))
.setMavenCoords(MVN_COORDS_A)
.addDep(targetC)
.build();
TargetNode<?, ?> publishableBNode =
JavaLibraryBuilder.createBuilder(publishableTargetB)
.addSrc(Paths.get("b.java"))
.setMavenCoords(MVN_COORDS_B)
.addDep(targetD)
.build();
TargetGraph targetGraph =
TargetGraphFactory.newInstance(
transitiveDepNode, depNode, publishableANode, publishableBNode);
BuildRuleResolver resolver =
new BuildRuleResolver(targetGraph, new DefaultTargetNodeToBuildRuleTransformer());
SourcePathResolver pathResolver = new SourcePathResolver(new SourcePathRuleFinder(resolver));
MavenPublishable publishableA = (MavenPublishable) resolver.requireRule(publishableTargetA);
MavenPublishable publishableB = (MavenPublishable) resolver.requireRule(publishableTargetB);
expectedException.expect(DeploymentException.class);
expectedException.expectMessage(
Matchers.containsString(targetD.getUnflavoredBuildTarget().getFullyQualifiedName()));
expectedException.expectMessage(
Matchers.containsString(
publishableTargetA.getUnflavoredBuildTarget().getFullyQualifiedName()));
expectedException.expectMessage(
Matchers.containsString(
publishableTargetB.getUnflavoredBuildTarget().getFullyQualifiedName()));
publisher.publish(pathResolver, ImmutableSet.of(publishableA, publishableB));
}
@Test
public void errorRaisedForDuplicateTransitiveDeps()
throws DeploymentException, NoSuchBuildTargetException {
// Construct a graph that looks like this. A and B have maven coordinates set.
// A B
// | |
// C D
// \ /
// E
BuildTarget publishableTargetA =
BuildTargetFactory.newInstance("//:a").withFlavors(JavaLibrary.MAVEN_JAR);
BuildTarget publishableTargetB =
BuildTargetFactory.newInstance("//:b").withFlavors(JavaLibrary.MAVEN_JAR);
BuildTarget targetC = BuildTargetFactory.newInstance("//:c");
BuildTarget targetD = BuildTargetFactory.newInstance("//:d");
BuildTarget targetE = BuildTargetFactory.newInstance("//:e");
TargetNode<?, ?> transitiveDepNode =
JavaLibraryBuilder.createBuilder(targetE).addSrc(Paths.get("e.java")).build();
TargetNode<?, ?> dep1Node =
JavaLibraryBuilder.createBuilder(targetC)
.addSrc(Paths.get("c.java"))
.addDep(targetE)
.build();
TargetNode<?, ?> dep2Node =
JavaLibraryBuilder.createBuilder(targetD)
.addSrc(Paths.get("d.java"))
.addDep(targetE)
.build();
TargetNode<?, ?> publishableANode =
JavaLibraryBuilder.createBuilder(publishableTargetA)
.addSrc(Paths.get("a.java"))
.setMavenCoords(MVN_COORDS_A)
.addDep(targetC)
.build();
TargetNode<?, ?> publishableBNode =
JavaLibraryBuilder.createBuilder(publishableTargetB)
.addSrc(Paths.get("b.java"))
.setMavenCoords(MVN_COORDS_B)
.addDep(targetD)
.build();
TargetGraph targetGraph =
TargetGraphFactory.newInstance(
transitiveDepNode, dep1Node, dep2Node, publishableANode, publishableBNode);
BuildRuleResolver resolver =
new BuildRuleResolver(targetGraph, new DefaultTargetNodeToBuildRuleTransformer());
SourcePathResolver pathResolver = new SourcePathResolver(new SourcePathRuleFinder(resolver));
MavenPublishable publishableA = (MavenPublishable) resolver.requireRule(publishableTargetA);
MavenPublishable publishableB = (MavenPublishable) resolver.requireRule(publishableTargetB);
expectedException.expect(DeploymentException.class);
expectedException.expectMessage(
Matchers.containsString(targetE.getUnflavoredBuildTarget().getFullyQualifiedName()));
expectedException.expectMessage(
Matchers.containsString(
publishableTargetA.getUnflavoredBuildTarget().getFullyQualifiedName()));
expectedException.expectMessage(
Matchers.containsString(
publishableTargetB.getUnflavoredBuildTarget().getFullyQualifiedName()));
publisher.publish(pathResolver, ImmutableSet.of(publishableA, publishableB));
}
}