/*
* 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.accumulo.core.data;
import org.apache.accumulo.core.security.ColumnVisibility;
import org.apache.hadoop.io.Text;
import org.junit.Test;
import java.nio.charset.StandardCharsets;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertSame;
public class KeyBuilderTest {
private static final byte EMPTY_BYTES[] = new byte[0];
byte[] rowBytes = "row".getBytes(StandardCharsets.UTF_8);
byte[] familyBytes = "family".getBytes(StandardCharsets.UTF_8);
byte[] qualifierBytes = "qualifier".getBytes(StandardCharsets.UTF_8);
byte[] visibilityBytes = "visibility".getBytes(StandardCharsets.UTF_8);
Text rowText = new Text(rowBytes);
Text familyText = new Text(familyBytes);
Text qualifierText = new Text(qualifierBytes);
Text visibilityText = new Text(visibilityBytes);
ColumnVisibility visibilityVisibility = new ColumnVisibility(visibilityBytes);
@Test
public void testKeyBuildingFromRow() {
Key keyBuilt = Key.builder().row("foo").build();
Key keyExpected = new Key("foo");
assertEquals(keyExpected, keyBuilt);
}
@Test
public void testKeyBuildingFromRowFamily() {
Key keyBuilt = Key.builder().row("foo").family("bar").build();
Key keyExpected = new Key("foo", "bar");
assertEquals(keyExpected, keyBuilt);
}
@Test
public void testKeyBuildingFromRowFamilyQualifier() {
Key keyBuilt = Key.builder().row("foo").family("bar").qualifier("baz").build();
Key keyExpected = new Key("foo", "bar", "baz");
assertEquals(keyExpected, keyBuilt);
}
@Test
public void testKeyBuildingFromRowFamilyQualifierVisibility() {
Key keyBuilt = Key.builder().row("foo").family("bar").qualifier("baz").visibility("v").build();
Key keyExpected = new Key("foo", "bar", "baz", "v");
assertEquals(keyExpected, keyBuilt);
}
@Test
public void testKeyBuildingFromRowFamilyQualifierVisibilityTimestamp() {
Key keyBuilt = Key.builder().row("foo").family("bar").qualifier("baz").visibility("v").timestamp(1L).build();
Key keyExpected = new Key("foo", "bar", "baz", "v", 1L);
assertEquals(keyExpected, keyBuilt);
}
@Test
public void testKeyBuildingFromRowFamilyQualifierVisibilityTimestampDeleted() {
Key keyBuilt = Key.builder().row("foo").family("bar").qualifier("baz").visibility("v").timestamp(10L).deleted(true).build();
Key keyExpected = new Key("foo", "bar", "baz", "v", 10L);
keyExpected.setDeleted(true);
assertEquals(keyExpected, keyBuilt);
}
@Test
public void testKeyBuildingFromRowVisibility() {
Key keyBuilt = Key.builder().row("foo").visibility("v").build();
Key keyExpected = new Key("foo", "", "", "v");
assertEquals(keyExpected, keyBuilt);
}
@Test
public void testKeyBuildingFromRowFamilyVisibility() {
Key keyBuilt = Key.builder().row("foo").family("bar").visibility("v").build();
Key keyExpected = new Key("foo", "bar", "", "v");
assertEquals(keyExpected, keyBuilt);
}
@Test
public void textKeyBuildingFromRowTimestamp() {
Key keyBuilt = Key.builder().row("foo").timestamp(3L).build();
Key keyExpected = new Key("foo");
keyExpected.setTimestamp(3L);
assertEquals(keyExpected, keyBuilt);
}
@Test
public void testKeyBuildingFromRowBytes() {
Key keyBuilt = Key.builder().row(rowBytes).build();
Key keyExpected = new Key(rowBytes, EMPTY_BYTES, EMPTY_BYTES, EMPTY_BYTES, Long.MAX_VALUE);
assertEquals(keyExpected, keyBuilt);
}
@Test
public void testKeyBuildingFromRowFamilyBytes() {
Key keyBuilt = Key.builder().row(rowBytes).family(familyBytes).build();
Key keyExpected = new Key(rowBytes, familyBytes, EMPTY_BYTES, EMPTY_BYTES, Long.MAX_VALUE);
assertEquals(keyExpected, keyBuilt);
}
@Test
public void testKeyBuildingFromRowFamilyQualifierBytes() {
Key keyBuilt = Key.builder().row(rowBytes).family(familyBytes).qualifier(qualifierBytes).build();
Key keyExpected = new Key(rowBytes, familyBytes, qualifierBytes, EMPTY_BYTES, Long.MAX_VALUE);
assertEquals(keyExpected, keyBuilt);
}
@Test
public void testKeyBuildingFromRowFamilyQualifierVisibilityBytes() {
Key keyBuilt = Key.builder().row(rowBytes).family(familyBytes).qualifier(qualifierBytes).visibility(visibilityBytes).build();
Key keyExpected = new Key(rowBytes, familyBytes, qualifierBytes, visibilityBytes, Long.MAX_VALUE);
assertEquals(keyExpected, keyBuilt);
}
@Test
public void testKeyBuildingFromRowFamilyQualifierVisibilityTimestampBytes() {
Key keyBuilt = Key.builder().row(rowBytes).family(familyBytes).qualifier(qualifierBytes).visibility(visibilityBytes).timestamp(1L).build();
Key keyExpected = new Key(rowBytes, familyBytes, qualifierBytes, visibilityBytes, 1L);
assertEquals(keyExpected, keyBuilt);
}
@Test
public void testKeyBuildingFromRowFamilyQualifierVisibilityTimestampDeletedBytes() {
Key keyBuilt = Key.builder().row(rowBytes).family(familyBytes).qualifier(qualifierBytes).visibility(visibilityBytes).timestamp(10L).deleted(true).build();
Key keyExpected = new Key(rowBytes, familyBytes, qualifierBytes, visibilityBytes, 10L);
keyExpected.setDeleted(true);
assertEquals(keyExpected, keyBuilt);
}
@Test
public void testKeyBuildingFromRowVisibilityBytes() {
Key keyBuilt = Key.builder().row(rowBytes).visibility(visibilityBytes).build();
Key keyExpected = new Key(rowBytes, EMPTY_BYTES, EMPTY_BYTES, visibilityBytes, Long.MAX_VALUE);
assertEquals(keyExpected, keyBuilt);
}
@Test
public void testKeyBuildingFromRowFamilyVisibilityBytes() {
Key keyBuilt = Key.builder().row(rowBytes).family(familyBytes).visibility(visibilityBytes).build();
Key keyExpected = new Key(rowBytes, familyBytes, EMPTY_BYTES, visibilityBytes, Long.MAX_VALUE);
assertEquals(keyExpected, keyBuilt);
}
@Test
public void textKeyBuildingFromRowTimestampBytes() {
Key keyBuilt = Key.builder().row(rowBytes).timestamp(3L).build();
Key keyExpected = new Key(rowBytes, EMPTY_BYTES, EMPTY_BYTES, EMPTY_BYTES, Long.MAX_VALUE);
keyExpected.setTimestamp(3L);
assertEquals(keyExpected, keyBuilt);
}
@Test
public void testKeyBuildingFromRowText() {
Key keyBuilt = Key.builder().row(rowText).build();
Key keyExpected = new Key(rowText);
assertEquals(keyExpected, keyBuilt);
}
@Test
public void testKeyBuildingFromRowFamilyText() {
Key keyBuilt = Key.builder().row(rowText).family(familyText).build();
Key keyExpected = new Key(rowText, familyText);
assertEquals(keyExpected, keyBuilt);
}
@Test
public void testKeyBuildingFromRowFamilyQualifierText() {
Key keyBuilt = Key.builder().row(rowText).family(familyText).qualifier(qualifierText).build();
Key keyExpected = new Key(rowText, familyText, qualifierText);
assertEquals(keyExpected, keyBuilt);
}
@Test
public void testKeyBuildingFromRowFamilyQualifierVisibilityText() {
Key keyBuilt = Key.builder().row(rowText).family(familyText).qualifier(qualifierText).visibility(visibilityText).build();
Key keyExpected = new Key(rowText, familyText, qualifierText, visibilityText);
assertEquals(keyExpected, keyBuilt);
}
@Test
public void testKeyBuildingFromRowFamilyQualifierVisibilityTimestampText() {
Key keyBuilt = Key.builder().row(rowText).family(familyText).qualifier(qualifierText).visibility(visibilityText).timestamp(1L).build();
Key keyExpected = new Key(rowText, familyText, qualifierText, visibilityText, 1L);
assertEquals(keyExpected, keyBuilt);
}
@Test
public void testKeyBuildingFromRowFamilyQualifierVisibilityTimestampDeletedText() {
Key keyBuilt = Key.builder().row(rowText).family(familyText).qualifier(qualifierText).visibility(visibilityText).timestamp(10L).deleted(true).build();
Key keyExpected = new Key(rowText, familyText, qualifierText, visibilityText, 10L);
keyExpected.setDeleted(true);
assertEquals(keyExpected, keyBuilt);
}
@Test
public void testKeyBuildingFromRowVisibilityText() {
Key keyBuilt = Key.builder().row(rowText).visibility(visibilityText).build();
Key keyExpected = new Key(rowText, new Text(), new Text(), visibilityText);
assertEquals(keyExpected, keyBuilt);
}
@Test
public void testKeyBuildingFromRowFamilyVisibilityText() {
Key keyBuilt = Key.builder().row(rowText).family(familyText).visibility(visibilityText).build();
Key keyExpected = new Key(rowText, familyText, new Text(), visibilityText);
assertEquals(keyExpected, keyBuilt);
}
@Test
public void testKeyBuildingFromRowFamilyVisibilityVisibility() {
Key keyBuilt = Key.builder().row(rowText).family(familyText).visibility(visibilityVisibility).build();
Key keyExpected = new Key(rowText, familyText, new Text(), visibilityVisibility, Long.MAX_VALUE);
assertEquals(keyExpected, keyBuilt);
}
@Test
public void testKeyBuildingFromRowTimestampText() {
Key keyBuilt = Key.builder().row(rowText).timestamp(3L).build();
Key keyExpected = new Key(rowText);
keyExpected.setTimestamp(3L);
assertEquals(keyExpected, keyBuilt);
}
@Test
public void testKeyBuildingReusingBytes() {
byte[] reuse = new byte[] {1, 2, 3};
KeyBuilder.Build keyBuilder = Key.builder(false).row(reuse);
Key keyBuilt = keyBuilder.build();
assertSame(reuse, keyBuilt.getRowBytes());
}
@Test
public void testKeyBuildingCopyBytes() {
byte[] reuse = new byte[] {1, 2, 3};
KeyBuilder.Build keyBuilder = Key.builder(true).row(reuse);
Key keyBuilt = keyBuilder.build();
assertNotEquals(reuse, keyBuilt.getRowBytes());
Key keyBuilt2 = keyBuilder.build();
assertNotEquals(reuse, keyBuilt2.getRowBytes());
}
@Test
public void testKeyHeterogeneous() {
Key keyBuilt = Key.builder().row(rowText).family(familyBytes).qualifier("foo").build();
Text fooText = new Text("foo");
Key keyExpected = new Key(rowText.getBytes(), 0, rowText.getLength(), familyBytes, 0, familyBytes.length, fooText.getBytes(), 0, fooText.getLength(),
EMPTY_BYTES, 0, 0, Long.MAX_VALUE);
assertEquals(keyExpected, keyBuilt);
}
@Test
public void testKeyUsingSubsetOfBytes() {
Key keyBuilt = Key.builder().row(rowBytes, 0, rowBytes.length - 1).build();
Key keyExpected = new Key(rowBytes, 0, rowBytes.length - 1, EMPTY_BYTES, 0, 0, EMPTY_BYTES, 0, 0, EMPTY_BYTES, 0, 0, Long.MAX_VALUE);
assertEquals(keyExpected, keyBuilt);
}
@Test
public void testKeyBuildingWithMultipleTimestamps() {
Key keyBuilt = Key.builder().row("r").timestamp(44).timestamp(99).build();
Key keyExpected = new Key("r", "", "", 99);
assertEquals(keyExpected, keyBuilt);
}
@Test
public void testKeyBuildingWithMultipleDeleted() {
Key keyBuilt = Key.builder().row("r").deleted(true).deleted(false).build();
Key keyExpected = new Key("r");
keyExpected.setDeleted(false);
assertEquals(keyExpected, keyBuilt);
}
}