/** * Copyright 2017 Linagora, Université Joseph Fourier, Floralis * * The present code is developed in the scope of the joint LINAGORA - * Université Joseph Fourier - Floralis research program and is designated * as a "Result" pursuant to the terms and conditions of the LINAGORA * - Université Joseph Fourier - Floralis research program. Each copyright * holder of Results enumerated here above fully & independently holds complete * ownership of the complete Intellectual Property rights applicable to the whole * of said Results, and may freely exploit it in any manner which does not infringe * the moral rights of the other copyright holders. * * Licensed 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 net.roboconf.messaging.api.internal.jmx; import java.io.IOException; import java.util.Dictionary; import org.junit.Assert; import org.junit.Test; import org.mockito.Mockito; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceRegistration; import net.roboconf.core.model.beans.Application; import net.roboconf.messaging.api.extensions.IMessagingClient; import net.roboconf.messaging.api.extensions.MessagingContext; import net.roboconf.messaging.api.extensions.MessagingContext.RecipientKind; import net.roboconf.messaging.api.jmx.MessagingApiMBean; import net.roboconf.messaging.api.jmx.RoboconfMessageQueue; import net.roboconf.messaging.api.messages.Message; import net.roboconf.messaging.api.utils.MessagingUtils; import net.roboconf.messaging.api.utils.OsgiHelper; /** * @author Vincent Zurczak - Linagora */ public class JmxWrapperForMessagingClientTest { @Test public void testSimpleWrappedMethods() throws Exception { // We do not run in OSGi, but it should not raise any error IMessagingClient messagingClient = Mockito.mock( IMessagingClient.class ); JmxWrapperForMessagingClient client = new JmxWrapperForMessagingClient( messagingClient ); // Simple wrapped methods client.closeConnection(); client.deleteMessagingServerArtifacts( Mockito.mock( Application.class )); Assert.assertEquals( 0, client.getConfiguration().size()); client.openConnection(); client.subscribe( Mockito.mock( MessagingContext.class )); client.unsubscribe( Mockito.mock( MessagingContext.class )); Mockito.verify( messagingClient ).closeConnection();; Mockito.verify( messagingClient ).deleteMessagingServerArtifacts( Mockito.any( Application.class ));; Mockito.verify( messagingClient ).getConfiguration(); Mockito.verify( messagingClient ).openConnection(); Mockito.verify( messagingClient ).subscribe( Mockito.any( MessagingContext.class )); Mockito.verify( messagingClient ).unsubscribe( Mockito.any( MessagingContext.class )); Mockito.verifyNoMoreInteractions( messagingClient ); } @Test public void testPublish_success() throws Exception { // We do not run in OSGi, but it should not raise any error IMessagingClient messagingClient = Mockito.mock( IMessagingClient.class ); JmxWrapperForMessagingClient client = new JmxWrapperForMessagingClient( messagingClient ); // Publish Assert.assertEquals( 0, client.getSentMessagesCount()); Assert.assertEquals( 0, client.getTimestampOfLastSentMessage()); Assert.assertEquals( 0, client.getFailedSendingCount()); Assert.assertEquals( 0, client.getTimestampOfLastSendingFailure()); Assert.assertEquals( 0, client.getReceivedMessagesCount()); Assert.assertEquals( 0, client.getTimestampOfLastReceivedMessage()); Assert.assertEquals( 0, client.getFailedReceptionCount()); Assert.assertEquals( 0, client.getTimestampOfLastReceptionFailure()); client.publish( Mockito.mock( MessagingContext.class ), Mockito.mock( Message.class )); Mockito.verify( messagingClient ).publish( Mockito.any( MessagingContext.class ), Mockito.any( Message.class )); Assert.assertEquals( 1, client.getSentMessagesCount()); Assert.assertNotEquals( 0, client.getTimestampOfLastSentMessage()); Assert.assertEquals( 0, client.getFailedSendingCount()); Assert.assertEquals( 0, client.getTimestampOfLastSendingFailure()); Assert.assertEquals( 0, client.getReceivedMessagesCount()); Assert.assertEquals( 0, client.getTimestampOfLastReceivedMessage()); Assert.assertEquals( 0, client.getFailedReceptionCount()); Assert.assertEquals( 0, client.getTimestampOfLastReceptionFailure()); // Reset client.reset(); Assert.assertEquals( 0, client.getSentMessagesCount()); Assert.assertEquals( 0, client.getTimestampOfLastSentMessage()); Assert.assertEquals( 0, client.getFailedSendingCount()); Assert.assertEquals( 0, client.getTimestampOfLastSendingFailure()); Assert.assertEquals( 0, client.getReceivedMessagesCount()); Assert.assertEquals( 0, client.getTimestampOfLastReceivedMessage()); Assert.assertEquals( 0, client.getFailedReceptionCount()); Assert.assertEquals( 0, client.getTimestampOfLastReceptionFailure()); } @Test public void testPublish_sendingError() throws Exception { // We do not run in OSGi, but it should not raise any error IMessagingClient messagingClient = Mockito.mock( IMessagingClient.class ); JmxWrapperForMessagingClient client = new JmxWrapperForMessagingClient( messagingClient ); Mockito.doThrow( new IOException( "for test" )).when( messagingClient ).publish( Mockito.any( MessagingContext.class ), Mockito.any( Message.class )); // Publish Assert.assertEquals( 0, client.getSentMessagesCount()); Assert.assertEquals( 0, client.getTimestampOfLastSentMessage()); Assert.assertEquals( 0, client.getFailedSendingCount()); Assert.assertEquals( 0, client.getTimestampOfLastSendingFailure()); Assert.assertEquals( 0, client.getReceivedMessagesCount()); Assert.assertEquals( 0, client.getTimestampOfLastReceivedMessage()); Assert.assertEquals( 0, client.getFailedReceptionCount()); Assert.assertEquals( 0, client.getTimestampOfLastReceptionFailure()); try { client.publish( Mockito.mock( MessagingContext.class ), Mockito.mock( Message.class )); Assert.fail( "An IO exception was expected. It should have been propagated." ); } catch( IOException e ) { // nothing } Mockito.verify( messagingClient ).publish( Mockito.any( MessagingContext.class ), Mockito.any( Message.class )); Assert.assertEquals( 0, client.getSentMessagesCount()); Assert.assertEquals( 0, client.getTimestampOfLastSentMessage()); Assert.assertEquals( 1, client.getFailedSendingCount()); Assert.assertNotEquals( 0, client.getTimestampOfLastSendingFailure()); Assert.assertEquals( 0, client.getReceivedMessagesCount()); Assert.assertEquals( 0, client.getTimestampOfLastReceivedMessage()); Assert.assertEquals( 0, client.getFailedReceptionCount()); Assert.assertEquals( 0, client.getTimestampOfLastReceptionFailure()); // Reset client.reset(); Assert.assertEquals( 0, client.getSentMessagesCount()); Assert.assertEquals( 0, client.getTimestampOfLastSentMessage()); Assert.assertEquals( 0, client.getFailedSendingCount()); Assert.assertEquals( 0, client.getTimestampOfLastSendingFailure()); Assert.assertEquals( 0, client.getReceivedMessagesCount()); Assert.assertEquals( 0, client.getTimestampOfLastReceivedMessage()); Assert.assertEquals( 0, client.getFailedReceptionCount()); Assert.assertEquals( 0, client.getTimestampOfLastReceptionFailure()); } @Test public void testSetMessageQueue_notNull() { // We do not run in OSGi, but it should not raise any error IMessagingClient messagingClient = Mockito.mock( IMessagingClient.class ); JmxWrapperForMessagingClient client = new JmxWrapperForMessagingClient( messagingClient ); // Set the message queue Assert.assertEquals( 0, client.getSentMessagesCount()); Assert.assertEquals( 0, client.getTimestampOfLastSentMessage()); Assert.assertEquals( 0, client.getFailedSendingCount()); Assert.assertEquals( 0, client.getTimestampOfLastSendingFailure()); Assert.assertEquals( 0, client.getReceivedMessagesCount()); Assert.assertEquals( 0, client.getTimestampOfLastReceivedMessage()); Assert.assertEquals( 0, client.getFailedReceptionCount()); Assert.assertEquals( 0, client.getTimestampOfLastReceptionFailure()); RoboconfMessageQueue queue = new RoboconfMessageQueue(); queue.add( Mockito.mock( Message.class )); queue.errorWhileReceivingMessage(); client.setMessageQueue( queue ); Mockito.verify( messagingClient ).setMessageQueue( queue ); Assert.assertEquals( 0, client.getSentMessagesCount()); Assert.assertEquals( 0, client.getTimestampOfLastSentMessage()); Assert.assertEquals( 0, client.getFailedSendingCount()); Assert.assertEquals( 0, client.getTimestampOfLastSendingFailure()); Assert.assertEquals( queue.getReceivedMessagesCount(), client.getReceivedMessagesCount()); Assert.assertEquals( queue.getTimestampOfLastReceivedMessage(), client.getTimestampOfLastReceivedMessage()); Assert.assertEquals( queue.getFailedReceptionCount(), client.getFailedReceptionCount()); Assert.assertEquals( queue.getTimestampOfLastReceptionFailure(), client.getTimestampOfLastReceptionFailure()); // Reset client.reset(); Assert.assertEquals( 0, client.getSentMessagesCount()); Assert.assertEquals( 0, client.getTimestampOfLastSentMessage()); Assert.assertEquals( 0, client.getFailedSendingCount()); Assert.assertEquals( 0, client.getTimestampOfLastSendingFailure()); Assert.assertEquals( 0, client.getReceivedMessagesCount()); Assert.assertEquals( 0, client.getTimestampOfLastReceivedMessage()); Assert.assertEquals( 0, client.getFailedReceptionCount()); Assert.assertEquals( 0, client.getTimestampOfLastReceptionFailure()); } @Test public void testSetOwnerProperties() { IMessagingClient messagingClient = Mockito.mock( IMessagingClient.class ); JmxWrapperForMessagingClient client = new JmxWrapperForMessagingClient( messagingClient ); Assert.assertNull( client.getId()); client.setOwnerProperties( RecipientKind.DM, "domain", "app", "/root" ); Mockito.verify( messagingClient ).setOwnerProperties( RecipientKind.DM, "domain", "app", "/root" ); Assert.assertNotNull( client.getId()); Assert.assertEquals( MessagingUtils.buildId( RecipientKind.DM, "domain", "app", "/root" ), client.getId()); } @Test public void testUnregister_noRegistration() { IMessagingClient messagingClient = Mockito.mock( IMessagingClient.class ); JmxWrapperForMessagingClient client = new JmxWrapperForMessagingClient( messagingClient ); Assert.assertNull( client.serviceReg ); client.unregisterService(); Assert.assertNull( client.serviceReg ); } @Test @SuppressWarnings( "unchecked" ) public void testUnregister_withRegistration() { IMessagingClient messagingClient = Mockito.mock( IMessagingClient.class ); JmxWrapperForMessagingClient client = new JmxWrapperForMessagingClient( messagingClient ); ServiceRegistration<MessagingApiMBean> serviceReg = Mockito.mock( ServiceRegistration.class ); client.serviceReg = serviceReg; client.unregisterService(); Assert.assertNull( client.serviceReg ); Mockito.verify( serviceReg, Mockito.only()).unregister(); } @Test @SuppressWarnings( "unchecked" ) public void testUnregister_withRegistration_withException() { IMessagingClient messagingClient = Mockito.mock( IMessagingClient.class ); JmxWrapperForMessagingClient client = new JmxWrapperForMessagingClient( messagingClient ); ServiceRegistration<MessagingApiMBean> serviceReg = Mockito.mock( ServiceRegistration.class ); Mockito.doThrow( new RuntimeException( "for test" )).when( serviceReg ).unregister(); client.serviceReg = serviceReg; client.unregisterService(); Assert.assertNull( client.serviceReg ); Mockito.verify( serviceReg, Mockito.only()).unregister(); } @Test @SuppressWarnings( "unchecked" ) public void testConstructor_mockOsgi() { ServiceRegistration<MessagingApiMBean> serviceReg = Mockito.mock( ServiceRegistration.class ); BundleContext bundleCtx = Mockito.mock( BundleContext.class ); Mockito.when( bundleCtx.registerService( Mockito.eq( MessagingApiMBean.class ), Mockito.any( JmxWrapperForMessagingClient.class ), Mockito.any( Dictionary.class ))).thenReturn( serviceReg ); OsgiHelper osgiHelper = Mockito.mock( OsgiHelper.class ); Mockito.when( osgiHelper.findBundleContext()).thenReturn( bundleCtx ); IMessagingClient messagingClient = Mockito.mock( IMessagingClient.class ); JmxWrapperForMessagingClient client = new JmxWrapperForMessagingClient( messagingClient, osgiHelper ); Assert.assertNotNull( client.serviceReg ); Assert.assertEquals( serviceReg, client.serviceReg ); } @Test @SuppressWarnings( "unchecked" ) public void testConstructor_mockOsgi_exceptionDuringRegistration() { BundleContext bundleCtx = Mockito.mock( BundleContext.class ); Mockito.when( bundleCtx.registerService( Mockito.eq( MessagingApiMBean.class ), Mockito.any( JmxWrapperForMessagingClient.class ), Mockito.any( Dictionary.class ))).thenThrow( new RuntimeException( "for test" )); OsgiHelper osgiHelper = Mockito.mock( OsgiHelper.class ); Mockito.when( osgiHelper.findBundleContext()).thenReturn( bundleCtx ); IMessagingClient messagingClient = Mockito.mock( IMessagingClient.class ); JmxWrapperForMessagingClient client = new JmxWrapperForMessagingClient( messagingClient, osgiHelper ); Assert.assertNull( client.serviceReg ); } }