| /** |
| * 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 static org.hamcrest.CoreMatchers.equalTo; |
| import static org.hamcrest.CoreMatchers.is; |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertThat; |
| import static org.mockito.Matchers.any; |
| import static org.mockito.Mockito.doReturn; |
| import static org.mockito.Mockito.doThrow; |
| import static org.mockito.Mockito.mock; |
| import static org.mockito.Mockito.spy; |
| import static org.mockito.Mockito.when; |
| |
| import java.sql.Connection; |
| |
| import org.apache.sqoop.SqoopOptions.InvalidOptionsException; |
| import org.apache.avro.Schema; |
| import org.apache.sqoop.SqoopOptions; |
| import org.apache.sqoop.avro.AvroSchemaMismatchException; |
| import org.apache.sqoop.hive.HiveClientFactory; |
| import org.apache.sqoop.util.ExpectedLogMessage; |
| import org.junit.Assert; |
| import org.junit.Rule; |
| import org.junit.Test; |
| import org.junit.experimental.theories.DataPoints; |
| import org.junit.experimental.theories.Theories; |
| import org.junit.experimental.theories.Theory; |
| import org.junit.runner.RunWith; |
| |
| @RunWith(Theories.class) |
| public class TestImportTool { |
| @DataPoints |
| public static final Object[][] TRANSACTION_ISOLATION_LEVEL_NAMES_AND_VALUES = { |
| {"TRANSACTION_NONE", Connection.TRANSACTION_NONE}, |
| {"TRANSACTION_READ_COMMITTED",Connection.TRANSACTION_READ_COMMITTED}, |
| {"TRANSACTION_READ_UNCOMMITTED",Connection.TRANSACTION_READ_UNCOMMITTED}, |
| {"TRANSACTION_REPEATABLE_READ",Connection.TRANSACTION_REPEATABLE_READ}, |
| {"TRANSACTION_SERIALIZABLE",Connection.TRANSACTION_SERIALIZABLE} |
| }; |
| |
| @Rule |
| public ExpectedLogMessage logMessage = new ExpectedLogMessage(); |
| |
| @Theory |
| public void esnureTransactionIsolationLevelsAreMappedToTheRightValues(Object[] values) |
| throws Exception { |
| ImportTool importTool = new ImportTool(); |
| String[] args = { "--" + BaseSqoopTool.METADATA_TRANSACTION_ISOLATION_LEVEL, values[0].toString() }; |
| SqoopOptions options = importTool.parseArguments(args, null, null, true); |
| assertThat(options.getMetadataTransactionIsolationLevel(), is(equalTo(values[1]))); |
| } |
| |
| @Test |
| public void testImportToolHandlesAvroSchemaMismatchExceptionProperly() throws Exception { |
| final String writtenWithSchemaString = "writtenWithSchema"; |
| final String actualSchemaString = "actualSchema"; |
| final String errorMessage = "Import failed"; |
| |
| ImportTool importTool = spy(new ImportTool("import", mock(CodeGenTool.class), false, mock(HiveClientFactory.class))); |
| |
| doReturn(true).when(importTool).init(any(SqoopOptions.class)); |
| |
| Schema writtenWithSchema = mock(Schema.class); |
| when(writtenWithSchema.toString()).thenReturn(writtenWithSchemaString); |
| Schema actualSchema = mock(Schema.class); |
| when(actualSchema.toString()).thenReturn(actualSchemaString); |
| |
| AvroSchemaMismatchException expectedException = new AvroSchemaMismatchException(errorMessage, writtenWithSchema, actualSchema); |
| doThrow(expectedException).when(importTool).importTable(any(SqoopOptions.class)); |
| |
| SqoopOptions sqoopOptions = mock(SqoopOptions.class); |
| when(sqoopOptions.doHiveImport()).thenReturn(true); |
| |
| logMessage.expectError(expectedException.getMessage()); |
| int result = importTool.run(sqoopOptions); |
| assertEquals(1, result); |
| } |
| |
| // If --external-table-dir is set and --hive-import is not, check an exception |
| // is thrown |
| @Test (expected = InvalidOptionsException.class) |
| public void testExternalTableNoHiveImportThrowsException() throws InvalidOptionsException { |
| String hdfsTableDir = "/data/movielens/genre"; |
| SqoopOptions options = new SqoopOptions("jdbc:postgresql://localhost/movielens", "genres"); |
| options.setHiveExternalTableDir(hdfsTableDir); |
| ImportTool tool = new ImportTool("Import Tool", false); |
| tool.validateHiveOptions(options); |
| Assert.fail("testExternalTableNoHiveImportThrowsException unit test failed!"); |
| } |
| |
| } |