/*
 * Copyright 2013-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.java;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import com.facebook.buck.model.BuildTarget;
import com.facebook.buck.rules.AbiRule;
import com.facebook.buck.rules.BuildContext;
import com.facebook.buck.rules.BuildRuleParams;
import com.facebook.buck.rules.FakeBuildRuleParams;
import com.facebook.buck.rules.FakeBuildableContext;
import com.facebook.buck.rules.Sha1HashCode;
import com.facebook.buck.step.ExecutionContext;
import com.facebook.buck.step.Step;
import com.facebook.buck.step.TestExecutionContext;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableMap;
import com.google.common.hash.HashCode;
import com.google.common.hash.Hashing;
import com.google.common.io.ByteStreams;
import com.google.common.io.Files;

import org.easymock.EasyMock;
import org.junit.Before;
import org.junit.Test;

import java.io.File;
import java.io.IOException;
import java.util.List;

public class PrebuiltJarRuleTest {

  private static final String PATH_TO_JUNIT_JAR = "lib/junit-4.11.jar";

  private PrebuiltJarRule junitJarRule;

  @Before
  public void setUp() {
    BuildRuleParams buildRuleParams = new FakeBuildRuleParams(new BuildTarget("//lib", "junit"));
    junitJarRule = new PrebuiltJarRule(buildRuleParams,
        PATH_TO_JUNIT_JAR,
        Optional.of("lib/junit-4.11-sources.jar"),
        Optional.of("http://junit-team.github.io/junit/javadoc/latest/"));
  }

  @Test
  public void testAbiKeyIsHashOfFileContents() throws IOException {
    BuildContext buildContext = EasyMock.createMock(BuildContext.class);
    FakeBuildableContext buildableContext = new FakeBuildableContext();
    List<Step> buildSteps = junitJarRule.getBuildSteps(buildContext, buildableContext);

    // Execute the lone build step.
    assertEquals("CalculateAbiStep should be the only step.", 1, buildSteps.size());
    Step calculateAbiStep = buildSteps.get(0);
    ExecutionContext executionContext = TestExecutionContext.newBuilder().build();
    int exitCode = calculateAbiStep.execute(executionContext);
    assertEquals("Step should execute successfully.", 0, exitCode);

    // Make sure the ABI key is set as expected.
    Sha1HashCode abiKey = junitJarRule.getAbiKey();
    HashCode hashForJar = ByteStreams.hash(
        Files.newInputStreamSupplier(
            new File(PATH_TO_JUNIT_JAR)),
        Hashing.sha1());
    assertEquals("ABI key should be the sha1 of the file contents.",
        hashForJar.toString(),
        abiKey.toString());

    assertEquals(
        "Executing the step should record the ABI key as metadata.",
        ImmutableMap.of(
            AbiRule.ABI_KEY_ON_DISK_METADATA,
            hashForJar.toString()),
        buildableContext.getRecordedMetadata());
  }

  @Test
  public void testGetJavaSrcsIsEmpty() {
    assertTrue(junitJarRule.getJavaSrcs().isEmpty());
  }

  @Test
  public void testGetAnnotationProcessingDataIsEmpty() {
    assertTrue(junitJarRule.getAnnotationProcessingData().isEmpty());
  }
}
