001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to you under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.hadoop.hbase.quotas;
018
019import static org.junit.Assert.assertFalse;
020import static org.junit.Assert.assertTrue;
021import static org.junit.Assert.fail;
022
023import java.io.IOException;
024
025import org.apache.hadoop.hbase.HBaseClassTestRule;
026import org.apache.hadoop.hbase.TableName;
027import org.apache.hadoop.hbase.quotas.QuotaSettingsFactory.QuotaGlobalsSettingsBypass;
028import org.apache.hadoop.hbase.testclassification.SmallTests;
029import org.junit.ClassRule;
030import org.junit.Test;
031import org.junit.experimental.categories.Category;
032
033@Category({SmallTests.class})
034public class TestQuotaGlobalsSettingsBypass {
035
036  @ClassRule
037  public static final HBaseClassTestRule CLASS_RULE =
038      HBaseClassTestRule.forClass(TestQuotaGlobalsSettingsBypass.class);
039
040  @Test
041  public void testMerge() throws IOException {
042    QuotaGlobalsSettingsBypass orig = new QuotaGlobalsSettingsBypass("joe", null, null, true);
043    assertFalse(orig.merge(new QuotaGlobalsSettingsBypass(
044        "joe", null, null, false)).getBypass());
045  }
046
047  @Test
048  public void testInvalidMerges() throws IOException {
049    QuotaGlobalsSettingsBypass userBypass = new QuotaGlobalsSettingsBypass(
050        "joe", null, null, true);
051    QuotaGlobalsSettingsBypass tableBypass = new QuotaGlobalsSettingsBypass(
052        null, TableName.valueOf("table"), null, true);
053    QuotaGlobalsSettingsBypass namespaceBypass = new QuotaGlobalsSettingsBypass(
054        null, null, "ns", true);
055    QuotaGlobalsSettingsBypass userOnTableBypass = new QuotaGlobalsSettingsBypass(
056        "joe", TableName.valueOf("table"), null, true);
057    QuotaGlobalsSettingsBypass userOnNamespaceBypass = new QuotaGlobalsSettingsBypass(
058        "joe", null, "ns", true);
059
060    assertTrue(userBypass.merge(userBypass).getBypass());
061    expectFailure(userBypass, new QuotaGlobalsSettingsBypass("frank", null, null, false));
062    expectFailure(userBypass, tableBypass);
063    expectFailure(userBypass, namespaceBypass);
064    expectFailure(userBypass, userOnTableBypass);
065    expectFailure(userBypass, userOnNamespaceBypass);
066
067    assertTrue(tableBypass.merge(tableBypass).getBypass());
068    expectFailure(tableBypass, userBypass);
069    expectFailure(tableBypass, new QuotaGlobalsSettingsBypass(
070        null, TableName.valueOf("foo"), null, false));
071    expectFailure(tableBypass, namespaceBypass);
072    expectFailure(tableBypass, userOnTableBypass);
073    expectFailure(tableBypass, userOnNamespaceBypass);
074
075    assertTrue(namespaceBypass.merge(namespaceBypass).getBypass());
076    expectFailure(namespaceBypass, userBypass);
077    expectFailure(namespaceBypass, tableBypass);
078    expectFailure(namespaceBypass, new QuotaGlobalsSettingsBypass(null, null, "sn", false));
079    expectFailure(namespaceBypass, userOnTableBypass);
080    expectFailure(namespaceBypass, userOnNamespaceBypass);
081
082    assertTrue(userOnTableBypass.merge(userOnTableBypass).getBypass());
083    expectFailure(userOnTableBypass, userBypass);
084    expectFailure(userOnTableBypass, tableBypass);
085    expectFailure(userOnTableBypass, namespaceBypass);
086    // Incorrect user
087    expectFailure(userOnTableBypass, new QuotaGlobalsSettingsBypass(
088        "frank", TableName.valueOf("foo"), null, false));
089    // Incorrect tablename
090    expectFailure(userOnTableBypass, new QuotaGlobalsSettingsBypass(
091        "joe", TableName.valueOf("bar"), null, false));
092    expectFailure(userOnTableBypass, userOnNamespaceBypass);
093
094    assertTrue(userOnNamespaceBypass.merge(userOnNamespaceBypass).getBypass());
095    expectFailure(userOnNamespaceBypass, userBypass);
096    expectFailure(userOnNamespaceBypass, tableBypass);
097    expectFailure(userOnNamespaceBypass, namespaceBypass);
098    expectFailure(userOnNamespaceBypass, userOnTableBypass);
099    expectFailure(userOnNamespaceBypass, new QuotaGlobalsSettingsBypass(
100        "frank", null, "ns", false));
101    expectFailure(userOnNamespaceBypass, new QuotaGlobalsSettingsBypass(
102        "joe", null, "sn", false));
103  }
104
105  void expectFailure(QuotaSettings one, QuotaSettings two) throws IOException {
106    try {
107      one.merge(two);
108      fail("Expected to see an Exception merging " + two + " into " + one);
109    } catch (IllegalArgumentException e) {}
110  }
111}