package org.ovirt.engine.core.bll.quota;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import org.junit.experimental.theories.DataPoints;
import org.junit.experimental.theories.Theories;
import org.junit.experimental.theories.Theory;
import org.junit.runner.RunWith;
import org.ovirt.engine.core.bll.CommandBase;
import org.ovirt.engine.core.bll.CommandsFactory;
import org.ovirt.engine.core.bll.InternalCommandAttribute;
import org.ovirt.engine.core.common.action.VdcActionType;
@RunWith(Theories.class)
public class QuotaDependencyTest {
@DataPoints
public static VdcActionType[] data() {
return VdcActionType.values();
}
@Theory
public void quotaDependencyTest(VdcActionType vdcActionType) {
if (vdcActionType.getQuotaDependency() != VdcActionType.QuotaDependency.NONE) {
Class commandClass = CommandsFactory.getCommandClass(vdcActionType.name());
// if command is deprecated or internal - skip it
if (commandClass.getAnnotation(Deprecated.class) != null
|| commandClass.getAnnotation(InternalCommandAttribute.class) != null) {
return;
}
switch (vdcActionType.getQuotaDependency()) {
case CLUSTER:
assertCommandIsQuotaVdsDependent(commandClass);
break;
case STORAGE:
assertCommandIsQuotaStorageDependent(commandClass);
break;
case BOTH:
assertCommandIsQuotaVdsDependent(commandClass);
assertCommandIsQuotaStorageDependent(commandClass);
break;
default:
break;
}
}
}
private void assertCommandIsQuotaStorageDependent(Class commandClass) {
assertTrue(String.format("The command %s was expected to implement QuotaStorageDependent interface",
commandClass.getName()),
isImplementingRecursive(commandClass, QuotaStorageDependent.class));
}
private void assertCommandIsQuotaVdsDependent(Class commandClass) {
assertTrue(String.format("The command %s was expected to implement QuotaVdsDependent interface",
commandClass.getName()),
isImplementingRecursive(commandClass, QuotaVdsDependent.class));
}
private boolean isImplementingRecursive(Class commandClass, Class interfaceClass) {
if (Arrays.asList(commandClass.getInterfaces()).contains(interfaceClass)) {
return true;
} else {
return !commandClass.getSuperclass().equals(CommandBase.class)
&& isImplementingRecursive(commandClass.getSuperclass(), interfaceClass);
}
}
}