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

import com.cloudera.sqoop.SqoopOptions;
import com.cloudera.sqoop.manager.MySQLTestUtils;
import com.cloudera.sqoop.testutil.CommonArgs;
import com.cloudera.sqoop.testutil.ImportJobTestCase;
import com.google.common.base.Charsets;
import com.google.common.io.Files;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;

import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;

public class MySqlColumnEscapeImportTest extends ImportJobTestCase {

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

  @Override
  protected boolean useHsqldbTestServer() {
    return false;
  }

  @Override
  protected String getConnectString() {
    return MySQLTestUtils.CONNECT_STRING;
  }

  @Override
  protected SqoopOptions getSqoopOptions(Configuration conf) {
    SqoopOptions opts = new SqoopOptions(conf);
    opts.setUsername(MySQLTestUtils.USER_NAME);
    opts.setPassword(MySQLTestUtils.USER_PASS);
    return opts;
  }

  @Override
  protected String dropTableIfExistsCommand(String table) {
    return "DROP TABLE IF EXISTS " + getManager().escapeTableName(table);
  }

    @Override
  public void tearDown() {
      try {
        dropTableIfExists(getTableName());
      } catch (SQLException e) {
        LOG.error("Could not delete test table", e);
      }
      super.tearDown();
  }

  protected String [] getArgv() {
    ArrayList<String> args = new ArrayList<String>();

    CommonArgs.addHadoopFlags(args);

    args.add("--connect");
    args.add(getConnectString());
    args.add("--username");
    args.add(MySQLTestUtils.USER_NAME);
    args.add("--password");
    args.add(MySQLTestUtils.USER_PASS);
    args.add("--target-dir");
    args.add(getWarehouseDir());
    args.add("--num-mappers");
    args.add("1");
    args.add("--table");
    args.add(getTableName());

    return args.toArray(new String[0]);
  }

  public void testEscapeColumnWithDoubleQuote() throws IOException {
    String[] colNames = { "column\"withdoublequote" };
    String[] types = { "VARCHAR(50)"};
    String[] vals = { "'hello, world'"};
    createTableWithColTypesAndNames(colNames, types, vals);
    String[] args = getArgv();
    runImport(args);

    Path warehousePath = new Path(this.getWarehouseDir());
    Path filePath = new Path(warehousePath, "part-m-00000");
    String output = Files.toString(new File(filePath.toString()), Charsets.UTF_8);

    assertEquals("hello, world", output.trim());
  }

}

