/* * 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.versions; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import com.facebook.buck.cxx.CxxLibraryBuilder; import com.facebook.buck.cxx.CxxLibraryDescriptionArg; import com.facebook.buck.model.BuildTarget; import com.facebook.buck.model.BuildTargetFactory; import com.facebook.buck.model.BuildTargetPattern; import com.facebook.buck.model.Pair; import com.facebook.buck.parser.BuildTargetPatternParser; import com.facebook.buck.rules.CellPathResolver; import com.facebook.buck.rules.DefaultBuildTargetSourcePath; import com.facebook.buck.rules.FakeCellPathResolver; import com.facebook.buck.rules.SourceWithFlags; import com.facebook.buck.rules.TargetNode; import com.facebook.buck.rules.coercer.DefaultTypeCoercerFactory; import com.facebook.buck.testutil.FakeProjectFilesystem; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSortedSet; import java.util.Optional; import org.hamcrest.Matchers; import org.junit.Test; public class TargetNodeTranslatorTest { private static final CellPathResolver CELL_PATH_RESOLVER = new FakeCellPathResolver(new FakeProjectFilesystem()); private static final BuildTargetPatternParser<BuildTargetPattern> PATTERN = BuildTargetPatternParser.fullyQualified(); @Test public void translate() { BuildTarget a = BuildTargetFactory.newInstance("//:a"); BuildTarget b = BuildTargetFactory.newInstance("//:b"); BuildTarget c = BuildTargetFactory.newInstance("//:c"); final BuildTarget d = BuildTargetFactory.newInstance("//:d"); TargetNode<CxxLibraryDescriptionArg, ?> node = new CxxLibraryBuilder(a) .setDeps(ImmutableSortedSet.of(b)) .setExportedDeps(ImmutableSortedSet.of(c)) .build(); TargetNodeTranslator translator = new TargetNodeTranslator(new DefaultTypeCoercerFactory(), ImmutableList.of()) { @Override public Optional<BuildTarget> translateBuildTarget(BuildTarget target) { return Optional.of(d); } @Override public Optional<ImmutableMap<BuildTarget, Version>> getSelectedVersions( BuildTarget target) { return Optional.empty(); } }; Optional<TargetNode<CxxLibraryDescriptionArg, ?>> translated = translator.translateNode(node); assertThat(translated.get().getBuildTarget(), Matchers.equalTo(d)); assertThat(translated.get().getDeclaredDeps(), Matchers.equalTo(ImmutableSet.of(d))); assertThat(translated.get().getExtraDeps(), Matchers.equalTo(ImmutableSet.of(d))); assertThat( translated.get().getConstructorArg().getDeps(), Matchers.equalTo(ImmutableSortedSet.of(d))); assertThat( translated.get().getConstructorArg().getExportedDeps(), Matchers.equalTo(ImmutableSortedSet.of(d))); } @Test public void noTranslate() { BuildTarget a = BuildTargetFactory.newInstance("//:a"); BuildTarget b = BuildTargetFactory.newInstance("//:b"); BuildTarget c = BuildTargetFactory.newInstance("//:c"); TargetNode<CxxLibraryDescriptionArg, ?> node = new CxxLibraryBuilder(a) .setDeps(ImmutableSortedSet.of(b)) .setExportedDeps(ImmutableSortedSet.of(c)) .build(); TargetNodeTranslator translator = new TargetNodeTranslator(new DefaultTypeCoercerFactory(), ImmutableList.of()) { @Override public Optional<BuildTarget> translateBuildTarget(BuildTarget target) { return Optional.empty(); } @Override public Optional<ImmutableMap<BuildTarget, Version>> getSelectedVersions( BuildTarget target) { return Optional.empty(); } }; Optional<TargetNode<CxxLibraryDescriptionArg, ?>> translated = translator.translateNode(node); assertFalse(translated.isPresent()); } @Test public void selectedVersions() { TargetNode<VersionPropagatorDescriptionArg, ?> node = new VersionPropagatorBuilder("//:a").build(); final ImmutableMap<BuildTarget, Version> selectedVersions = ImmutableMap.of(BuildTargetFactory.newInstance("//:b"), Version.of("1.0")); TargetNodeTranslator translator = new TargetNodeTranslator(new DefaultTypeCoercerFactory(), ImmutableList.of()) { @Override public Optional<BuildTarget> translateBuildTarget(BuildTarget target) { return Optional.empty(); } @Override public Optional<ImmutableMap<BuildTarget, Version>> getSelectedVersions( BuildTarget target) { return Optional.of(selectedVersions); } }; Optional<TargetNode<VersionPropagatorDescriptionArg, ?>> translated = translator.translateNode(node); assertTrue(translated.isPresent()); assertThat( translated.get().getSelectedVersions(), Matchers.equalTo(Optional.of(selectedVersions))); } @Test public void translatePair() { BuildTarget a = BuildTargetFactory.newInstance("//:a"); BuildTarget b = BuildTargetFactory.newInstance("//:b"); TargetNodeTranslator translator = new TargetNodeTranslator(new DefaultTypeCoercerFactory(), ImmutableList.of()) { @Override public Optional<BuildTarget> translateBuildTarget(BuildTarget target) { return Optional.of(b); } @Override public Optional<ImmutableMap<BuildTarget, Version>> getSelectedVersions( BuildTarget target) { return Optional.empty(); } }; assertThat( translator.translatePair(CELL_PATH_RESOLVER, PATTERN, new Pair<>("hello", a)), Matchers.equalTo(Optional.of(new Pair<>("hello", b)))); } @Test public void translateBuildTargetSourcePath() { BuildTarget a = BuildTargetFactory.newInstance("//:a"); BuildTarget b = BuildTargetFactory.newInstance("//:b"); TargetNodeTranslator translator = new TargetNodeTranslator(new DefaultTypeCoercerFactory(), ImmutableList.of()) { @Override public Optional<BuildTarget> translateBuildTarget(BuildTarget target) { return Optional.of(b); } @Override public Optional<ImmutableMap<BuildTarget, Version>> getSelectedVersions( BuildTarget target) { return Optional.empty(); } }; assertThat( translator.translateBuildTargetSourcePath( CELL_PATH_RESOLVER, PATTERN, new DefaultBuildTargetSourcePath(a)), Matchers.equalTo(Optional.of(new DefaultBuildTargetSourcePath(b)))); } @Test public void translateSourceWithFlags() { BuildTarget a = BuildTargetFactory.newInstance("//:a"); BuildTarget b = BuildTargetFactory.newInstance("//:b"); TargetNodeTranslator translator = new TargetNodeTranslator(new DefaultTypeCoercerFactory(), ImmutableList.of()) { @Override public Optional<BuildTarget> translateBuildTarget(BuildTarget target) { return Optional.of(b); } @Override public Optional<ImmutableMap<BuildTarget, Version>> getSelectedVersions( BuildTarget target) { return Optional.empty(); } }; assertThat( translator.translateSourceWithFlags( CELL_PATH_RESOLVER, PATTERN, SourceWithFlags.of(new DefaultBuildTargetSourcePath(a), ImmutableList.of("-flag"))), Matchers.equalTo( Optional.of( SourceWithFlags.of( new DefaultBuildTargetSourcePath(b), ImmutableList.of("-flag"))))); } @Test public void translateTargetTranslator() { TargetTranslator<Integer> integerTranslator = new TargetTranslator<Integer>() { @Override public Class<Integer> getTranslatableClass() { return Integer.class; } @Override public Optional<Integer> translateTargets( CellPathResolver cellPathResolver, BuildTargetPatternParser<BuildTargetPattern> pattern, TargetNodeTranslator translator, Integer val) { return Optional.of(0); } }; TargetNodeTranslator translator = new FixedTargetNodeTranslator( new DefaultTypeCoercerFactory(), ImmutableList.of(integerTranslator), ImmutableMap.of()); assertThat( translator.translate(CELL_PATH_RESOLVER, PATTERN, 12), Matchers.equalTo(Optional.of(0))); } }