/*
 * 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.buildArchive(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);
  }
}
