summaryrefslogtreecommitdiffstats
path: root/document/src/test/java/com/yahoo/document/DocumentIdTestCase.java
diff options
context:
space:
mode:
Diffstat (limited to 'document/src/test/java/com/yahoo/document/DocumentIdTestCase.java')
-rw-r--r--document/src/test/java/com/yahoo/document/DocumentIdTestCase.java294
1 files changed, 294 insertions, 0 deletions
diff --git a/document/src/test/java/com/yahoo/document/DocumentIdTestCase.java b/document/src/test/java/com/yahoo/document/DocumentIdTestCase.java
new file mode 100644
index 00000000000..defb86387ab
--- /dev/null
+++ b/document/src/test/java/com/yahoo/document/DocumentIdTestCase.java
@@ -0,0 +1,294 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.document;
+
+import com.yahoo.document.*;
+import com.yahoo.document.idstring.*;
+
+import java.math.BigInteger;
+
+import java.io.*;
+import java.util.regex.Pattern;
+import java.util.Arrays;
+
+public class DocumentIdTestCase extends junit.framework.TestCase {
+ DocumentTypeManager manager = new DocumentTypeManager();
+
+ public DocumentIdTestCase(String name) {
+ super(name);
+ }
+
+ protected void setUp() {
+ DocumentType testDocType = new DocumentType("testdoc");
+
+ testDocType.addHeaderField("intattr", DataType.INT);
+ testDocType.addField("rawattr", DataType.RAW);
+ testDocType.addField("floatattr", DataType.FLOAT);
+ testDocType.addHeaderField("stringattr", DataType.STRING);
+ testDocType.addHeaderField("Minattr", DataType.INT);
+
+ manager.registerDocumentType(testDocType);
+ }
+
+ public void testCompareTo() {
+ DocumentId docId1 = new Document(manager.getDocumentType("testdoc"), new DocumentId("doc:testdoc:http://www.uio.no/")).getId();
+ DocumentId docId2 = new Document(manager.getDocumentType("testdoc"), new DocumentId("doc:testdoc:http://www.uio.no/")).getId();
+ DocumentId docId3 = new Document(manager.getDocumentType("testdoc"), new DocumentId("doc:testdoc:http://www.ntnu.no/")).getId();
+
+ assertTrue(docId1.equals(docId2));
+ assertTrue(!docId1.equals(docId3));
+ assertTrue(docId1.compareTo(docId3) > 0);
+ assertTrue(docId3.compareTo(docId1) < 0);
+
+ assertEquals(docId1.hashCode(), docId2.hashCode());
+
+ }
+
+ private void checkInvalidUri(String uri) {
+ try {
+ //invalid URI
+ new DocumentId(uri);
+ fail();
+ } catch (IllegalArgumentException iae) {
+ }
+ }
+
+ public void testValidInvalidUriSchemes() {
+ try {
+ //valid URIs
+ new DocumentId("doc:blabla:something");
+ new DocumentId("doc:doc:doc");
+ new DocumentId("userdoc:bla:2387:");
+ new DocumentId("userdoc:bar:0:");
+ new DocumentId("userdoc:bar:18446744073709551615:");
+ new DocumentId("userdoc:foo:15:bar");
+ new DocumentId("id:namespace:type:n=42:whatever");
+ new DocumentId("id:namespace:type::whatever");
+ } catch (IllegalArgumentException iae) {
+ fail(iae.getMessage());
+ }
+
+ checkInvalidUri("foobar:");
+ checkInvalidUri("ballooo:blabla/something/");
+ checkInvalidUri("doc:");
+ checkInvalidUri("doc::");
+ checkInvalidUri("doc:::");
+ checkInvalidUri("doc::/");
+ checkInvalidUri("doc");
+ checkInvalidUri("userdoc:");
+ checkInvalidUri("userdoc::");
+ checkInvalidUri("userdoc:::");
+ checkInvalidUri("userdoc:::/");
+ checkInvalidUri("userdoc");
+ checkInvalidUri("userdoc:-87987//");
+ checkInvalidUri("userdoc:18446744073709551620/bar/");
+ checkInvalidUri("id:namespace:type");
+ checkInvalidUri("id:namespace:type:key-values");
+ checkInvalidUri("id:namespace:type:n=0,n=1:foo");
+ checkInvalidUri("id:namespace:type:g=foo,g=bar:foo");
+ checkInvalidUri("id:namespace:type:n=0,g=foo:foo");
+ }
+
+
+ //Compares globalId with C++ implementation located in
+ // ~document-HEAD/document/src/tests/cpp-globalidbucketids.txt
+ public void testCalculateGlobalId() throws IOException{
+
+ String file = "src/tests/cpp-globalidbucketids.txt";
+ BufferedReader fr = new BufferedReader(new FileReader(file));
+ String line;
+ String[] split_line;
+ String[] split_gid;
+ byte[] b;
+
+ // reads from file
+ while ((line = fr.readLine()) != null) {
+ split_line = line.split(" - ");
+ DocumentId mydoc = new DocumentId(split_line[0]);
+ b = mydoc.getGlobalId();
+ split_gid = Pattern.compile("\\(|\\)").split(split_line[1]);
+ compareStringByte(split_gid[1],b);
+ }
+ fr.close();
+ }
+
+ private void compareStringByte(String s, byte[] b){
+ /*
+ System.out.println("-- "+s+" --");
+ System.out.print("++ 0x");
+ for (int i=0; i<b.length; ++i) {
+ int nr = b[i] & 0xFF;
+ System.out.print(Integer.toHexString(nr / 16) + Integer.toHexString(nr % 16));
+ }
+ System.out.println(" ++");
+ */
+ s = s.substring(2);
+ assertEquals(s.length()/2, b.length);
+ for(int i=0; i<b.length;i++){
+ String ss = s.substring(2*i,2*i+2);
+ assertEquals(Integer.valueOf(ss, 16).intValue(),(((int)b[i])+256)%256);
+ }
+ }
+
+ //Compares bucketId with C++ implementation located in
+ // ~document-HEAD/document/src/tests/cpp-globalidbucketids.txt
+ public void testGetBucketId() throws IOException{
+ String file = "src/tests/cpp-globalidbucketids.txt";
+ BufferedReader fr = new BufferedReader(new FileReader(file));
+ String line;
+ String[] split_line;
+ BucketId bid;
+
+ // reads from file
+ while ((line = fr.readLine()) != null) {
+ split_line = line.split(" - ");
+ DocumentId mydoc = new DocumentId(split_line[0]);
+ BucketIdFactory factory = new BucketIdFactory(32, 26, 6);
+ bid = new BucketId(factory.getBucketId(mydoc).getId());
+ assertEquals(split_line[2], bid.toString());
+ }
+ fr.close();
+ }
+
+ public void testGroupdoc() {
+ try {
+ //valid
+ new DocumentId("groupdoc:blabla:something:jkl");
+ new DocumentId("groupdoc:doc:doc:asd");
+ new DocumentId("groupdoc:bar:0:a");
+ new DocumentId("groupdoc:bar:18446744073709551615:");
+ new DocumentId("groupdoc:foo:15:bar");
+ } catch (IllegalArgumentException iae) {
+ fail(iae.getMessage());
+ }
+ }
+
+ public void testInvalidGroupdoc() {
+ checkInvalidUri("grouppdoc:blabla:something");
+ checkInvalidUri("groupdoc:blablasomething");
+ }
+
+ public void testUriNamespace() {
+ DocumentId docId = new DocumentId("doc:bar:foo");
+ assertEquals("doc:bar:foo", docId.toString());
+ assertEquals("doc", docId.getScheme().getType().toString());
+ assertEquals("bar", docId.getScheme().getNamespace());
+ assertEquals("foo", docId.getScheme().getNamespaceSpecific());
+
+ docId = new DocumentId("userdoc:ns:90:boo");
+ assertEquals("userdoc:ns:90:boo", docId.toString());
+ assertEquals("userdoc", docId.getScheme().getType().toString());
+ assertEquals("ns", docId.getScheme().getNamespace());
+ assertEquals("boo", docId.getScheme().getNamespaceSpecific());
+ assertEquals(90l, ((UserDocIdString) docId.getScheme()).getUserId());
+
+ docId = new DocumentId("userdoc:ns:18446744073709551615:boo");
+ assertEquals("userdoc:ns:18446744073709551615:boo", docId.toString());
+ assertEquals("userdoc", docId.getScheme().getType().toString());
+ assertEquals("ns", docId.getScheme().getNamespace());
+ assertEquals("boo", docId.getScheme().getNamespaceSpecific());
+ assertEquals(new BigInteger("18446744073709551615").longValue(), ((UserDocIdString) docId.getScheme()).getUserId());
+
+ docId = new DocumentId("userdoc:ns:9223372036854775808:boo");
+ assertEquals("userdoc:ns:9223372036854775808:boo", docId.toString());
+ assertEquals("userdoc", docId.getScheme().getType().toString());
+ assertEquals("ns", docId.getScheme().getNamespace());
+ assertEquals("boo", docId.getScheme().getNamespaceSpecific());
+ assertEquals(new BigInteger("9223372036854775808").longValue(), ((UserDocIdString) docId.getScheme()).getUserId());
+
+ BigInteger negativeUserId = new BigInteger("F00DCAFEDEADBABE", 16);
+ assertEquals(0xF00DCAFEDEADBABEl, negativeUserId.longValue());
+ docId = new DocumentId("userdoc:ns:"+negativeUserId+":bar");
+ assertEquals("userdoc:ns:17297704939806374590:bar", docId.toString());
+ assertEquals(negativeUserId.longValue(), ((UserDocIdString) docId.getScheme()).getUserId());
+
+ docId = new DocumentId("orderdoc(31,19):ns2:1234:1268182861:foo");
+ assertEquals("orderdoc(31,19):ns2:1234:1268182861:foo", docId.toString());
+ assertEquals("orderdoc", docId.getScheme().getType().toString());
+ assertEquals("ns2", docId.getScheme().getNamespace());
+ assertEquals("foo", docId.getScheme().getNamespaceSpecific());
+ assertEquals(31, ((OrderDocIdString)docId.getScheme()).getWidthBits());
+ assertEquals(19, ((OrderDocIdString)docId.getScheme()).getDivisionBits());
+ assertEquals("1234", ((OrderDocIdString)docId.getScheme()).getGroup());
+ assertEquals(1234, ((OrderDocIdString)docId.getScheme()).getUserId());
+ assertEquals(1268182861, ((OrderDocIdString)docId.getScheme()).getOrdering());
+ }
+
+ public void testIdStrings() {
+ DocumentId docId;
+ docId = new DocumentId(new DocIdString("test", "baaaa"));
+ assertEquals("doc:test:baaaa", docId.toString());
+ assertFalse(docId.hasDocType());
+
+ docId = new DocumentId(new UserDocIdString("test", 54, "something"));
+ assertEquals("userdoc:test:54:something", docId.toString());
+ assertFalse(docId.hasDocType());
+
+ docId = new DocumentId(new UserDocIdString("test", 0xFFFFFFFFFFFFFFFFl, "something"));
+ assertEquals("userdoc:test:18446744073709551615:something", docId.toString());
+
+ //sign flipped
+ docId = new DocumentId(new UserDocIdString("test", -8193, "something"));
+ assertEquals("userdoc:test:18446744073709543423:something", docId.toString());
+
+ docId = new DocumentId(new IdIdString("namespace", "type", "g=group", "foobar"));
+ assertEquals("id:namespace:type:g=group:foobar", docId.toString());
+ assertTrue(docId.hasDocType());
+ assertEquals("type", docId.getDocType());
+ }
+
+ public void testIdStringFeatures() {
+ DocumentId none = new DocumentId("id:ns:type::foo");
+ assertFalse(none.getScheme().hasGroup());
+ assertFalse(none.getScheme().hasNumber());
+
+ none = new DocumentId("doc:ns:foo");
+ assertFalse(none.getScheme().hasGroup());
+ assertFalse(none.getScheme().hasNumber());
+
+ DocumentId user = new DocumentId("id:ns:type:n=42:foo");
+ assertFalse(user.getScheme().hasGroup());
+ assertTrue(user.getScheme().hasNumber());
+ assertEquals(42, user.getScheme().getNumber());
+
+ user = new DocumentId("userdoc:ns:42:foo");
+ assertFalse(user.getScheme().hasGroup());
+ assertTrue(user.getScheme().hasNumber());
+ assertEquals(42, user.getScheme().getNumber());
+
+ DocumentId group = new DocumentId("id:ns:type:g=mygroup:foo");
+ assertTrue(group.getScheme().hasGroup());
+ assertFalse(group.getScheme().hasNumber());
+ assertEquals("mygroup", group.getScheme().getGroup());
+
+ group = new DocumentId("groupdoc:ns:mygroup:foo");
+ assertTrue(group.getScheme().hasGroup());
+ assertFalse(group.getScheme().hasNumber());
+ assertEquals("mygroup", group.getScheme().getGroup());
+
+ DocumentId order = new DocumentId("orderdoc(5,2):ns:42:007:foo");
+ assertTrue(order.getScheme().hasGroup());
+ assertTrue(order.getScheme().hasNumber());
+ assertEquals("42", order.getScheme().getGroup());
+ assertEquals(42, order.getScheme().getNumber());
+ }
+
+ public void testHashCodeOfGids() {
+ DocumentId docId0 = new DocumentId("doc:blabla:0");
+ byte[] docId0Gid = docId0.getGlobalId();
+ DocumentId docId0Copy = new DocumentId("doc:blabla:0");
+ byte[] docId0CopyGid = docId0Copy.getGlobalId();
+
+
+ //GIDs should be the same
+ for (int i = 0; i < docId0Gid.length; i++) {
+ assertEquals(docId0Gid[i], docId0CopyGid[i]);
+ }
+
+ //straight hashCode() of byte arrays won't be the same
+ assertFalse(docId0Gid.hashCode() == docId0CopyGid.hashCode());
+
+ //Arrays.hashCode() works better...
+ assertEquals(Arrays.hashCode(docId0Gid), Arrays.hashCode(docId0CopyGid));
+ }
+
+}