Repository: hbase Updated Branches: refs/heads/branch-2 26e02e1c0 -> 891c620c5
http://git-wip-us.apache.org/repos/asf/hbase/blob/891c620c/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift2/TestThriftConnection.java ---------------------------------------------------------------------- diff --git a/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift2/TestThriftConnection.java b/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift2/TestThriftConnection.java new file mode 100644 index 0000000..1583619 --- /dev/null +++ b/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift2/TestThriftConnection.java @@ -0,0 +1,841 @@ +/** + * 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.hadoop.hbase.thrift2; + +import static org.apache.hadoop.hbase.thrift.Constants.THRIFT_INFO_SERVER_PORT; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.hbase.Cell; +import org.apache.hadoop.hbase.CellUtil; +import org.apache.hadoop.hbase.CompareOperator; +import org.apache.hadoop.hbase.HBaseClassTestRule; +import org.apache.hadoop.hbase.HBaseConfiguration; +import org.apache.hadoop.hbase.HBaseTestingUtility; +import org.apache.hadoop.hbase.HConstants; +import org.apache.hadoop.hbase.NamespaceDescriptor; +import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.client.Admin; +import org.apache.hadoop.hbase.client.ClusterConnection; +import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor; +import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder; +import org.apache.hadoop.hbase.client.Connection; +import org.apache.hadoop.hbase.client.ConnectionFactory; +import org.apache.hadoop.hbase.client.Delete; +import org.apache.hadoop.hbase.client.Durability; +import org.apache.hadoop.hbase.client.Get; +import org.apache.hadoop.hbase.client.Put; +import org.apache.hadoop.hbase.client.Result; +import org.apache.hadoop.hbase.client.ResultScanner; +import org.apache.hadoop.hbase.client.Scan; +import org.apache.hadoop.hbase.client.Table; +import org.apache.hadoop.hbase.client.TableDescriptor; +import org.apache.hadoop.hbase.client.TableDescriptorBuilder; +import org.apache.hadoop.hbase.filter.ColumnValueFilter; +import org.apache.hadoop.hbase.filter.FilterList; +import org.apache.hadoop.hbase.filter.PrefixFilter; +import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding; +import org.apache.hadoop.hbase.testclassification.MediumTests; +import org.apache.hadoop.hbase.testclassification.RestTests; +import org.apache.hadoop.hbase.thrift.Constants; +import org.apache.hadoop.hbase.thrift2.client.ThriftConnection; +import org.apache.hadoop.hbase.util.Bytes; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.ClassRule; +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Category({ RestTests.class, MediumTests.class}) + +public class TestThriftConnection { + private static final Logger LOG = + LoggerFactory.getLogger(TestThriftConnection.class); + + @ClassRule + public static final HBaseClassTestRule CLASS_RULE = + HBaseClassTestRule.forClass(TestThriftConnection.class); + + private static final byte[] FAMILYA = Bytes.toBytes("fa"); + private static final byte[] FAMILYB = Bytes.toBytes("fb"); + private static final byte[] FAMILYC = Bytes.toBytes("fc"); + private static final byte[] FAMILYD = Bytes.toBytes("fd"); + + private static final byte[] ROW_1 = Bytes.toBytes("testrow1"); + private static final byte[] ROW_2 = Bytes.toBytes("testrow2"); + private static final byte[] ROW_3 = Bytes.toBytes("testrow3"); + private static final byte[] ROW_4 = Bytes.toBytes("testrow4"); + + private static final byte[] QUALIFIER_1 = Bytes.toBytes("1"); + private static final byte[] QUALIFIER_2 = Bytes.toBytes("2"); + private static final byte[] VALUE_1 = Bytes.toBytes("testvalue1"); + private static final byte[] VALUE_2 = Bytes.toBytes("testvalue2"); + + private static final long ONE_HOUR = 60 * 60 * 1000; + private static final long TS_2 = System.currentTimeMillis(); + private static final long TS_1 = TS_2 - ONE_HOUR; + + + protected static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility(); + + protected static ThriftServer thriftServer; + + protected static ThriftServer thriftHttpServer; + + protected static int thriftPort; + protected static int httpPort; + + protected static Connection thriftConnection; + protected static Connection thriftHttpConnection; + + private static Admin thriftAdmin; + + private static ThriftServer startThriftServer(int port, boolean useHttp) { + Configuration thriftServerConf = HBaseConfiguration.create(TEST_UTIL.getConfiguration()); + thriftServerConf.setInt(Constants.PORT_CONF_KEY, port); + if (useHttp) { + thriftServerConf.setBoolean(Constants.USE_HTTP_CONF_KEY, true); + } + ThriftServer server = new ThriftServer(thriftServerConf); + Thread thriftServerThread = new Thread(() -> { + try{ + server.run(); + } catch (Exception t) { + LOG.error("Thrift Server failed", t); + } + }); + thriftServerThread.setDaemon(true); + thriftServerThread.start(); + if (useHttp) { + TEST_UTIL.waitFor(10000, () -> server.getHttpServer() != null); + } else { + TEST_UTIL.waitFor(10000, () -> server.getTserver() != null); + } + return server; + } + + private static Connection createConnection(int port, boolean useHttp) throws IOException { + Configuration conf = HBaseConfiguration.create(TEST_UTIL.getConfiguration()); + conf.set(ClusterConnection.HBASE_CLIENT_CONNECTION_IMPL, + ThriftConnection.class.getName()); + if (useHttp) { + conf.set(Constants.HBASE_THRIFT_CLIENT_BUIDLER_CLASS, + ThriftConnection.HTTPThriftClientBuilder.class.getName()); + } + String host = HConstants.LOCALHOST; + if (useHttp) { + host = "http://" + host; + } + conf.set(Constants.HBASE_THRIFT_SERVER_NAME, host); + conf.setInt(Constants.HBASE_THRIFT_SERVER_PORT, port); + return ConnectionFactory.createConnection(conf); + } + + + @BeforeClass + public static void setUp() throws Exception { + // Do not start info server + TEST_UTIL.getConfiguration().setInt(THRIFT_INFO_SERVER_PORT , -1); + TEST_UTIL.startMiniCluster(); + thriftPort = HBaseTestingUtility.randomFreePort(); + httpPort = HBaseTestingUtility.randomFreePort(); + // Start a thrift server + thriftServer = startThriftServer(thriftPort, false); + // Start a HTTP thrift server + thriftHttpServer = startThriftServer(httpPort, true); + thriftConnection = createConnection(thriftPort, false); + thriftHttpConnection = createConnection(httpPort, true); + thriftAdmin = thriftConnection.getAdmin(); + LOG.info("TS_1=" + TS_1); + LOG.info("TS_2=" + TS_1); + + } + + @AfterClass + public static void shutdown() throws Exception { + if (thriftAdmin != null) { + thriftAdmin.close(); + } + if (thriftHttpConnection != null) { + thriftHttpConnection.close(); + } + if (thriftConnection != null) { + thriftConnection.close(); + } + if (thriftHttpServer != null) { + thriftHttpServer.stop(); + } + TEST_UTIL.shutdownMiniCluster(); + } + + @Test + public void testThrfitAdmin() throws Exception { + testThriftAdmin(thriftConnection, "testThrfitAdminNamesapce", "testThrfitAdminTable"); + testThriftAdmin(thriftHttpConnection, "testThrfitHttpAdminNamesapce", + "testThrfitHttpAdminTable"); + } + + @Test + public void testGet() throws Exception { + testGet(thriftConnection, "testGetTable"); + testGet(thriftHttpConnection, "testGetHttpTable"); + + } + + public void testGet(Connection connection, String tableName) throws IOException { + createTable(thriftAdmin, tableName); + try (Table table = connection.getTable(TableName.valueOf(tableName))){ + Get get = new Get(ROW_1); + Result result = table.get(get); + byte[] value1 = result.getValue(FAMILYA, QUALIFIER_1); + byte[] value2 = result.getValue(FAMILYB, QUALIFIER_2); + assertNotNull(value1); + assertTrue(Bytes.equals(VALUE_1, value1)); + assertNull(value2); + + get = new Get(ROW_1); + get.addFamily(FAMILYC); + result = table.get(get); + value1 = result.getValue(FAMILYA, QUALIFIER_1); + value2 = result.getValue(FAMILYB, QUALIFIER_2); + assertNull(value1); + assertNull(value2); + + get = new Get(ROW_1); + get.addColumn(FAMILYA, QUALIFIER_1); + get.addColumn(FAMILYB, QUALIFIER_2); + result = table.get(get); + value1 = result.getValue(FAMILYA, QUALIFIER_1); + value2 = result.getValue(FAMILYB, QUALIFIER_2); + assertNotNull(value1); + assertTrue(Bytes.equals(VALUE_1, value1)); + assertNull(value2); + + get = new Get(ROW_2); + result = table.get(get); + value1 = result.getValue(FAMILYA, QUALIFIER_1); + value2 = result.getValue(FAMILYB, QUALIFIER_2); + assertNotNull(value1); + assertTrue(Bytes.equals(VALUE_2, value1)); // @TS_2 + assertNotNull(value2); + assertTrue(Bytes.equals(VALUE_2, value2)); + + get = new Get(ROW_2); + get.addFamily(FAMILYA); + result = table.get(get); + value1 = result.getValue(FAMILYA, QUALIFIER_1); + value2 = result.getValue(FAMILYB, QUALIFIER_2); + assertNotNull(value1); + assertTrue(Bytes.equals(VALUE_2, value1)); // @TS_2 + assertNull(value2); + + get = new Get(ROW_2); + get.addColumn(FAMILYA, QUALIFIER_1); + get.addColumn(FAMILYB, QUALIFIER_2); + result = table.get(get); + value1 = result.getValue(FAMILYA, QUALIFIER_1); + value2 = result.getValue(FAMILYB, QUALIFIER_2); + assertNotNull(value1); + assertTrue(Bytes.equals(VALUE_2, value1)); // @TS_2 + assertNotNull(value2); + assertTrue(Bytes.equals(VALUE_2, value2)); + + // test timestamp + + get = new Get(ROW_2); + get.addFamily(FAMILYA); + get.addFamily(FAMILYB); + get.setTimestamp(TS_1); + result = table.get(get); + value1 = result.getValue(FAMILYA, QUALIFIER_1); + value2 = result.getValue(FAMILYB, QUALIFIER_2); + assertNotNull(value1); + assertTrue(Bytes.equals(VALUE_1, value1)); // @TS_1 + assertNull(value2); + + // test timerange + + get = new Get(ROW_2); + get.addFamily(FAMILYA); + get.addFamily(FAMILYB); + get.setTimeRange(0, TS_1 + 1); + result = table.get(get); + value1 = result.getValue(FAMILYA, QUALIFIER_1); + value2 = result.getValue(FAMILYB, QUALIFIER_2); + assertNotNull(value1); + assertTrue(Bytes.equals(VALUE_1, value1)); // @TS_1 + assertNull(value2); + + // test maxVersions + + get = new Get(ROW_2); + get.addFamily(FAMILYA); + get.setMaxVersions(2); + result = table.get(get); + int count = 0; + for (Cell kv: result.listCells()) { + if (CellUtil.matchingFamily(kv, FAMILYA) && TS_1 == kv.getTimestamp()) { + assertTrue(CellUtil.matchingValue(kv, VALUE_1)); // @TS_1 + count++; + } + if (CellUtil.matchingFamily(kv, FAMILYA) && TS_2 == kv.getTimestamp()) { + assertTrue(CellUtil.matchingValue(kv, VALUE_2)); // @TS_2 + count++; + } + } + assertEquals(2, count); + } + + } + + @Test + public void testMultiGet() throws Exception { + testMultiGet(thriftConnection, "testMultiGetTable"); + testMultiGet(thriftHttpConnection, "testMultiGetHttpTable"); + } + + public void testMultiGet(Connection connection, String tableName) throws Exception { + createTable(thriftAdmin, tableName); + try (Table table = connection.getTable(TableName.valueOf(tableName))){ + ArrayList<Get> gets = new ArrayList<>(2); + gets.add(new Get(ROW_1)); + gets.add(new Get(ROW_2)); + Result[] results = table.get(gets); + assertNotNull(results); + assertEquals(2, results.length); + assertEquals(1, results[0].size()); + assertEquals(2, results[1].size()); + + //Test Versions + gets = new ArrayList<>(2); + Get g = new Get(ROW_1); + g.setMaxVersions(3); + gets.add(g); + Get get2 = new Get(ROW_2); + get2.setMaxVersions(3); + gets.add(get2); + results = table.get(gets); + assertNotNull(results); + assertEquals(2, results.length); + assertEquals(1, results[0].size()); + assertEquals(3, results[1].size()); + + gets = new ArrayList<>(1); + gets.add(new Get(Bytes.toBytes("RESALLYREALLYNOTTHERE"))); + results = table.get(gets); + assertNotNull(results); + assertTrue(results[0].isEmpty()); + + gets = new ArrayList<>(3); + gets.add(new Get(Bytes.toBytes("RESALLYREALLYNOTTHERE"))); + gets.add(new Get(ROW_1)); + gets.add(new Get(ROW_2)); + results = table.get(gets); + assertNotNull(results); + assertEquals(3, results.length); + assertTrue(results[0].isEmpty()); + } + + } + + @Test + public void testPut() throws Exception { + testPut(thriftConnection, "testPutTable"); + testPut(thriftHttpConnection, "testPutHttpTable"); + } + + public void testPut(Connection connection, String tableName) throws IOException { + createTable(thriftAdmin, tableName); + try (Table table = connection.getTable(TableName.valueOf(tableName))){ + Put put = new Put(ROW_3); + put.addColumn(FAMILYA, QUALIFIER_1, VALUE_1); + table.put(put); + + Get get = new Get(ROW_3); + get.addFamily(FAMILYA); + Result result = table.get(get); + byte[] value = result.getValue(FAMILYA, QUALIFIER_1); + assertNotNull(value); + assertTrue(Bytes.equals(VALUE_1, value)); + + // multiput + + List<Put> puts = new ArrayList<>(3); + put = new Put(ROW_3); + put.addColumn(FAMILYB, QUALIFIER_2, VALUE_2); + puts.add(put); + put = new Put(ROW_4); + put.addColumn(FAMILYA, QUALIFIER_1, VALUE_1); + puts.add(put); + put = new Put(ROW_4); + put.addColumn(FAMILYB, QUALIFIER_2, VALUE_2); + puts.add(put); + table.put(puts); + + get = new Get(ROW_3); + get.addFamily(FAMILYB); + result = table.get(get); + value = result.getValue(FAMILYB, QUALIFIER_2); + assertNotNull(value); + assertTrue(Bytes.equals(VALUE_2, value)); + get = new Get(ROW_4); + result = table.get(get); + value = result.getValue(FAMILYA, QUALIFIER_1); + assertNotNull(value); + assertTrue(Bytes.equals(VALUE_1, value)); + value = result.getValue(FAMILYB, QUALIFIER_2); + assertNotNull(value); + assertTrue(Bytes.equals(VALUE_2, value)); + } + } + + @Test + public void testDelete() throws Exception { + testDelete(thriftConnection, "testDeleteTable"); + testDelete(thriftHttpConnection, "testDeleteHttpTable"); + } + + public void testDelete(Connection connection, String tableName) throws IOException { + createTable(thriftAdmin, tableName); + try (Table table = connection.getTable(TableName.valueOf(tableName))){ + Put put = new Put(ROW_3); + put.addColumn(FAMILYA, QUALIFIER_1, VALUE_1); + put.addColumn(FAMILYB, QUALIFIER_2, VALUE_2); + put.addColumn(FAMILYC, QUALIFIER_1, VALUE_1); + put.addColumn(FAMILYC, QUALIFIER_2, VALUE_2); + table.put(put); + + Get get = new Get(ROW_3); + get.addFamily(FAMILYA); + get.addFamily(FAMILYB); + get.addFamily(FAMILYC); + Result result = table.get(get); + byte[] value1 = result.getValue(FAMILYA, QUALIFIER_1); + byte[] value2 = result.getValue(FAMILYB, QUALIFIER_2); + byte[] value3 = result.getValue(FAMILYC, QUALIFIER_1); + byte[] value4 = result.getValue(FAMILYC, QUALIFIER_2); + assertNotNull(value1); + assertTrue(Bytes.equals(VALUE_1, value1)); + assertNotNull(value2); + assertTrue(Bytes.equals(VALUE_2, value2)); + assertNotNull(value3); + assertTrue(Bytes.equals(VALUE_1, value3)); + assertNotNull(value4); + assertTrue(Bytes.equals(VALUE_2, value4)); + + Delete delete = new Delete(ROW_3); + delete.addColumn(FAMILYB, QUALIFIER_2); + table.delete(delete); + + get = new Get(ROW_3); + get.addFamily(FAMILYA); + get.addFamily(FAMILYB); + result = table.get(get); + value1 = result.getValue(FAMILYA, QUALIFIER_1); + value2 = result.getValue(FAMILYB, QUALIFIER_2); + assertNotNull(value1); + assertTrue(Bytes.equals(VALUE_1, value1)); + assertNull(value2); + + delete = new Delete(ROW_3); + delete.setTimestamp(1L); + table.delete(delete); + + get = new Get(ROW_3); + get.addFamily(FAMILYA); + get.addFamily(FAMILYB); + result = table.get(get); + value1 = result.getValue(FAMILYA, QUALIFIER_1); + value2 = result.getValue(FAMILYB, QUALIFIER_2); + assertNotNull(value1); + assertTrue(Bytes.equals(VALUE_1, value1)); + assertNull(value2); + + // Delete column family from row + delete = new Delete(ROW_3); + delete.addFamily(FAMILYC); + table.delete(delete); + + get = new Get(ROW_3); + get.addFamily(FAMILYC); + result = table.get(get); + value3 = result.getValue(FAMILYC, QUALIFIER_1); + value4 = result.getValue(FAMILYC, QUALIFIER_2); + assertNull(value3); + assertNull(value4); + + delete = new Delete(ROW_3); + table.delete(delete); + + get = new Get(ROW_3); + get.addFamily(FAMILYA); + get.addFamily(FAMILYB); + result = table.get(get); + value1 = result.getValue(FAMILYA, QUALIFIER_1); + value2 = result.getValue(FAMILYB, QUALIFIER_2); + assertNull(value1); + assertNull(value2); + } + + } + + @Test + public void testScanner() throws Exception { + testScanner(thriftConnection, "testScannerTable"); + testScanner(thriftHttpConnection, "testScannerHttpTable"); + } + + public void testScanner(Connection connection, String tableName) throws IOException { + createTable(thriftAdmin, tableName); + try (Table table = connection.getTable(TableName.valueOf(tableName))){ + List<Put> puts = new ArrayList<>(4); + Put put = new Put(ROW_1); + put.addColumn(FAMILYA, QUALIFIER_1, VALUE_1); + puts.add(put); + put = new Put(ROW_2); + put.addColumn(FAMILYA, QUALIFIER_1, VALUE_1); + puts.add(put); + put = new Put(ROW_3); + put.addColumn(FAMILYA, QUALIFIER_1, VALUE_1); + puts.add(put); + put = new Put(ROW_4); + put.addColumn(FAMILYA, QUALIFIER_1, VALUE_1); + puts.add(put); + table.put(puts); + + ResultScanner scanner = table.getScanner(new Scan()); + + Result[] results = scanner.next(1); + assertNotNull(results); + assertEquals(1, results.length); + assertTrue(Bytes.equals(ROW_1, results[0].getRow())); + + Result result = scanner.next(); + assertNotNull(result); + assertTrue(Bytes.equals(ROW_2, result.getRow())); + + results = scanner.next(2); + assertNotNull(results); + assertEquals(2, results.length); + assertTrue(Bytes.equals(ROW_3, results[0].getRow())); + assertTrue(Bytes.equals(ROW_4, results[1].getRow())); + + results = scanner.next(1); + assertTrue(results == null || results.length == 0); + scanner.close(); + + scanner = table.getScanner(FAMILYA); + results = scanner.next(4); + assertNotNull(results); + assertEquals(4, results.length); + assertTrue(Bytes.equals(ROW_1, results[0].getRow())); + assertTrue(Bytes.equals(ROW_2, results[1].getRow())); + assertTrue(Bytes.equals(ROW_3, results[2].getRow())); + assertTrue(Bytes.equals(ROW_4, results[3].getRow())); + + scanner.close(); + + scanner = table.getScanner(FAMILYA,QUALIFIER_1); + results = scanner.next(4); + assertNotNull(results); + assertEquals(4, results.length); + assertTrue(Bytes.equals(ROW_1, results[0].getRow())); + assertTrue(Bytes.equals(ROW_2, results[1].getRow())); + assertTrue(Bytes.equals(ROW_3, results[2].getRow())); + assertTrue(Bytes.equals(ROW_4, results[3].getRow())); + scanner.close(); + } + + } + + @Test + public void testCheckAndDelete() throws Exception { + testCheckAndDelete(thriftConnection, "testCheckAndDeleteTable"); + testCheckAndDelete(thriftHttpConnection, "testCheckAndDeleteHttpTable"); + } + + + public void testCheckAndDelete(Connection connection, String tableName) throws IOException { + createTable(thriftAdmin, tableName); + try (Table table = connection.getTable(TableName.valueOf(tableName))){ + Get get = new Get(ROW_1); + Result result = table.get(get); + byte[] value1 = result.getValue(FAMILYA, QUALIFIER_1); + byte[] value2 = result.getValue(FAMILYB, QUALIFIER_2); + assertNotNull(value1); + assertTrue(Bytes.equals(VALUE_1, value1)); + assertNull(value2); + assertTrue(table.exists(get)); + assertEquals(1, table.existsAll(Collections.singletonList(get)).length); + Delete delete = new Delete(ROW_1); + + table.checkAndMutate(ROW_1, FAMILYA).qualifier(QUALIFIER_1) + .ifEquals(VALUE_1).thenDelete(delete); + assertFalse(table.exists(get)); + + Put put = new Put(ROW_1); + put.addColumn(FAMILYA, QUALIFIER_1, VALUE_1); + table.put(put); + + assertTrue(table.checkAndMutate(ROW_1, FAMILYA).qualifier(QUALIFIER_1) + .ifEquals(VALUE_1).thenPut(put)); + assertFalse(table.checkAndMutate(ROW_1, FAMILYA).qualifier(QUALIFIER_1) + .ifEquals(VALUE_2).thenPut(put)); + } + + } + + @Test + public void testIteratorScaner() throws Exception { + testIteratorScanner(thriftConnection, "testIteratorScanerTable"); + testIteratorScanner(thriftHttpConnection, "testIteratorScanerHttpTable"); + } + + public void testIteratorScanner(Connection connection, String tableName) throws IOException { + createTable(thriftAdmin, tableName); + try (Table table = connection.getTable(TableName.valueOf(tableName))){ + List<Put> puts = new ArrayList<>(4); + Put put = new Put(ROW_1); + put.addColumn(FAMILYA, QUALIFIER_1, VALUE_1); + puts.add(put); + put = new Put(ROW_2); + put.addColumn(FAMILYA, QUALIFIER_1, VALUE_1); + puts.add(put); + put = new Put(ROW_3); + put.addColumn(FAMILYA, QUALIFIER_1, VALUE_1); + puts.add(put); + put = new Put(ROW_4); + put.addColumn(FAMILYA, QUALIFIER_1, VALUE_1); + puts.add(put); + table.put(puts); + Scan scan = new Scan(); + scan.setCaching(1); + ResultScanner scanner = table.getScanner(scan); + Iterator<Result> iterator = scanner.iterator(); + assertTrue(iterator.hasNext()); + int counter = 0; + while (iterator.hasNext()) { + iterator.next(); + counter++; + } + assertEquals(4, counter); + } + + } + + @Test + public void testReverseScan() throws Exception { + testReverseScan(thriftConnection, "testReverseScanTable"); + testReverseScan(thriftHttpConnection, "testReverseScanHttpTable"); + } + + public void testReverseScan(Connection connection, String tableName) throws IOException { + createTable(thriftAdmin, tableName); + try (Table table = connection.getTable(TableName.valueOf(tableName))){ + List<Put> puts = new ArrayList<>(4); + Put put = new Put(ROW_1); + put.addColumn(FAMILYA, QUALIFIER_1, VALUE_1); + puts.add(put); + put = new Put(ROW_2); + put.addColumn(FAMILYA, QUALIFIER_1, VALUE_1); + puts.add(put); + put = new Put(ROW_3); + put.addColumn(FAMILYA, QUALIFIER_1, VALUE_1); + puts.add(put); + put = new Put(ROW_4); + put.addColumn(FAMILYA, QUALIFIER_1, VALUE_1); + puts.add(put); + table.put(puts); + Scan scan = new Scan(); + scan.setReversed(true); + scan.setCaching(1); + ResultScanner scanner = table.getScanner(scan); + Iterator<Result> iterator = scanner.iterator(); + assertTrue(iterator.hasNext()); + int counter = 0; + Result lastResult = null; + while (iterator.hasNext()) { + Result current = iterator.next(); + if (lastResult != null) { + assertTrue(Bytes.compareTo(lastResult.getRow(), current.getRow()) > 0); + } + lastResult = current; + counter++; + } + assertEquals(4, counter); + } + + } + + + @Test + public void testScanWithFilters() throws Exception { + testIteratorScanner(thriftConnection, "testScanWithFiltersTable"); + testIteratorScanner(thriftHttpConnection, "testScanWithFiltersHttpTable"); + } + + private void testScanWithFilters(Connection connection, String tableName) throws IOException { + createTable(thriftAdmin, tableName); + try (Table table = connection.getTable(TableName.valueOf(tableName))){ + FilterList filterList = new FilterList(); + PrefixFilter prefixFilter = new PrefixFilter(Bytes.toBytes("testrow")); + ColumnValueFilter columnValueFilter = new ColumnValueFilter(FAMILYA, QUALIFIER_1, + CompareOperator.EQUAL, VALUE_1); + filterList.addFilter(prefixFilter); + filterList.addFilter(columnValueFilter); + Scan scan = new Scan(); + scan.setMaxVersions(2); + ResultScanner scanner = table.getScanner(scan); + Iterator<Result> iterator = scanner.iterator(); + assertTrue(iterator.hasNext()); + int counter = 0; + while (iterator.hasNext()) { + Result result = iterator.next(); + counter += result.size(); + } + assertEquals(2, counter); + } + } + + + private TableDescriptor createTable(Admin admin, String tableName) throws IOException { + TableDescriptorBuilder builder = TableDescriptorBuilder + .newBuilder(TableName.valueOf(tableName)); + ColumnFamilyDescriptorBuilder familyABuilder = ColumnFamilyDescriptorBuilder + .newBuilder(FAMILYA); + familyABuilder.setMaxVersions(3); + ColumnFamilyDescriptorBuilder familyBBuilder = ColumnFamilyDescriptorBuilder + .newBuilder(FAMILYB); + familyBBuilder.setMaxVersions(3); + ColumnFamilyDescriptorBuilder familyCBuilder = ColumnFamilyDescriptorBuilder + .newBuilder(FAMILYC); + familyCBuilder.setMaxVersions(3); + builder.setColumnFamily(familyABuilder.build()); + builder.setColumnFamily(familyBBuilder.build()); + builder.setColumnFamily(familyCBuilder.build()); + TableDescriptor tableDescriptor = builder.build(); + admin.createTable(tableDescriptor); + try (Table table = TEST_UTIL.getConnection().getTable(TableName.valueOf(tableName))) { + Put put = new Put(ROW_1); + put.addColumn(FAMILYA, QUALIFIER_1, TS_2, VALUE_1); + table.put(put); + put = new Put(ROW_2); + put.addColumn(FAMILYA, QUALIFIER_1, TS_1, VALUE_1); + put.addColumn(FAMILYA, QUALIFIER_1, TS_2, VALUE_2); + put.addColumn(FAMILYB, QUALIFIER_2, TS_2, VALUE_2); + table.put(put); + + } + return tableDescriptor; + + } + + private void testThriftAdmin(Connection connection, String namespace, String table) + throws Exception { + try (Admin admin = connection.getAdmin()){ + //create name space + NamespaceDescriptor namespaceDescriptor = NamespaceDescriptor.create(namespace).build(); + namespaceDescriptor.setConfiguration("key1", "value1"); + namespaceDescriptor.setConfiguration("key2", "value2"); + admin.createNamespace(namespaceDescriptor); + //list namespace + NamespaceDescriptor[] namespaceDescriptors = admin.listNamespaceDescriptors(); + boolean found = false; + for (NamespaceDescriptor nd : namespaceDescriptors) { + if (nd.getName().equals(namespace)) { + found = true; + break; + } + } + assertTrue(found); + //modify namesapce + namespaceDescriptor.setConfiguration("kye3", "value3"); + admin.modifyNamespace(namespaceDescriptor); + //get namespace + NamespaceDescriptor namespaceDescriptorReturned = admin.getNamespaceDescriptor(namespace); + assertTrue(namespaceDescriptorReturned.getConfiguration().size() == 3); + //create table + TableDescriptor tableDescriptor = createTable(admin, table); + //modify table + TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tableDescriptor); + builder.setDurability(Durability.ASYNC_WAL); + admin.modifyTable(builder.build()); + //modify column family + ColumnFamilyDescriptor familyA = tableDescriptor.getColumnFamily(FAMILYA); + ColumnFamilyDescriptorBuilder familyABuilder = ColumnFamilyDescriptorBuilder + .newBuilder(familyA); + familyABuilder.setInMemory(true); + admin.modifyColumnFamily(tableDescriptor.getTableName(), familyABuilder.build()); + //add column family + ColumnFamilyDescriptorBuilder familyDBuilder = ColumnFamilyDescriptorBuilder + .newBuilder(FAMILYD); + familyDBuilder.setDataBlockEncoding(DataBlockEncoding.PREFIX); + admin.addColumnFamily(tableDescriptor.getTableName(), familyDBuilder.build()); + //get table descriptor + TableDescriptor tableDescriptorReturned = admin.getDescriptor(tableDescriptor.getTableName()); + assertTrue(tableDescriptorReturned.getColumnFamilies().length == 4); + assertTrue(tableDescriptorReturned.getDurability() == Durability.ASYNC_WAL); + ColumnFamilyDescriptor columnFamilyADescriptor1Returned = tableDescriptorReturned + .getColumnFamily(FAMILYA); + assertTrue(columnFamilyADescriptor1Returned.isInMemory() == true); + //delete column family + admin.deleteColumnFamily(tableDescriptor.getTableName(), FAMILYA); + tableDescriptorReturned = admin.getDescriptor(tableDescriptor.getTableName()); + assertTrue(tableDescriptorReturned.getColumnFamilies().length == 3); + //disable table + admin.disableTable(tableDescriptor.getTableName()); + assertTrue(admin.isTableDisabled(tableDescriptor.getTableName())); + //enable table + admin.enableTable(tableDescriptor.getTableName()); + assertTrue(admin.isTableEnabled(tableDescriptor.getTableName())); + assertTrue(admin.isTableAvailable(tableDescriptor.getTableName())); + //truncate table + admin.disableTable(tableDescriptor.getTableName()); + admin.truncateTable(tableDescriptor.getTableName(), true); + assertTrue(admin.isTableAvailable(tableDescriptor.getTableName())); + //delete table + admin.disableTable(tableDescriptor.getTableName()); + admin.deleteTable(tableDescriptor.getTableName()); + assertFalse(admin.tableExists(tableDescriptor.getTableName())); + //delete namespace + admin.deleteNamespace(namespace); + namespaceDescriptors = admin.listNamespaceDescriptors(); + // should have 2 namespace, default and hbase + found = false; + for (NamespaceDescriptor nd : namespaceDescriptors) { + if (nd.getName().equals(namespace)) { + found = true; + break; + } + } + assertTrue(found == false); + } + } +}