/***********************************************************************************************************************
* Copyright (C) 2010-2013 by the Stratosphere project (http://stratosphere.eu)
*
* Licensed 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 eu.stratosphere.api.java.record.io;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.log4j.Level;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import eu.stratosphere.configuration.Configuration;
import eu.stratosphere.core.fs.FileInputSplit;
import eu.stratosphere.core.fs.Path;
import eu.stratosphere.types.IntValue;
import eu.stratosphere.types.Record;
import eu.stratosphere.util.LogUtils;
public class FixedLenghtInputFormatTest {
protected Configuration config;
protected File tempFile;
private final FixedLengthInputFormat format = new MyFixedLengthInputFormat();
// --------------------------------------------------------------------------------------------
@BeforeClass
public static void initialize() {
LogUtils.initializeDefaultConsoleLogger(Level.WARN);
}
@Before
public void setup() {
format.setFilePath("file:///some/file/that/will/not/be/read");
}
@After
public void setdown() throws Exception {
if (this.format != null) {
this.format.close();
}
if (this.tempFile != null) {
this.tempFile.delete();
}
}
@Test
public void testOpen() throws IOException {
final int[] fileContent = {1,2,3,4,5,6,7,8};
final FileInputSplit split = createTempFile(fileContent);
final Configuration parameters = new Configuration();
parameters.setInteger(FixedLengthInputFormat.RECORDLENGTH_PARAMETER_KEY, 8);
format.configure(parameters);
format.open(split);
assertEquals(0, format.getSplitStart());
assertEquals(0, format.getReadBufferSize() % 8);
format.close();
parameters.setInteger(FixedLengthInputFormat.RECORDLENGTH_PARAMETER_KEY, 13);
format.configure(parameters);
format.close();
format.open(split);
assertEquals(0, format.getReadBufferSize() % 13);
format.close();
parameters.setInteger(FixedLengthInputFormat.RECORDLENGTH_PARAMETER_KEY, 27);
format.configure(parameters);
format.close();
format.open(split);
assertEquals(0, format.getReadBufferSize() % 27);
format.close();
}
@Test
public void testRead() throws IOException {
final int[] fileContent = {1,2,3,4,5,6,7,8};
final FileInputSplit split = createTempFile(fileContent);
final Configuration parameters = new Configuration();
parameters.setInteger(FixedLengthInputFormat.RECORDLENGTH_PARAMETER_KEY, 8);
format.configure(parameters);
format.open(split);
Record record = new Record();
assertNotNull(format.nextRecord(record));
assertEquals(1, record.getField(0, IntValue.class).getValue());
assertEquals(2, record.getField(1, IntValue.class).getValue());
assertNotNull(format.nextRecord(record));
assertEquals(3, record.getField(0, IntValue.class).getValue());
assertEquals(4, record.getField(1, IntValue.class).getValue());
assertNotNull(format.nextRecord(record));
assertEquals(5, record.getField(0, IntValue.class).getValue());
assertEquals(6, record.getField(1, IntValue.class).getValue());
assertNotNull(format.nextRecord(record));
assertEquals(7, record.getField(0, IntValue.class).getValue());
assertEquals(8, record.getField(1, IntValue.class).getValue());
assertNull(format.nextRecord(record));
assertTrue(format.reachedEnd());
}
@Test
public void testReadFail() throws IOException {
final int[] fileContent = {1,2,3,4,5,6,7,8,9};
final FileInputSplit split = createTempFile(fileContent);
final Configuration parameters = new Configuration();
parameters.setInteger(FixedLengthInputFormat.RECORDLENGTH_PARAMETER_KEY, 8);
format.configure(parameters);
format.open(split);
Record record = new Record();
try {
assertNotNull(format.nextRecord(record));
assertEquals(1, record.getField(0, IntValue.class).getValue());
assertEquals(2, record.getField(1, IntValue.class).getValue());
assertNotNull(format.nextRecord(record));
assertEquals(3, record.getField(0, IntValue.class).getValue());
assertEquals(4, record.getField(1, IntValue.class).getValue());
assertNotNull(format.nextRecord(record));
assertEquals(5, record.getField(0, IntValue.class).getValue());
assertEquals(6, record.getField(1, IntValue.class).getValue());
assertNotNull(format.nextRecord(record));
assertEquals(7, record.getField(0, IntValue.class).getValue());
assertEquals(8, record.getField(1, IntValue.class).getValue());
assertNull(format.nextRecord(record));
} catch(IOException ioe) {
assertTrue(ioe.getMessage().equals("Unable to read full record"));
}
}
private FileInputSplit createTempFile(int[] contents) throws IOException {
this.tempFile = File.createTempFile("test_contents", "tmp");
this.tempFile.deleteOnExit();
DataOutputStream dos = new DataOutputStream(new FileOutputStream(tempFile));
for(int i : contents) {
dos.writeInt(i);
}
dos.close();
return new FileInputSplit(0, new Path(this.tempFile.toURI().toString()), 0, this.tempFile.length(), new String[] {"localhost"});
}
private final class MyFixedLengthInputFormat extends FixedLengthInputFormat {
private static final long serialVersionUID = 1L;
IntValue p1 = new IntValue();
IntValue p2 = new IntValue();
@Override
public boolean readBytes(Record target, byte[] buffer, int startPos) {
int v1 = 0;
v1 = (v1 | buffer[startPos+0]) << 8;
v1 = (v1 | buffer[startPos+1]) << 8;
v1 = (v1 | buffer[startPos+2]) << 8;
v1 = (v1 | buffer[startPos+3]);
p1.setValue(v1);
int v2 = 0;
v2 = (v2 | buffer[startPos+4]) << 8;
v2 = (v2 | buffer[startPos+5]) << 8;
v2 = (v2 | buffer[startPos+6]) << 8;
v2 = (v2 | buffer[startPos+7]);
p2.setValue(v2);
target.setField(0, p1);
target.setField(1, p2);
return true;
}
}
}