Package org.waveprotocol.box.server.persistence

Source Code of org.waveprotocol.box.server.persistence.AttachmentStoreTestBase

/**
* 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");
  }
}
TOP

Related Classes of org.waveprotocol.box.server.persistence.AttachmentStoreTestBase

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.