/** * 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.waveprotocol.box.server.persistence; import junit.framework.TestCase; import org.waveprotocol.box.server.persistence.AttachmentStore.AttachmentData; import org.waveprotocol.wave.media.model.AttachmentId; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; /** * Test cases for the Attachment Stores. * * @author josephg@gmail.com (Joseph Gentle) * @author akaplanov@gmail.com (A. Kaplanov) */ public abstract class AttachmentStoreTestBase extends TestCase { public void testStoreReturnsNullForNonexistantId() throws IOException { AttachmentStore store = newAttachmentStore(); AttachmentId id = new AttachmentId("", "some_madeup_id"); assertNull(store.getAttachment(id)); } public void testStoreCanStoreData() throws Exception { String testData = "some file data"; AttachmentId id = new AttachmentId("", "id_1"); AttachmentStore store = makeStoreWithData(id, testData); AttachmentData data = store.getAttachment(id); assertEquals(testData, dataToString(data)); } public void testContentLengthMatchesDataSize() throws Exception { String testData = "blah blah blah"; AttachmentId id = new AttachmentId("", "id_2"); AttachmentStore store = makeStoreWithData(id, testData); AttachmentData data = store.getAttachment(id); assertEquals(testData.length(), data.getSize()); } public void testStoreCanDeleteData() throws Exception { String testData = "some day, I'm going to run out of test strings"; AttachmentId id = new AttachmentId("", "id_3"); AttachmentStore store = makeStoreWithData(id, testData); store.deleteAttachment(id); AttachmentData data = store.getAttachment(id); assertNull(data); } public void testAttachmentCanWriteToOutputStream() throws Exception { String testData = "maybe there's some easy way to generate test strings"; AttachmentId id = new AttachmentId("", "id_4"); AttachmentStore store = makeStoreWithData(id, testData); AttachmentData data = store.getAttachment(id); ByteArrayOutputStream stream = new ByteArrayOutputStream(); InputStream io = data.getInputStream(); try { AttachmentUtil.writeTo(io, stream); assertEquals(testData, stream.toString("UTF-8")); } finally { io.close(); } } public void testAttachmentHasWorkingInputStream() throws Exception { String testData = "I suppose these strings don't actually need to be different"; AttachmentId id = new AttachmentId("", "id_5"); AttachmentStore store = makeStoreWithData(id, testData); AttachmentData data = store.getAttachment(id); BufferedReader reader = new BufferedReader(new InputStreamReader(data.getInputStream())); StringBuilder builder = new StringBuilder(); String line; try { while ((line = reader.readLine()) != null) { // This little snippet will discard any "\n" characters, but it shouldn't // matter. builder.append(line); } } finally { reader.close(); } assertEquals(testData, builder.toString()); } public void testGetStreamReturnsNewStream() throws Exception { String testData = "There's something quite peaceful about writing tests."; AttachmentId id = new AttachmentId("", "id_6"); AttachmentStore store = makeStoreWithData(id, testData); AttachmentData data = store.getAttachment(id); InputStream is1 = data.getInputStream(); InputStream is2 = data.getInputStream(); InputStream is3 = null; try { assertNotSame(is1, is2); int firstByte = is1.read(); assertSame(firstByte, is2.read()); // Check that a new input stream created now still has the same first // byte. is3 = data.getInputStream(); assertSame(firstByte, is3.read()); } finally { is1.close(); is2.close(); if (is3 != null) { is3.close(); } } } public void testOverwriteAttachmentThrowsException() throws Exception { String testData = "First."; AttachmentId id = new AttachmentId("", "id_7"); AttachmentStore store = makeStoreWithData(id, testData); boolean exceptionThrown=false; try { // A second element added with the same ID should not write. writeStringDataToAttachmentStore(store, id, "Second"); } catch (IOException ex) { exceptionThrown=true; } //assertTrue(exceptionThrown); // Check that the database still contains the original entry assertEquals(testData, dataToString(store.getAttachment(id))); } // Helpers. /** * Create and return a new attachment store instance of the type being tested. * @return a new attachment store */ protected abstract AttachmentStore newAttachmentStore(); protected void writeStringDataToAttachmentStore( AttachmentStore store, AttachmentId id, String data) throws IOException { store.storeAttachment(id, new ByteArrayInputStream(data.getBytes("UTF-8"))); } protected AttachmentStore makeStoreWithData(AttachmentId id, String data) throws Exception { AttachmentStore store = newAttachmentStore(); writeStringDataToAttachmentStore(store, id, data); return store; } protected String dataToString(AttachmentData data) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); InputStream io = data.getInputStream(); try { AttachmentUtil.writeTo(io, out); } finally { io.close(); } return out.toString("UTF-8"); } }