/*
 * 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.rules;

import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.not;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;

import com.facebook.buck.java.DefaultJavaLibraryRule;
import com.facebook.buck.model.BuildTargetFactory;
import com.facebook.buck.rules.RuleKey.Builder;
import com.facebook.buck.testutil.TestConsole;
import com.facebook.buck.util.DefaultFileHashCache;
import com.facebook.buck.util.FileHashCache;
import com.facebook.buck.util.ProjectFilesystem;

import org.junit.Test;

import java.io.File;
import java.io.IOException;

/**
 * Unit test for {@link RuleKey}.
 */
public class RuleKeyTest {

  @Test
  public void testRuleKeyFromHashString() {
    RuleKey ruleKey = new RuleKey("19d2558a6bd3a34fb3f95412de9da27ed32fe208");
    assertEquals("19d2558a6bd3a34fb3f95412de9da27ed32fe208", ruleKey.toString());
  }

  /**
   * Ensure that build rules with the same inputs but different deps have unique RuleKeys.
   */
  @Test
  public void testRuleKeyDependsOnDeps() throws IOException {
    BuildRuleResolver ruleResolver1 = new BuildRuleResolver();
    BuildRuleResolver ruleResolver2 = new BuildRuleResolver();
    ProjectFilesystem projectFilesystem = new ProjectFilesystem(new File("."));
    final FileHashCache fileHashCache = new DefaultFileHashCache(projectFilesystem,
        new TestConsole());
    AbstractBuildRuleBuilderParams builderParams = new DefaultBuildRuleBuilderParams(
        projectFilesystem,
        new RuleKeyBuilderFactory() {
          @Override
          public Builder newInstance(BuildRule buildRule) {
            return RuleKey.builder(buildRule, fileHashCache);
          }
        });

    // Create a dependent build rule, //src/com/facebook/buck/cli:common.
    DefaultJavaLibraryRule.Builder commonJavaLibraryRuleBuilder = DefaultJavaLibraryRule
        .newJavaLibraryRuleBuilder(builderParams)
        .setBuildTarget(BuildTargetFactory.newInstance("//src/com/facebook/buck/cli:common"));
    ruleResolver1.buildAndAddToIndex(commonJavaLibraryRuleBuilder);
    ruleResolver2.buildAndAddToIndex(commonJavaLibraryRuleBuilder);

    // Create a java_library() rule with no deps.
    DefaultJavaLibraryRule.Builder javaLibraryBuilder = DefaultJavaLibraryRule
        .newJavaLibraryRuleBuilder(builderParams)
        .setBuildTarget(BuildTargetFactory.newInstance("//src/com/facebook/buck/cli:cli"))
        // The source file must be an existing file or else RuleKey.Builder.setVal(File) will throw
        // an IOException, which is caught and then results in the rule being flagged as
        // "not idempotent", which screws up this test.
        // TODO(mbolin): Update RuleKey.Builder.setVal(File) to use a ProjectFilesystem so that file
        // access can be mocked appropriately during a unit test.
        .addSrc("src/com/facebook/buck/cli/Main.java");
    DefaultJavaLibraryRule libraryNoCommon = ruleResolver1.buildAndAddToIndex(
        javaLibraryBuilder);

    // Create the same java_library() rule, but with a dep on //src/com/facebook/buck/cli:common.
    javaLibraryBuilder.addDep(BuildTargetFactory.newInstance("//src/com/facebook/buck/cli:common"));
    DefaultJavaLibraryRule libraryWithCommon = ruleResolver2.buildAndAddToIndex(
        javaLibraryBuilder);

    // Assert that the RuleKeys are distinct.
    RuleKey r1 = libraryNoCommon.getRuleKey();
    RuleKey r2 = libraryWithCommon.getRuleKey();
    assertThat("Rule keys should be distinct because the deps of the rules are different.",
        r1,
        not(equalTo(r2)));
  }
}
