blob: 374ebd11393e3f1a2041b9a8c05d8b579aa98a60 [file] [log] [blame]
package org.apache.samoa.streams.fs;
/*
* #%L
* SAMOA
* %%
* Copyright (C) 2014 - 2015 Apache Software Foundation
* %%
* 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.
* #L%
*/
import java.io.BufferedWriter;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.lang.SecurityException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.apache.commons.io.FileUtils;
import org.apache.samoa.streams.fs.LocalFileStreamSource;
public class LocalFileStreamSourceTest {
private static final String BASE_DIR = "localfsTest";
private static final int NUM_FILES_IN_DIR = 4;
private static final int NUM_NOISE_FILES_IN_DIR = 2;
private LocalFileStreamSource streamSource;
@Before
public void setUp() throws Exception {
streamSource = new LocalFileStreamSource();
}
@After
public void tearDown() throws Exception {
FileUtils.deleteDirectory(new File(BASE_DIR));
}
@Test
public void testInitWithSingleFileAndExtension() {
// write input file
writeSimpleFiles(BASE_DIR, "txt", 1);
// init with path to input file
File inFile = new File(BASE_DIR, "1.txt");
String inFilePath = inFile.getAbsolutePath();
streamSource.init(inFilePath, "txt");
// assertions
assertEquals("Size of filePaths is not correct.", 1, streamSource.getFilePathListSize(), 0);
String fn = streamSource.getFilePathAt(0);
assertEquals("Incorrect file in filePaths.", inFilePath, fn);
}
@Test
public void testInitWithSingleFileAndNullExtension() {
// write input file
writeSimpleFiles(BASE_DIR, "txt", 1);
// init with path to input file
File inFile = new File(BASE_DIR, "1.txt");
String inFilePath = inFile.getAbsolutePath();
streamSource.init(inFilePath, null);
// assertions
assertEquals("Size of filePaths is not correct.", 1, streamSource.getFilePathListSize(), 0);
String fn = streamSource.getFilePathAt(0);
assertEquals("Incorrect file in filePaths.", inFilePath, fn);
}
@Test
public void testInitWithFolderAndExtension() {
// write input file
writeSimpleFiles(BASE_DIR, null, NUM_NOISE_FILES_IN_DIR);
writeSimpleFiles(BASE_DIR, "txt", NUM_FILES_IN_DIR);
// init with path to input dir
File inDir = new File(BASE_DIR);
String inDirPath = inDir.getAbsolutePath();
streamSource.init(inDirPath, "txt");
// assertions
assertEquals("Size of filePaths is not correct.", NUM_FILES_IN_DIR, streamSource.getFilePathListSize(), 0);
Set<String> filenames = new HashSet<String>();
for (int i = 1; i <= NUM_FILES_IN_DIR; i++) {
String expectedFn = (new File(inDirPath, Integer.toString(i) + ".txt")).getAbsolutePath();
filenames.add(expectedFn);
}
for (int i = 0; i < NUM_FILES_IN_DIR; i++) {
String fn = streamSource.getFilePathAt(i);
assertTrue("Incorrect file in filePaths:" + fn, filenames.contains(fn));
}
}
@Test
public void testInitWithFolderAndNullExtension() {
// write input file
writeSimpleFiles(BASE_DIR, null, NUM_FILES_IN_DIR);
// init with path to input dir
File inDir = new File(BASE_DIR);
String inDirPath = inDir.getAbsolutePath();
streamSource.init(inDirPath, null);
// assertions
assertEquals("Size of filePaths is not correct.", NUM_FILES_IN_DIR, streamSource.getFilePathListSize(), 0);
Set<String> filenames = new HashSet<String>();
for (int i = 1; i <= NUM_FILES_IN_DIR; i++) {
String expectedFn = (new File(inDirPath, Integer.toString(i))).getAbsolutePath();
filenames.add(expectedFn);
}
for (int i = 0; i < NUM_FILES_IN_DIR; i++) {
String fn = streamSource.getFilePathAt(i);
assertTrue("Incorrect file in filePaths:" + fn, filenames.contains(fn));
}
}
/*
* getNextInputStream tests
*/
@Test
public void testGetNextInputStream() {
// write input files & noise files
writeSimpleFiles(BASE_DIR, "txt", NUM_FILES_IN_DIR);
// init with path to input dir
streamSource.init(BASE_DIR, "txt");
// call getNextInputStream & assertions
Set<String> contents = new HashSet<String>();
for (int i = 1; i <= NUM_FILES_IN_DIR; i++) {
contents.add(Integer.toString(i));
}
for (int i = 0; i < NUM_FILES_IN_DIR; i++) {
InputStream inStream = streamSource.getNextInputStream();
assertNotNull("Unexpected end of input stream list.", inStream);
BufferedReader rd = new BufferedReader(new InputStreamReader(inStream));
String inputRead = null;
try {
inputRead = rd.readLine();
} catch (IOException ioe) {
fail("Fail reading from stream at index:" + i + ioe.getMessage());
}
assertTrue("File content is incorrect.", contents.contains(inputRead));
Iterator<String> it = contents.iterator();
while (it.hasNext()) {
if (it.next().equals(inputRead)) {
it.remove();
break;
}
}
}
// assert that another call to getNextInputStream will return null
assertNull("Call getNextInputStream after the last file did not return null.", streamSource.getNextInputStream());
}
/*
* getCurrentInputStream tests
*/
public void testGetCurrentInputStream() {
// write input files & noise files
writeSimpleFiles(BASE_DIR, "txt", NUM_FILES_IN_DIR);
// init with path to input dir
streamSource.init(BASE_DIR, "txt");
// call getNextInputStream, getCurrentInputStream & assertions
for (int i = 0; i <= NUM_FILES_IN_DIR; i++) { // test also after-end-of-list
InputStream inStream1 = streamSource.getNextInputStream();
InputStream inStream2 = streamSource.getCurrentInputStream();
assertSame("Incorrect current input stream.", inStream1, inStream2);
}
}
/*
* reset tests
*/
public void testReset() {
// write input files & noise files
writeSimpleFiles(BASE_DIR, "txt", NUM_FILES_IN_DIR);
// init with path to input dir
streamSource.init(BASE_DIR, "txt");
// Get the first input string
InputStream firstInStream = streamSource.getNextInputStream();
String firstInput = null;
assertNotNull("Unexpected end of input stream list.", firstInStream);
BufferedReader rd1 = new BufferedReader(new InputStreamReader(firstInStream));
try {
firstInput = rd1.readLine();
} catch (IOException ioe) {
fail("Fail reading from stream at index:0" + ioe.getMessage());
}
// call getNextInputStream a few times
streamSource.getNextInputStream();
// call reset, call next, assert that output is 1 (the first file)
try {
streamSource.reset();
} catch (IOException ioe) {
fail("Fail resetting stream source." + ioe.getMessage());
}
InputStream inStream = streamSource.getNextInputStream();
assertNotNull("Unexpected end of input stream list.", inStream);
BufferedReader rd2 = new BufferedReader(new InputStreamReader(inStream));
String inputRead = null;
try {
inputRead = rd2.readLine();
} catch (IOException ioe) {
fail("Fail reading from stream at index:0" + ioe.getMessage());
}
assertEquals("File content is incorrect.", firstInput, inputRead);
}
private void writeSimpleFiles(String path, String ext, int numOfFiles) {
// Create folder
File folder = new File(path);
if (!folder.exists()) {
try {
folder.mkdir();
} catch (SecurityException se) {
fail("Failed creating directory:" + path + se);
}
}
// Write files
for (int i = 1; i <= numOfFiles; i++) {
String fn = null;
if (ext != null) {
fn = Integer.toString(i) + "." + ext;
} else {
fn = Integer.toString(i);
}
try {
FileWriter fwr = new FileWriter(new File(path, fn));
fwr.write(Integer.toString(i));
fwr.close();
} catch (IOException ioe) {
fail("Fail writing to input file: " + fn + " in directory: " + path + ioe.getMessage());
}
}
}
}