// // Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you 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.cloud.agent.api; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.Arrays; import java.util.Map; import net.nuage.vsp.acs.client.api.model.Protocol; import net.nuage.vsp.acs.client.api.model.VspAclRule; import net.nuage.vsp.acs.client.api.model.VspNetwork; import org.junit.Assert; import org.junit.Test; import com.google.common.collect.Maps; import com.google.common.testing.EqualsTester; import com.google.gson.Gson; import com.cloud.agent.api.element.ApplyAclRuleVspCommand; import com.cloud.agent.api.element.ApplyStaticNatVspCommand; import com.cloud.agent.api.element.ImplementVspCommand; import com.cloud.agent.api.element.ShutDownVpcVspCommand; import com.cloud.agent.api.guru.DeallocateVmVspCommand; import com.cloud.agent.api.guru.ImplementNetworkVspCommand; import com.cloud.agent.api.guru.ReserveVmInterfaceVspCommand; import com.cloud.agent.api.guru.TrashNetworkVspCommand; import com.cloud.agent.api.manager.EntityExistsCommand; import com.cloud.agent.api.manager.SupportedApiVersionCommand; import com.cloud.agent.api.sync.SyncDomainCommand; import com.cloud.agent.api.sync.SyncNuageVspCmsIdCommand; import com.cloud.serializer.GsonHelper; import static org.hamcrest.core.Is.is; public class CommandsTest { private static final Gson s_gson = GsonHelper.getGson(); private EqualsTester tester = new EqualsTester(); @Test public void testCommandEquals() throws IllegalAccessException, InvocationTargetException, InstantiationException { addCommandEqualityGroup(ApplyAclRuleVspCommand.class); addCommandEqualityGroup(ImplementVspCommand.class); addCommandEqualityGroup(ApplyStaticNatVspCommand.class); addCommandEqualityGroup(ShutDownVpcVspCommand.class); addCommandEqualityGroup(DeallocateVmVspCommand.class); addCommandEqualityGroup(ImplementNetworkVspCommand.class); addCommandEqualityGroup(ReserveVmInterfaceVspCommand.class); addCommandEqualityGroup(TrashNetworkVspCommand.class); addCommandEqualityGroup(SyncDomainCommand.class); addCommandEqualityGroup(SyncNuageVspCmsIdCommand.class); addCommandEqualityGroup(PingNuageVspCommand.class); SupportedApiVersionCommand supportedApiVersionCommandA = new SupportedApiVersionCommand("3.2"); SupportedApiVersionCommand supportedApiVersionCommandB = new SupportedApiVersionCommand("3.2"); EntityExistsCommand entityExistsCommandA = new EntityExistsCommand(Command.class, "uuid"); EntityExistsCommand entityExistsCommandB = new EntityExistsCommand(Command.class, "uuid"); tester .addEqualityGroup(supportedApiVersionCommandA, supportedApiVersionCommandB) .addEqualityGroup(entityExistsCommandA, entityExistsCommandB) .testEquals(); } @Test public void testCommandGsonEquals() throws IllegalAccessException, InvocationTargetException, InstantiationException { addCommandGsonEqualityGroup(ApplyAclRuleVspCommand.class); addCommandGsonEqualityGroup(ImplementVspCommand.class); addCommandGsonEqualityGroup(ApplyStaticNatVspCommand.class); addCommandGsonEqualityGroup(ShutDownVpcVspCommand.class); addCommandGsonEqualityGroup(DeallocateVmVspCommand.class); addCommandGsonEqualityGroup(ImplementNetworkVspCommand.class); addCommandGsonEqualityGroup(ReserveVmInterfaceVspCommand.class); addCommandGsonEqualityGroup(TrashNetworkVspCommand.class); addCommandGsonEqualityGroup(new SupportedApiVersionCommand("3.2")); addCommandGsonEqualityGroup(SyncDomainCommand.class); addCommandGsonEqualityGroup(SyncNuageVspCmsIdCommand.class); addCommandGsonEqualityGroup(PingNuageVspCommand.class); addCommandGsonEqualityGroup(new EntityExistsCommand(Command.class, "uuid")); tester.testEquals(); } @Test public void testApplyAclRuleVspCommandGsonEquals() throws IllegalAccessException, InvocationTargetException, InstantiationException { VspNetwork vspNetwork = new VspNetwork.Builder() .id(1) .uuid("uuid") .name("name") .cidr("192.168.1.0/24") .gateway("192.168.1.1") .build(); VspAclRule aclRule = new VspAclRule.Builder() .action(VspAclRule.ACLAction.Allow) .uuid("uuid") .trafficType(VspAclRule.ACLTrafficType.Egress) .protocol(Protocol.TCP) .startPort(80) .endPort(80) .priority(1) .state(VspAclRule.ACLState.Active) .build(); ApplyAclRuleVspCommand before = new ApplyAclRuleVspCommand(VspAclRule.ACLType.NetworkACL, vspNetwork, Arrays.asList(aclRule), false); ApplyAclRuleVspCommand after = serializeAndDeserialize(before); Assert.assertThat(after.getAclRules().get(0).getProtocol().hasPort(), is(Protocol.TCP.hasPort())); } private <T extends Command> T serializeAndDeserialize(T command) { Command[] forwardedCommands = s_gson.fromJson(s_gson.toJson(new Command[] { command }), Command[].class); return (T) forwardedCommands[0]; } private <T extends Command> void addCommandGsonEqualityGroup(Class<T> clazz) throws IllegalAccessException, InvocationTargetException, InstantiationException{ addCommandGsonEqualityGroup(fillObject(clazz)); } private <T extends Command> void addCommandGsonEqualityGroup(Command command) throws IllegalAccessException, InvocationTargetException, InstantiationException{ Command[] forwardedCommands = s_gson.fromJson(s_gson.toJson(new Command[] { command }), Command[].class); Assert.assertEquals(command, forwardedCommands[0]); tester.addEqualityGroup(command, forwardedCommands[0]); } private <T extends Command> void addCommandEqualityGroup(Class<T> clazz) throws IllegalAccessException, InvocationTargetException, InstantiationException { Command a = fillObject(clazz); Command b = fillObject(clazz); tester.addEqualityGroup(a, b); } private <T> T fillObject(Class<T> clazz) throws IllegalAccessException, InvocationTargetException, InstantiationException { Constructor constructor = clazz.getDeclaredConstructors()[0]; Object[] constructorArgs = new Object[constructor.getParameterTypes().length]; for (int i = 0; i < constructor.getParameterTypes().length; i++) { Class constructorArgType = constructor.getParameterTypes()[i]; if (isNumericType(constructorArgType)) { constructorArgs[i] = constructorArgType.getName().length(); } else if (String.class.isAssignableFrom(constructorArgType)) { constructorArgs[i] = constructorArgType.getName(); } else if (Boolean.class.isAssignableFrom(constructorArgType) || boolean.class.isAssignableFrom(constructorArgType)) { constructorArgs[i] = constructorArgType.getName().length() % 2 == 0; } else if (Map.class.isAssignableFrom(constructorArgType)) { constructorArgs[i] = Maps.newHashMap(); } else { constructorArgs[i] = null; } } return (T) constructor.newInstance(constructorArgs); } private boolean isNumericType(Class type) { return Number.class.isAssignableFrom(type) || int.class.isAssignableFrom(type) || long.class.isAssignableFrom(type); } }