//* Licensed Materials - Property of * //* IBM * //* * //* eu.abc4trust.pabce.1.34 * //* * //* (C) Copyright IBM Corp. 2014. All Rights Reserved. * //* US Government Users Restricted Rights - Use, duplication or * //* disclosure restricted by GSA ADP Schedule Contract with IBM Corp. * //* * //* This file is licensed 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 eu.abc4trust.db; import static org.junit.Assert.*; import java.net.URI; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Collections; import java.util.List; import java.util.Random; import java.util.UUID; import org.junit.Before; import org.junit.Test; public class TestMockPersistentStorage { private MockPersistentStorage ps; @Before public void setup() { ps = new MockPersistentStorage(); } @Test public void simpleTest() { for(SimpleParamTypes table: SimpleParamTypes.values()) { simpleTest(table); } } private void simpleTest(SimpleParamTypes table) { String prefix = UUID.randomUUID().toString(); byte[] data = ("HelloWorld-"+prefix).getBytes(); URI key = URI.create("test-"+prefix); assertTrue(ps.insertItem(table, key, data)); byte[] ret = ps.getItem(table, key); assertTrue(Arrays.equals(data, ret)); byte[] newdata = ("HowAreYou-"+prefix).getBytes(); assertTrue(ps.updateItem(table, key, newdata)); ret = ps.getItem(table, key); assertTrue(Arrays.equals(newdata, ret)); List<URI> l = ps.listItems(table); assertTrue(l.contains(key)); assertTrue(ps.deleteItem(table, key)); URI key2 = URI.create("test-2-"+prefix); ps.replaceItem(table, key2, data); ret = ps.getItem(table, key2); assertTrue(Arrays.equals(data, ret)); ps.replaceItem(table, key2, newdata); ret = ps.getItem(table, key2); assertTrue(Arrays.equals(newdata, ret)); } @Test public void simpleTokenTest() { simpleTokenTest(SimpleParamTypes.ISSUANCE_TOKEN, TokenTypes.ISSUANCE_TOKEN); simpleTokenTest(SimpleParamTypes.VERIFIER_TOKEN, TokenTypes.VERIFIER_TOKEN); } private void simpleTokenTest(SimpleParamTypes tokenTable, TokenTypes psTable) { String prefix = UUID.randomUUID().toString(); byte[] data = ("HelloWorld-"+prefix).getBytes(); byte[] psValue = ("PsValue-"+prefix).getBytes(); URI key = URI.create("test-"+prefix); // Foreign key constraint assertFalse(ps.associatePseudonym(psTable, key, psValue)); assertTrue(ps.insertItem(tokenTable, key, data)); assertFalse(ps.isPseudonymInToken(psTable, psValue)); assertTrue(ps.associatePseudonym(psTable, key, psValue)); assertTrue(ps.isPseudonymInToken(psTable, psValue)); assertTrue(ps.deleteItem(tokenTable, key)); // Deletion should cascade to pseudonym assertFalse(ps.isPseudonymInToken(psTable, psValue)); } @Test public void zeroLengthData() { SimpleParamTypes table = SimpleParamTypes.TEST_TABLE; String prefix = UUID.randomUUID().toString(); byte[] data = new byte[0]; URI key = URI.create("test-"+prefix); assertTrue(ps.insertItem(table, key, data)); byte[] ret = ps.getItem(table, key); assertTrue(Arrays.equals(data, ret)); assertTrue(ps.updateItem(table, key, data)); ret = ps.getItem(table, key); assertTrue(Arrays.equals(data, ret)); List<URI> l = ps.listItems(table); assertTrue(l.contains(key)); assertTrue(ps.deleteItem(table, key)); } @Test public void largeBinaryData() { SimpleParamTypes table = SimpleParamTypes.TEST_TABLE; String prefix = UUID.randomUUID().toString(); byte[] data = new byte[1024*512]; Random r = new Random(); r.nextBytes(data); URI key = URI.create("test-"+prefix); assertTrue(ps.insertItem(table, key, data)); byte[] ret = ps.getItem(table, key); assertTrue(Arrays.equals(data, ret)); r.nextBytes(data); assertTrue(ps.updateItem(table, key, data)); ret = ps.getItem(table, key); assertTrue(Arrays.equals(data, ret)); List<URI> l = ps.listItems(table); assertTrue(l.contains(key)); assertTrue(ps.deleteItem(table, key)); } @Test public void utf8Key() { SimpleParamTypes table = SimpleParamTypes.TEST_TABLE; String prefix = UUID.randomUUID().toString(); byte[] data = ("HelloWorld-"+prefix).getBytes(); // Doesn't work for Japanese (3 byte per character) UTF8 strings //URI key = URI.create("test-"+prefix+"\u53e4\u6c60\u3084\u86d9\u98db\u3073\u8fbc\u3080\u6c34\u306e\u97f3"); URI key = URI.create("test-"+prefix+"I\u00f1t\u00ebrn\u00e2ti\u00f4n\u00e0liz\u00e6ti\u00f8n"); assertTrue(ps.insertItem(table, key, data)); byte[] ret = ps.getItem(table, key); assertTrue(Arrays.equals(data, ret)); byte[] newdata = ("HowAreYou-"+prefix).getBytes(); assertTrue(ps.updateItem(table, key, newdata)); ret = ps.getItem(table, key); assertTrue(Arrays.equals(newdata, ret)); List<URI> l = ps.listItems(table); assertTrue(l.contains(key)); assertTrue(ps.deleteItem(table, key)); } @Test public void testDuplicateKey() { SimpleParamTypes table = SimpleParamTypes.TEST_TABLE; String prefix = UUID.randomUUID().toString(); byte[] data = ("HelloWorld-"+prefix).getBytes(); URI key = URI.create("test-"+prefix); assertTrue(ps.insertItem(table, key, data)); byte[] ret = ps.getItem(table, key); assertTrue(Arrays.equals(data, ret)); assertFalse(ps.insertItem(table, key, data)); assertTrue(ps.deleteItem(table, key)); } @Test public void testDeleteWithoutItem() { SimpleParamTypes table = SimpleParamTypes.TEST_TABLE; String prefix = UUID.randomUUID().toString(); URI key = URI.create("test-"+prefix); assertFalse(ps.deleteItem(table, key)); } @Test public void testGetWithoutItem() { SimpleParamTypes table = SimpleParamTypes.TEST_TABLE; String prefix = UUID.randomUUID().toString(); URI key = URI.create("test-"+prefix); assertNull(ps.getItem(table, key)); } @Test public void testUpdateWithoutItem() { SimpleParamTypes table = SimpleParamTypes.TEST_TABLE; String prefix = UUID.randomUUID().toString(); byte[] data = ("HelloWorld-"+prefix).getBytes(); URI key = URI.create("test-"+prefix); assertFalse(ps.updateItem(table, key, data)); assertNull(ps.getItem(table, key)); assertTrue(ps.insertItem(table, key, data)); byte[] ret = ps.getItem(table, key); assertTrue(Arrays.equals(data, ret)); assertTrue(ps.deleteItem(table, key)); } @Test public void testEmptyList() { SimpleParamTypes table = SimpleParamTypes.TEST_TABLE; List<URI> ret = ps.listItems(table); assertEquals(0, ret.size()); } @Test public void simpleTestCredential() { String prefix = UUID.randomUUID().toString(); byte[] data = ("HelloWorld-"+prefix).getBytes(); URI key = URI.create("test-"+prefix); URI issuer = URI.create("theissuer"); URI credspec = URI.create("thecredspec"); String user = "Alice-"+prefix; String otherUser = "Bob-"+prefix; assertTrue(ps.insertCredential(key, user, issuer, credspec, data)); assertNull(ps.getCredential(key, otherUser)); byte[] ret = ps.getCredential(key, user); assertTrue(Arrays.equals(data, ret)); byte[] newdata = ("HowAreYou-"+prefix).getBytes(); assertFalse(ps.updateCredential(key, otherUser, newdata)); ret = ps.getCredential(key, user); assertTrue(Arrays.equals(data, ret)); assertTrue(ps.updateCredential(key, user, newdata)); ret = ps.getCredential(key, user); assertTrue(Arrays.equals(newdata, ret)); assertFalse(ps.deleteCredential(key, otherUser)); List<URI> l = ps.listCredentials(user); assertTrue(l.contains(key)); l = ps.listCredentials(otherUser); assertEquals(0, l.size()); assertTrue(ps.deleteCredential(key, user)); } @Test public void simpleTestSecret() { String prefix = UUID.randomUUID().toString(); byte[] data = ("HelloWorld-"+prefix).getBytes(); URI key = URI.create("test-"+prefix); String user = "Alice-"+prefix; String otherUser = "Bob-"+prefix; assertTrue(ps.insertSecret(key, user, data)); assertNull(ps.getSecret(key, otherUser)); byte[] ret = ps.getSecret(key, user); assertTrue(Arrays.equals(data, ret)); byte[] newdata = ("HowAreYou-"+prefix).getBytes(); assertFalse(ps.updateSecret(key, otherUser, newdata)); ret = ps.getSecret(key, user); assertTrue(Arrays.equals(data, ret)); assertTrue(ps.updateSecret(key, user, newdata)); ret = ps.getSecret(key, user); assertTrue(Arrays.equals(newdata, ret)); assertFalse(ps.deleteSecret(key, otherUser)); List<URI> l = ps.listSecrets(user); assertTrue(l.contains(key)); l = ps.listSecrets(otherUser); assertEquals(0, l.size()); assertTrue(ps.deleteSecret(key, user)); } @Test public void simpleTestPseudonym() { String prefix = UUID.randomUUID().toString(); byte[] data = ("HelloWorld-"+prefix).getBytes(); URI key = URI.create("test-"+prefix); String user = "Alice-"+prefix; String otherUser = "Bob-"+prefix; byte[] psValue = ("HelloWorld-"+prefix).getBytes(); String scope = "test-scope-"+prefix; boolean exclusive = false; assertTrue(ps.insertPseudonym(key, user, scope, exclusive, psValue, data)); assertNull(ps.getPseudonym(key, otherUser)); byte[] ret = ps.getPseudonym(key, user); assertTrue(Arrays.equals(data, ret)); byte[] newdata = ("HowAreYou-"+prefix).getBytes(); assertFalse(ps.updatePseudonym(key, otherUser, newdata)); ret = ps.getPseudonym(key, user); assertTrue(Arrays.equals(data, ret)); assertTrue(ps.updatePseudonym(key, user, newdata)); ret = ps.getPseudonym(key, user); assertTrue(Arrays.equals(newdata, ret)); assertFalse(ps.deletePseudonym(key, otherUser)); List<URI> l = ps.listPseudonyms(user); assertTrue(l.contains(key)); l = ps.listPseudonyms(otherUser); assertEquals(0, l.size()); assertTrue(ps.deletePseudonym(key, user)); } @Test public void simpleTestRevInfo() { String prefix = UUID.randomUUID().toString(); byte[] data1 = ("HelloWorld-1-"+prefix).getBytes(); byte[] data2 = ("HelloWorld-2-"+prefix).getBytes(); URI key = URI.create("test-"+prefix); URI revAuth1 = URI.create("test-ra1-"+prefix); URI revAuth2 = URI.create("test-ra2-"+prefix); Calendar cal = Calendar.getInstance(); assertTrue(ps.insertRevocationInformation(key, revAuth1, cal, data1)); byte[] ret = ps.getRevocationInformation(key, revAuth1); assertTrue(Arrays.equals(data1, ret)); assertTrue(ps.insertRevocationInformation(key, revAuth2, cal, data2)); ret = ps.getRevocationInformation(key, revAuth2); assertTrue(Arrays.equals(data2, ret)); ret = ps.getRevocationInformation(key, revAuth1); assertTrue(Arrays.equals(data1, ret)); } @Test public void testCredentialFilter() { class MiniCred { final byte[] data; final URI key; final URI issuer; final URI credspec; final String user; MiniCred(String prefix, URI issuer, URI credspec, String user, int i) { this.key = URI.create("test-"+i+prefix); this.issuer = issuer; this.credspec = credspec; this.user = user; this.data = ("HelloWorld-"+i+prefix).getBytes(); } void insert() { assertTrue(ps.insertCredential(key, user, issuer, credspec, data)); } void delete() { assertTrue(ps.deleteCredential(key, user)); } } String prefix = UUID.randomUUID().toString(); List<URI> issuers = Arrays.asList(URI.create("I0"), URI.create("I1"), URI.create("I2")); List<URI> credSpecs = Arrays.asList(URI.create("CS0"), URI.create("CS1"), URI.create("CS2")); List<MiniCred> creds = new ArrayList<MiniCred>(); String user = "Alice-"+prefix; String otherUser = "Bob-"+prefix; for(int i=0;i<9;++i) { MiniCred c = new MiniCred(prefix, issuers.get(i%3), credSpecs.get(i/3), user, i); creds.add(c); c.insert(); } for(int i=0;i<9;++i) { MiniCred c = new MiniCred(prefix, issuers.get(i%3), credSpecs.get(i/3), otherUser, i); creds.add(c); c.insert(); } List<URI> filterIssuers; List<URI> filterCs; List<URI> res; // Filter 0: zero issuers, zero cs filterIssuers = Collections.emptyList(); filterCs = Collections.emptyList(); res = ps.listCredentials(user, filterIssuers, filterCs); assertEquals(0, res.size()); // Filter 1: one issuer, one cs filterIssuers = Collections.singletonList(issuers.get(1)); filterCs = Collections.singletonList(credSpecs.get(1)); res = ps.listCredentials(user, filterIssuers, filterCs); assertEquals(1, res.size()); assertEquals(creds.get(4).key, res.get(0)); // Filter 2: two issuers, two cs filterIssuers = Arrays.asList(issuers.get(0), issuers.get(2)); filterCs = Arrays.asList(credSpecs.get(1), credSpecs.get(2)); res = ps.listCredentials(user, filterIssuers, filterCs); assertEquals(4, res.size()); assertTrue(res.contains(creds.get(3).key)); assertTrue(res.contains(creds.get(5).key)); assertTrue(res.contains(creds.get(6).key)); assertTrue(res.contains(creds.get(8).key)); // Filter 3: all issuers, all cs filterIssuers = issuers; filterCs = credSpecs; res = ps.listCredentials(user, filterIssuers, filterCs); assertEquals(9, res.size()); for(int i=0;i<9;++i) { assertTrue(res.contains(creds.get(i).key)); } // Filter 4: multiple copies of one issuer, one cs filterIssuers = Arrays.asList(issuers.get(1), issuers.get(1)); filterCs = Arrays.asList(credSpecs.get(1), credSpecs.get(1)); res = ps.listCredentials(user, filterIssuers, filterCs); assertEquals(1, res.size()); assertEquals(creds.get(4).key, res.get(0)); for(MiniCred c: creds) { c.delete(); } } @Test public void pseudonymSearch() { class MiniNym { final byte[] data; final URI key; final byte[] value; final String scope; final String user; final boolean exclusive; MiniNym(String prefix, String scope, String user, boolean exclusive, int i) { this.key = URI.create("test-"+i+prefix); this.scope = scope; this.exclusive = exclusive; this.user = user; this.data = ("HelloWorld-"+i+prefix).getBytes(); this.value = ("value-"+i+prefix).getBytes(); } void insert() { assertTrue(ps.insertPseudonym(key, user, scope, exclusive, value, data)); } void delete() { assertTrue(ps.deletePseudonym(key, user)); } } String prefix = UUID.randomUUID().toString(); List<String> users = Arrays.asList("Alice-"+prefix, "Bob"+prefix); List<String> scopes = Arrays.asList("S1", "S2", "S3"); List<MiniNym> nyms = new ArrayList<>(); for(int i=0;i<12;++i) { MiniNym nym = new MiniNym(prefix, scopes.get(i%3), users.get(i/6), (i/3)%2==0, i); nym.insert(); nyms.add(nym); } List<URI> res; res = ps.listPseudonyms(users.get(1)); assertEquals(6, res.size()); for(int i=6;i<12;++i) { assertTrue(res.contains(nyms.get(i).key)); } res = ps.listPseudonyms(users.get(0), nyms.get(3).value); assertEquals(1, res.size()); assertEquals(res.get(0), nyms.get(3).key); res = ps.listPseudonyms(users.get(1), nyms.get(3).value); assertEquals(0, res.size()); res = ps.listPseudonyms(users.get(0), scopes.get(2)); assertEquals(2, res.size()); assertTrue(res.contains(nyms.get(2).key)); assertTrue(res.contains(nyms.get(5).key)); res = ps.listPseudonyms(users.get(0), scopes.get(2), true); assertEquals(1, res.size()); assertEquals(res.get(0), nyms.get(2).key); res = ps.listPseudonyms(users.get(0), scopes.get(2), false); assertEquals(1, res.size()); assertEquals(res.get(0), nyms.get(5).key); for(MiniNym nym: nyms) { nym.delete(); } } @Test public void testLatestRevocationInformation() { String prefix = UUID.randomUUID().toString(); byte[] data1 = ("HelloWorld-1-"+prefix).getBytes(); byte[] data2 = ("HelloWorld-2-"+prefix).getBytes(); URI key1 = URI.create("test-1-"+prefix); URI key2 = URI.create("test-2-"+prefix); URI revAuth = URI.create("test-ra1-"+prefix); Calendar cal1 = Calendar.getInstance(); Calendar cal2 = Calendar.getInstance(); cal1.add(Calendar.DAY_OF_MONTH, 1); assertTrue(ps.insertRevocationInformation(key1, revAuth, cal1, data1)); assertTrue(ps.insertRevocationInformation(key2, revAuth, cal2, data2)); byte[] ret = ps.getLatestRevocationInformation(revAuth); assertTrue(Arrays.equals(data1, ret)); } }