| /** |
| * 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.avro; |
| |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertFalse; |
| import static org.junit.Assert.assertTrue; |
| |
| import java.nio.ByteBuffer; |
| |
| import org.apache.avro.Schema; |
| import org.apache.avro.generic.GenericArray; |
| import org.apache.avro.generic.GenericData; |
| import org.apache.hadoop.hbase.HBaseTestingUtility; |
| import org.apache.hadoop.hbase.avro.generated.AColumn; |
| import org.apache.hadoop.hbase.avro.generated.AColumnValue; |
| import org.apache.hadoop.hbase.avro.generated.AFamilyDescriptor; |
| import org.apache.hadoop.hbase.avro.generated.AGet; |
| import org.apache.hadoop.hbase.avro.generated.APut; |
| import org.apache.hadoop.hbase.avro.generated.ATableDescriptor; |
| import org.apache.hadoop.hbase.util.Bytes; |
| import org.apache.hadoop.hbase.util.Threads; |
| import org.junit.After; |
| import org.junit.AfterClass; |
| import org.junit.Before; |
| import org.junit.BeforeClass; |
| import org.junit.Test; |
| |
| /** |
| * Unit testing for AvroServer.HBaseImpl, a part of the |
| * org.apache.hadoop.hbase.avro package. |
| */ |
| public class TestAvroServer { |
| private final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility(); |
| |
| // Static names for tables, columns, rows, and values |
| // TODO(hammer): Better style to define these in test method? |
| private static ByteBuffer tableAname = ByteBuffer.wrap(Bytes.toBytes("tableA")); |
| private static ByteBuffer tableBname = ByteBuffer.wrap(Bytes.toBytes("tableB")); |
| private static ByteBuffer familyAname = ByteBuffer.wrap(Bytes.toBytes("FamilyA")); |
| private static ByteBuffer qualifierAname = ByteBuffer.wrap(Bytes.toBytes("QualifierA")); |
| private static ByteBuffer rowAname = ByteBuffer.wrap(Bytes.toBytes("RowA")); |
| private static ByteBuffer valueA = ByteBuffer.wrap(Bytes.toBytes("ValueA")); |
| |
| /** |
| * @throws java.lang.Exception |
| */ |
| @BeforeClass |
| public static void setUpBeforeClass() throws Exception { |
| TEST_UTIL.startMiniCluster(3); |
| } |
| |
| /** |
| * @throws java.lang.Exception |
| */ |
| @AfterClass |
| public static void tearDownAfterClass() throws Exception { |
| TEST_UTIL.shutdownMiniCluster(); |
| } |
| |
| /** |
| * @throws java.lang.Exception |
| */ |
| @Before |
| public void setUp() throws Exception { |
| // Nothing to do. |
| } |
| |
| /** |
| * @throws java.lang.Exception |
| */ |
| @After |
| public void tearDown() throws Exception { |
| // Nothing to do. |
| } |
| |
| /** |
| * Tests for creating, enabling, disabling, modifying, and deleting tables. |
| * |
| * @throws Exception |
| */ |
| @Test (timeout=300000) |
| public void testTableAdminAndMetadata() throws Exception { |
| AvroServer.HBaseImpl impl = |
| new AvroServer.HBaseImpl(TEST_UTIL.getConfiguration()); |
| |
| assertEquals(impl.listTables().size(), 0); |
| |
| ATableDescriptor tableA = new ATableDescriptor(); |
| tableA.name = tableAname; |
| impl.createTable(tableA); |
| assertEquals(impl.listTables().size(), 1); |
| assertTrue(impl.isTableEnabled(tableAname)); |
| assertTrue(impl.tableExists(tableAname)); |
| |
| ATableDescriptor tableB = new ATableDescriptor(); |
| tableB.name = tableBname; |
| impl.createTable(tableB); |
| assertEquals(impl.listTables().size(), 2); |
| |
| impl.disableTable(tableBname); |
| assertFalse(impl.isTableEnabled(tableBname)); |
| |
| impl.deleteTable(tableBname); |
| assertEquals(impl.listTables().size(), 1); |
| |
| impl.disableTable(tableAname); |
| assertFalse(impl.isTableEnabled(tableAname)); |
| |
| tableA.maxFileSize = 123456L; |
| impl.modifyTable(tableAname, tableA); |
| // It can take a while for the change to take effect. Wait here a while. |
| while(impl.describeTable(tableAname).maxFileSize != 123456L) Threads.sleep(100); |
| assertEquals(123456L, (long) impl.describeTable(tableAname).maxFileSize); |
| /* DISABLED FOR NOW TILL WE HAVE BETTER DISABLE/ENABLE |
| impl.enableTable(tableAname); |
| assertTrue(impl.isTableEnabled(tableAname)); |
| |
| impl.disableTable(tableAname); |
| */ |
| impl.deleteTable(tableAname); |
| } |
| |
| /** |
| * Tests for creating, modifying, and deleting column families. |
| * |
| * @throws Exception |
| */ |
| @Test |
| public void testFamilyAdminAndMetadata() throws Exception { |
| AvroServer.HBaseImpl impl = |
| new AvroServer.HBaseImpl(TEST_UTIL.getConfiguration()); |
| |
| ATableDescriptor tableA = new ATableDescriptor(); |
| tableA.name = tableAname; |
| AFamilyDescriptor familyA = new AFamilyDescriptor(); |
| familyA.name = familyAname; |
| Schema familyArraySchema = Schema.createArray(AFamilyDescriptor.SCHEMA$); |
| GenericArray<AFamilyDescriptor> families = new GenericData.Array<AFamilyDescriptor>(1, familyArraySchema); |
| families.add(familyA); |
| tableA.families = families; |
| impl.createTable(tableA); |
| assertEquals(impl.describeTable(tableAname).families.size(), 1); |
| |
| impl.disableTable(tableAname); |
| assertFalse(impl.isTableEnabled(tableAname)); |
| |
| familyA.maxVersions = 123456; |
| impl.modifyFamily(tableAname, familyAname, familyA); |
| assertEquals((int) impl.describeFamily(tableAname, familyAname).maxVersions, 123456); |
| |
| impl.deleteFamily(tableAname, familyAname); |
| assertEquals(impl.describeTable(tableAname).families.size(), 0); |
| |
| impl.disableTable(tableAname); |
| impl.deleteTable(tableAname); |
| } |
| |
| /** |
| * Tests for adding, reading, and deleting data. |
| * |
| * @throws Exception |
| */ |
| @Test |
| public void testDML() throws Exception { |
| AvroServer.HBaseImpl impl = |
| new AvroServer.HBaseImpl(TEST_UTIL.getConfiguration()); |
| |
| ATableDescriptor tableA = new ATableDescriptor(); |
| tableA.name = tableAname; |
| AFamilyDescriptor familyA = new AFamilyDescriptor(); |
| familyA.name = familyAname; |
| Schema familyArraySchema = Schema.createArray(AFamilyDescriptor.SCHEMA$); |
| GenericArray<AFamilyDescriptor> families = new GenericData.Array<AFamilyDescriptor>(1, familyArraySchema); |
| families.add(familyA); |
| tableA.families = families; |
| impl.createTable(tableA); |
| assertEquals(impl.describeTable(tableAname).families.size(), 1); |
| |
| AGet getA = new AGet(); |
| getA.row = rowAname; |
| Schema columnsSchema = Schema.createArray(AColumn.SCHEMA$); |
| GenericArray<AColumn> columns = new GenericData.Array<AColumn>(1, columnsSchema); |
| AColumn column = new AColumn(); |
| column.family = familyAname; |
| column.qualifier = qualifierAname; |
| columns.add(column); |
| getA.columns = columns; |
| |
| assertFalse(impl.exists(tableAname, getA)); |
| |
| APut putA = new APut(); |
| putA.row = rowAname; |
| Schema columnValuesSchema = Schema.createArray(AColumnValue.SCHEMA$); |
| GenericArray<AColumnValue> columnValues = new GenericData.Array<AColumnValue>(1, columnValuesSchema); |
| AColumnValue acv = new AColumnValue(); |
| acv.family = familyAname; |
| acv.qualifier = qualifierAname; |
| acv.value = valueA; |
| columnValues.add(acv); |
| putA.columnValues = columnValues; |
| |
| impl.put(tableAname, putA); |
| assertTrue(impl.exists(tableAname, getA)); |
| |
| assertEquals(impl.get(tableAname, getA).entries.size(), 1); |
| |
| impl.disableTable(tableAname); |
| impl.deleteTable(tableAname); |
| } |
| } |