/**
* This file is part of muCommander, http://www.mucommander.com
* Copyright (C) 2002-2016 Maxence Bernard
*
* muCommander is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* muCommander is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.mucommander.commons.file;
import java.io.IOException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import org.testng.annotations.Test;
/**
* An {@link AbstractFileTest} implementation for {@link ProxyFile}, with some additional
* test methods.
*
* @author Maxence Bernard
*/
public class ProxyFileTest extends AbstractFileTest {
////////////////////////////////////
// ConditionalTest implementation //
////////////////////////////////////
public boolean isEnabled() {
return true;
}
/////////////////////////////////////
// AbstractFileTest implementation //
/////////////////////////////////////
@Override
public AbstractFile getTemporaryFile() throws IOException {
// Returns a ProxyFile instance proxying a LocalFile ; the kind of proxied file should not matter as long as it
// passes AbstractFileTest.
return new ProxyFile(FileFactory.getTemporaryFile(getClass().getName(), false)) {
// Note: a ProxyFile with no overridden method serves absolutely no purpose whatsoever
};
}
@Override
public FileOperation[] getSupportedOperations() {
return new FileOperation[] {
FileOperation.READ_FILE,
FileOperation.RANDOM_READ_FILE,
FileOperation.WRITE_FILE,
FileOperation.APPEND_FILE,
FileOperation.RANDOM_WRITE_FILE,
FileOperation.CREATE_DIRECTORY,
FileOperation.LIST_CHILDREN,
FileOperation.DELETE,
FileOperation.RENAME,
FileOperation.CHANGE_DATE,
FileOperation.CHANGE_PERMISSION,
FileOperation.GET_FREE_SPACE,
FileOperation.GET_TOTAL_SPACE
};
}
////////////////////////
// Overridden methods //
////////////////////////
//@Test
@Override
public void testUnsupportedFileOperationAnnotations() throws Exception {
}
//@Test
@Override
public void testSupportedFileOperations() throws Exception {
}
//@Test
@Override
public void testFileInstanceCaching() throws Exception {
// This test can't pass as ProxyFile instance are not cached, only the underlying protocol file.
}
/////////////////////////////
// Additional test methods //
/////////////////////////////
/**
* Asserts that all public, non-final and non-static <code>AbstractFile</code> methods are overridden by
* <code>ProxyFile</code>.
*/
@Test
public void testAllMethodsOverridden() {
Class<?> proxyFileClass = ProxyFile.class;
Class<?> abstractFileClass = AbstractFile.class;
// This array will contain all AbstractFile public methods, including the ones defined by parent classes
// (java.lang.Object), and including static and final ones.
Method abstractFileMethods[] = abstractFileClass.getMethods();
Method proxyFileMethod;
for (Method abstractFileMethod : abstractFileMethods) {
// Skip:
// - methods that are not declared by AbstractFile (e.g. java.lang.Object methods)
// - static methods
// - final methods
if (!abstractFileMethod.getDeclaringClass().equals(abstractFileClass)
|| (abstractFileMethod.getModifiers() & (Modifier.STATIC | Modifier.FINAL)) != 0)
continue;
try {
proxyFileMethod = proxyFileClass.getMethod(abstractFileMethod.getName(), abstractFileMethod.getParameterTypes());
}
catch (Exception e) { // NoSuchMethodException, SecurityException
proxyFileMethod = null;
}
assert proxyFileMethod != null && (proxyFileMethod.getDeclaringClass().equals(proxyFileClass)):
abstractFileMethod.getName() + " not overridden by " + proxyFileClass.getName();
}
}
}