package org.cyclopsgroup.jmxterm.cmd; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.io.StringWriter; import java.util.Arrays; import java.util.concurrent.atomic.AtomicReference; import javax.management.Attribute; import javax.management.JMException; import javax.management.MBeanAttributeInfo; import javax.management.MBeanInfo; import javax.management.MBeanServerConnection; import javax.management.ObjectName; import org.cyclopsgroup.jmxterm.MockSession; import org.jmock.Expectations; import org.jmock.Mockery; import org.jmock.api.Invocation; import org.jmock.lib.action.CustomAction; import org.jmock.lib.legacy.ClassImposteriser; import org.junit.Before; import org.junit.Test; /** * Test case of {@link SetCommand} * * @author <a href="mailto:jiaqi.guo@gmail.com">Jiaqi Guo</a> */ public class SetCommandTest { private SetCommand command; private Mockery context; private StringWriter output; /** * Set up objects to test */ @Before public void setUp() { command = new SetCommand(); output = new StringWriter(); context = new Mockery(); context.setImposteriser( ClassImposteriser.INSTANCE ); } private void setValueAndVerify( String expr, final String type, final Object expected ) { command.setBean( "a:type=x" ); command.setArguments( Arrays.asList( "var", expr ) ); final MBeanServerConnection con = context.mock( MBeanServerConnection.class ); final MBeanInfo beanInfo = context.mock( MBeanInfo.class ); final MBeanAttributeInfo attributeInfo = context.mock( MBeanAttributeInfo.class ); final AtomicReference<Attribute> setAttribute = new AtomicReference<Attribute>(); try { context.checking( new Expectations() { { atLeast( 1 ).of( con ).getMBeanInfo( new ObjectName( "a:type=x" ) ); will( returnValue( beanInfo ) ); atLeast( 1 ).of( beanInfo ).getAttributes(); will( returnValue( new MBeanAttributeInfo[] { attributeInfo } ) ); atLeast( 1 ).of( attributeInfo ).getName(); will( returnValue( "var" ) ); atLeast( 1 ).of( attributeInfo ).getType(); will( returnValue( type ) ); atLeast( 1 ).of( attributeInfo ).isWritable(); will( returnValue( true ) ); one( con ).setAttribute( with( equal( new ObjectName( "a:type=x" ) ) ), (Attribute) with( a( Attribute.class ) ) ); will( doAll( new CustomAction( "SetAttribute" ) { public Object invoke( Invocation invocation ) throws Throwable { setAttribute.set( (Attribute) invocation.getParameter( 1 ) ); return null; } } ) ); } } ); command.setSession( new MockSession( output, con ) ); command.execute(); } catch ( IOException e ) { throw new RuntimeException( e ); } catch ( JMException e ) { throw new RuntimeException( e ); } context.assertIsSatisfied(); assertNotNull( setAttribute.get() ); assertEquals( "var", setAttribute.get().getName() ); assertEquals( expected, setAttribute.get().getValue() ); } /** * Test setting an integer */ @Test public void testExecuteNormally() { setValueAndVerify( "33", "int", 33 ); } /** * Test setting an empty string */ @Test public void testExecuteWithAnEmptyString() { setValueAndVerify( "\"\"", String.class.getName(), "" ); } /** * Test setting string with control character */ @Test public void testExecuteWithControlCharacter() { setValueAndVerify( "hello\\n", String.class.getName(), "hello\n" ); } /** * Test with negative number */ @Test public void testExecuteWithNegativeNumber() { setValueAndVerify( "-2", "int", -2 ); } /** * Test setting NULL string */ @Test public void testExecuteWithNullString() { setValueAndVerify( "null", String.class.getName(), null ); } /** * Test with quoted negative number */ @Test public void testExecuteWithQuotedNegativeNumber() { setValueAndVerify( "\"-2\"", "int", -2 ); } }