/*
 * Copyright 2012-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.cli;

import static com.facebook.buck.util.BuckConstant.GEN_DIR;
import static org.junit.Assert.assertEquals;

import com.facebook.buck.android.AndroidBinaryRule;
import com.facebook.buck.graph.MutableDirectedGraph;
import com.facebook.buck.java.DefaultJavaLibraryRule;
import com.facebook.buck.java.JavaLibraryRule;
import com.facebook.buck.java.JavaTestRule;
import com.facebook.buck.model.BuildTarget;
import com.facebook.buck.model.BuildTargetFactory;
import com.facebook.buck.parser.PartialGraph;
import com.facebook.buck.parser.PartialGraphFactory;
import com.facebook.buck.rules.ArtifactCache;
import com.facebook.buck.rules.BuildRule;
import com.facebook.buck.rules.DependencyGraph;
import com.facebook.buck.rules.NoopArtifactCache;
import com.facebook.buck.util.Ansi;
import com.facebook.buck.util.CapturingPrintStream;
import com.facebook.buck.util.ProjectFilesystem;
import com.google.common.base.Charsets;
import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;

import org.junit.Before;
import org.junit.Test;

import java.io.File;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.SortedSet;

public class AuditClasspathCommandTest {

  private final String projectRootPath = ".";
  private final File projectRoot = new File(projectRootPath);
  private final Ansi ansi = new Ansi(false);
  private final ArtifactCache artifactCache = new NoopArtifactCache();
  private CapturingPrintStream stdOutStream;
  private CapturingPrintStream stdErrStream;
  private AuditClasspathCommand auditClasspathCommand;

  @Before
  public void setUp() {
    stdOutStream = new CapturingPrintStream();
    stdErrStream = new CapturingPrintStream();
    Console console = new Console(stdOutStream, stdErrStream, ansi);
    ProjectFilesystem projectFilesystem = new ProjectFilesystem(projectRoot);
    ArtifactCache artifactCache = new NoopArtifactCache();
    auditClasspathCommand = new AuditClasspathCommand(stdOutStream,
        stdErrStream,
        console,
        projectFilesystem,
        artifactCache);
  }

  private String getCapturedOutput(CapturingPrintStream stream) {
    return stream.getContentsAsString(Charsets.UTF_8);
  }

  private PartialGraph createGraphFromBuildRules(Iterable<BuildRule> rules, List<String> targets) {
    MutableDirectedGraph<BuildRule> graph = new MutableDirectedGraph<BuildRule>();
    for (BuildRule rule : rules) {
      for (BuildRule dep : rule.getDeps()) {
        graph.addEdge(rule, dep);
      }
    }

    List<BuildTarget> buildTargets = Lists.transform(targets, new Function<String, BuildTarget>() {
      @Override
      public BuildTarget apply(String target) {
        return BuildTargetFactory.newInstance(target);
      }
    });

    DependencyGraph dependencyGraph = new DependencyGraph(graph);
    return PartialGraphFactory.newInstance(dependencyGraph, buildTargets);
  }

  @Test
  public void testClassPathOutput() {
    // Build a DependencyGraph of build rules manually.
    Map<String, BuildRule> buildRuleIndex1 = Maps.newHashMap();
    List<String> targets = Lists.newArrayList();

    // Test that no output is created.
    PartialGraph partialGraph1 = createGraphFromBuildRules(buildRuleIndex1.values(), targets);
    auditClasspathCommand.printClasspath(partialGraph1);
    assertEquals("", getCapturedOutput(stdOutStream));
    assertEquals("", getCapturedOutput(stdErrStream));

    // Add build rules such that all implementations of HasClasspathEntries are tested.
    DefaultJavaLibraryRule javaLibraryRule = DefaultJavaLibraryRule.newJavaLibraryRuleBuilder()
        .setBuildTarget(BuildTargetFactory.newInstance("//:test-java-library"))
        .addSrc("src/com/facebook/TestJavaLibrary.java")
        .setArtifactCache(artifactCache)
        .build(buildRuleIndex1);
    buildRuleIndex1.put(javaLibraryRule.getFullyQualifiedName(), javaLibraryRule);
    JavaLibraryRule androidLibraryRule =
        DefaultJavaLibraryRule.newJavaLibraryRuleBuilder()
        .setBuildTarget(BuildTargetFactory.newInstance("//:test-android-library"))
        .addSrc("src/com/facebook/TestAndroidLibrary.java")
        .addDep("//:test-java-library")
        .setArtifactCache(artifactCache)
        .build(buildRuleIndex1);
    buildRuleIndex1.put(androidLibraryRule.getFullyQualifiedName(), androidLibraryRule);
    AndroidBinaryRule androidBinaryRule = AndroidBinaryRule.newAndroidBinaryRuleBuilder()
        .setBuildTarget(BuildTargetFactory.newInstance("//:test-android-binary"))
        .setManifest("AndroidManifest.xml")
        .setTarget("Google Inc.:Google APIs:16")
        .setKeystorePropertiesPath("keystore.properties")
        .addDep("//:test-android-library")
        .addDep("//:test-java-library")
        .setArtifactCache(artifactCache)
        .build(buildRuleIndex1);
    buildRuleIndex1.put(androidBinaryRule.getFullyQualifiedName(), androidBinaryRule);
    JavaTestRule testRule = JavaTestRule.newJavaTestRuleBuilder()
        .setBuildTarget(BuildTargetFactory.newInstance("//:project-tests"))
        .addDep("//:test-java-library")
        .setSourceUnderTest(ImmutableSet.of("//:test-java-library"))
        .addSrc("src/com/facebook/test/ProjectTests.java")
        .setArtifactCache(artifactCache)
        .build(buildRuleIndex1);
    buildRuleIndex1.put(testRule.getFullyQualifiedName(), testRule);
    PartialGraph partialGraph2 = createGraphFromBuildRules(buildRuleIndex1.values(), targets);
    auditClasspathCommand.printClasspath(partialGraph2);

    // Still empty.
    assertEquals("", getCapturedOutput(stdOutStream));
    assertEquals("", getCapturedOutput(stdErrStream));

    // Request the top build target. This will test the following:
    // - paths don't appear multiple times when dependencies are referenced multiple times.
    // - dependencies are walked
    // - independent targets in the same BUCK file are not included in the output
    targets.add("//:test-android-binary");
    PartialGraph partialGraph3 = createGraphFromBuildRules(buildRuleIndex1.values(), targets);
    auditClasspathCommand.printClasspath(partialGraph3);

    SortedSet<String> expectedPaths = Sets.newTreeSet(
        Arrays.asList(
            GEN_DIR + "/lib__test-android-library__output/test-android-library.jar",
            GEN_DIR + "/lib__test-java-library__output/test-java-library.jar"
        )
    );
    String expectedClasspath = Joiner.on("\n").join(expectedPaths) + "\n";

    assertEquals(expectedClasspath, getCapturedOutput(stdOutStream));
    assertEquals("", getCapturedOutput(stdErrStream));

    // Add independent test target. This will test:
    // - the union of the classpath is output.
    // - all rules have implemented HasClasspathEntries.
    // Note that the output streams are reset.
    setUp();
    targets.add("//:test-java-library");
    targets.add("//:test-android-library");
    targets.add("//:project-tests");
    PartialGraph partialGraph4 = createGraphFromBuildRules(buildRuleIndex1.values(), targets);
    auditClasspathCommand.printClasspath(partialGraph4);

    expectedPaths.add(GEN_DIR + "/lib__project-tests__output/project-tests.jar");
    expectedClasspath = Joiner.on("\n").join(expectedPaths) + "\n";
    assertEquals(expectedClasspath, getCapturedOutput(stdOutStream));
    assertEquals("", getCapturedOutput(stdErrStream));
  }
}
