/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 org.apache.sqoop.tool;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.apache.commons.cli.CommandLine;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.util.StringUtils;

import org.apache.sqoop.Sqoop;
import org.apache.sqoop.SqoopOptions;

import org.apache.sqoop.SqoopOptions.InvalidOptionsException;

import org.apache.sqoop.cli.ToolOptions;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.junit.Test;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;

/**
 * Test that tool plugins work.
 */
public class TestToolPlugin {

  public static final Log LOG = LogFactory
      .getLog(TestToolPlugin.class.getName());

  /**
   * The plugin that registers the tool.
   */
  public static class PluginClass extends ToolPlugin {
    public List<ToolDesc> getTools() {
      return Collections.singletonList(new ToolDesc("fooTool",
          FooTool.class, "does foo things"));
    }
  }

  /**
   * The dummy tool itself.
   */
  public static class FooTool extends BaseSqoopTool {
    /** Holds the name of the last user we "operated" as.  */
    private static String lastUser;
    static String getLastUser() {
      return lastUser;
    }

    private static void setLastUser(String last) {
      lastUser = last;
    }

    public FooTool() {
      super("fooTool");
    }

    /** Just save the username and call it a day. */
    @Override
    public int run(SqoopOptions opts) {
      setLastUser(opts.getUsername());
      LOG.info("FooTool operating on user: " + lastUser);
      return 0;
    }

    @Override
    public void configureOptions(ToolOptions toolOptions) {
      toolOptions.addUniqueOptions(getCommonOptions());
    }

    @Override
    public void applyOptions(CommandLine in, SqoopOptions out)
        throws InvalidOptionsException {
      applyCommonOptions(in, out);
    }

    @Override
    public void validateOptions(SqoopOptions options)
        throws InvalidOptionsException {
      validateCommonOptions(options);
    }
  }

  @Test
  public void testPlugin() {
    // Register the plugin with SqoopTool.
    Configuration pluginConf = new Configuration();
    pluginConf.set(SqoopTool.TOOL_PLUGINS_KEY, PluginClass.class.getName());
    SqoopTool.loadPlugins(pluginConf);

    ArrayList<String> args = new ArrayList<String>();
    args.add("fooTool");
    args.add("--username");
    args.add("bob");
    args.add("--connect");
    args.add("anywhere");

    int ret = Sqoop.runTool(args.toArray(new String[0]));
    assertEquals("Expected tool run success", 0, ret);

    String actualUser = FooTool.getLastUser();
    assertEquals("Failed to set username correctly.", "bob", actualUser);
  }

  /**
   * Plugin class that tries to override an existing tool definition.
   */
  public static class OverridePlugin extends ToolPlugin {
    public List<ToolDesc> getTools() {
      return Collections.singletonList(new ToolDesc("import",
          FooTool.class, "replaces 'import' with foo"));
    }
  }

  @Test
  public void testNoOverrideTools() {
    // Test that you can't override an existing tool definition. First
    // registration of a tool name wins.
    Configuration pluginConf = new Configuration();
    pluginConf.set(SqoopTool.TOOL_PLUGINS_KEY, OverridePlugin.class.getName());
    try {
      SqoopTool.loadPlugins(pluginConf);
      fail("Successfully loaded a plugin that overrides 'import' tool.");
    } catch (RuntimeException re) {
      LOG.info("Got runtime exception registering plugin (expected; ok): "
          + StringUtils.stringifyException(re));
    }
  }
}
