diff --git itests/hcatalog-unit/src/test/java/org/apache/hive/hcatalog/listener/TestDbNotificationListener.java itests/hcatalog-unit/src/test/java/org/apache/hive/hcatalog/listener/TestDbNotificationListener.java index 96141140838865a641e7e6117046c545dcf54657..a5f4da3ec24a1975bfed3d4d27c0275e0b5b24a2 100644 --- itests/hcatalog-unit/src/test/java/org/apache/hive/hcatalog/listener/TestDbNotificationListener.java +++ itests/hcatalog-unit/src/test/java/org/apache/hive/hcatalog/listener/TestDbNotificationListener.java @@ -978,7 +978,7 @@ public void createIndex() throws Exception { Arrays.asList("bucketcol"), Arrays.asList(new Order("sortcol", 1)), params); Table table = new Table(tableName, dbName, "me", startTime, startTime, 0, sd, null, emptyParameters, - null, null, null); + null, null, TableType.INDEX_TABLE.name()); // Event 1 msClient.createTable(table); Index index = @@ -986,7 +986,7 @@ public void createIndex() throws Exception { emptyParameters, false); Table indexTable = new Table(indexTableName, dbName, "me", startTime, startTime, 0, sd, null, emptyParameters, - null, null, null); + null, null, TableType.INDEX_TABLE.name()); // Event 2, 3 (index table and index) msClient.createIndex(index, indexTable); @@ -1057,7 +1057,7 @@ public void dropIndex() throws Exception { emptyParameters, false); Table indexTable = new Table(indexTableName, dbName, "me", startTime, startTime, 0, sd, null, emptyParameters, - null, null, null); + null, null, TableType.INDEX_TABLE.name()); // Event 2, 3 (index table and index) msClient.createIndex(index, indexTable); // Event 4 (drops index and indexTable) @@ -1092,7 +1092,7 @@ public void dropIndex() throws Exception { "dropIndexTable__dropIndexTable2__", sd, emptyParameters, false); Table indexTable2 = new Table("dropIndexTable__dropIndexTable2__", dbName, "me", startTime, startTime, 0, sd, - null, emptyParameters, null, null, null); + null, emptyParameters, null, null, TableType.INDEX_TABLE.name()); msClient.createIndex(index, indexTable2); DummyRawStoreFailEvent.setEventSucceed(false); try { @@ -1132,7 +1132,7 @@ public void alterIndex() throws Exception { emptyParameters, false); Table oldIndexTable = new Table(indexTableName, dbName, "me", startTime, startTime, 0, sd, null, emptyParameters, - null, null, null); + null, null, TableType.INDEX_TABLE.name()); // Event 2, 3 msClient.createIndex(oldIndex, oldIndexTable); // creates index and index table Index newIndex = diff --git standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java index 8dc9b6af92359460b732fb47d8e590329dbc91c0..1f998285cf4d15cd19caa05fd2f19d3e7fc2cf48 100644 --- standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java +++ standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java @@ -4989,6 +4989,11 @@ private Index add_index_core(final RawStore ms, final Index index, final Table i long time = System.currentTimeMillis() / 1000; Table indexTbl = indexTable; if (indexTbl != null) { + if (!TableType.INDEX_TABLE.name().equals(indexTbl.getTableType())){ + throw new InvalidObjectException( + "The table " + indexTbl.getTableName()+ " provided as index table must have " + + TableType.INDEX_TABLE + " table type"); + } try { indexTbl = ms.getTable(qualified[0], qualified[1]); } catch (Exception e) { diff --git standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/TableBuilder.java standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/TableBuilder.java index 69acf3cfff5696dea8a15bd5472dcb7adaa7ccf7..a5325e7d1a7d1d05877811bcd6fc258d966f8db8 100644 --- standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/TableBuilder.java +++ standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/client/builder/TableBuilder.java @@ -142,6 +142,7 @@ public TableBuilder fromIndex(Index index) { dbName = index.getDbName(); tableName = index.getIndexTableName(); setCols(index.getSd().getCols()); + setType(TableType.INDEX_TABLE.name()); return this; } diff --git standalone-metastore/src/test/java/org/apache/hadoop/hive/metastore/client/TestAddAlterDropIndexes.java standalone-metastore/src/test/java/org/apache/hadoop/hive/metastore/client/TestAddAlterDropIndexes.java index 88bacbf84150b9913c31becba0f3874d69cb9b63..680a863c19f49f92a96fbcd78d3c53116bb95216 100644 --- standalone-metastore/src/test/java/org/apache/hadoop/hive/metastore/client/TestAddAlterDropIndexes.java +++ standalone-metastore/src/test/java/org/apache/hadoop/hive/metastore/client/TestAddAlterDropIndexes.java @@ -25,6 +25,7 @@ import org.apache.hadoop.fs.Path; import org.apache.hadoop.hive.metastore.IMetaStoreClient; +import org.apache.hadoop.hive.metastore.TableType; import org.apache.hadoop.hive.metastore.api.AlreadyExistsException; import org.apache.hadoop.hive.metastore.api.Database; import org.apache.hadoop.hive.metastore.api.FieldSchema; @@ -147,7 +148,7 @@ public void testCreateGetAndDropIndex() throws Exception { .setSerdeName(INDEX_TABLE_NAME) .addStorageDescriptorParam(sdParamKey, sdParamValue) .build(); - client.createIndex(index, buildTable(DB_NAME, INDEX_TABLE_NAME)); + client.createIndex(index, buildIndexTable(DB_NAME, INDEX_TABLE_NAME)); Index resultIndex = client.getIndex(DB_NAME, TABLE_NAME, INDEX_NAME); Assert.assertNotNull(resultIndex); @@ -202,8 +203,8 @@ public void testCreateIndexesSameNameDifferentOrigAndIndexTables() throws Except Table origTable1 = createTable(DB_NAME, origTableName1); Table origTable2 = createTable(DB_NAME, origTableName2); - createIndex(DB_NAME, origTable1, INDEX_NAME, buildTable(DB_NAME, indexNameTableName1)); - createIndex(DB_NAME, origTable2, INDEX_NAME, buildTable(DB_NAME, indexNameTableName2)); + createIndex(DB_NAME, origTable1, INDEX_NAME, buildIndexTable(DB_NAME, indexNameTableName1)); + createIndex(DB_NAME, origTable2, INDEX_NAME, buildIndexTable(DB_NAME, indexNameTableName2)); verifyIndex(DB_NAME, origTableName1, INDEX_NAME, indexNameTableName1); verifyIndex(DB_NAME, origTableName2, INDEX_NAME, indexNameTableName2); @@ -217,7 +218,7 @@ public void testCreateIndexStrangeCharsInName() throws Exception { // TODO: Special character should not be allowed in index name. Table origTable = createTable(DB_NAME, TABLE_NAME); - Table indexTable = buildTable(DB_NAME, INDEX_TABLE_NAME); + Table indexTable = buildIndexTable(DB_NAME, INDEX_TABLE_NAME); String indexName = "§±!;@#$%^&*()_+}{|-=[]\':|?><"; createIndex(DB_NAME, origTable, indexName, indexTable); verifyIndex(DB_NAME, TABLE_NAME, indexName, INDEX_TABLE_NAME); @@ -230,7 +231,7 @@ public void testCreateIndexWithUpperCaseName() throws Exception { Table origTable = createTable(DB_NAME, TABLE_NAME); String indexName = "UPPERCASE_INDEX_NAME"; String indexTableName = "UPPERCASE_INDEX_TABLE_NAME"; - Table indexTable = buildTable(DB_NAME, indexTableName); + Table indexTable = buildIndexTable(DB_NAME, indexTableName); createIndex(DB_NAME, origTable, indexName, indexTable); verifyIndex(DB_NAME, TABLE_NAME, indexName.toLowerCase(), indexTableName.toLowerCase()); client.dropIndex(DB_NAME, TABLE_NAME, indexName, true); @@ -240,7 +241,7 @@ public void testCreateIndexWithUpperCaseName() throws Exception { public void testCreateIndexesWithSameOrigAndIndexTable() throws Exception { Table origTable = createTable(DB_NAME, TABLE_NAME); - Table indexTable = buildTable(DB_NAME, INDEX_TABLE_NAME); + Table indexTable = buildIndexTable(DB_NAME, INDEX_TABLE_NAME); createIndex(DB_NAME, origTable, INDEX_NAME, indexTable); createIndex(DB_NAME, origTable, INDEX_NAME, indexTable); checkIfIndexExists(DB_NAME, TABLE_NAME, INDEX_NAME); @@ -253,8 +254,8 @@ public void testCreateIndexesWithSameNameAndOrigTableDifferentIndexTable() throw Table origTable = createTable(DB_NAME, TABLE_NAME); String indexTableName1 = origTable.getTableName() + "__" + INDEX_NAME + "_1"; String indexTableName2 = origTable.getTableName() + "__" + INDEX_NAME + "_2"; - createIndex(DB_NAME, origTable, INDEX_NAME, buildTable(DB_NAME, indexTableName1)); - createIndex(DB_NAME, origTable, INDEX_NAME, buildTable(DB_NAME, indexTableName2)); + createIndex(DB_NAME, origTable, INDEX_NAME, buildIndexTable(DB_NAME, indexTableName1)); + createIndex(DB_NAME, origTable, INDEX_NAME, buildIndexTable(DB_NAME, indexTableName2)); checkIfIndexExists(DB_NAME, TABLE_NAME, INDEX_NAME); client.dropIndex(DB_NAME, TABLE_NAME, INDEX_NAME, true); } @@ -272,7 +273,7 @@ public void testCreateIndexWithExistingIndexTable() throws Exception { public void testCreateIndexNullIndexTableName() throws Exception { Table origTable = createTable(DB_NAME, TABLE_NAME); - Table indexTable = buildTable(DB_NAME, null); + Table indexTable = buildIndexTable(DB_NAME, null); createIndex(DB_NAME, origTable, INDEX_NAME, indexTable); checkIfIndexExists(DB_NAME, TABLE_NAME, INDEX_NAME); } @@ -281,7 +282,7 @@ public void testCreateIndexNullIndexTableName() throws Exception { public void testCreateIndexEmptyIndexTableName() throws Exception { Table origTable = createTable(DB_NAME, TABLE_NAME); - Table indexTable = buildTable(DB_NAME, ""); + Table indexTable = buildIndexTable(DB_NAME, ""); createIndex(DB_NAME, origTable, INDEX_NAME, indexTable); checkIfIndexListEmpty(DB_NAME, TABLE_NAME); } @@ -296,7 +297,7 @@ public void testCreateIndexesWithSameIndexTable() throws Exception { String indexTableName = origTableName1 + "__" + indexName1; Table origTable1 = createTable(DB_NAME, origTableName1); Table origTable2 = createTable(DB_NAME, origTableName2); - Table indexTable = buildTable(DB_NAME, indexTableName); + Table indexTable = buildIndexTable(DB_NAME, indexTableName); createIndex(DB_NAME, origTable1, indexName1, indexTable); createIndex(DB_NAME, origTable2, indexName2, indexTable); @@ -310,7 +311,7 @@ public void testCreateIndexesWithSameIndexTable() throws Exception { public void testCreateIndexWithNonExistingDB() throws Exception { Table origTable = createTable(DB_NAME, TABLE_NAME); - Table indexTable = buildTable(DB_NAME, INDEX_TABLE_NAME); + Table indexTable = buildIndexTable(DB_NAME, INDEX_TABLE_NAME); createIndex("nonexistingdb", origTable, INDEX_NAME, indexTable); checkIfIndexListEmpty(DB_NAME, TABLE_NAME); } @@ -319,14 +320,14 @@ public void testCreateIndexWithNonExistingDB() throws Exception { public void testCreateIndexWithNullDBName() throws Exception { Table origTable = createTable(DB_NAME, TABLE_NAME); - Table indexTable = buildTable(DB_NAME, INDEX_TABLE_NAME); + Table indexTable = buildIndexTable(DB_NAME, INDEX_TABLE_NAME); createIndex(null, origTable, INDEX_NAME, indexTable); } @Test(expected = InvalidObjectException.class) public void testCreateIndexNonExistingOrigTable() throws Exception { - Table indexTable = buildTable(DB_NAME, INDEX_TABLE_NAME); + Table indexTable = buildIndexTable(DB_NAME, INDEX_TABLE_NAME); Index index = buildIndexWithDefaultValues(); index.setOrigTableName("nonexistingtable"); client.createIndex(index, indexTable); @@ -335,7 +336,7 @@ public void testCreateIndexNonExistingOrigTable() throws Exception { @Test(expected = MetaException.class) public void testCreateIndexNullOrigTable() throws Exception { - Table indexTable = buildTable(DB_NAME, INDEX_TABLE_NAME); + Table indexTable = buildIndexTable(DB_NAME, INDEX_TABLE_NAME); Index index = buildIndexWithDefaultValues(); index.setOrigTableName(null); client.createIndex(index, indexTable); @@ -344,7 +345,7 @@ public void testCreateIndexNullOrigTable() throws Exception { @Test public void testCreateIndexNullIndex() throws Exception { // TODO: NPE should not be thrown. - Table indexTable = buildTable(DB_NAME, INDEX_TABLE_NAME); + Table indexTable = buildIndexTable(DB_NAME, INDEX_TABLE_NAME); try { client.createIndex(null, indexTable); Assert.fail("TTransportException or NullPointerException should have happened"); @@ -372,7 +373,7 @@ public void testCreateIndexNullIndexTable() throws Exception { @Test(expected = InvalidObjectException.class) public void testCreateIndexWithEmptyOrigTable() throws Exception { - Table indexTable = buildTable(DB_NAME, INDEX_TABLE_NAME); + Table indexTable = buildIndexTable(DB_NAME, INDEX_TABLE_NAME); Index index = buildIndexWithDefaultValues(); index.setOrigTableName(""); client.createIndex(index, indexTable); @@ -384,7 +385,7 @@ public void testCreateIndexWithEmptyDBName() throws Exception { createTable(DB_NAME, TABLE_NAME); Index index = buildIndexWithDefaultValues(); index.setDbName(""); - client.createIndex(index, buildTable(DB_NAME, INDEX_TABLE_NAME)); + client.createIndex(index, buildIndexTable(DB_NAME, INDEX_TABLE_NAME)); } @Test(expected = MetaException.class) @@ -393,14 +394,14 @@ public void testCreateIndexNullIndexName() throws Exception { createTable(DB_NAME, TABLE_NAME); Index index = buildIndexWithDefaultValues(); index.setIndexTableName(null); - client.createIndex(index, buildTable(DB_NAME, INDEX_TABLE_NAME)); + client.createIndex(index, buildIndexTable(DB_NAME, INDEX_TABLE_NAME)); } @Test public void testCreateIndexEmptyIndexName() throws Exception { Table origTable = createTable(DB_NAME, TABLE_NAME); - Table indexTable = buildTable(DB_NAME, INDEX_TABLE_NAME); + Table indexTable = buildIndexTable(DB_NAME, INDEX_TABLE_NAME); createIndex(DB_NAME, origTable, "", indexTable); checkIfIndexExists(DB_NAME, TABLE_NAME, ""); client.dropIndex(DB_NAME, TABLE_NAME, "", true); @@ -412,7 +413,7 @@ public void testCreateIndexWithDifferentIndexTableName() throws Exception { createTable(DB_NAME, TABLE_NAME); Index index = buildIndexWithDefaultValues(); index.setIndexTableName("differentindextablename"); - Table indexTable = buildTable(DB_NAME, INDEX_TABLE_NAME); + Table indexTable = buildIndexTable(DB_NAME, INDEX_TABLE_NAME); client.createIndex(index, indexTable); checkIfIndexListEmpty(DB_NAME, TABLE_NAME); List tableNames = client.listTableNamesByFilter(DB_NAME, "", MAX); @@ -429,7 +430,7 @@ public void testCreateIndexWithDifferentDBInIndexTableAndIndex() throws Exceptio String dbName = "second_index_db"; createDB(dbName); Index index = buildIndexWithDefaultValues(); - Table indexTable = buildTable(dbName, INDEX_TABLE_NAME); + Table indexTable = buildIndexTable(dbName, INDEX_TABLE_NAME); Assert.assertFalse(metaStore.isPathExists(new Path(indexTable.getSd().getLocation()))); client.createIndex(index, indexTable); checkIfIndexListEmpty(DB_NAME, TABLE_NAME); @@ -446,7 +447,7 @@ public void testCreateIndexWithDifferentDBInIndexTableAndIndex() throws Exceptio public void testCreateIndexDifferentColsInIndexAndIndexTable() throws Exception { createTable(DB_NAME, TABLE_NAME); - Table indexTable = buildTable(DB_NAME, INDEX_TABLE_NAME); + Table indexTable = buildIndexTable(DB_NAME, INDEX_TABLE_NAME); Index index = new IndexBuilder() .setDbName(DB_NAME) .setTableName(TABLE_NAME) @@ -482,7 +483,7 @@ public void testCreateIndexWithNullSd() throws Exception { createTable(DB_NAME, TABLE_NAME); Index index = buildIndexWithDefaultValues(); index.setSd(null); - client.createIndex(index, buildTable(DB_NAME, INDEX_TABLE_NAME)); + client.createIndex(index, buildIndexTable(DB_NAME, INDEX_TABLE_NAME)); checkIfIndexListEmpty(DB_NAME, TABLE_NAME); } @@ -588,7 +589,7 @@ public void testAlterIndex() throws Exception { .setOutputFormat(oldOutputFormat) .addStorageDescriptorParam(oldIndexSdParamKey, oldIndexSdParamValue) .build(); - client.createIndex(index, buildTable(DB_NAME, indexTableName)); + client.createIndex(index, buildIndexTable(DB_NAME, indexTableName)); Index oldIndex = client.getIndex(DB_NAME, TABLE_NAME, INDEX_NAME); int newCreateTime = (int) (System.currentTimeMillis() / 1000); @@ -766,13 +767,17 @@ public void testAlterIndexNullCols() throws Exception { // Helper methods private Table createTable(String dbName, String tableName) throws Exception { - Table table = buildTable(dbName, tableName); + Table table = buildTable(dbName, tableName, null); client.createTable(table); return table; } - private Table buildTable(String dbName, String tableName) throws Exception { - Table table = new TableBuilder() + private Table buildIndexTable(String dbName, String tableName) throws Exception { + return buildTable(dbName, tableName, TableType.INDEX_TABLE); + } + + private Table buildTable(String dbName, String tableName, TableType tableType) throws Exception { + TableBuilder tableBuilder = new TableBuilder() .setDbName(dbName) .setTableName(tableName) .addCol("id", "int", "test col id") @@ -781,15 +786,20 @@ private Table buildTable(String dbName, String tableName) throws Exception { .setSerdeName(tableName) .setStoredAsSubDirectories(false) .addSerdeParam("testSerdeParamKey", "testSerdeParamValue") - .setLocation(metaStore.getWarehouseRoot() + "/" + tableName) - .build(); - return table; + .setLocation(metaStore.getWarehouseRoot() + "/" + tableName); + + if (tableType != null) { + tableBuilder.setType(tableType.name()); + } + + return tableBuilder.build(); } private void createIndex(String indexName, String origTableName) throws Exception { Table origTable = createTable(DB_NAME, origTableName); String indexTableName = origTableName + "__" + indexName + "__"; - createIndex(DB_NAME, origTable, indexName, buildTable(DB_NAME, indexTableName)); + createIndex(DB_NAME, origTable, indexName, buildTable(DB_NAME, indexTableName, + TableType.INDEX_TABLE)); } private void createIndex(String dbName, Table origTable, String indexName, Table indexTable) diff --git standalone-metastore/src/test/java/org/apache/hadoop/hive/metastore/client/TestDatabases.java standalone-metastore/src/test/java/org/apache/hadoop/hive/metastore/client/TestDatabases.java index db80072b1ddf1968bc55a6043abefbf0f9457948..8af4f8b0b0426e7e5f59170ce7e9edbc30ab6ea1 100644 --- standalone-metastore/src/test/java/org/apache/hadoop/hive/metastore/client/TestDatabases.java +++ standalone-metastore/src/test/java/org/apache/hadoop/hive/metastore/client/TestDatabases.java @@ -20,6 +20,7 @@ import org.apache.hadoop.fs.Path; import org.apache.hadoop.hive.metastore.IMetaStoreClient; +import org.apache.hadoop.hive.metastore.TableType; import org.apache.hadoop.hive.metastore.api.AlreadyExistsException; import org.apache.hadoop.hive.metastore.api.Database; import org.apache.hadoop.hive.metastore.api.Function; @@ -433,6 +434,7 @@ private void createIndex(String databaseName) throws TException { Table testIndexTable = new TableBuilder() .setDbName(databaseName) + .setType(TableType.INDEX_TABLE.name()) .setTableName("test_index_table") .addCol("test_col", "int") .build(); diff --git standalone-metastore/src/test/java/org/apache/hadoop/hive/metastore/client/TestGetListIndexes.java standalone-metastore/src/test/java/org/apache/hadoop/hive/metastore/client/TestGetListIndexes.java index ab3c00d27169b5413d1e5cfb2a32ac87b485c2c4..8ca40c85dd71826099c444ab768b415923f2b896 100644 --- standalone-metastore/src/test/java/org/apache/hadoop/hive/metastore/client/TestGetListIndexes.java +++ standalone-metastore/src/test/java/org/apache/hadoop/hive/metastore/client/TestGetListIndexes.java @@ -22,6 +22,7 @@ import java.util.stream.Collectors; import org.apache.hadoop.hive.metastore.IMetaStoreClient; +import org.apache.hadoop.hive.metastore.TableType; import org.apache.hadoop.hive.metastore.api.Database; import org.apache.hadoop.hive.metastore.api.Index; import org.apache.hadoop.hive.metastore.api.MetaException; @@ -388,13 +389,17 @@ public void testListIndexNamesWithDifferentNums() throws Exception { // Helper methods private Table createTable(String dbName, String tableName) throws Exception { - Table table = buildTable(dbName, tableName); + Table table = buildTable(dbName, tableName, null); client.createTable(table); return table; } - private Table buildTable(String dbName, String tableName) throws Exception { - Table table = new TableBuilder() + private Table buildIndexTable(String dbName, String tableName) throws Exception { + return buildTable(dbName, tableName, TableType.INDEX_TABLE); + } + + private Table buildTable(String dbName, String tableName, TableType tableType) throws Exception { + TableBuilder tableBuilder = new TableBuilder() .setDbName(dbName) .setTableName(tableName) .addCol("id", "int", "test col id") @@ -403,9 +408,13 @@ private Table buildTable(String dbName, String tableName) throws Exception { .setSerdeName(tableName) .setStoredAsSubDirectories(false) .addSerdeParam("testSerdeParamKey", "testSerdeParamValue") - .setLocation(metaStore.getWarehouseRoot() + "/" + tableName) - .build(); - return table; + .setLocation(metaStore.getWarehouseRoot() + "/" + tableName); + + if (tableType != null){ + tableBuilder.setType(tableType.name()); + } + + return tableBuilder.build(); } private Index createIndex(Table origTable, String indexName) throws Exception { @@ -414,7 +423,7 @@ private Index createIndex(Table origTable, String indexName) throws Exception { String origTableName = origTable.getTableName(); String indexTableName = origTableName + "__" + indexName + "__"; Index index = buildIndex(dbName, origTableName, indexName, indexTableName); - client.createIndex(index, buildTable(dbName, indexTableName)); + client.createIndex(index, buildTable(dbName, indexTableName, TableType.INDEX_TABLE)); return client.getIndex(dbName, origTableName, indexName); } diff --git standalone-metastore/src/test/java/org/apache/hadoop/hive/metastore/client/TestListPartitions.java standalone-metastore/src/test/java/org/apache/hadoop/hive/metastore/client/TestListPartitions.java index fdabbe4bdaaa90f6e3a2d2f8b0726f32bbc50ac3..e3b1198cda54d7a22df6b95798b95f73cf9c3a4c 100644 --- standalone-metastore/src/test/java/org/apache/hadoop/hive/metastore/client/TestListPartitions.java +++ standalone-metastore/src/test/java/org/apache/hadoop/hive/metastore/client/TestListPartitions.java @@ -57,7 +57,6 @@ import static junit.framework.TestCase.assertNull; import static junit.framework.TestCase.assertTrue; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; import static org.junit.Assert.fail; /**