/******************************************************************************* * Copyright (c) 2010-2014 SAP AG and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * SAP AG - initial API and implementation *******************************************************************************/ package org.eclipse.skalli.testutil; import static org.junit.Assert.*; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.apache.commons.io.IOUtils; import org.eclipse.skalli.services.persistence.StorageConsumer; import org.eclipse.skalli.services.persistence.StorageService; import org.junit.Test; @SuppressWarnings("nls") public abstract class StorageServiceTestBase { protected static final String TEST_ID = "test_id"; protected static final String TEST_NONEXISTING_ID = "some_non_existing_id"; protected static final String TEST_NONEXISTING_CATEGORY = "some_non_existing_category"; protected static final String TEST_CONTENT = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>" + "<entity-project lastModified=\"2011-05-10T08:16:25.137Z\" modifiedBy=\"d044774\" version=\"16\">" + " <uuid>00c5cdb4-fb0f-4f11-913c-44a7f24531bd</uuid>" + " <deleted>true</deleted>" + " <parentEntityId>ccefcf51-6b8b-440b-ac32-3b8f94c66590</parentEntityId>" + "</entity-project>"; protected static final String TEST_CONTENT_UPDATED = "updated_data"; /** * Creates the {@link StorageService} instance under test. */ protected abstract StorageService getStorageService() throws Exception; @Test public void testReadWrite() throws Exception { final String TEST_CATEGORY = "test_readwrite"; writeContent(TEST_CATEGORY, TEST_ID, TEST_CONTENT); String outputText = readContent(TEST_CATEGORY); assertEquals(TEST_CONTENT, outputText); } @Test public void testUpdate() throws Exception { final String TEST_CATEGORY = "test_update"; writeContent(TEST_CATEGORY, TEST_ID, TEST_CONTENT); //update the same key with TEST_CONTENT_UPDATED ByteArrayInputStream is = new ByteArrayInputStream(TEST_CONTENT_UPDATED.getBytes("UTF-8")); StorageService storageService = getStorageService(); storageService.write(TEST_CATEGORY, TEST_ID, is); InputStream stream = storageService.read(TEST_CATEGORY, TEST_ID); String outputText = IOUtils.toString(stream, "UTF-8"); assertEquals(TEST_CONTENT_UPDATED, outputText); is.close(); stream.close(); } @Test public void testReadNonExistingId() throws Exception { StorageService storageService = getStorageService(); InputStream stream = storageService.read(TEST_NONEXISTING_CATEGORY, TEST_NONEXISTING_ID); assertNull(stream); } @Test public void testKeys() throws Exception { final String TEST_CATEGORY = "test_keys"; StorageService storageService = getStorageService(); List<String> ids = storageService.keys(TEST_CATEGORY); assertTrue(ids.isEmpty()); writeContent(TEST_CATEGORY, TEST_ID, TEST_CONTENT); ids = storageService.keys(TEST_CATEGORY); assertTrue(ids.size() == 1); assertEquals(TEST_ID, ids.get(0)); } @Test public void testWriteBigData() throws Exception { final String TEST_CATEGORY = "test_writebigdata"; char[] chars = new char[100000]; Arrays.fill(chars, 'a'); String bigString = String.valueOf(chars); writeContent(TEST_CATEGORY, TEST_ID, bigString); StorageService storageService = getStorageService(); InputStream stream = storageService.read(TEST_CATEGORY, TEST_ID); String outputText = IOUtils.toString(stream, "UTF-8"); assertEquals(bigString, outputText); stream.close(); } @Test public void testArchive() throws Exception { final String TEST_CATEGORY = "test_archive"; StorageService storageService = getStorageService(); // initially empty List<ByteArrayStorageItem> items = getHistory(storageService, TEST_CATEGORY, TEST_ID); assertTrue(items.isEmpty()); // archive non existing element, should do nothing storageService.archive(TEST_CATEGORY, TEST_ID); items = getHistory(storageService, TEST_CATEGORY, TEST_ID); assertTrue(items.isEmpty()); // create item ByteArrayInputStream is = new ByteArrayInputStream(TEST_CONTENT.getBytes("UTF-8")); storageService.write(TEST_CATEGORY, TEST_ID, is); // first archive step storageService.archive(TEST_CATEGORY, TEST_ID); items = getHistory(storageService, TEST_CATEGORY, TEST_ID); assertEquals(1, items.size()); assertEquals(TEST_CATEGORY, items.get(0).getCategory()); assertEquals(TEST_ID, items.get(0).getId()); assertEquals(TEST_CONTENT, IOUtils.toString(items.get(0).getContent())); assertTrue(items.get(0).lastModified() != 0); // second archive step storageService.archive(TEST_CATEGORY, TEST_ID); items = getHistory(storageService, TEST_CATEGORY, TEST_ID); assertEquals(2, items.size()); assertTrue(items.get(0).lastModified() != 0); assertEquals(TEST_ID, items.get(0).getId()); assertTrue(items.get(1).lastModified() != 0); assertTrue(items.get(1).lastModified() >= items.get(0).lastModified()); assertEquals(TEST_ID, items.get(1).getId()); } @Test public void testReadWriteArchive() throws Exception { final String TEST_CATEGORY = "test_large_archive"; StorageService storageService = getStorageService(); // create item ByteArrayInputStream is = new ByteArrayInputStream(TEST_CONTENT.getBytes("UTF-8")); storageService.write(TEST_CATEGORY, TEST_ID, is); // create some archive entries for (int i = 0; i < 10; ++i) { storageService.archive(TEST_CATEGORY, TEST_ID); } // read these entries and check that the timestamps form a series List<ByteArrayStorageItem> items = getHistory(storageService, TEST_CATEGORY, TEST_ID); assertEquals(10, items.size()); for (int i = 0; i < 10; ++i) { assertEquals(TEST_CATEGORY, items.get(i).getCategory()); assertEquals(TEST_ID, items.get(i).getId()); assertEquals(TEST_CONTENT, IOUtils.toString(items.get(i).getContent())); if (i > 0) { assertTrue(items.get(i).lastModified() >= items.get(i-1).lastModified()); } } // write an additional entry long now = System.currentTimeMillis() + 4711; storageService.writeToArchive(TEST_CATEGORY, TEST_ID, now, IOUtils.toInputStream(TEST_CONTENT_UPDATED)); items = getHistory(storageService, TEST_CATEGORY, TEST_ID); assertEquals(11, items.size()); assertEquals(TEST_CATEGORY, items.get(10).getCategory()); assertEquals(TEST_ID, items.get(10).getId()); assertEquals(TEST_CONTENT_UPDATED, IOUtils.toString(items.get(10).getContent())); assertEquals(now, items.get(10).lastModified()); } private String readContent(final String TEST_CATEGORY) throws Exception { StorageService storageService = getStorageService(); InputStream stream = storageService.read(TEST_CATEGORY, TEST_ID); String outputText = IOUtils.toString(stream, "UTF-8"); stream.close(); return outputText; } private void writeContent(final String TEST_CATEGORY, String id, String content) throws Exception { StorageService storageService = getStorageService(); ByteArrayInputStream is = new ByteArrayInputStream(content.getBytes("UTF-8")); storageService.write(TEST_CATEGORY, TEST_ID, is); is.close(); return; } private List<ByteArrayStorageItem> getHistory(StorageService storageService, String category, String id) throws IOException { final List<ByteArrayStorageItem> items = new ArrayList<ByteArrayStorageItem>(); storageService.readFromArchive(category, id, new StorageConsumer(){ @Override public void consume(String category, String key, long lastModified, InputStream blob) throws IOException { items.add(new ByteArrayStorageItem(category, key, lastModified, IOUtils.toByteArray(blob))); } }); return items; } }