package io.lumify.core.util;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class HdfsLimitOutputStreamTest {
@Mock
private FileSystem mockFileSystem;
@Mock
private FSDataOutputStream mockFSDataOutputStream;
@Test
public void testSmall() throws NoSuchAlgorithmException, IOException {
HdfsLimitOutputStream out = new HdfsLimitOutputStream(mockFileSystem, 10);
byte[] data = createMockData(10);
out.write(data[0]);
out.write(data, 1, 2);
out.write(Arrays.copyOfRange(data, 3, 10));
out.flush();
out.close();
assertEquals(false, out.hasExceededSizeLimit());
assertArrayEquals(data, out.getSmall());
assertEquals("urn\u001Fsha256\u001F1f825aa2f0020ef7cf91dfa30da4668d791c5d4824fc8e41354b89ec05795ab3", out.getRowKey());
}
@Test
public void testLarge() throws NoSuchAlgorithmException, IOException {
ArgumentCaptor<Path> path = ArgumentCaptor.forClass(Path.class);
when(mockFileSystem.create(path.capture())).thenReturn(mockFSDataOutputStream);
HdfsLimitOutputStream out = new HdfsLimitOutputStream(mockFileSystem, 2);
byte[] data = createMockData(11);
out.write(data[0]);
out.write(data, 1, 2);
out.write(Arrays.copyOfRange(data, 3, 10));
out.write(data[10]);
out.flush();
out.close();
assertEquals(true, out.hasExceededSizeLimit());
assertEquals(null, out.getSmall());
assertEquals("urn\u001Fsha256\u001F78a6273103d17c39a0b6126e226cec70e33337f4bc6a38067401b54a33e78ead", out.getRowKey());
assertEquals(path.getValue(), out.getHdfsPath());
}
private byte[] createMockData(int len) {
byte[] data = new byte[len];
for (int i = 0; i < len; i++) {
data[i] = (byte) i;
}
return data;
}
}