/*
 * 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 ruleResolver = 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.
    ruleResolver.buildAndAddToIndex(
        DefaultJavaLibraryRule.newJavaLibraryRuleBuilder(builderParams)
        .setBuildTarget(BuildTargetFactory.newInstance("//src/com/facebook/buck/cli:common")));

    // 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 = ruleResolver.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 = ruleResolver.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)));
  }
}
