/*
 * 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 com.facebook.buck.rules.BuildableProperties.Kind.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.assertEquals;
import static org.junit.Assert.assertTrue;

import com.facebook.buck.model.BuildTargetFactory;
import com.facebook.buck.rules.BuildContext;
import com.facebook.buck.rules.BuildRuleResolver;
import com.facebook.buck.rules.BuildRuleType;
import com.facebook.buck.rules.Buildable;
import com.facebook.buck.rules.FakeAbstractBuildRuleBuilderParams;
import com.facebook.buck.rules.FakeBuildableContext;
import com.facebook.buck.shell.ShellStep;
import com.facebook.buck.step.ExecutionContext;
import com.facebook.buck.step.Step;
import com.facebook.buck.step.fs.MkdirStep;
import com.facebook.buck.util.AndroidPlatformTarget;
import com.facebook.buck.util.BuckConstant;
import com.facebook.buck.util.ProjectFilesystem;
import com.google.common.collect.ImmutableList;

import org.junit.Test;

import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;

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

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

    String pathToAidl = "java/com/example/base/IWhateverService.aidl";
    String importPath = "java/com/example/base/";

    BuildRuleResolver ruleResolver = new BuildRuleResolver();
    GenAidl.Builder builder = GenAidl
        .newGenAidlRuleBuilder(new FakeAbstractBuildRuleBuilderParams())
        .setBuildTarget(BuildTargetFactory.newInstance("//java/com/example/base:IWhateverService"))
        .setAidl(pathToAidl)
        .setImportPath(importPath);
    Buildable genAidlRule = ruleResolver.buildAndAddToIndex(builder).getBuildable();

    assertEquals(BuildRuleType.GEN_AIDL, builder.getType());
    assertTrue(genAidlRule.getProperties().is(ANDROID));

    assertEquals(ImmutableList.of(pathToAidl), genAidlRule.getInputsToCompareToOutput());

    List<Step> steps = genAidlRule.getBuildSteps(context, new FakeBuildableContext());

    final String pathToAidlExecutable = "/usr/local/bin/aidl";
    final String pathToFrameworkAidl = "/home/root/android/platforms/android-16/framework.aidl";
    AndroidPlatformTarget androidPlatformTarget = createMock(AndroidPlatformTarget.class);
    File aidlExecutable = createMock(File.class);
    expect(aidlExecutable.getAbsolutePath()).andReturn(pathToAidlExecutable);
    expect(androidPlatformTarget.getAidlExecutable()).andReturn(aidlExecutable);
    File frameworkIdlFile = createMock(File.class);
    expect(frameworkIdlFile.getAbsolutePath()).andReturn(pathToFrameworkAidl);
    expect(androidPlatformTarget.getAndroidFrameworkIdlFile()).andReturn(frameworkIdlFile);

    ExecutionContext executionContext = createMock(ExecutionContext.class);
    expect(executionContext.getAndroidPlatformTarget()).andReturn(androidPlatformTarget);
    expect(executionContext.getProjectFilesystem()).andReturn(
        new ProjectFilesystem(new File(".")) {
          @Override
          public Path resolve(Path path) {
            return path;
          }
        })
        .times(2);
    replay(androidPlatformTarget,
        aidlExecutable,
        frameworkIdlFile,
        executionContext);

    Path outputDirectory = Paths.get(
        BuckConstant.BIN_DIR,
        "/java/com/example/base/.IWhateverService.aidl");
    MkdirStep mkdirStep = (MkdirStep) steps.get(0);
    assertEquals("gen_aidl() should make a directory at " + outputDirectory,
        outputDirectory,
        mkdirStep.getPath(executionContext));

    ShellStep aidlStep = (ShellStep) steps.get(1);
    assertEquals(
        "gen_aidl() should use the aidl binary to write .java files.",
        String.format("%s -b -p%s -I%s -o%s %s",
            pathToAidlExecutable,
            pathToFrameworkAidl,
            importPath,
            outputDirectory,
            pathToAidl),
        aidlStep.getDescription(executionContext));

    assertEquals(4, steps.size());

    verify(androidPlatformTarget,
        aidlExecutable,
        frameworkIdlFile,
        executionContext);
  }
}
