/*
* RHQ Management Platform
* Copyright (C) 2005-2008 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 2 of the License.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.enterprise.communications.util;
import java.io.Serializable;
import org.testng.annotations.Test;
import org.rhq.core.util.stream.StreamUtil;
import org.rhq.enterprise.communications.command.CommandResponse;
import org.rhq.enterprise.communications.command.CommandType;
import org.rhq.enterprise.communications.command.client.CommandAndCallback;
import org.rhq.enterprise.communications.command.client.CommandResponseCallback;
import org.rhq.enterprise.communications.command.impl.generic.GenericCommand;
import org.rhq.enterprise.communications.command.param.ParameterDefinition;
import org.rhq.enterprise.communications.command.param.ParameterRenderingInformation;
/**
* Tests that commands can be serialized.
*
* @author John Mazzitelli
*/
@Test
public class CommandSerializationTest {
/**
* Tests serializing commands.
*
* @throws Exception
*/
public void testSerializeCommands() throws Exception {
GenericCommand gc = new GenericCommand();
ParameterDefinition def = new ParameterDefinition("hello", String.class.getName(),
new ParameterRenderingInformation("a", "b"));
gc.setCommandType(new CommandType("foo", 3));
gc.setParameterDefinitions(new ParameterDefinition[] { def });
gc.setParameterValue("hello", "world");
gc.getConfiguration().put("config1", "config1value");
gc.getConfiguration().put("config2", "config2value");
gc = (GenericCommand) serializeDeserialize(gc);
assert gc.getCommandType().equals(new CommandType("foo", 3));
assert gc.getParameterDefinition("hello").getType().equals(String.class.getName());
assert gc.getParameterDefinition("hello").getRenderingInfo().getLabelKey().equals("a");
assert gc.getParameterDefinition("hello").getRenderingInfo().getDescriptionKey().equals("b");
assert gc.getParameterValue("hello").equals("world");
assert gc.getConfiguration().getProperty("config1").equals("config1value");
assert gc.getConfiguration().getProperty("config2").equals("config2value");
return;
}
/**
* Tests serializing commands.
*
* @throws Exception
*/
public void testSerializeCommandsWithNoConfig() throws Exception {
GenericCommand gc = new GenericCommand();
ParameterDefinition def = new ParameterDefinition("hello", String.class.getName(),
new ParameterRenderingInformation("a", "b"));
gc.setCommandType(new CommandType("foo", 3));
gc.setParameterDefinitions(new ParameterDefinition[] { def });
gc.setParameterValue("hello", "world");
gc = (GenericCommand) serializeDeserialize(gc);
assert gc.getCommandType().equals(new CommandType("foo", 3));
assert gc.getParameterDefinition("hello").getType().equals(String.class.getName());
assert gc.getParameterDefinition("hello").getRenderingInfo().getLabelKey().equals("a");
assert gc.getParameterDefinition("hello").getRenderingInfo().getDescriptionKey().equals("b");
assert gc.getParameterValue("hello").equals("world");
return;
}
/**
* Tests serializing commands and callbacks.
*/
public void testSerializeCommandAndCallback() {
GenericCommand gc = new GenericCommand();
CommandAndCallback cnc = new CommandAndCallback(gc, new DummyCommandResponseCallback());
cnc = (CommandAndCallback) serializeDeserialize(cnc);
assert cnc.getCommand() != null;
assert cnc.getCallback() != null;
assert ((DummyCommandResponseCallback) cnc.getCallback()).foo.equals("bar");
return;
}
/**
* Serializes and then deserializes object and returns the reconstituted object. After the deserialization, this
* method does not check for object equality but it does check that the reconstituted object is not the same as
* <code>o</code> (that is, the returned object != <code>o</code>).
*
* @param o object to test
*
* @return the object after its been serialized and then deserialized
*/
private Object serializeDeserialize(Serializable o) {
byte[] b = StreamUtil.serialize(o);
assert b != null;
Object o2 = StreamUtil.deserialize(b);
assert o2 != null;
assert o != o2;
return o2;
}
}
/**
* Just a dummy callback that we will use to ensure callbacks are serializable.
*/
class DummyCommandResponseCallback implements CommandResponseCallback {
private static final long serialVersionUID = 1L;
/**
* We will use this to check its value after serialization to make sure its reconstituted successfully
*/
public String foo = "bar";
/**
* @see CommandResponseCallback#commandSent(CommandResponse)
*/
public void commandSent(CommandResponse response) {
}
}