/*******************************************************************************
* Copyright (c) 2015 Oracle and/or its affiliates. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
* which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Oracle - initial API and implementation from Oracle TopLink
******************************************************************************/
package org.eclipse.persistence.testing.tests.distributedservers.rcm.jgroups;
import org.eclipse.persistence.internal.sessions.AbstractSession;
import org.eclipse.persistence.internal.sessions.coordination.RemoteConnection;
import org.eclipse.persistence.sessions.coordination.RemoteCommandManager;
import org.eclipse.persistence.sessions.coordination.TransportManager;
import org.eclipse.persistence.testing.tests.distributedservers.rcm.ConfigurableCacheSyncDistributedTest;
import org.junit.Assert;
import java.lang.reflect.Field;
/**
* Test to ensure JGroups configuration file passed is used
*/
public class JGroupsConfigurationTest extends ConfigurableCacheSyncDistributedTest {
@Override
protected void test() throws Throwable {
AbstractSession session = getAbstractSession();
RemoteCommandManager rcm = new RemoteCommandManager(session);
TransportManager transport = (TransportManager)Class.forName("org.eclipse.persistence.sessions.coordination.jgroups.JGroupsTransportManager").newInstance();
rcm.setTransportManager(transport);
transport.createLocalConnection();
RemoteConnection connection = transport.getConnectionToLocalHost();
try {
int multicastPort = getMulticastPort(connection);
Assert.assertEquals("Default multicast port different than expected", 45588, multicastPort);
} catch (Exception x) {
Assert.fail("Failed to retrieve multicast port: " + x.getMessage());
} finally {
connection.close();
}
rcm = new RemoteCommandManager(session);
transport = (TransportManager) Class.forName("org.eclipse.persistence.sessions.coordination.jgroups.JGroupsTransportManager").newInstance();
transport.setConfig("org/eclipse/persistence/testing/config/distributedservers/rcm/jgroups/jgroups-udp-config.xml");
rcm.setTransportManager(transport);
transport.createLocalConnection();
connection = transport.getConnectionToLocalHost();
try {
int multicastPort = getMulticastPort(connection);
Assert.assertEquals("Configured multicast port different than expected", 45678, multicastPort);
} catch (Exception x) {
Assert.fail("Failed to retrieve multicast port: " + x.getMessage());
} finally {
connection.close();
}
}
private int getMulticastPort(RemoteConnection connection) throws Exception {
Field field = Class.forName("org.eclipse.persistence.internal.sessions.coordination.jgroups.JGroupsRemoteConnection").getDeclaredField("channel");
field.setAccessible(true);
Object channel = field.get(connection);
Object protocolStack = Class.forName("org.jgroups.JChannel").getMethod("getProtocolStack").invoke(channel);
Object bottomProtocol = Class.forName("org.jgroups.stack.ProtocolStack").getMethod("getBottomProtocol").invoke(protocolStack);
return (int) Class.forName("org.jgroups.protocols.UDP").getMethod("getMulticastPort").invoke(bottomProtocol);
}
}