/* * Copyright (c) 2013 Google Inc. * * 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 com.google.api.client.test.util.store; import com.google.api.client.util.Beta; import com.google.api.client.util.store.DataStore; import com.google.api.client.util.store.DataStoreFactory; import com.google.common.collect.Sets; import junit.framework.TestCase; import java.util.Arrays; import java.util.Collection; import java.util.Set; /** * Tests {@link DataStoreFactory}. * * @author Yaniv Inbar */ @Beta public abstract class AbstractDataStoreFactoryTest extends TestCase { private static final String STRING_ID = "String"; private static final String BOOLEAN_ID = "Boolean"; DataStoreFactory dataStore; DataStore<String> stringTyped; DataStore<Boolean> boolTyped; /** Returns a new instance of the data store factory to test. */ protected abstract DataStoreFactory newDataStoreFactory() throws Exception; @Override public void setUp() throws Exception { dataStore = newDataStoreFactory(); stringTyped = dataStore.getDataStore(STRING_ID); boolTyped = dataStore.getDataStore(BOOLEAN_ID); } @Override public void tearDown() throws Exception { stringTyped.clear(); assertTrue(stringTyped.values().isEmpty()); boolTyped.clear(); assertTrue(boolTyped.values().isEmpty()); } private static void assertContentsAnyOrder(Collection<?> c, Object... elts) { assertEquals(Sets.newHashSet(c), Sets.newHashSet(Arrays.asList(elts))); } public void testId() throws Exception { subtestIdNoException("1"); subtestIdNoException("123456789012345678901234567890"); subtestIdNoException("abcdefghijklmnopqrstuvwxyz"); subtestIdNoException("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); subtestIdException(""); subtestIdException("."); subtestIdException(" "); subtestIdException("1234567890123456789012345678901"); } private void subtestIdException(String id) throws Exception { try { subtestIdNoException(id); fail("expected " + IllegalArgumentException.class); } catch (IllegalArgumentException e) { // expected } } private void subtestIdNoException(String id) throws Exception { newDataStoreFactory().getDataStore(id); } public void testSet() throws Exception { // get null assertNull(stringTyped.get(null)); // before stored assertNull(stringTyped.get("k")); // store with basic values stringTyped.set("k", "v"); assertEquals("v", stringTyped.get("k")); stringTyped = dataStore.getDataStore(STRING_ID); assertEquals("v", stringTyped.get("k")); stringTyped = dataStore.getDataStore(STRING_ID); assertEquals("v", stringTyped.get("k")); // store with new value stringTyped.set("k", "new"); assertEquals("new", stringTyped.get("k")); // store on another key stringTyped.set("k2", "other"); assertEquals("new", stringTyped.get("k")); assertEquals("other", stringTyped.get("k2")); // set null try { stringTyped.set("k", null); fail("expected " + NullPointerException.class); } catch (NullPointerException e) { // expected } try { stringTyped.set(null, "v"); fail("expected " + NullPointerException.class); } catch (NullPointerException e) { // expected } // boolean stringTyped.set("k", "v"); assertNull(boolTyped.get("k")); boolTyped.set("k", true); assertEquals("v", stringTyped.get("k")); assertTrue(boolTyped.get("k")); } public void testValues() throws Exception { // before assertTrue(stringTyped.values().isEmpty()); // store keys stringTyped.set("k", "new"); stringTyped.set("k2", "other"); // check values assertContentsAnyOrder(stringTyped.values(), "new", "other"); // delete one stringTyped.delete("k"); assertNull(stringTyped.get("k")); assertContentsAnyOrder(stringTyped.values(), "other"); stringTyped.delete("k2"); // boolean stringTyped.set("k", "v"); assertTrue(boolTyped.values().isEmpty()); boolTyped.set("k", true); assertContentsAnyOrder(stringTyped.values(), "v"); assertContentsAnyOrder(boolTyped.values(), true); } public void testKeySet() throws Exception { // before assertTrue(stringTyped.keySet().isEmpty()); // store a key stringTyped.set("k", "new"); Set<String> expected = Sets.newTreeSet(); expected.add("k"); assertEquals(expected, Sets.newTreeSet(stringTyped.keySet())); // store another key stringTyped.set("k2", "other"); expected.add("k2"); assertEquals(expected, Sets.newTreeSet(stringTyped.keySet())); // clear after stringTyped.delete("k2"); expected.remove("k2"); assertEquals(expected, Sets.newTreeSet(stringTyped.keySet())); stringTyped.delete("k"); assertTrue(stringTyped.keySet().isEmpty()); } public void testDelete() throws Exception { // store with basic values stringTyped.set("k", "v").set("k2", "v2"); assertFalse(stringTyped.isEmpty()); assertEquals(2, stringTyped.size()); // delete one key stringTyped.delete("k2"); assertNull(stringTyped.get("k2")); stringTyped.delete("k2"); assertNull(stringTyped.get("k2")); assertEquals("v", stringTyped.get("k")); assertFalse(stringTyped.isEmpty()); assertEquals(1, stringTyped.size()); // delete another key stringTyped.delete("k"); assertNull(stringTyped.get("k")); // set null key stringTyped.delete(null); assertTrue(stringTyped.isEmpty()); assertEquals(0, stringTyped.size()); } public void testClear() throws Exception { // store with basic values stringTyped.set("k", "v").set("k2", "v2"); // clear stringTyped.clear(); assertTrue(stringTyped.isEmpty()); assertEquals(0, stringTyped.size()); // clear again stringTyped.clear(); assertTrue(stringTyped.isEmpty()); assertEquals(0, stringTyped.size()); } public void testLarge() throws Exception { // TODO(yanivi): size = 1000? need to speed up JdoDataStoreTest first int size = 100; for (int i = 0; i < size; i++) { stringTyped.set(String.valueOf(i), "hello" + i); } assertEquals(size, stringTyped.size()); int mid = size / 2; assertEquals("hello" + mid, stringTyped.get(String.valueOf(mid))); } public void testContainsKeyAndValue() throws Exception { // before assertFalse(stringTyped.containsKey("k")); assertFalse(stringTyped.containsValue("new")); assertFalse(stringTyped.containsKey("k2")); assertFalse(stringTyped.containsValue("other")); // store a key stringTyped.set("k", "new"); assertTrue(stringTyped.containsKey("k")); assertFalse(stringTyped.containsKey("k2")); assertTrue(stringTyped.containsValue("new")); assertFalse(stringTyped.containsValue("other")); // store another key stringTyped.set("k2", "other"); assertTrue(stringTyped.containsKey("k")); assertTrue(stringTyped.containsKey("k2")); assertTrue(stringTyped.containsValue("new")); assertTrue(stringTyped.containsValue("other")); // clear after stringTyped.delete("k"); assertFalse(stringTyped.containsKey("k")); assertTrue(stringTyped.containsKey("k2")); assertFalse(stringTyped.containsValue("new")); assertTrue(stringTyped.containsValue("other")); stringTyped.clear(); assertFalse(stringTyped.containsKey("k")); assertFalse(stringTyped.containsKey("k2")); assertFalse(stringTyped.containsValue("new")); assertFalse(stringTyped.containsValue("other")); } }