SQOOP-2381: Add test for mysql export with --escape-by option
(Abraham Elmahrek via Jarek Jarcec Cecho)
diff --git a/src/test/com/cloudera/sqoop/manager/DirectMySQLExportTest.java b/src/test/com/cloudera/sqoop/manager/DirectMySQLExportTest.java
index 986dc86..79e90e2 100644
--- a/src/test/com/cloudera/sqoop/manager/DirectMySQLExportTest.java
+++ b/src/test/com/cloudera/sqoop/manager/DirectMySQLExportTest.java
@@ -23,6 +23,7 @@
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.sql.Connection;
+import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.SQLException;
@@ -38,6 +39,9 @@
import com.cloudera.sqoop.TestExport;
import com.cloudera.sqoop.mapreduce.MySQLExportMapper;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
/**
* Test the DirectMySQLManager implementation's exportJob() functionality.
*/
@@ -219,6 +223,89 @@
}
}
+ /**
+ * Test an authenticated export using mysqlimport.
+ */
+ public void testEscapedByExport() throws IOException, SQLException {
+ SqoopOptions options = new SqoopOptions(MySQLAuthTest.AUTH_CONNECT_STRING,
+ getTableName());
+ options.setUsername(MySQLAuthTest.AUTH_TEST_USER);
+ options.setPassword(MySQLAuthTest.AUTH_TEST_PASS);
+
+ manager = new DirectMySQLManager(options);
+
+ Connection connection = null;
+ Statement st = null;
+
+ String tableName = getTableName();
+
+ try {
+ connection = manager.getConnection();
+ connection.setAutoCommit(false);
+ st = connection.createStatement();
+
+ // create a target database table.
+ st.executeUpdate("DROP TABLE IF EXISTS " + tableName);
+ st.executeUpdate("CREATE TABLE " + tableName + " ("
+ + "id INT NOT NULL PRIMARY KEY, "
+ + "msg VARCHAR(24) NOT NULL, "
+ + "value VARCHAR(100) NOT NULL)");
+ connection.commit();
+
+ // Write a file containing a record to export.
+ Path tablePath = getTablePath();
+ Path filePath = new Path(tablePath, "datafile");
+ Configuration conf = new Configuration();
+ conf.set("fs.default.name", "file:///");
+
+ ColumnGenerator gen = new ColumnGenerator() {
+ public String getExportText(int rowNum) {
+ return "||" + rowNum;
+ }
+ public String getVerifyText(int rowNum) {
+ return "|" + rowNum;
+ }
+ public String getType() {
+ return "STRING";
+ }
+ };
+
+ FileSystem fs = FileSystem.get(conf);
+ fs.mkdirs(tablePath);
+ OutputStream os = fs.create(filePath);
+ BufferedWriter w = new BufferedWriter(new OutputStreamWriter(os));
+ w.write(getRecordLine(0, gen));
+ w.write(getRecordLine(1, gen));
+ w.write(getRecordLine(2, gen));
+ w.close();
+ os.close();
+
+ // run the export and verify that the results are good.
+ runExport(getArgv(true, 10, 10,
+ "--username", MySQLAuthTest.AUTH_TEST_USER,
+ "--password", MySQLAuthTest.AUTH_TEST_PASS,
+ "--connect", MySQLAuthTest.AUTH_CONNECT_STRING,
+ "--escaped-by", "|"));
+ verifyExport(3, connection);
+ verifyTableColumnContents(connection, tableName, "value", gen);
+ } catch (SQLException sqlE) {
+ LOG.error("Encountered SQL Exception: " + sqlE);
+ sqlE.printStackTrace();
+ fail("SQLException when accessing target table. " + sqlE);
+ } finally {
+ try {
+ if (null != st) {
+ st.close();
+ }
+
+ if (null != connection) {
+ connection.close();
+ }
+ } catch (SQLException sqlE) {
+ LOG.warn("Got SQLException when closing connection: " + sqlE);
+ }
+ }
+ }
@Override
public void testMultiMapTextExportWithStaging()
@@ -231,4 +318,18 @@
throws IOException, SQLException {
// disable this test as staging is not supported in direct mode
}
+
+ private void verifyTableColumnContents(Connection connection,
+ String table, String column, ColumnGenerator gen)
+ throws IOException, SQLException {
+ Statement st = connection.createStatement();
+
+ // create a target database table.
+ assertTrue(st.execute("SELECT " + column + " FROM " + table));
+ ResultSet rs = st.getResultSet();
+
+ for (int row = 0; rs.next(); ++row) {
+ assertEquals(gen.getVerifyText(row), rs.getString(1));
+ }
+ }
}