/* * Copyright 2017-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.distributed; import com.facebook.buck.jvm.java.JavaLibraryBuilder; import com.facebook.buck.model.BuildTarget; import com.facebook.buck.model.BuildTargetFactory; import com.facebook.buck.parser.NoSuchBuildTargetException; import com.facebook.buck.rules.BuildRule; import com.facebook.buck.rules.BuildRuleResolver; import com.facebook.buck.rules.DefaultTargetNodeToBuildRuleTransformer; import com.facebook.buck.rules.TargetGraph; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSortedSet; import org.junit.Assert; import org.junit.Test; public class BuildTargetsQueueTest { public static final String TARGET_NAME = "//foo:one"; @Test public void testEmptyQueue() { BuildTargetsQueue queue = BuildTargetsQueue.newEmptyQueue(); ImmutableList<String> zeroDepTargets = queue.dequeueZeroDependencyNodes(ImmutableList.of()); Assert.assertEquals(0, zeroDepTargets.size()); } @Test public void testResolverWithoutAnyTargets() { BuildRuleResolver resolver = new BuildRuleResolver(TargetGraph.EMPTY, new DefaultTargetNodeToBuildRuleTransformer()); BuildTargetsQueue queue = BuildTargetsQueue.newQueue(resolver, ImmutableList.of()); ImmutableList<String> zeroDepTargets = queue.dequeueZeroDependencyNodes(ImmutableList.of()); Assert.assertEquals(0, zeroDepTargets.size()); } @Test public void testResolverWithOnSingleTarget() throws NoSuchBuildTargetException { BuildRuleResolver resolver = createSimpleResolver(); BuildTarget target = BuildTargetFactory.newInstance(TARGET_NAME); BuildTargetsQueue queue = BuildTargetsQueue.newQueue(resolver, ImmutableList.of(target)); ImmutableList<String> zeroDepTargets = queue.dequeueZeroDependencyNodes(ImmutableList.of()); Assert.assertEquals(1, zeroDepTargets.size()); Assert.assertEquals("//foo:one", zeroDepTargets.get(0)); Assert.assertEquals(0, queue.dequeueZeroDependencyNodes(ImmutableList.of()).size()); Assert.assertEquals( 0, queue.dequeueZeroDependencyNodes(ImmutableList.of(target.getFullyQualifiedName())).size()); } @Test public void testResolverWithDiamondDependencyTarget() throws NoSuchBuildTargetException { BuildRuleResolver resolver = createDiamondDependencyResolver(); BuildTarget target = BuildTargetFactory.newInstance(TARGET_NAME); BuildTargetsQueue queue = BuildTargetsQueue.newQueue(resolver, ImmutableList.of(target)); ImmutableList<String> zeroDepTargets = queue.dequeueZeroDependencyNodes(ImmutableList.of()); Assert.assertEquals(1, zeroDepTargets.size()); Assert.assertEquals(TARGET_NAME + "_leaf", zeroDepTargets.get(0)); zeroDepTargets = queue.dequeueZeroDependencyNodes(zeroDepTargets); Assert.assertEquals(2, zeroDepTargets.size()); Assert.assertTrue(zeroDepTargets.contains(TARGET_NAME + "_right")); Assert.assertTrue(zeroDepTargets.contains(TARGET_NAME + "_left")); zeroDepTargets = queue.dequeueZeroDependencyNodes(zeroDepTargets); Assert.assertEquals(1, zeroDepTargets.size()); Assert.assertEquals(TARGET_NAME, zeroDepTargets.get(0)); Assert.assertEquals(0, queue.dequeueZeroDependencyNodes(zeroDepTargets).size()); } private static BuildRuleResolver createSimpleResolver() throws NoSuchBuildTargetException { BuildRuleResolver resolver = new BuildRuleResolver(TargetGraph.EMPTY, new DefaultTargetNodeToBuildRuleTransformer()); ImmutableSortedSet<BuildRule> buildRules = ImmutableSortedSet.of( JavaLibraryBuilder.createBuilder(BuildTargetFactory.newInstance(TARGET_NAME)) .build(resolver), JavaLibraryBuilder.createBuilder(BuildTargetFactory.newInstance("//foo:two")) .build(resolver)); resolver.addAllToIndex(buildRules); return resolver; } public static BuildTargetsQueue createDiamondDependencyQueue() throws NoSuchBuildTargetException { return BuildTargetsQueue.newQueue( createDiamondDependencyResolver(), ImmutableList.of(BuildTargetFactory.newInstance(TARGET_NAME))); } public static BuildRuleResolver createDiamondDependencyResolver() throws NoSuchBuildTargetException { BuildRuleResolver resolver = new BuildRuleResolver(TargetGraph.EMPTY, new DefaultTargetNodeToBuildRuleTransformer()); BuildTarget root = BuildTargetFactory.newInstance(TARGET_NAME); BuildTarget left = BuildTargetFactory.newInstance(TARGET_NAME + "_left"); BuildTarget right = BuildTargetFactory.newInstance(TARGET_NAME + "_right"); BuildTarget leaf = BuildTargetFactory.newInstance(TARGET_NAME + "_leaf"); ImmutableSortedSet<BuildRule> buildRules = ImmutableSortedSet.of( JavaLibraryBuilder.createBuilder(leaf).build(resolver), JavaLibraryBuilder.createBuilder(left).addDep(leaf).build(resolver), JavaLibraryBuilder.createBuilder(right).addDep(leaf).build(resolver), JavaLibraryBuilder.createBuilder(root).addDep(left).addDep(right).build(resolver)); resolver.addAllToIndex(buildRules); return resolver; } }