blob: 2e82f20c794799dde975f05180977d7da71a8c20 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Patrick Tasse - Initial API and implementation
*******************************************************************************/
package org.eclipse.tracecompass.tmf.core.tests.io;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import org.eclipse.tracecompass.tmf.core.io.BufferedRandomAccessFile;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* Tests for class {@link BufferedRandomAccessFile}
*/
public class BufferedRandomAccessFileTest {
private static final int FILESIZE = 256;
private static final String LINE = "123456789abcdef\n";
private static final int LENGTH = LINE.length();
private static File testFile;
/**
* Setup
*
* @throws IOException
* if an exception occurs
*/
@BeforeClass
public static void beforeClass() throws IOException {
testFile = File.createTempFile("test", ".txt");
FileWriter fw = new FileWriter(testFile);
try (BufferedWriter bw = new BufferedWriter(fw)) {
for (int i = 0; i < FILESIZE / LENGTH; i++) {
bw.write(LINE);
}
}
}
/**
* Test read methods
*
* @throws IOException
* if an exception occurs
*/
@Test
public void testRead() throws IOException {
try (BufferedRandomAccessFile file = new BufferedRandomAccessFile(testFile, "r", 16)) {
assertEquals(FILESIZE, file.length());
for (int pos = 0; pos < file.length(); pos++) {
assertEquals(pos, file.getFilePointer());
int c = file.read();
assertEquals(LINE.getBytes()[pos % 16], c);
}
assertEquals(file.length(), file.getFilePointer());
assertEquals(-1, file.read());
}
try (BufferedRandomAccessFile file = new BufferedRandomAccessFile(testFile, "r", 24)) {
assertEquals(FILESIZE, file.length());
for (int pos = 0; pos < file.length(); pos += LENGTH) {
byte[] b = new byte[LENGTH];
assertEquals(pos, file.getFilePointer());
int num = file.read(b);
assertEquals(LENGTH, num);
assertArrayEquals(LINE.getBytes(), b);
}
assertEquals(file.length(), file.getFilePointer());
assertEquals(-1, file.read(new byte[LENGTH]));
}
try (BufferedRandomAccessFile file = new BufferedRandomAccessFile(testFile, "r", 16)) {
assertEquals(FILESIZE, file.length());
int off = LENGTH / 4;
int len = LENGTH / 2;
for (int pos = 0; pos < file.length(); pos += len) {
byte[] b = new byte[LENGTH];
assertEquals(pos, file.getFilePointer());
int num = file.read(b, off, len);
assertEquals(len, num);
byte[] expected = new byte[LENGTH];
System.arraycopy(LINE.getBytes(), pos % 16, expected, off, len);
assertArrayEquals(expected, b);
}
assertEquals(file.length(), file.getFilePointer());
assertEquals(-1, file.read(new byte[LENGTH], off, len));
}
}
/**
* Test readLine method
*
* @throws IOException
* if an exception occurs
*/
@Test
public void testReadLine() throws IOException {
try (BufferedRandomAccessFile file = new BufferedRandomAccessFile(testFile, "r", 8)) {
assertEquals(FILESIZE, file.length());
for (int pos = 0; pos < file.length(); pos += LENGTH) {
assertEquals(pos, file.getFilePointer());
String line = file.readLine();
assertEquals(LINE.trim(), line);
}
assertEquals(file.length(), file.getFilePointer());
assertEquals(null, file.readLine());
}
}
/**
* Test seek followed by read
*
* @throws IOException
* if an exception occurs
*/
@Test
public void testSeekAndRead() throws IOException {
try (BufferedRandomAccessFile file = new BufferedRandomAccessFile(testFile, "r", 8)) {
assertEquals(FILESIZE, file.length());
for (int i = 0; i < file.length(); i++) {
/* alternate seeking forward and backward */
/* 0, 255, 1, 254, ..., 127, 128 */
int seek = (i % 2 == 0 ? i / 2 : FILESIZE - 1 - i / 2);
file.seek(seek);
/* read from seek position to end of file */
for (int pos = seek; pos < file.length(); pos++) {
assertEquals(pos, file.getFilePointer());
int c = file.read();
assertEquals(LINE.getBytes()[pos % 16], c);
}
}
file.seek(file.length());
assertEquals(file.length(), file.getFilePointer());
assertEquals(-1, file.read());
}
}
/**
* Test seek followed by write
*
* @throws IOException
* if an exception occurs
*/
@Test
public void testSeekAndWrite() throws IOException {
byte[] expected = new byte[FILESIZE + 1];
expected[FILESIZE] = -1;
try (BufferedRandomAccessFile file = new BufferedRandomAccessFile(File.createTempFile("test", ".txt"), "rw", 8)) {
assertEquals(0, file.length());
for (int i = 0; i < FILESIZE; i++) {
/* alternate seeking forward and backward */
/* 255, 0, 254, 1, ..., 128, 127 */
/* first iteration write sets the file length */
int seek = (i % 2 == 0 ? FILESIZE - 1 - i / 2 : i / 2);
file.seek(seek);
/* write one byte at seek position */
byte b = LINE.getBytes()[seek % 16];
file.write(b);
expected[seek] = b;
assertEquals(FILESIZE, file.length());
assertEquals(seek + 1, file.getFilePointer());
/* read next position in the file */
int c = file.read();
assertEquals(expected[seek + 1], c);
}
/* read back the whole written file */
file.seek(0);
for (int pos = 0; pos < file.length(); pos++) {
assertEquals(pos, file.getFilePointer());
int c = file.read();
assertEquals(expected[pos], c);
}
assertEquals(file.length(), file.getFilePointer());
assertEquals(-1, file.read());
}
}
}