/*
This file is part of Reactive Cascade which is released under The MIT License.
See license.md , https://github.com/futurice/cascade and http://reactivecascade.com for details.
This is open source for the common good. Please contribute improvements by pull request or contact paulirotta@gmail.com
*/
package com.reactivecascade.util;
import android.content.Context;
import android.support.annotation.NonNull;
import android.test.mock.MockContext;
import android.test.suitebuilder.annotation.LargeTest;
import com.reactivecascade.AsyncAndroidTestCase;
import org.junit.Before;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
*/
public class FileUtilTest extends AsyncAndroidTestCase {
private static final String TEST_FILE_NAME = "TESTfileNAME.txt";
private static final String TEST_CODE = "TESTcode";
final AsyncMockContext mockContext = new AsyncMockContext();
private FileUtil mockFileUtil;
public FileUtilTest() {
super();
}
@Before
@Override
public void setUp() throws Exception {
super.setUp();
mockFileUtil = new FileUtil(mockContext, Context.MODE_PRIVATE);
}
@LargeTest
public void testMockWriteShouldAccessFileSystemOnce() {
mockFileUtil.write("someFile", "something to write".getBytes());
assertEquals(1, mockContext.fileOpens);
assertEquals(1, mockContext.fileWrites);
}
@LargeTest
public void testMockReadFileShouldAccessFileSystemOnce() {
mockFileUtil.read("someFile");
assertEquals(1, mockContext.fileOpens);
assertEquals(3, mockContext.fileBufferReads);
assertEquals(2, mockContext.fileReads);
}
@LargeTest
public void testMockDeleteOfNonexistantFile() {
boolean response = mockFileUtil.delete("nonFile");
assertFalse(response);
assertEquals(0, mockContext.fileDeletes);
}
@LargeTest
public void testMockDeleteOfFile() {
boolean response = mockFileUtil.delete("someFile");
assertTrue(response);
assertEquals(1, mockContext.fileDeletes);
}
@LargeTest
public void testActualWriteReadDelete() {
getFileUtil().write(TEST_FILE_NAME, TEST_CODE.getBytes());
byte[] bytes = getFileUtil().read(TEST_FILE_NAME);
assertEquals(TEST_CODE, new String(bytes));
assertTrue(getFileUtil().delete(TEST_FILE_NAME));
assertFalse(getFileUtil().delete(TEST_FILE_NAME));
}
public class AsyncMockContext extends MockContext {
public int fileWrites = 0;
public int fileReads = 0;
public int fileBufferReads = 0;
public int fileDeletes = 0;
public int fileOpens = 0;
@Override // Context
public FileOutputStream openFileOutput(@NonNull String name, int mode) throws FileNotFoundException {
if (!name.equals("someFile")) {
throw new FileNotFoundException("No such file");
}
fileOpens++;
return new StubOutputStream();
}
@Override // Context
public FileInputStream openFileInput(@NonNull String name) throws FileNotFoundException {
if (!name.equals("someFile")) {
throw new FileNotFoundException("No such file");
}
fileOpens++;
return new StubInputStream();
}
@Override // Context
public boolean deleteFile(@NonNull String name) {
if (!name.equals("someFile")) {
return false;
}
fileDeletes++;
return true;
}
class StubOutputStream extends FileOutputStream {
public StubOutputStream() throws FileNotFoundException {
super(FileDescriptor.out);
}
// count number of calls, don't bother to really write something
@Override // OutputStream
public void write(@NonNull byte[] buffer) throws IOException {
fileWrites++;
}
}
class StubInputStream extends FileInputStream {
private final byte[] BUFFER_READ_SEQUENCE = new byte[]{45, 0, 33};
private int readPosition = 0;
public StubInputStream() throws FileNotFoundException {
super(FileDescriptor.in);
}
// count number of calls, don't bother to really write something
@Override // InputStream
public int read() throws IOException {
fileReads++;
return 12;
}
// count number of calls, don't bother to really write something
@Override // InputStream
public int read(@NonNull byte[] buffer, final int byteOffset, final int byteCount) throws IOException {
fileReads++;
int bytesRead = -1;
for (int i = byteOffset; readPosition < BUFFER_READ_SEQUENCE.length && i < byteOffset + byteCount; i++) {
buffer[i] = BUFFER_READ_SEQUENCE[readPosition++];
fileBufferReads++;
bytesRead = readPosition;
}
return bytesRead;
}
}
}
}