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, null, true);
043    assertFalse(
044      orig.merge(new QuotaGlobalsSettingsBypass("joe", null, null, null, false)).getBypass());
045  }
046
047  @Test
048  public void testInvalidMerges() throws IOException {
049    QuotaGlobalsSettingsBypass userBypass =
050        new QuotaGlobalsSettingsBypass("joe", null, null, null, true);
051    QuotaGlobalsSettingsBypass tableBypass =
052        new QuotaGlobalsSettingsBypass(null, TableName.valueOf("table"), null, null, true);
053    QuotaGlobalsSettingsBypass namespaceBypass =
054        new QuotaGlobalsSettingsBypass(null, null, "ns", null, true);
055    QuotaGlobalsSettingsBypass regionServerBypass =
056        new QuotaGlobalsSettingsBypass(null, null, null, "all", true);
057    QuotaGlobalsSettingsBypass userOnTableBypass =
058        new QuotaGlobalsSettingsBypass("joe", TableName.valueOf("table"), null, null, true);
059    QuotaGlobalsSettingsBypass userOnNamespaceBypass =
060        new QuotaGlobalsSettingsBypass("joe", null, "ns", null, true);
061    QuotaGlobalsSettingsBypass userOnRegionServerBypass =
062        new QuotaGlobalsSettingsBypass("joe", null, null, "all", true);
063
064    assertTrue(userBypass.merge(userBypass).getBypass());
065    expectFailure(userBypass, new QuotaGlobalsSettingsBypass("frank", null, null, null, false));
066    expectFailure(userBypass, tableBypass);
067    expectFailure(userBypass, namespaceBypass);
068    expectFailure(userBypass, regionServerBypass);
069    expectFailure(userBypass, userOnTableBypass);
070    expectFailure(userBypass, userOnNamespaceBypass);
071    expectFailure(userBypass, userOnRegionServerBypass);
072
073    assertTrue(tableBypass.merge(tableBypass).getBypass());
074    expectFailure(tableBypass, userBypass);
075    expectFailure(tableBypass,
076      new QuotaGlobalsSettingsBypass(null, TableName.valueOf("foo"), null, null, false));
077    expectFailure(tableBypass, namespaceBypass);
078    expectFailure(tableBypass, regionServerBypass);
079    expectFailure(tableBypass, userOnTableBypass);
080    expectFailure(tableBypass, userOnNamespaceBypass);
081    expectFailure(tableBypass, userOnRegionServerBypass);
082
083    assertTrue(namespaceBypass.merge(namespaceBypass).getBypass());
084    expectFailure(namespaceBypass, userBypass);
085    expectFailure(namespaceBypass, tableBypass);
086    expectFailure(namespaceBypass, regionServerBypass);
087    expectFailure(namespaceBypass, new QuotaGlobalsSettingsBypass(null, null, "sn", null, false));
088    expectFailure(namespaceBypass, userOnTableBypass);
089    expectFailure(namespaceBypass, userOnNamespaceBypass);
090    expectFailure(namespaceBypass, userOnNamespaceBypass);
091
092    assertTrue(regionServerBypass.merge(regionServerBypass).getBypass());
093    expectFailure(regionServerBypass, userBypass);
094    expectFailure(regionServerBypass, tableBypass);
095    expectFailure(regionServerBypass, namespaceBypass);
096    expectFailure(regionServerBypass,
097      new QuotaGlobalsSettingsBypass(null, null, null, "rs", false));
098    expectFailure(regionServerBypass, userOnTableBypass);
099    expectFailure(regionServerBypass, userOnNamespaceBypass);
100    expectFailure(regionServerBypass, userOnRegionServerBypass);
101
102    assertTrue(userOnTableBypass.merge(userOnTableBypass).getBypass());
103    expectFailure(userOnTableBypass, userBypass);
104    expectFailure(userOnTableBypass, tableBypass);
105    expectFailure(userOnTableBypass, namespaceBypass);
106    expectFailure(userOnTableBypass, regionServerBypass);
107    // Incorrect user
108    expectFailure(userOnTableBypass,
109      new QuotaGlobalsSettingsBypass("frank", TableName.valueOf("foo"), null, null, false));
110    // Incorrect tablename
111    expectFailure(userOnTableBypass,
112      new QuotaGlobalsSettingsBypass("joe", TableName.valueOf("bar"), null, null, false));
113    expectFailure(userOnTableBypass, userOnNamespaceBypass);
114    expectFailure(userOnTableBypass, userOnRegionServerBypass);
115
116    assertTrue(userOnNamespaceBypass.merge(userOnNamespaceBypass).getBypass());
117    expectFailure(userOnNamespaceBypass, userBypass);
118    expectFailure(userOnNamespaceBypass, tableBypass);
119    expectFailure(userOnNamespaceBypass, namespaceBypass);
120    expectFailure(userOnNamespaceBypass, regionServerBypass);
121    expectFailure(userOnNamespaceBypass, userOnTableBypass);
122    expectFailure(userOnNamespaceBypass,
123      new QuotaGlobalsSettingsBypass("frank", null, "ns", null, false));
124    expectFailure(userOnNamespaceBypass,
125      new QuotaGlobalsSettingsBypass("joe", null, "sn", null, false));
126    expectFailure(userOnNamespaceBypass, userOnRegionServerBypass);
127
128    assertTrue(userOnRegionServerBypass.merge(userOnRegionServerBypass).getBypass());
129    expectFailure(userOnRegionServerBypass, userBypass);
130    expectFailure(userOnRegionServerBypass, tableBypass);
131    expectFailure(userOnRegionServerBypass, namespaceBypass);
132    expectFailure(userOnRegionServerBypass, regionServerBypass);
133    expectFailure(userOnRegionServerBypass, userOnTableBypass);
134    expectFailure(userOnRegionServerBypass, userOnNamespaceBypass);
135    expectFailure(userOnRegionServerBypass,
136      new QuotaGlobalsSettingsBypass("frank", null, null, "all", false));
137    expectFailure(userOnRegionServerBypass,
138      new QuotaGlobalsSettingsBypass("joe", null, null, "rs", false));
139  }
140
141  void expectFailure(QuotaSettings one, QuotaSettings two) throws IOException {
142    try {
143      one.merge(two);
144      fail("Expected to see an Exception merging " + two + " into " + one);
145    } catch (IllegalArgumentException e) {}
146  }
147}