/*
* Copyright (C) 2014 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.repository.local;
import com.android.sdklib.io.FileOp;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
import junit.framework.TestCase;
public class LocalDirInfoTest extends TestCase {
private final FileOp mFOp = new FileOp();
private File mTempDir;
@Override
protected void setUp() throws Exception {
super.setUp();
mTempDir = File.createTempFile("test", "dir");
assertTrue(mTempDir.delete());
assertTrue(mTempDir.mkdirs());
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
mFOp.deleteFileOrFolder(mTempDir);
mTempDir = null;
}
// Test: start with empty directory, removing the dir marks it as changed.
public final void testHasChanged_Empty() {
LocalDirInfo di = new LocalDirInfo(mFOp, mTempDir);
assertFalse(di.hasChanged());
// Removing the dir marks it as changed
mFOp.deleteFileOrFolder(mTempDir);
assertTrue(di.hasChanged());
}
// Test: start with empty directory, adding a file marks it as changed.
public final void testHasChanged_AddFile() throws Exception {
LocalDirInfo di = new LocalDirInfo(mFOp, mTempDir);
assertFalse(di.hasChanged());
// Adding a file inside the dir marks it as changed
createFileContent(mTempDir, "some_file.txt", "whatever content");
assertTrue(di.hasChanged());
}
// Test: removing any file marks it as changed.
public final void testHasChanged_RemoveFile() throws Exception {
File f = createFileContent(mTempDir, "some_file.txt", "whatever content");
LocalDirInfo di = new LocalDirInfo(mFOp, mTempDir);
assertFalse(di.hasChanged());
// Removing a file inside the dir marks it as changed
mFOp.deleteFileOrFolder(f);
assertTrue(di.hasChanged());
}
// Test: start with empty directory, adding a directory marks it as changed.
public final void testHasChanged_AddDir() throws Exception {
LocalDirInfo di = new LocalDirInfo(mFOp, mTempDir);
assertFalse(di.hasChanged());
// Adding a file inside the dir marks it as changed
File dir = new File(mTempDir, "some_dir");
assertTrue(dir.mkdirs());
assertTrue(di.hasChanged());
}
// Test: removing any directory marks it as changed.
public final void testHasChanged_RemoveDir() throws Exception {
File dir = new File(mTempDir, "some_dir");
assertTrue(dir.mkdirs());
LocalDirInfo di = new LocalDirInfo(mFOp, mTempDir);
assertFalse(di.hasChanged());
// Removing a dir marks it as changed
mFOp.deleteFileOrFolder(dir);
assertTrue(di.hasChanged());
}
// Test: directory that contains a source.properties, change source.properties's content
public final void testHasChanged_SourceProps_Changed() throws Exception {
createFileContent(mTempDir, "source.properties", "key=value");
LocalDirInfo di = new LocalDirInfo(mFOp, mTempDir);
assertFalse(di.hasChanged());
// Change source.properties's content
createFileContent(mTempDir, "source.properties", "other_key=other_value");
assertTrue(di.hasChanged());
}
// Test: directory that contains a source.properties, change source.properties's timestamp
public final void testHasChanged_SourceProps_Timestamp() throws Exception {
createFileContent(mTempDir, "source.properties", "key=value");
LocalDirInfo di = new LocalDirInfo(mFOp, mTempDir);
assertFalse(di.hasChanged());
// Recreate source.properties with the same content, this changes its timestamp.
// Note: the last-modified resolution on Linux is 1 second on ext3/ext4 file systems
// so we need at least 1 second in between both edits other they will have the same
// last-modified value.
Thread.sleep(1100);
createFileContent(mTempDir, "source.properties", "key=value");
assertTrue(di.hasChanged());
}
// Test: directory that contains a source.properties, change delete source.properties
public final void testHasChanged_SourceProps_Deleted() throws Exception {
File sp = createFileContent(mTempDir, "source.properties", "key=value");
LocalDirInfo di = new LocalDirInfo(mFOp, mTempDir);
assertFalse(di.hasChanged());
// Removing the source.properties marks it as changed
mFOp.deleteFileOrFolder(sp);
assertTrue(di.hasChanged());
}
//---- Helpers
// Creates a new file with the specified name, in the specified
// parent directory with the given UTF-8 content.
private static File createFileContent(File parentDir,
String fileName,
String fileContent) throws IOException {
File f = new File(parentDir, fileName);
OutputStreamWriter fw = new OutputStreamWriter(new FileOutputStream(f),
Charset.forName("UTF-8"));
try {
fw.write(fileContent);
} finally {
fw.close();
}
return f;
}
}