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

import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import static org.junit.Assert.assertTrue;

import com.facebook.buck.model.BuildTargetFactory;
import com.facebook.buck.model.BuildTargetPattern;
import com.facebook.buck.rules.BuildContext;
import com.facebook.buck.rules.BuildRuleResolver;
import com.facebook.buck.rules.BuildRuleType;
import com.facebook.buck.rules.FakeAbstractBuildRuleBuilderParams;
import com.facebook.buck.step.ExecutionContext;
import com.facebook.buck.step.Step;
import com.facebook.buck.testutil.MoreAsserts;
import com.facebook.buck.util.BuckConstant;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;

import org.junit.Assert;
import org.junit.Test;

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

/**
 * Unit test for {@link com.facebook.buck.android.NdkLibraryRule}.
 */
public class NdkLibraryRuleTest {

  @Test
  public void testSimpleNdkLibraryRule() throws IOException {
    BuildContext context = null;

    String basePath = "java/src/com/facebook/base";
    BuildRuleResolver ruleResolver = new BuildRuleResolver();
    NdkLibraryRule ndkLibraryRule = ruleResolver.buildAndAddToIndex(
        NdkLibraryRule.newNdkLibraryRuleBuilder(new FakeAbstractBuildRuleBuilderParams())
        .setBuildTarget(BuildTargetFactory.newInstance(
            String.format("//%s:base", basePath)))
        .addSrc(basePath + "/Application.mk")
        .addSrc(basePath + "/main.cpp")
        .addSrc(basePath + "/Android.mk")
        .addFlag("flag1")
        .addFlag("flag2")
        .setIsAsset(true)
        .addVisibilityPattern(BuildTargetPattern.MATCH_ALL));

    Assert.assertEquals(BuildRuleType.NDK_LIBRARY, ndkLibraryRule.getType());
    assertTrue(ndkLibraryRule.isAndroidRule());
    assertTrue(ndkLibraryRule.isAsset());
    Assert.assertEquals(BuckConstant.GEN_DIR + "/" + basePath + "/__libbase/libs",
        ndkLibraryRule.getLibraryPath());

    MoreAsserts.assertListEquals(
        ImmutableList.of(
            basePath + "/Android.mk",
            basePath + "/Application.mk",
            basePath + "/main.cpp"),
        ImmutableList.copyOf(ndkLibraryRule.getInputsToCompareToOutput()));

    List<Step> steps = ndkLibraryRule.buildInternal(context);

    ExecutionContext executionContext = createMock(ExecutionContext.class);
    File projectRoot = createMock(File.class);
    expect(executionContext.getProjectDirectoryRoot()).andReturn(projectRoot);
    expect(projectRoot.getAbsolutePath()).andReturn("/foo");
    File ndkDir = createMock(File.class);
    expect(executionContext.getNdkRoot()).andReturn(Optional.of(ndkDir));
    expect(ndkDir.getAbsolutePath()).andReturn("/ndk-r8b");

    replay(executionContext, projectRoot, ndkDir);
    MoreAsserts.assertShellCommands(
        "ndk_library() should invoke ndk-build on the given path with some -j value",
        ImmutableList.of(
            String.format(
              "/ndk-r8b/ndk-build -j %d -C %s/ flag1 flag2 " +
              "APP_PROJECT_PATH=/foo/%s/%s/%s/ APP_BUILD_SCRIPT=/foo/%s/Android.mk " +
              "NDK_OUT=/foo/%s/%s/%s/",
              Runtime.getRuntime().availableProcessors(),
              basePath,
              BuckConstant.GEN_DIR,
              basePath,
              "__libbase",
              basePath,
              BuckConstant.GEN_DIR,
              basePath,
              "__libbase")
        ),
        steps,
        executionContext);
    verify(executionContext, projectRoot);
  }
}
