Package freenet.support.io

Source Code of freenet.support.io.BucketTestBase

/* This code is part of Freenet. It is distributed under the GNU General
* Public License, version 2 (or at your option any later version). See
* http://www.gnu.org/ for further details of the GPL. */
package freenet.support.io;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import junit.framework.TestCase;
import freenet.support.ByteArrayWrapper;
import freenet.support.api.Bucket;

public abstract class BucketTestBase extends TestCase {
  protected byte[] DATA1 = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
  protected byte[] DATA2 = new byte[] { 0x70, (byte) 0x81, (byte) 0x92, (byte) 0xa3, (byte) 0xb4, (byte) 0xc5,
          (byte) 0xd6, (byte) 0xe7, (byte) 0xf8 };

  protected abstract Bucket makeBucket(long size) throws IOException;

  protected abstract void freeBucket(Bucket bucket) throws IOException;

  public void testReadEmpty() throws IOException {
    Bucket bucket = makeBucket(3);
    try {
      assertEquals("Size-0", 0, bucket.size());
      OutputStream os = bucket.getOutputStream();
      os.close();
     
      // Read byte[]
      InputStream is = bucket.getInputStream();
      byte[] data = new byte[10];
      int read = is.read(data, 0, 10);
      is.close();

      assertEquals("Read-Empty", -1, read);
    } finally {
      freeBucket(bucket);
    }
  }

  public void testReadExcess() throws IOException {
    Bucket bucket = makeBucket(Math.max(DATA1.length, DATA2.length));
    try {
      assertEquals("Size-0", 0, bucket.size());

      // Write
      OutputStream os = bucket.getOutputStream();
      os.write(new byte[] { 5 });
      os.close();

      assertEquals("Read-Excess-Size", 1, bucket.size());

      // Read byte[]
      InputStream is = bucket.getInputStream();
      byte[] data = new byte[10];
      int read = is.read(data, 0, 10);
      assertEquals("Read-Excess", 1, read);
      assertEquals("Read-Excess-5", 5, data[0]);

      read = is.read(data, 0, 10);
      assertEquals("Read-Excess-EOF", -1, read);

      is.close();
    } finally {
      freeBucket(bucket);
    }
  }

  public void testReadWrite() throws IOException {
    Bucket bucket = makeBucket(Math.max(DATA1.length, DATA2.length));
    try {
      assertEquals("Size-0", 0, bucket.size());

      // Write
      OutputStream os = bucket.getOutputStream();
      os.write(DATA1);
      os.close();

      assertEquals("Size-1", DATA1.length, bucket.size());

      // Read byte[]
      InputStream is = bucket.getInputStream();
      byte[] data = new byte[DATA1.length];
      int read = is.read(data, 0, DATA1.length);
      is.close();

      assertEquals("SimpleRead-1-SIZE", DATA1.length, read);
      assertEquals("SimpleRead-1", new ByteArrayWrapper(DATA1), new ByteArrayWrapper(data));

      // Read byte
      is = bucket.getInputStream();
      for (byte b : DATA1)
        assertEquals("SimpleRead-2", b, (byte) is.read());

      // EOF
      assertEquals("SimpleRead-EOF0", -1, is.read(new byte[4]));
      assertEquals("SimpleRead-EOF1", -1, is.read());
      assertEquals("SimpleRead-EOF2", -1, is.read());

      is.close();
    } finally {
      freeBucket(bucket);
    }
  }
 
  protected boolean canOverwrite = true;

  // Write twice -- should overwrite, not append
  public void testReuse() throws IOException {
    if (!canOverwrite)
      return;
   
    Bucket bucket = makeBucket(Math.max(DATA1.length, DATA2.length));
    try {
      // Write
      OutputStream os = bucket.getOutputStream();
      os.write(DATA1);
      os.close();

      // Read byte[]
      InputStream is = bucket.getInputStream();
      byte[] data = new byte[DATA1.length];
      int read = is.read(data, 0, DATA1.length);
      is.close();

      assertEquals("Read-1-SIZE", DATA1.length, read);
      assertEquals("Read-1", new ByteArrayWrapper(DATA1), new ByteArrayWrapper(data));

      // Write again
      os = bucket.getOutputStream();
      os.write(DATA2);
      os.close();

      // Read byte[]
      is = bucket.getInputStream();
      data = new byte[DATA2.length];
      read = is.read(data, 0, DATA2.length);
      is.close();

      assertEquals("Read-2-SIZE", DATA2.length, read);
      assertEquals("Read-2", new ByteArrayWrapper(DATA2), new ByteArrayWrapper(data));
    } finally {
      freeBucket(bucket);
    }
  }

  public void testNegative() throws IOException {
    Bucket bucket = makeBucket(Math.max(DATA1.length, DATA2.length));
    try {
      // Write
      OutputStream os = bucket.getOutputStream();
      os.write(0);
      os.write(-1);
      os.write(-2);
      os.write(123);
      os.close();

      // Read byte[]
      InputStream is = bucket.getInputStream();
      assertEquals("Write-0", 0xff & (byte) 0, is.read());
      assertEquals("Write-1", 0xff & (byte) -1, is.read());
      assertEquals("Write-2", 0xff & (byte) -2, is.read());
      assertEquals("Write-123", 0xff & (byte) 123, is.read());
      assertEquals("EOF", -1, is.read());
      is.close();
    } finally {
      freeBucket(bucket);
    }
  }

  protected static byte[] DATA_LONG;
  static {
    DATA_LONG = new byte[32768 + 1]; // 32K + 1
    for (int i = 0; i < DATA_LONG.length; i++)
      DATA_LONG[i] = (byte) i;
  }

  public void testLargeData() throws IOException {

    Bucket bucket = makeBucket(DATA_LONG.length * 16);
    try {
      // Write
      OutputStream os = bucket.getOutputStream();
      for (int i = 0; i < 16; i++)
        os.write(DATA_LONG);
      os.close();

      // Read byte[]
      DataInputStream is = new DataInputStream(bucket.getInputStream());
      for (int i = 0; i < 16; i++) {
        byte[] buf = new byte[DATA_LONG.length];
        is.readFully(buf);
        assertEquals("Read-Long", new ByteArrayWrapper(DATA_LONG), new ByteArrayWrapper(buf));
      }

      int read = is.read(new byte[1]);
      assertEquals("Read-Long-Size", -1, read);

      is.close();
    } finally {
      freeBucket(bucket);
    }
  }
}
TOP

Related Classes of freenet.support.io.BucketTestBase

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.