| /** |
| * |
| * 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; |
| |
| |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertFalse; |
| import static org.junit.Assert.assertTrue; |
| |
| import org.apache.commons.logging.Log; |
| import org.apache.commons.logging.LogFactory; |
| import org.apache.hadoop.fs.FileSystem; |
| import org.apache.hadoop.fs.Path; |
| import org.apache.hadoop.hbase.client.Get; |
| import org.apache.hadoop.hbase.client.HTable; |
| import org.apache.hadoop.hbase.client.Put; |
| import org.apache.hadoop.hbase.client.Result; |
| import org.apache.hadoop.hbase.testclassification.LargeTests; |
| import org.apache.hadoop.hbase.util.Bytes; |
| import org.apache.hadoop.hbase.zookeeper.MiniZooKeeperCluster; |
| import org.apache.hadoop.hdfs.MiniDFSCluster; |
| import org.junit.Test; |
| import org.junit.experimental.categories.Category; |
| |
| /** |
| * Test our testing utility class |
| */ |
| @Category(LargeTests.class) |
| public class TestHBaseTestingUtility { |
| private final Log LOG = LogFactory.getLog(this.getClass()); |
| |
| /** |
| * Basic sanity test that spins up multiple HDFS and HBase clusters that share |
| * the same ZK ensemble. We then create the same table in both and make sure |
| * that what we insert in one place doesn't end up in the other. |
| * @throws Exception |
| */ |
| @Test (timeout=180000) |
| public void testMultiClusters() throws Exception { |
| // Create three clusters |
| |
| // Cluster 1. |
| HBaseTestingUtility htu1 = new HBaseTestingUtility(); |
| // Set a different zk path for each cluster |
| htu1.getConfiguration().set(HConstants.ZOOKEEPER_ZNODE_PARENT, "/1"); |
| htu1.startMiniZKCluster(); |
| |
| // Cluster 2 |
| HBaseTestingUtility htu2 = new HBaseTestingUtility(); |
| htu2.getConfiguration().set(HConstants.ZOOKEEPER_ZNODE_PARENT, "/2"); |
| htu2.getConfiguration().set(HConstants.ZOOKEEPER_CLIENT_PORT, |
| htu1.getConfiguration().get(HConstants.ZOOKEEPER_CLIENT_PORT, "-1")); |
| htu2.setZkCluster(htu1.getZkCluster()); |
| |
| // Cluster 3; seed it with the conf from htu1 so we pickup the 'right' |
| // zk cluster config; it is set back into the config. as part of the |
| // start of minizkcluster. |
| HBaseTestingUtility htu3 = new HBaseTestingUtility(); |
| htu3.getConfiguration().set(HConstants.ZOOKEEPER_ZNODE_PARENT, "/3"); |
| htu3.getConfiguration().set(HConstants.ZOOKEEPER_CLIENT_PORT, |
| htu1.getConfiguration().get(HConstants.ZOOKEEPER_CLIENT_PORT, "-1")); |
| htu3.setZkCluster(htu1.getZkCluster()); |
| |
| try { |
| htu1.startMiniCluster(); |
| htu2.startMiniCluster(); |
| htu3.startMiniCluster(); |
| |
| final byte[] TABLE_NAME = Bytes.toBytes("test"); |
| final byte[] FAM_NAME = Bytes.toBytes("fam"); |
| final byte[] ROW = Bytes.toBytes("row"); |
| final byte[] QUAL_NAME = Bytes.toBytes("qual"); |
| final byte[] VALUE = Bytes.toBytes("value"); |
| |
| HTable table1 = htu1.createTable(TABLE_NAME, FAM_NAME); |
| HTable table2 = htu2.createTable(TABLE_NAME, FAM_NAME); |
| |
| Put put = new Put(ROW); |
| put.add(FAM_NAME, QUAL_NAME, VALUE); |
| table1.put(put); |
| |
| Get get = new Get(ROW); |
| get.addColumn(FAM_NAME, QUAL_NAME); |
| Result res = table1.get(get); |
| assertEquals(1, res.size()); |
| |
| res = table2.get(get); |
| assertEquals(0, res.size()); |
| |
| table1.close(); |
| table2.close(); |
| |
| } finally { |
| htu3.shutdownMiniCluster(); |
| htu2.shutdownMiniCluster(); |
| htu1.shutdownMiniCluster(); |
| } |
| } |
| |
| @Test public void testMiniCluster() throws Exception { |
| HBaseTestingUtility hbt = new HBaseTestingUtility(); |
| |
| MiniHBaseCluster cluster = hbt.startMiniCluster(); |
| try { |
| assertEquals(1, cluster.getLiveRegionServerThreads().size()); |
| } finally { |
| hbt.shutdownMiniCluster(); |
| } |
| } |
| |
| /** |
| * Test that we can start and stop multiple time a cluster |
| * with the same HBaseTestingUtility. |
| */ |
| @Test public void testMultipleStartStop() throws Exception{ |
| HBaseTestingUtility htu1 = new HBaseTestingUtility(); |
| Path foo = new Path("foo"); |
| |
| htu1.startMiniCluster(); |
| htu1.getDFSCluster().getFileSystem().create(foo); |
| assertTrue( htu1.getDFSCluster().getFileSystem().exists(foo)); |
| htu1.shutdownMiniCluster(); |
| |
| htu1.startMiniCluster(); |
| assertFalse( htu1.getDFSCluster().getFileSystem().exists(foo)); |
| htu1.getDFSCluster().getFileSystem().create(foo); |
| assertTrue( htu1.getDFSCluster().getFileSystem().exists(foo)); |
| htu1.shutdownMiniCluster(); |
| } |
| |
| |
| @Test public void testMiniZooKeeper() throws Exception { |
| HBaseTestingUtility hbt = new HBaseTestingUtility(); |
| MiniZooKeeperCluster cluster1 = hbt.startMiniZKCluster(); |
| try { |
| assertEquals(0, cluster1.getBackupZooKeeperServerNum()); |
| assertTrue((cluster1.killCurrentActiveZooKeeperServer() == -1)); |
| } finally { |
| hbt.shutdownMiniZKCluster(); |
| } |
| |
| // set up zookeeper cluster with 5 zk servers |
| MiniZooKeeperCluster cluster2 = hbt.startMiniZKCluster(5); |
| int defaultClientPort = 21818; |
| cluster2.setDefaultClientPort(defaultClientPort); |
| try { |
| assertEquals(4, cluster2.getBackupZooKeeperServerNum()); |
| |
| // killing the current active zk server |
| assertTrue((cluster2.killCurrentActiveZooKeeperServer() >= defaultClientPort)); |
| assertTrue((cluster2.killCurrentActiveZooKeeperServer() >= defaultClientPort)); |
| assertEquals(2, cluster2.getBackupZooKeeperServerNum()); |
| assertEquals(3, cluster2.getZooKeeperServerNum()); |
| |
| // killing the backup zk servers |
| cluster2.killOneBackupZooKeeperServer(); |
| cluster2.killOneBackupZooKeeperServer(); |
| assertEquals(0, cluster2.getBackupZooKeeperServerNum()); |
| assertEquals(1, cluster2.getZooKeeperServerNum()); |
| |
| // killing the last zk server |
| assertTrue((cluster2.killCurrentActiveZooKeeperServer() == -1)); |
| // this should do nothing. |
| cluster2.killOneBackupZooKeeperServer(); |
| assertEquals(-1, cluster2.getBackupZooKeeperServerNum()); |
| assertEquals(0, cluster2.getZooKeeperServerNum()); |
| } finally { |
| hbt.shutdownMiniZKCluster(); |
| } |
| } |
| |
| @Test public void testMiniDFSCluster() throws Exception { |
| HBaseTestingUtility hbt = new HBaseTestingUtility(); |
| MiniDFSCluster cluster = hbt.startMiniDFSCluster(null); |
| FileSystem dfs = cluster.getFileSystem(); |
| Path dir = new Path("dir"); |
| Path qualifiedDir = dfs.makeQualified(dir); |
| LOG.info("dir=" + dir + ", qualifiedDir=" + qualifiedDir); |
| assertFalse(dfs.exists(qualifiedDir)); |
| assertTrue(dfs.mkdirs(qualifiedDir)); |
| assertTrue(dfs.delete(qualifiedDir, true)); |
| hbt.shutdownMiniCluster(); |
| } |
| |
| @Test public void testSetupClusterTestBuildDir() throws Exception { |
| HBaseTestingUtility hbt = new HBaseTestingUtility(); |
| Path testdir = hbt.getClusterTestDir(); |
| LOG.info("uuid-subdir=" + testdir); |
| FileSystem fs = hbt.getTestFileSystem(); |
| |
| assertFalse(fs.exists(testdir)); |
| |
| hbt.startMiniDFSCluster(null); |
| assertTrue(fs.exists(testdir)); |
| |
| hbt.shutdownMiniCluster(); |
| assertFalse(fs.exists(testdir)); |
| } |
| |
| @Test public void testTestDir() throws Exception { |
| HBaseTestingUtility hbt = new HBaseTestingUtility(); |
| Path testdir = hbt.getDataTestDir(); |
| LOG.info("testdir=" + testdir); |
| FileSystem fs = hbt.getTestFileSystem(); |
| assertTrue(!fs.exists(testdir)); |
| assertTrue(fs.mkdirs(testdir)); |
| assertTrue(hbt.cleanupTestDir()); |
| } |
| |
| } |
| |