/*
* Copyright (C) 2011 The Android Open Source Project
*
* 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 com.android.sdklib.io;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;
import junit.framework.TestCase;
/**
* Unit-test for the {@link MockFileOp}, which is a mock of {@link FileOp} that doesn't
* touch the file system. Just testing the test.
*/
public class MockFileOpTest extends TestCase {
private MockFileOp m;
@Override
protected void setUp() throws Exception {
super.setUp();
m = new MockFileOp();
}
private File createFile(String...segments) {
File f = null;
for (String segment : segments) {
if (f == null) {
f = new File(segment);
} else {
f = new File(f, segment);
}
}
return f;
}
public void testIsFile() {
File f1 = createFile("/dir1", "file1");
assertFalse(m.isFile(f1));
m.recordExistingFile("/dir1/file1");
assertTrue(m.isFile(f1));
assertEquals(
"[/dir1/file1]",
Arrays.toString(m.getExistingFiles()));
}
public void testIsDirectory() {
File d4 = createFile("/dir1", "dir2", "dir3", "dir4");
File f7 = createFile("/dir1", "dir2", "dir6", "file7");
assertFalse(m.isDirectory(d4));
m.recordExistingFolder("/dir1/dir2/dir3/dir4");
m.recordExistingFile("/dir1/dir2/dir6/file7");
assertTrue(m.isDirectory(d4));
assertFalse(m.isDirectory(f7));
// any intermediate directory exists implicitly
assertTrue(m.isDirectory(createFile("/")));
assertTrue(m.isDirectory(createFile("/dir1")));
assertTrue(m.isDirectory(createFile("/dir1", "dir2")));
assertTrue(m.isDirectory(createFile("/dir1", "dir2", "dir3")));
assertTrue(m.isDirectory(createFile("/dir1", "dir2", "dir6")));
assertEquals(
"[/dir1/dir2/dir3/dir4]",
Arrays.toString(m.getExistingFolders()));
}
public void testDelete() {
m.recordExistingFolder("/dir1");
m.recordExistingFile("/dir1/file1");
m.recordExistingFile("/dir1/file2");
assertEquals(
"[/dir1/file1, /dir1/file2]",
Arrays.toString(m.getExistingFiles()));
assertTrue(m.delete(createFile("/dir1", "file1")));
assertFalse(m.delete(createFile("/dir1", "file3")));
assertFalse(m.delete(createFile("/dir2", "file2")));
assertEquals(
"[/dir1/file2]",
Arrays.toString(m.getExistingFiles()));
// deleting a directory with files in it fails
assertFalse(m.delete(createFile("/dir1")));
// but it works if the directory is empty
assertTrue(m.delete(createFile("/dir1", "file2")));
assertTrue(m.delete(createFile("/dir1")));
}
public void testListFiles() {
m.recordExistingFolder("/dir1");
m.recordExistingFile("/dir1/file1");
m.recordExistingFile("/dir1/file2");
m.recordExistingFile("/dir1/dir2/file3");
m.recordExistingFile("/dir4/file4");
assertEquals(
"[]",
m.getAgnosticAbsPath(Arrays.toString(m.listFiles(createFile("/not_a_dir")))));
assertEquals(
"[/dir1/dir2/file3]",
m.getAgnosticAbsPath(Arrays.toString(m.listFiles(createFile("/dir1", "dir2")))));
assertEquals(
"[/dir1/dir2/file3, /dir1/file1, /dir1/file2]",
m.getAgnosticAbsPath(Arrays.toString(m.listFiles(createFile("/dir1")))));
}
public void testMkDirs() {
assertEquals("[]", Arrays.toString(m.getExistingFolders()));
assertTrue(m.mkdirs(createFile("/dir1")));
assertEquals("[/, /dir1]", Arrays.toString(m.getExistingFolders()));
m.recordExistingFolder("/dir1");
assertEquals("[/, /dir1]", Arrays.toString(m.getExistingFolders()));
assertTrue(m.mkdirs(createFile("/dir1/dir2/dir3")));
assertEquals(
"[/, /dir1, /dir1/dir2, /dir1/dir2/dir3]",
Arrays.toString(m.getExistingFolders()));
}
public void testRenameTo() {
m.recordExistingFile("/dir1/dir2/dir6/file7");
m.recordExistingFolder("/dir1/dir2/dir3/dir4");
assertEquals("[/dir1/dir2/dir6/file7]", Arrays.toString(m.getExistingFiles()));
assertEquals("[/dir1/dir2/dir3/dir4]", Arrays.toString(m.getExistingFolders()));
assertTrue(m.renameTo(createFile("/dir1", "dir2"), createFile("/dir1", "newDir2")));
assertEquals("[/dir1/newDir2/dir6/file7]", Arrays.toString(m.getExistingFiles()));
assertEquals("[/dir1/newDir2/dir3/dir4]", Arrays.toString(m.getExistingFolders()));
assertTrue(m.renameTo(
createFile("/dir1", "newDir2", "dir6", "file7"),
createFile("/dir1", "newDir2", "dir6", "newFile7")));
assertTrue(m.renameTo(
createFile("/dir1", "newDir2", "dir3", "dir4"),
createFile("/dir1", "newDir2", "dir3", "newDir4")));
assertEquals("[/dir1/newDir2/dir6/newFile7]", Arrays.toString(m.getExistingFiles()));
assertEquals("[/dir1/newDir2/dir3/newDir4]", Arrays.toString(m.getExistingFolders()));
}
public void testNewFileOutputStream() throws Exception {
assertEquals("[]", Arrays.toString(m.getOutputStreams()));
File f = createFile("/dir1", "dir2", "simple ascii");
OutputStream os = m.newFileOutputStream(f);
assertNotNull(os);
os.write("regular ascii".getBytes("UTF-8"));
os.close();
f = createFile("/dir1", "dir2", "utf-8 test");
os = m.newFileOutputStream(f);
assertNotNull(os);
os.write("nihongo in UTF-8: 日本語".getBytes("UTF-8"));
os.close();
f = createFile("/dir1", "dir2", "forgot to close");
os = m.newFileOutputStream(f);
assertNotNull(os);
os.write("wrote stuff but not closing the stream".getBytes("UTF-8"));
assertEquals(
"[</dir1/dir2/simple ascii: 'regular ascii'>, " +
"</dir1/dir2/utf-8 test: 'nihongo in UTF-8: 日本語'>, " +
"</dir1/dir2/forgot to close: (stream not closed properly)>]",
Arrays.toString(m.getOutputStreams()));
}
public void testMakeRelative() throws Exception {
assertEquals("dir3",
FileOp.makeRelativeImpl("/dir1/dir2",
"/dir1/dir2/dir3",
false, "/"));
assertEquals("../../../dir3",
FileOp.makeRelativeImpl("/dir1/dir2/dir4/dir5/dir6",
"/dir1/dir2/dir3",
false, "/"));
assertEquals("dir3/dir4/dir5/dir6",
FileOp.makeRelativeImpl("/dir1/dir2/",
"/dir1/dir2/dir3/dir4/dir5/dir6",
false, "/"));
// case-sensitive on non-Windows.
assertEquals("../DIR2/dir3/DIR4/dir5/DIR6",
FileOp.makeRelativeImpl("/dir1/dir2/",
"/dir1/DIR2/dir3/DIR4/dir5/DIR6",
false, "/"));
// same path: empty result.
assertEquals("",
FileOp.makeRelativeImpl("/dir1/dir2/dir3",
"/dir1/dir2/dir3",
false, "/"));
// same drive letters on Windows
assertEquals("..\\..\\..\\dir3",
FileOp.makeRelativeImpl("C:\\dir1\\dir2\\dir4\\dir5\\dir6",
"C:\\dir1\\dir2\\dir3",
true, "\\"));
// not case-sensitive on Windows, results will be mixed.
assertEquals("dir3/DIR4/dir5/DIR6",
FileOp.makeRelativeImpl("/DIR1/dir2/",
"/dir1/DIR2/dir3/DIR4/dir5/DIR6",
true, "/"));
// UNC path on Windows
assertEquals("..\\..\\..\\dir3",
FileOp.makeRelativeImpl("\\\\myserver.domain\\dir1\\dir2\\dir4\\dir5\\dir6",
"\\\\myserver.domain\\dir1\\dir2\\dir3",
true, "\\"));
// different drive letters are not supported
try {
FileOp.makeRelativeImpl("C:\\dir1\\dir2\\dir4\\dir5\\dir6",
"D:\\dir1\\dir2\\dir3",
true, "\\");
fail("Expected: IOException. Actual: no exception.");
} catch (IOException e) {
assertEquals("makeRelative: incompatible drive letters", e.getMessage());
}
}
}