package com.neverwinterdp.scribengin.nizarS3; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; import org.junit.After; import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import com.google.common.base.Charsets; import com.google.common.io.Files; import com.neverwinterdp.scribengin.Record; import com.neverwinterdp.scribengin.nizarS3.sink.S3SinkBuffer; import com.neverwinterdp.scribengin.nizarS3.sink.S3SinkConfig; import com.neverwinterdp.scribengin.storage.StreamDescriptor; import com.neverwinterdp.scribengin.storage.sink.partitioner.OffsetPartitioner; import com.neverwinterdp.scribengin.storage.sink.partitioner.SinkPartitioner; import com.neverwinterdp.scribengin.util.Label; import com.neverwinterdp.scribengin.util.PropertyUtils; public class SinkBufferUnitTest { private S3SinkBuffer buffer; S3SinkConfig config; SinkPartitioner partitioner; private String pathname; @Before public void setUp() throws IOException { StreamDescriptor descriptor = null; descriptor = new PropertyUtils("s3.default.properties").getDescriptor(); descriptor.setLocation(""); config = new S3SinkConfig(descriptor); pathname = config.getLocalTmpDir(); int offsetPerPartition = 10; partitioner = new OffsetPartitioner(offsetPerPartition); buffer = new S3SinkBuffer(partitioner, config); // delete files from tmp dir File file = new File(pathname); FileUtils.deleteDirectory(file); } @Test @Label("S3_19") public void testAdd() { // just to be sure assertEquals(0, buffer.size()); int tuples = 100; Record tuple; for (int i = 0; i < tuples; i++) { tuple = new Record(Integer.toString(i), new byte[10]); buffer.add(tuple); } assertEquals(tuples, buffer.size()); int expectedFiles = tuples / config.getChunkSize(); // get count of files in expected folder int files = countFiles(new File(pathname), true); assertEquals(expectedFiles, files); // TODO make this work /* * int expectedFolders = tuples / (config.getChunkSize() * config.getOffsetPerPartition()); * int folders = countFiles(new File(pathname), false); * assertEquals(expectedFolders, folders); */ } @Test // This test fails for tuples > 1000000 public void testAppendRecordsToMemory() { // add zero tuples to memory, get tuplesCountInMemory assertEquals(0, buffer.size()); // add a million tuples to memory, get tuplesCountInMemory int tuples = 1000; for (int i = 0; i < tuples; i++) { Record tuple = new Record(Integer.toString(i), new byte[10]); buffer.add(tuple); } assertEquals(tuples, buffer.size()); } @Test public void testPurgeMemoryToDisk() { // test how many written to disk // test how many remain in memory int tuples = 1000; for (int i = 0; i < tuples; i++) { Record tuple = new Record(Integer.toString(i), new byte[10]); buffer.add(tuple); } // we expect all tuples on disk, 0 in memory buffer.purgeMemoryToDisk(); System.out.println(buffer.size()); System.out.println(countFiles(new File(pathname), true)); System.out.println(); assertEquals(tuples, buffer.size()); assertEquals(0, buffer.tuplesInMemory()); assertEquals(tuples, buffer.tuplesOnDisk()); System.out.println("finished"); } @Test public void testClear() { // add tuples, call clear. check zero in memory, check zero in file int tuples = 1000; for (int i = 0; i < tuples; i++) { Record tuple = new Record(Integer.toString(i), new byte[10]); buffer.add(tuple); } try { buffer.clear(); } catch (IOException e) { System.out.println("got an exception "); Assert.fail("got an exception. " + e.getMessage()); } assertEquals(0, buffer.size()); assertEquals(0, buffer.getFilesCount()); assertTrue(buffer.isEmpty()); } @Test public void testGetFilesSize() { int tuples = 1000; for (int i = 0; i < tuples; i++) { Record tuple = new Record(Integer.toString(i), new byte[10]); buffer.add(tuple); } int expected = tuples / config.getChunkSize(); assertEquals(expected, buffer.getFilesCount()); } @Test public void testPollFromDisk() { int tuples = 10; String message = "test message "; for (int i = 0; i < tuples; i++) { Record tuple = new Record(Integer.toString(i), (message + i).getBytes()); buffer.add(tuple); } String actual; String expected = "test message 0"; try { File read = buffer.pollFromDisk(); System.out.println("exists " + read.exists()); System.out.println("length " + read.length()); System.out.println("total space " + read.getTotalSpace()); actual = Files.readFirstLine(read, Charsets.UTF_8).trim(); System.out.println(actual); System.out.println(expected); assertEquals(expected, actual); } catch (IOException e) { e.printStackTrace(); } } @Test public void testIsSaturated() { int tuples = 1000; for (int i = 0; i < tuples; i++) { Record tuple = new Record(Integer.toString(i), new byte[10]); buffer.add(tuple); } assertEquals(tuples, buffer.size()); } @Test public void testGetRecordsCount() { int tuples = 1000; for (int i = 0; i < tuples; i++) { Record tuple = new Record(Integer.toString(i), new byte[10]); buffer.add(tuple); } assertEquals(tuples, buffer.size()); } @After public void tearDown() throws Exception { // delete files from tmp dir buffer = null; File file = new File(pathname); FileUtils.deleteDirectory(file); } public int countFiles(File file, boolean filesOnly) { File[] files = file.listFiles(); int count = 0; for (File f : files) if (f.isDirectory()) { count += countFiles(f, filesOnly); } else { count++; } return count; } @AfterClass public static void tearDownAfterClass() throws Exception { } }