package com.linkedin.databus.client;
/*
*
* Copyright 2013 LinkedIn Corp. All rights reserved
*
* 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.
*
*/
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.lang.reflect.Field;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ReadableByteChannel;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.TreeSet;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.easymock.EasyMock;
import org.easymock.IArgumentMatcher;
import org.jboss.netty.logging.InternalLoggerFactory;
import org.jboss.netty.logging.Log4JLoggerFactory;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.linkedin.databus.client.ConnectionState.StateId;
import com.linkedin.databus.client.consumer.LoggingConsumer;
import com.linkedin.databus.client.netty.RemoteExceptionHandler;
import com.linkedin.databus.client.pub.DbusClusterInfo;
import com.linkedin.databus.client.pub.DbusModPartitionedFilterFactory;
import com.linkedin.databus.client.pub.DbusPartitionInfo;
import com.linkedin.databus.client.pub.ServerInfo;
import com.linkedin.databus.core.Checkpoint;
import com.linkedin.databus.core.CheckpointMult;
import com.linkedin.databus.core.DatabusComponentStatus;
import com.linkedin.databus.core.DatabusComponentStatus.Status;
import com.linkedin.databus.core.DbusClientMode;
import com.linkedin.databus.core.DbusConstants;
import com.linkedin.databus.core.DbusEventBuffer;
import com.linkedin.databus.core.DbusEventFactory;
import com.linkedin.databus.core.DbusEventV1Factory;
import com.linkedin.databus.core.InternalDatabusEventsListener;
import com.linkedin.databus.core.InvalidEventException;
import com.linkedin.databus.core.ScnNotFoundException;
import com.linkedin.databus.core.async.AbstractActorMessageQueue;
import com.linkedin.databus.core.async.ActorMessageQueue;
import com.linkedin.databus.core.async.LifecycleMessage;
import com.linkedin.databus.core.data_model.DatabusSubscription;
import com.linkedin.databus.core.monitoring.mbean.DbusEventsStatisticsCollector;
import com.linkedin.databus.core.util.ConfigLoader;
import com.linkedin.databus.core.util.IdNamePair;
import com.linkedin.databus.core.util.Range;
import com.linkedin.databus2.core.DatabusException;
import com.linkedin.databus2.core.container.DatabusHttpHeaders;
import com.linkedin.databus2.core.container.request.RegisterResponseEntry;
import com.linkedin.databus2.core.container.request.RegisterResponseMetadataEntry;
import com.linkedin.databus2.core.filter.DbusKeyCompositeFilter;
import com.linkedin.databus2.core.filter.DbusKeyCompositeFilterConfig;
import com.linkedin.databus2.core.filter.DbusKeyFilter;
import com.linkedin.databus2.core.filter.KeyFilterConfigHolder;
import com.linkedin.databus2.test.ConditionCheck;
import com.linkedin.databus2.test.TestUtil;
/**
* Unit tests for the {@link RelayPullThread} class
*/
@Test(singleThreaded=true)
public class TestRelayPullThread
{
public static final Logger LOG = Logger.getLogger("TestRelayPullThread");
public static final org.apache.avro.Schema SCHEMA$ = org.apache.avro.Schema.parse("{\"type\":\"record\",\"name\":\"LiarJobRelay\",\"namespace\":\"com.linkedin.events.liar.jobrelay\",\"fields\":[{\"name\":\"txn\",\"type\":[\"int\",\"null\"],\"meta\":\"dbFieldName=TXN;dbFieldPosition=0;\"},{\"name\":\"key\",\"type\":[\"int\",\"null\"],\"meta\":\"dbFieldName=KEY;dbFieldPosition=1;\"},{\"name\":\"eventId\",\"type\":[\"int\",\"null\"],\"meta\":\"dbFieldName=EVENT_ID;dbFieldPosition=2;\"},{\"name\":\"isDelete\",\"type\":[\"string\",\"null\"],\"meta\":\"dbFieldName=IS_DELETE;dbFieldPosition=3;\"},{\"name\":\"state\",\"type\":[\"string\",\"null\"],\"meta\":\"dbFieldName=STATE;dbFieldPosition=4;\"}],\"meta\":\"dbFieldName=SY$LIAR_JOB_RELAY_1;\"}");
public static final String _HOSTNAME = "localhost";
public static final String _SVCNAME = "UnitTestService";
@BeforeClass
public void setUp()
{
TestUtil.setupLoggingWithTimestampedFile(true, "/tmp/TestRelayPullThread", ".log", Level.WARN);
InternalLoggerFactory.setDefaultFactory(new Log4JLoggerFactory());
}
public static class RelayPullThreadBuilder
{
public RelayPullThreadBuilder(boolean failRelayConnection, boolean muteTransition)
{
_failRelayConnection = failRelayConnection; _muteTransition = muteTransition;
}
// setters
RelayPullThreadBuilder setBootstrapEnabled(boolean bootstrapEnabled)
{
_bootstrapEnabled = bootstrapEnabled;
return this;
}
RelayPullThreadBuilder setReadLatestScnEnabled(boolean readLatestScnEnabled)
{
_readLatestScnEnabled = readLatestScnEnabled;
return this;
}
RelayPullThreadBuilder setReadDataThrowException(boolean readDataThrowException)
{
_readDataThrowException = readDataThrowException;
return this;
}
RelayPullThreadBuilder setReadDataException(boolean readDataException)
{
_readDataException = readDataException;
return this;
}
RelayPullThreadBuilder setExceptionName(String exceptionName)
{
_exceptionName = exceptionName;
return this;
}
RelayPullThreadBuilder setNumRetriesOnFellOff(int numRetriesOnFellOff)
{
_numRetriesOnFellOff = numRetriesOnFellOff;
return this;
}
RelayPullThreadBuilder setFilterConfig(DbusKeyCompositeFilterConfig filterConfig)
{
_filterConfig = filterConfig;
return this;
}
boolean _failRelayConnection;
boolean _muteTransition;
boolean _bootstrapEnabled;
boolean _readLatestScnEnabled;
boolean _readDataThrowException;
boolean _readDataException;
String _exceptionName;
int _numRetriesOnFellOff;
DbusKeyCompositeFilterConfig _filterConfig = null;
public RelayPullThread createRelayPullThread() throws Exception
{
return TestRelayPullThread.createRelayPullThread(_failRelayConnection,
_muteTransition,
_bootstrapEnabled,
_readLatestScnEnabled,
_readDataThrowException,
_readDataException,
_exceptionName,
_numRetriesOnFellOff,
_filterConfig);
}
public RelayPullThread createFellOffRelayPullThread() throws Exception
{
RelayPullThread r = createRelayPullThread();
r.getConnectionState().setRelayFellOff(true);
return r;
}
}
private static RelayPullThread createRelayPullThread(boolean failRelayConnection,
boolean muteTransition,
boolean bootstrapEnabled,
boolean readLatestScnEnabled,
boolean readDataThrowException,
boolean readDataException,
String exceptionName,
int numRetriesOnFellOff,
DbusKeyCompositeFilterConfig filterConfig)
throws Exception
{
List<String> sources = Arrays.asList("source1");
Properties clientProps = new Properties();
if (bootstrapEnabled)
{
clientProps.setProperty("client.runtime.bootstrap.enabled", "true");
clientProps.setProperty("client.runtime.bootstrap.service(1).name", "bs1");
clientProps.setProperty("client.runtime.bootstrap.service(1).port", "10001");
clientProps.setProperty("client.runtime.bootstrap.service(1).sources", "source1");
} else {
clientProps.setProperty("client.runtime.bootstrap.enabled", "false");
}
clientProps.setProperty("client.container.jmx.rmiEnabled", "false");
clientProps.setProperty("client.runtime.relay(1).name", "relay1");
clientProps.setProperty("client.runtime.relay(1).port", "10001");
clientProps.setProperty("client.runtime.relay(1).sources", "source1");
clientProps.setProperty("client.runtime.relay(2).name", "relay2");
clientProps.setProperty("client.runtime.relay(2).port", "10002");
clientProps.setProperty("client.runtime.relay(2).sources", "source1");
clientProps.setProperty("client.runtime.relay(3).name", "relay3");
clientProps.setProperty("client.runtime.relay(3).port", "10003");
clientProps.setProperty("client.runtime.relay(3).sources", "source1");
if (readLatestScnEnabled)
clientProps.setProperty("client.enableReadLatestOnRelayFallOff", "true");
clientProps.setProperty("client.connectionDefaults.eventBuffer.maxSize", "100000");
clientProps.setProperty("client.connectionDefaults.pullerRetries.maxRetryNum", "9");
clientProps.setProperty("client.connectionDefaults.pullerRetries.sleepIncFactor", "1.0");
clientProps.setProperty("client.connectionDefaults.pullerRetries.sleepIncDelta", "1");
clientProps.setProperty("client.connectionDefaults.pullerRetries.initSleep", "1");
clientProps.setProperty("client.connectionDefaults.numRetriesOnFallOff", "" + numRetriesOnFellOff);
DatabusHttpClientImpl.Config clientConfBuilder = new DatabusHttpClientImpl.Config();
ConfigLoader<DatabusHttpClientImpl.StaticConfig> configLoader =
new ConfigLoader<DatabusHttpClientImpl.StaticConfig>("client.", clientConfBuilder);
configLoader.loadConfig(clientProps);
DatabusHttpClientImpl.StaticConfig clientConf = clientConfBuilder.build();
DatabusSourcesConnection.StaticConfig srcConnConf = clientConf.getConnectionDefaults();
DatabusHttpClientImpl client = new DatabusHttpClientImpl(clientConf);
if (bootstrapEnabled)
client.registerDatabusBootstrapListener(new LoggingConsumer(), null, "source1");
Assert.assertNotNull(client, "client instantiation ok");
DatabusHttpClientImpl.RuntimeConfig clientRtConf = clientConf.getRuntime().build();
//we keep the index of the next server we expect to see
AtomicInteger serverIdx = new AtomicInteger(-1);
//generate the order in which we should see the servers
List<ServerInfo> relayOrder = new ArrayList<ServerInfo>(clientRtConf.getRelays());
if (LOG.isInfoEnabled())
{
StringBuilder sb = new StringBuilder();
for (ServerInfo serverInfo: relayOrder)
{
sb.append(serverInfo.getName());
sb.append(" ");
}
LOG.info("Relay order:" + sb.toString());
}
List<IdNamePair> sourcesResponse = new ArrayList<IdNamePair>();
sourcesResponse.add(new IdNamePair(1L, "source1"));
Map<Long, List<RegisterResponseEntry>> registerSourcesResponse = new HashMap<Long, List<RegisterResponseEntry>>();
List<RegisterResponseEntry> regResponse = new ArrayList<RegisterResponseEntry>();
regResponse.add(new RegisterResponseEntry(1L, (short)1, SCHEMA$.toString()));
registerSourcesResponse.put(1L, regResponse);
ChunkedBodyReadableByteChannel channel = EasyMock.createMock(ChunkedBodyReadableByteChannel.class);
if ( ! readDataException)
{
EasyMock.expect(channel.getMetadata(EasyMock.<String>notNull())).andReturn(null).anyTimes();
} else {
EasyMock.expect(channel.getMetadata(EasyMock.<String>notNull())).andReturn(exceptionName).anyTimes();
}
EasyMock.replay(channel);
DbusEventBuffer dbusBuffer = EasyMock.createMock(DbusEventBuffer.class);
EasyMock.expect(dbusBuffer.readEvents(EasyMock.<ReadableByteChannel>notNull(), EasyMock.<List<InternalDatabusEventsListener>>notNull(), EasyMock.<DbusEventsStatisticsCollector>isNull())).andReturn(1).anyTimes();
EasyMock.expect(dbusBuffer.getSeenEndOfPeriodScn()).andReturn(1L).anyTimes();
EasyMock.expect(dbusBuffer.getEventSerializationVersion()).andReturn(DbusEventFactory.DBUS_EVENT_V1).anyTimes();
if ( readDataThrowException)
{
EasyMock.expect(dbusBuffer.readEvents(EasyMock.<ReadableByteChannel>notNull())).andThrow(new RuntimeException("dummy")).anyTimes();
} else {
EasyMock.expect(dbusBuffer.readEvents(EasyMock.<ReadableByteChannel>notNull())).andReturn(1).anyTimes();
}
EasyMock.expect(dbusBuffer.acquireIterator(EasyMock.<String>notNull())).andReturn(null).anyTimes();
dbusBuffer.waitForFreeSpace((int)(clientConf.getConnectionDefaults().getFreeBufferThreshold() * 100.0 / clientConf.getPullerBufferUtilizationPct()));
EasyMock.expectLastCall().anyTimes();
EasyMock.expect(dbusBuffer.getBufferFreeReadSpace()).andReturn(0).anyTimes();
EasyMock.replay(dbusBuffer);
//This guy succeeds on /sources but fails on /register [FIXME: it does? why?]
Map<Long, List<RegisterResponseEntry>> registerKeysResponse = null;
List<RegisterResponseMetadataEntry> registerMetadataResponse = null;
MockRelayConnection mockSuccessConn = new MockRelayConnection(sourcesResponse,
registerSourcesResponse,
registerKeysResponse,
registerMetadataResponse,
channel,
serverIdx,
muteTransition);
DatabusRelayConnectionFactory mockConnFactory =
EasyMock.createMock("mockRelayFactory", DatabusRelayConnectionFactory.class);
//each server should be tried MAX_RETRIES time until all retries are exhausted
if ( failRelayConnection )
{
EasyMock.expect(mockConnFactory.createRelayConnection(
EasyMock.<ServerInfo>notNull(),
EasyMock.<ActorMessageQueue>notNull(),
EasyMock.<RemoteExceptionHandler>notNull())).andThrow(new RuntimeException("Mock Error")).anyTimes();
} else {
EasyMock.expect(mockConnFactory.createRelayConnection(
EasyMock.<ServerInfo>notNull(),
EasyMock.<ActorMessageQueue>notNull(),
EasyMock.<RemoteExceptionHandler>notNull())).andReturn(mockSuccessConn).anyTimes();
}
List<DatabusSubscription> sourcesSubList = DatabusSubscription.createSubscriptionList(sources);
// Mock Bootstrap Puller
BootstrapPullThread mockBsPuller = EasyMock.createMock("bpt",BootstrapPullThread.class);
mockBsPuller.enqueueMessage(EasyMock.notNull());
EasyMock.expectLastCall().anyTimes();
// Mock Relay Dispatcher
RelayDispatcher mockDispatcher = EasyMock.createMock("rd", RelayDispatcher.class);
mockDispatcher.enqueueMessage(EasyMock.notNull());
EasyMock.expectLastCall().anyTimes();
DatabusSourcesConnection sourcesConn2 = EasyMock.createMock(DatabusSourcesConnection.class);
DatabusSourcesConnection.SourcesConnectionStatus scs = sourcesConn2.new SourcesConnectionStatus();
EasyMock.expect(sourcesConn2.getSourcesNames()).andReturn(Arrays.asList("source1")).anyTimes();
EasyMock.expect(sourcesConn2.getSubscriptions()).andReturn(sourcesSubList).anyTimes();
EasyMock.expect(sourcesConn2.getConnectionConfig()).andReturn(srcConnConf).anyTimes();
EasyMock.expect(sourcesConn2.getConnectionStatus()).andReturn(scs).anyTimes();
EasyMock.expect(sourcesConn2.getLocalRelayCallsStatsCollector()).andReturn(null).anyTimes();
EasyMock.expect(sourcesConn2.getInboundEventsStatsCollector()).andReturn(null).anyTimes();
EasyMock.expect(sourcesConn2.getRelayCallsStatsCollector()).andReturn(null).anyTimes();
EasyMock.expect(sourcesConn2.getUnifiedClientStats()).andReturn(null).anyTimes();
EasyMock.expect(sourcesConn2.getRelayConnFactory()).andReturn(mockConnFactory).anyTimes();
EasyMock.expect(sourcesConn2.loadPersistentCheckpoint()).andReturn(null).anyTimes();
EasyMock.expect(sourcesConn2.getDataEventsBuffer()).andReturn(dbusBuffer).anyTimes();
if ( bootstrapEnabled)
EasyMock.expect(sourcesConn2.isBootstrapEnabled()).andReturn(true).anyTimes();
else
EasyMock.expect(sourcesConn2.isBootstrapEnabled()).andReturn(false).anyTimes();
EasyMock.expect(sourcesConn2.getBootstrapRegistrations()).andReturn(null).anyTimes();
EasyMock.expect(sourcesConn2.getBootstrapServices()).andReturn(null).anyTimes();
EasyMock.expect(sourcesConn2.getBootstrapPuller()).andReturn(mockBsPuller).anyTimes();
EasyMock.expect(sourcesConn2.getRelayDispatcher()).andReturn(mockDispatcher).anyTimes();
EasyMock.makeThreadSafe(mockConnFactory, true);
EasyMock.makeThreadSafe(mockDispatcher, true);
EasyMock.makeThreadSafe(mockBsPuller, true);
EasyMock.makeThreadSafe(sourcesConn2, true);
EasyMock.replay(mockConnFactory);
EasyMock.replay(sourcesConn2);
EasyMock.replay(mockDispatcher);
EasyMock.replay(mockBsPuller);
ConnectionStateFactory connStateFactory = new ConnectionStateFactory(sources);
ArrayList<DbusKeyCompositeFilterConfig> filters = new ArrayList<DbusKeyCompositeFilterConfig>();
if(filterConfig != null)
filters.add(filterConfig);
RelayPullThread relayPuller = new RelayPullThread("RelayPuller", sourcesConn2, dbusBuffer, connStateFactory, clientRtConf.getRelaysSet(),
filters,
srcConnConf.getConsumeCurrent(),
srcConnConf.getReadLatestScnOnError(),
srcConnConf.getPullerUtilizationPct(),
0, // no threshold for noEventsRest set
ManagementFactory.getPlatformMBeanServer(),
new DbusEventV1Factory(),
null);
RemoteExceptionHandler mockRemoteExceptionHandler = new MockRemoteExceptionHandler(sourcesConn2, dbusBuffer, relayPuller);
Field field = relayPuller.getClass().getDeclaredField("_remoteExceptionHandler");
field.setAccessible(true);
field.set(relayPuller, mockRemoteExceptionHandler);
mockSuccessConn.setCallback(relayPuller);
return relayPuller;
}
private static DbusKeyCompositeFilterConfig createFakeFilter() throws DatabusException
{
DbusModPartitionedFilterFactory filterFactory = new DbusModPartitionedFilterFactory("source1");
DbusClusterInfo cluster = new DbusClusterInfo("cluster", 2, 2);
DbusPartitionInfo partition = new DbusPartitionInfo() {
@Override
public long getPartitionId() { return 1; }
@Override
public boolean equalsPartition(DbusPartitionInfo other) { return true; }
};
return filterFactory.createServerSideFilter(cluster, partition);
}
private void validateConnState(ConnectionState connState)
{
Assert.assertEquals(connState.getHostName(), _HOSTNAME);
Assert.assertEquals(connState.getSvcName(), _SVCNAME);
}
@Test(groups={"small", "functional"})
public void testRelayTransition() throws Exception
{
final Logger log = Logger.getLogger("TestRelayPullThread.testRelayTransition");
log.info("---------- start ---------------");
// Test Case : Initial State Check
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
//RelayPullThread relayPuller = createRelayPullThread(false, false);
RelayPullThread relayPuller = bldr.createRelayPullThread();
Assert.assertEquals(relayPuller.getConnectionState().getStateId(), StateId.INITIAL, "Initial State Check");
//Let the show begin
Thread relayPullerThread = new Thread(relayPuller);
relayPullerThread.setDaemon(false);
relayPullerThread.start();
relayPuller.enqueueMessage(LifecycleMessage.createStartMessage());
try
{
Thread.sleep(500);
} catch (InterruptedException ie){}
for (int i = 0 ; i < 100; i++ )
{
try
{
Thread.sleep(5);
Assert.assertTrue(relayPuller.getConnectionState().getStateId() != StateId.INITIAL,"StateId can never be INITIAL once started");
} catch (InterruptedException ie){}
}
//EasyMock.verify(mockConnFactory);
relayPuller.enqueueMessage(LifecycleMessage.createShutdownMessage());
relayPuller.awaitShutdown();
}
// Main Transition Test (Without Server-Set Change)
{
// PICK_SERVER - Happy Path
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
}
// PICK_SERVER - Relays exhausted
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(true, false);
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.PICK_SERVER, "SUSPEND_ON_ERROR");
}
// PICK_SERVER - No Servers
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
relayPuller.getServers().clear();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.PICK_SERVER, "SUSPEND_ON_ERROR");
}
// Request_Sources to Re Sources_Request_Sent
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, true);
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_REQUEST_SENT, "");
}
// Request_Sources to Sources_Response_Success
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_RESPONSE_SUCCESS);
}
// Sources_Response_Success - Happy Path
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, true);
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_REQUEST_SENT, "");
List<IdNamePair> sourcesResponse = new ArrayList<IdNamePair>();
sourcesResponse.add(new IdNamePair(1L, "source1"));
connState.switchToSourcesSuccess(sourcesResponse, _HOSTNAME, _SVCNAME);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
validateConnState(connState);
String expSubsListStr = "[{\"physicalSource\":{\"uri\":\"databus:physical-source:ANY\",\"role\":\"ANY\"},\"physicalPartition\":{\"id\":-1,\"name\":\"*\"},\"logicalPartition\":{\"source\":{\"id\":1,\"name\":\"source1\"},\"id\":-1}}]";
String expSourcesIdListStr = "1";
Assert.assertEquals(connState.getSourcesIdListString(), expSourcesIdListStr,
"SourcesId Added");
String subsListStr = connState.getSubsListString();
Assert.assertEquals(subsListStr, expSubsListStr);
}
// Sources_Response_Success - When source not found in server
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, true);
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_REQUEST_SENT, "");
List<IdNamePair> sourcesResponse = new ArrayList<IdNamePair>();
sourcesResponse.add(new IdNamePair(1L, "source1"));
connState.switchToSourcesSuccess(sourcesResponse, _HOSTNAME, _SVCNAME);
relayPuller.getMessageQueue().clear();
connState.getSourcesNameMap().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.PICK_SERVER);
validateConnState(connState);
}
// Request_Register to Register_Request_Sent
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, true);
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_REQUEST_SENT, "");
List<IdNamePair> sourcesResponse = new ArrayList<IdNamePair>();
sourcesResponse.add(new IdNamePair(1L, "source1"));
connState.switchToSourcesSuccess(sourcesResponse, _HOSTNAME, _SVCNAME);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
String subsListString = "[{\"physicalSource\":{\"uri\":\"databus:physical-source:ANY\",\"role\":\"MASTER\"},\"physicalPartition\":{\"id\":-1,\"name\":\"*\"},\"logicalPartition\":{\"source\":{\"id\":0,\"name\":\"source1\"},\"id\":-1}}]";
String sourcesIdListString = "1";
connState.switchToRequestSourcesSchemas(sourcesIdListString, subsListString);
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_REQUEST_SENT,"");
validateConnState(connState);
}
// Request_Register to Register_Response_success
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_RESPONSE_SUCCESS);
}
// Register_Response_Success : Error Case
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_RESPONSE_SUCCESS);
connState.getSourcesSchemas().clear();
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS, StateId.PICK_SERVER);
}
// Register_Response_Success to Request Stream
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS, StateId.REQUEST_STREAM);
Assert.assertEquals(relayPuller.getConnectionState().isSCNRegress(), false, "SCN Regress check");
}
// Register_Response_Success to Request Stream, when partially consumed window
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
RelayPullThread relayPuller = bldr.createRelayPullThread();
Checkpoint cp = new Checkpoint();
cp.setConsumptionMode(DbusClientMode.ONLINE_CONSUMPTION);
cp.setWindowScn(100L);
cp.setWindowOffset(20);
cp.setPrevScn(80L);
relayPuller.getConnectionState().setCheckpoint(cp);
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS, StateId.REQUEST_STREAM);
Assert.assertEquals(relayPuller.getConnectionState().getCheckpoint().getWindowScn(), 80L, "WindowSCN check");
Assert.assertEquals(relayPuller.getConnectionState().getCheckpoint().getWindowOffset(), new Long(-1), "WindowOffset check");
Assert.assertEquals(relayPuller.getConnectionState().isSCNRegress(), true, "SCN Regress check");
}
// Register_Response_Success, No PrevSCN for partially consumed window
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
RelayPullThread relayPuller = bldr.createRelayPullThread();
Checkpoint cp = new Checkpoint();
cp.setConsumptionMode(DbusClientMode.ONLINE_CONSUMPTION);
cp.setWindowScn(100L);
cp.setWindowOffset(20);
relayPuller.getConnectionState().setCheckpoint(cp);
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS,StateId.REGISTER_RESPONSE_SUCCESS, "SUSPEND_ON_ERROR");
}
// Register_Response_Success to Bootstrap ( when checkpoint is Bootstrap_SnapShot
{
//RelayPullThread relayPuller = createRelayPullThread(false, false, true);
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
bldr.setBootstrapEnabled(true);
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), false, "Is Relay FellOff");
Checkpoint cp = new Checkpoint();
cp.setConsumptionMode(DbusClientMode.BOOTSTRAP_SNAPSHOT);
connState.setCheckpoint(cp);
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS, StateId.BOOTSTRAP);
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "Is Relay FellOff");
Assert.assertEquals(relayPuller.getConnectionState().isSCNRegress(), false, "SCN Regress check");
}
// Register_Response_Success to Bootstrap ( when checkpoint is Bootstrap_Catchup
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
bldr.setBootstrapEnabled(true);
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), false, "Is Relay FellOff");
Checkpoint cp = new Checkpoint();
cp.setConsumptionMode(DbusClientMode.BOOTSTRAP_CATCHUP);
connState.setCheckpoint(cp);
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS, StateId.BOOTSTRAP);
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "Is Relay FellOff");
Assert.assertEquals(relayPuller.getConnectionState().isSCNRegress(), false, "SCN Regress check");
}
// Request_Stream to Request_Stream_Sent
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, true);
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_REQUEST_SENT, "");
List<IdNamePair> sourcesResponse = new ArrayList<IdNamePair>();
sourcesResponse.add(new IdNamePair(1L, "source1"));
connState.switchToSourcesSuccess(sourcesResponse, _HOSTNAME, _SVCNAME);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
String subsListString = "[{\"physicalSource\":{\"uri\":\"databus:physical-source:ANY\",\"role\":\"MASTER\"},\"physicalPartition\":{\"id\":-1,\"name\":\"*\"},\"logicalPartition\":{\"source\":{\"id\":0,\"name\":\"source1\"},\"id\":-1}}]";
String sourcesIdListString = "1";
connState.switchToRequestSourcesSchemas(sourcesIdListString, subsListString);
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_REQUEST_SENT,"");
relayPuller.getMessageQueue().clear();
MockRelayConnection conn = (MockRelayConnection)connState.getRelayConnection();
connState.switchToRegisterSuccess(conn.getRegisterResponse(), conn.getRegisterResponse(), conn.getRegisterMetadataResponse());
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS, StateId.REQUEST_STREAM);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_STREAM, StateId.STREAM_REQUEST_SENT, "");
validateConnState(connState);
}
// Request_Stream to Stream_Response_Success
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS, StateId.REQUEST_STREAM);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_STREAM, StateId.STREAM_REQUEST_SUCCESS);
}
//Stream_Request_Success to Stream_Request_Done
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS, StateId.REQUEST_STREAM);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_STREAM, StateId.STREAM_REQUEST_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.STREAM_REQUEST_SUCCESS,StateId.STREAM_RESPONSE_DONE);
}
//Stream_Request_Success : ScnNotFoundException but retries set to 5 and bootstrap enabled
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
bldr.setBootstrapEnabled(true).setReadLatestScnEnabled(false).setReadDataThrowException(false)
.setReadDataException(true).setExceptionName(ScnNotFoundException.class.getName()).setNumRetriesOnFellOff(5);
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
for ( int i = 1; i <= 6 ; i++)
{
System.out.println("Iteration :" + i);
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS, StateId.REQUEST_STREAM);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_STREAM, StateId.STREAM_REQUEST_SUCCESS);
relayPuller.getMessageQueue().clear();
if ( i < 6 )
{
testTransitionCase(relayPuller, StateId.STREAM_REQUEST_SUCCESS,StateId.PICK_SERVER);
Assert.assertEquals(relayPuller.getRetryonFallOff().getRemainingRetriesNum(), 6-i ,"Retry State");
} else {
testTransitionCase(relayPuller, StateId.STREAM_REQUEST_SUCCESS,StateId.BOOTSTRAP);
Assert.assertEquals(relayPuller.getRetryonFallOff().getRemainingRetriesNum(), 5 ,"Retry State"); //reset
}
relayPuller.getMessageQueue().clear();
}
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "RelayFellOff State");
}
//Stream_Request_Success : ScnNotFoundException and bootstrap enabled
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
bldr.setBootstrapEnabled(true).setReadLatestScnEnabled(false).setReadDataThrowException(false)
.setReadDataException(true).setExceptionName(ScnNotFoundException.class.getName());
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS, StateId.REQUEST_STREAM);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_STREAM, StateId.STREAM_REQUEST_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.STREAM_REQUEST_SUCCESS,StateId.BOOTSTRAP);
}
//Stream_Request_Success : ScnNotFoundException but retries set to 5, bootstrap disabled and readLatestScnOnFallOff enabled.
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
bldr.setBootstrapEnabled(false).setReadLatestScnEnabled(true).setReadDataThrowException(false)
.setReadDataException(true).setExceptionName(ScnNotFoundException.class.getName()).setNumRetriesOnFellOff(5);
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
for (int i=1; i<=6;i++)
{
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS, StateId.REQUEST_STREAM);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_STREAM, StateId.STREAM_REQUEST_SUCCESS);
relayPuller.getMessageQueue().clear();
if ( i < 6 )
{
testTransitionCase(relayPuller, StateId.STREAM_REQUEST_SUCCESS,StateId.PICK_SERVER);
Assert.assertEquals(relayPuller.getRetryonFallOff().getRemainingRetriesNum(), 6-i ,"Retry State");
} else {
testTransitionCase(relayPuller, StateId.STREAM_REQUEST_SUCCESS,StateId.STREAM_RESPONSE_DONE);
Assert.assertEquals(relayPuller.getRetryonFallOff().getRemainingRetriesNum(), 5 ,"Retry State"); //reset
}
relayPuller.getMessageQueue().clear();
}
MockRelayConnection conn = (MockRelayConnection)connState.getRelayConnection();
Assert.assertEquals(conn.isReadFromLatestScn(),true, "ReadFromLatestScn set");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), false, "RelayFellOff State");
}
//Stream_Request_Success : ScnNotFoundException, bootstrap disabled and readLatestScnOnFallOff enabled.
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
bldr.setBootstrapEnabled(false).setReadLatestScnEnabled(true).setReadDataThrowException(false)
.setReadDataException(true).setExceptionName(ScnNotFoundException.class.getName());
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS, StateId.REQUEST_STREAM);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_STREAM, StateId.STREAM_REQUEST_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.STREAM_REQUEST_SUCCESS,StateId.STREAM_RESPONSE_DONE);
MockRelayConnection conn = (MockRelayConnection)connState.getRelayConnection();
Assert.assertEquals(conn.isReadFromLatestScn(),true, "ReadFromLatestScn set");
}
//Stream_Request_Success : ScnNotFoundException but retries set to 5, bootstrap disabled and readLatestScnOnFallOff disabled.
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
bldr.setBootstrapEnabled(false).setReadLatestScnEnabled(false).setReadDataThrowException(false)
.setReadDataException(true).setExceptionName(ScnNotFoundException.class.getName()).setNumRetriesOnFellOff(5);
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
for (int i = 1; i <= 6; i++)
{
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS, StateId.REQUEST_STREAM);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_STREAM, StateId.STREAM_REQUEST_SUCCESS);
relayPuller.getMessageQueue().clear();
if ( i < 6 )
{
testTransitionCase(relayPuller, StateId.STREAM_REQUEST_SUCCESS,StateId.PICK_SERVER);
Assert.assertEquals(relayPuller.getRetryonFallOff().getRemainingRetriesNum(), 6-i ,"Retry State");
} else {
testTransitionCase(relayPuller, StateId.STREAM_REQUEST_SUCCESS,StateId.STREAM_REQUEST_SUCCESS, "SUSPEND_ON_ERROR");
Assert.assertEquals(relayPuller.getRetryonFallOff().getRemainingRetriesNum(), 5 ,"Retry State"); //reset
}
relayPuller.getMessageQueue().clear();
}
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "RelayFellOff State");
}
//Stream_Request_Success : ScnNotFoundException, bootstrap disabled and readLatestScnOnFallOff disabled.
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
bldr.setBootstrapEnabled(false).setReadLatestScnEnabled(false).setReadDataThrowException(false)
.setReadDataException(true).setExceptionName(ScnNotFoundException.class.getName());
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS, StateId.REQUEST_STREAM);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_STREAM, StateId.STREAM_REQUEST_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.STREAM_REQUEST_SUCCESS,StateId.STREAM_REQUEST_SUCCESS, "SUSPEND_ON_ERROR");
}
//Stream_Request_Success : Non-ScnNotFoundException
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
bldr.setBootstrapEnabled(true).setReadLatestScnEnabled(false).setReadDataThrowException(false)
.setReadDataException(true).setExceptionName("DummyError");
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS, StateId.REQUEST_STREAM);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_STREAM, StateId.STREAM_REQUEST_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.STREAM_REQUEST_SUCCESS,StateId.STREAM_RESPONSE_ERROR);
}
//Stream_Request_Done to Request_Stream
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS, StateId.REQUEST_STREAM);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_STREAM, StateId.STREAM_REQUEST_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.STREAM_REQUEST_SUCCESS,StateId.STREAM_RESPONSE_DONE);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.STREAM_RESPONSE_DONE,StateId.REQUEST_STREAM);
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), false, "Is Relay FellOff");
}
// Bootstrap to Bootstrap_Requested
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
bldr.setBootstrapEnabled(true).setReadLatestScnEnabled(false).setReadDataThrowException(false)
.setReadDataException(true).setExceptionName(ScnNotFoundException.class.getName());
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS, StateId.REQUEST_STREAM);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_STREAM, StateId.STREAM_REQUEST_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.STREAM_REQUEST_SUCCESS,StateId.BOOTSTRAP);
relayPuller.getMessageQueue().clear();
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "Is Relay FellOff");
testTransitionCase(relayPuller, StateId.BOOTSTRAP,StateId.BOOTSTRAP_REQUESTED,"");
}
//Exception while doBootstrap()
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
bldr.setBootstrapEnabled(true).setReadLatestScnEnabled(false).setReadDataThrowException(true)
.setReadDataException(true).setExceptionName(ScnNotFoundException.class.getName());
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS, StateId.REQUEST_STREAM);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_STREAM, StateId.STREAM_REQUEST_SUCCESS);
relayPuller.getMessageQueue().clear();
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), false, "Is Relay FellOff");
testTransitionCase(relayPuller, StateId.STREAM_REQUEST_SUCCESS,StateId.BOOTSTRAP);
relayPuller.getMessageQueue().clear();
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "Is Relay FellOff");
testTransitionCase(relayPuller, StateId.BOOTSTRAP,StateId.BOOTSTRAP, "SUSPEND_ON_ERROR");
}
// Bootstrap Failed : Case 1
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
bldr.setBootstrapEnabled(true).setReadLatestScnEnabled(false).setReadDataThrowException(false)
.setReadDataException(true).setExceptionName(ScnNotFoundException.class.getName());
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS, StateId.REQUEST_STREAM);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_STREAM, StateId.STREAM_REQUEST_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.STREAM_REQUEST_SUCCESS,StateId.BOOTSTRAP);
relayPuller.getMessageQueue().clear();
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "Is Relay FellOff");
testTransitionCase(relayPuller, StateId.BOOTSTRAP,StateId.BOOTSTRAP_REQUESTED,"");
BootstrapResultMessage msg = BootstrapResultMessage.createBootstrapFailedMessage(new Exception("Dummy"));
doExecuteAndChangeState(relayPuller,msg);
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "Is Relay FellOff");
Assert.assertEquals(connState.getStateId(),StateId.BOOTSTRAP, "BOOTSTRAP_REQUESTED to BOOTSTRAP");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: [BOOTSTRAP]", "Queue :BOOTSTRAP_REQUESTED to BOOTSTRAP");
}
// Bootstrap Failed : Case 2
{
//RelayPullThread relayPuller = createRelayPullThread(false, false, true, false, false, true, ScnNotFoundException.class.getName());
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
bldr.setBootstrapEnabled(true).setReadLatestScnEnabled(false).setReadDataThrowException(false)
.setReadDataException(true).setExceptionName(ScnNotFoundException.class.getName());
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS, StateId.REQUEST_STREAM);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_STREAM, StateId.STREAM_REQUEST_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.STREAM_REQUEST_SUCCESS,StateId.BOOTSTRAP);
relayPuller.getMessageQueue().clear();
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "Is Relay FellOff");
testTransitionCase(relayPuller, StateId.BOOTSTRAP,StateId.BOOTSTRAP_REQUESTED,"");
BootstrapResultMessage msg = BootstrapResultMessage.createBootstrapCompleteMessage(null);
doExecuteAndChangeState(relayPuller,msg);
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "Is Relay FellOff");
Assert.assertEquals(connState.getStateId(),StateId.BOOTSTRAP, "BOOTSTRAP_REQUESTED to BOOTSTRAP");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: [BOOTSTRAP]", "Queue :BOOTSTRAP_REQUESTED to BOOTSTRAP");
}
// Bootstrap Success
{
//RelayPullThread relayPuller = createRelayPullThread(false, false, true, false, false, true, ScnNotFoundException.class.getName());
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
bldr.setBootstrapEnabled(true).setReadLatestScnEnabled(false).setReadDataThrowException(false)
.setReadDataException(true).setExceptionName(ScnNotFoundException.class.getName());
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS, StateId.REQUEST_STREAM);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_STREAM, StateId.STREAM_REQUEST_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.STREAM_REQUEST_SUCCESS,StateId.BOOTSTRAP);
relayPuller.getMessageQueue().clear();
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "Is Relay FellOff");
testTransitionCase(relayPuller, StateId.BOOTSTRAP,StateId.BOOTSTRAP_REQUESTED,"");
BootstrapResultMessage msg = BootstrapResultMessage.createBootstrapCompleteMessage(new Checkpoint());
doExecuteAndChangeState(relayPuller,msg);
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), false, "Is Relay FellOff");
Assert.assertEquals(connState.getStateId(),StateId.REQUEST_STREAM, "BOOTSTRAP_REQUESTED to REQUEST_STREAM");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: [REQUEST_STREAM]", "Queue :BOOTSTRAP_REQUESTED to REQUEST_STREAM");
}
// Error States to Pick_Server
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
bldr.setBootstrapEnabled(true).setReadLatestScnEnabled(false).setReadDataThrowException(false)
.setReadDataException(true).setExceptionName(ScnNotFoundException.class.getName());
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
connState.switchToSourcesRequestError();
testTransitionCase(relayPuller, StateId.SOURCES_REQUEST_ERROR, StateId.PICK_SERVER);
relayPuller.getMessageQueue().clear();
connState.switchToSourcesResponseError();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_ERROR, StateId.PICK_SERVER);
relayPuller.getMessageQueue().clear();
connState.switchToRegisterRequestError();
testTransitionCase(relayPuller, StateId.REGISTER_REQUEST_ERROR, StateId.PICK_SERVER);
relayPuller.getMessageQueue().clear();
connState.switchToRegisterResponseError();
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_ERROR, StateId.PICK_SERVER);
relayPuller.getMessageQueue().clear();
connState.switchToStreamRequestError();
testTransitionCase(relayPuller, StateId.STREAM_REQUEST_ERROR, StateId.PICK_SERVER);
relayPuller.getMessageQueue().clear();
connState.switchToStreamResponseError();
testTransitionCase(relayPuller, StateId.STREAM_RESPONSE_ERROR, StateId.PICK_SERVER);
}
}
log.info("--------- end -------------");
}
// make sure the filter is passed along to the doRequestStream call
@Test
public void testRelayPullerThreadV3WithFilter() throws Exception
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
// create filter
DbusKeyCompositeFilterConfig filterConfig = createFakeFilter();
bldr.setFilterConfig(filterConfig);
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
// get the created connection
MockRelayConnection conn = (MockRelayConnection) relayPuller.getLastOpenConnection();
conn.setProtocolVersion(3);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS, StateId.REQUEST_STREAM);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_STREAM, StateId.STREAM_REQUEST_SUCCESS);
DbusKeyCompositeFilter filter = conn.getRelayFilter();
Assert.assertNotNull(filter);
// get DbusKeyFilter that we put in
KeyFilterConfigHolder configHolder = filterConfig.getConfigMap().values().iterator().next();
DbusKeyFilter inFilter = new DbusKeyFilter(configHolder);
// get filter from the connection
Assert.assertEquals(filter.getFilterMap().size(), 1, "1 filter in the composite filter");
Assert.assertTrue(filter.getFilterMap().entrySet().iterator().hasNext(), "has one filter");
DbusKeyFilter newFilter = filter.getFilterMap().values().iterator().next();
//compare them
boolean eq = inFilter.getPartitionType() == newFilter.getPartitionType() &&
inFilter.getFilters().size() == newFilter.getFilters().size();
Assert.assertTrue(eq, "Same Filter");
}
@Test
public void testServerSetChanges()
throws Exception
{
// Server-Set Change TestCases
{
Set<ServerInfo> expServerInfo = new TreeSet<ServerInfo>();
expServerInfo.add(new ServerInfo("relay1", "ONLINE", new InetSocketAddress("localhost",10001),"source1"));
expServerInfo.add(new ServerInfo("relay2","ONLINE", new InetSocketAddress("localhost",10002),"source1"));
expServerInfo.add(new ServerInfo("relay3","ONLINE", new InetSocketAddress("localhost",10003),"source1"));
Set<ServerInfo> expServerInfo2 = new TreeSet<ServerInfo>(expServerInfo);
expServerInfo2.add(new ServerInfo("relay4","ONLINE", new InetSocketAddress("localhost",10000),"source1"));
Set<ServerInfo> expServerInfo3 = new TreeSet<ServerInfo>();
expServerInfo3.add(new ServerInfo("relay4","ONLINE", new InetSocketAddress("localhost",10000),"source1"));
// when on PICK_SERVER
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
relayPuller.enqueueMessage(connState);
// ServerSetChange
{
Assert.assertEquals(relayPuller.getCurrentServerIdx(), -1, "Current Server Index");
Assert.assertEquals(relayPuller.getCurentServer() == null, true, "Current Server Null");
Assert.assertEquals(relayPuller.getServers(),expServerInfo,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(true, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx(), -1, "Current Server Index");
Assert.assertEquals(relayPuller.getCurentServer() == null, true, "Current Server Null");
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.PICK_SERVER, "ServerSetChange while Pick_Server");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: [PICK_SERVER]", "Queue :ServerSetChange while Pick_Server");
}
}
// When on Request_Sources
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
RelayPullThread relayPuller = bldr.createFellOffRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
// ServerSetChange when New Set includes CurrentServer
{
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer() != null, true, "Current Server not Null");
ServerInfo oldServer = relayPuller.getCurentServer();
Assert.assertEquals(relayPuller.getServers(),expServerInfo,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(true, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer(), oldServer, "Current Server unchanged");
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.REQUEST_SOURCES, "ServerSetChange while REQUEST_SOURCES");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: [REQUEST_SOURCES]", "Queue :ServerSetChange while REQUEST_SOURCES");
}
// ServerSetChange when New Set excludes CurrentServer
{
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(false, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx() == -1, true, "Current Server Index undefined");
Assert.assertEquals(relayPuller.getCurentServer() == null, true, "Current Server Null");
Assert.assertEquals(relayPuller.getServers(),expServerInfo3,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.PICK_SERVER, "ServerSetChange while REQUEST_SOURCES");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: [PICK_SERVER]", "Queue :ServerSetChange while REQUEST_SOURCES");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), false, "Relay FellOff CHeck");
}
}
// When on SOURCES-REQUEST-SENT and Response Successful
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, true);
RelayPullThread relayPuller = bldr.createFellOffRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_REQUEST_SENT, "");
// ServerSetChange when New Set includes CurrentServer
{
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer() != null, true, "Current Server not Null");
ServerInfo oldServer = relayPuller.getCurentServer();
Assert.assertEquals(relayPuller.getServers(),expServerInfo,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(true, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer(), oldServer, "Current Server unchanged");
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.SOURCES_REQUEST_SENT, "ServerSetChange while SOURCES_REQUEST_SENT");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: []", "Queue :ServerSetChange while SOURCES_REQUEST_SENT");
}
// ServerSetChange when New Set excludes CurrentServer and SuccessFul Response
{
int oldServerIndex = relayPuller.getCurrentServerIdx();
ServerInfo oldServer = relayPuller.getCurentServer();
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(false, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx(), oldServerIndex, "Current Server Index unchanged");
Assert.assertEquals(relayPuller.getCurentServer(), oldServer, "Current Server unchanged");
Assert.assertEquals(relayPuller.getServers(),expServerInfo3,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), true, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.SOURCES_REQUEST_SENT, "ServerSetChange while REQUEST_SOURCES");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: []", "Queue :ServerSetChange while REQUEST_SOURCES");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "Relay FellOff Check");
// Now Response arrives
List<IdNamePair> sourcesResponse = new ArrayList<IdNamePair>();
sourcesResponse.add(new IdNamePair(1L, "source1"));
connState.switchToSourcesSuccess(sourcesResponse, _HOSTNAME, _SVCNAME);
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.PICK_SERVER);
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(relayPuller.getCurrentServerIdx() == -1, true, "Current Server Index undefined");
Assert.assertEquals(relayPuller.getCurentServer() == null, true, "Current Server Null");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), false, "Relay FellOff CHeck");
validateConnState(connState);
}
}
// When on SOURCES-REQUEST-SENT and SOURCES_RESPONSE_ERROR
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, true);
RelayPullThread relayPuller = bldr.createFellOffRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_REQUEST_SENT, "");
// ServerSetChange when New Set includes CurrentServer
{
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer() != null, true, "Current Server not Null");
ServerInfo oldServer = relayPuller.getCurentServer();
Assert.assertEquals(relayPuller.getServers(),expServerInfo,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(true, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer(), oldServer, "Current Server unchanged");
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.SOURCES_REQUEST_SENT, "ServerSetChange while SOURCES_REQUEST_SENT");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: []", "Queue :ServerSetChange while SOURCES_REQUEST_SENT");
}
// ServerSetChange when New Set excludes CurrentServer and SOURCES_RESPONSE_ERROR
{
int oldServerIndex = relayPuller.getCurrentServerIdx();
ServerInfo oldServer = relayPuller.getCurentServer();
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(false, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx(), oldServerIndex, "Current Server Index unchanged");
Assert.assertEquals(relayPuller.getCurentServer(), oldServer, "Current Server unchanged");
Assert.assertEquals(relayPuller.getServers(),expServerInfo3,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), true, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.SOURCES_REQUEST_SENT, "ServerSetChange while REQUEST_SOURCES");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: []", "Queue :ServerSetChange while REQUEST_SOURCES");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "Relay FellOff CHeck");
// Now Response arrives
List<IdNamePair> sourcesResponse = new ArrayList<IdNamePair>();
sourcesResponse.add(new IdNamePair(1L, "source1"));
connState.switchToSourcesResponseError();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_ERROR, StateId.PICK_SERVER);
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(relayPuller.getCurrentServerIdx() == -1, true, "Current Server Index undefined");
Assert.assertEquals(relayPuller.getCurentServer() == null, true, "Current Server Null");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), false, "Relay FellOff CHeck");
}
}
// When on SOURCES-REQUEST-SENT and SOURCES_REQUEST_ERROR
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, true);
RelayPullThread relayPuller = bldr.createFellOffRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_REQUEST_SENT, "");
// ServerSetChange when New Set includes CurrentServer
{
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer() != null, true, "Current Server not Null");
ServerInfo oldServer = relayPuller.getCurentServer();
Assert.assertEquals(relayPuller.getServers(),expServerInfo,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(true, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer(), oldServer, "Current Server unchanged");
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.SOURCES_REQUEST_SENT, "ServerSetChange while SOURCES_REQUEST_SENT");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: []", "Queue :ServerSetChange while SOURCES_REQUEST_SENT");
}
// ServerSetChange when New Set excludes CurrentServer and SOURCES_REQUEST_ERROR
{
int oldServerIndex = relayPuller.getCurrentServerIdx();
ServerInfo oldServer = relayPuller.getCurentServer();
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(false, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx(), oldServerIndex, "Current Server Index unchanged");
Assert.assertEquals(relayPuller.getCurentServer(), oldServer, "Current Server unchanged");
Assert.assertEquals(relayPuller.getServers(),expServerInfo3,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), true, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.SOURCES_REQUEST_SENT, "ServerSetChange while REQUEST_SOURCES");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: []", "Queue :ServerSetChange while REQUEST_SOURCES");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "Relay FellOff CHeck");
// Now Response arrives
List<IdNamePair> sourcesResponse = new ArrayList<IdNamePair>();
sourcesResponse.add(new IdNamePair(1L, "source1"));
connState.switchToSourcesRequestError();
testTransitionCase(relayPuller, StateId.SOURCES_REQUEST_ERROR, StateId.PICK_SERVER);
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(relayPuller.getCurrentServerIdx() == -1, true, "Current Server Index undefined");
Assert.assertEquals(relayPuller.getCurentServer() == null, true, "Current Server Null");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), false, "Relay FellOff CHeck");
}
}
// When on Request Register
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, true);
RelayPullThread relayPuller = bldr.createFellOffRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_REQUEST_SENT, "");
List<IdNamePair> sourcesResponse = new ArrayList<IdNamePair>();
sourcesResponse.add(new IdNamePair(1L, "source1"));
connState.switchToSourcesSuccess(sourcesResponse, _HOSTNAME, _SVCNAME);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
validateConnState(connState);
// ServerSetChange when New Set includes CurrentServer
{
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer() != null, true, "Current Server not Null");
ServerInfo oldServer = relayPuller.getCurentServer();
Assert.assertEquals(relayPuller.getServers(),expServerInfo,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(true, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer(), oldServer, "Current Server unchanged");
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.REQUEST_REGISTER, "ServerSetChange while REQUEST_REGISTER");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: [REQUEST_REGISTER]", "Queue :ServerSetChange while REQUEST_REGISTER");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "Relay FellOff CHeck");
}
// ServerSetChange when New Set excludes CurrentServer
{
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(false, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx() == -1, true, "Current Server Index undefined");
Assert.assertEquals(relayPuller.getCurentServer() == null, true, "Current Server Null");
Assert.assertEquals(relayPuller.getServers(),expServerInfo3,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.PICK_SERVER, "ServerSetChange while REQUEST_REGISTER");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: [PICK_SERVER]", "Queue :ServerSetChange while REQUEST_REGISTER");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), false, "Relay FellOff CHeck");
}
}
// When on REGISTER-REQUEST-SENT and REGISTER_RESPONSE_ERROR
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, true);
RelayPullThread relayPuller = bldr.createFellOffRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_REQUEST_SENT, "");
List<IdNamePair> sourcesResponse = new ArrayList<IdNamePair>();
sourcesResponse.add(new IdNamePair(1L, "source1"));
connState.switchToSourcesSuccess(sourcesResponse, _HOSTNAME, _SVCNAME);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
String subsListString = "[{\"physicalSource\":{\"uri\":\"databus:physical-source:ANY\",\"role\":\"MASTER\"},\"physicalPartition\":{\"id\":-1,\"name\":\"*\"},\"logicalPartition\":{\"source\":{\"id\":0,\"name\":\"source1\"},\"id\":-1}}]";
String sourcesIdListString = "1";
connState.switchToRequestSourcesSchemas(sourcesIdListString, subsListString);
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_REQUEST_SENT,"");
// ServerSetChange when New Set includes CurrentServer
{
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer() != null, true, "Current Server not Null");
ServerInfo oldServer = relayPuller.getCurentServer();
Assert.assertEquals(relayPuller.getServers(),expServerInfo,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(true, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer(), oldServer, "Current Server unchanged");
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.REGISTER_REQUEST_SENT, "ServerSetChange while REGISTER_REQUEST_SENT");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: []", "Queue :ServerSetChange while REGISTER_REQUEST_SENT");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "Relay FellOff CHeck");
}
// ServerSetChange when New Set excludes CurrentServer and SuccessFul Response
{
int oldServerIndex = relayPuller.getCurrentServerIdx();
ServerInfo oldServer = relayPuller.getCurentServer();
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(false, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx(), oldServerIndex, "Current Server Index unchanged");
Assert.assertEquals(relayPuller.getCurentServer(), oldServer, "Current Server unchanged");
Assert.assertEquals(relayPuller.getServers(),expServerInfo3,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), true, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.REGISTER_REQUEST_SENT, "ServerSetChange while REQUEST_REGISTER");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: []", "Queue :ServerSetChange while REQUEST_REGISTER");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "Relay FellOff CHeck");
connState.switchToRegisterResponseError();
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_ERROR, StateId.PICK_SERVER);
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(relayPuller.getCurrentServerIdx() == -1, true, "Current Server Index undefined");
Assert.assertEquals(relayPuller.getCurentServer() == null, true, "Current Server Null");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), false, "Relay FellOff CHeck");
}
}
// When on REGISTER-REQUEST-SENT and REGISTER_REQUEST_ERROR
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, true);
RelayPullThread relayPuller = bldr.createFellOffRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_REQUEST_SENT, "");
List<IdNamePair> sourcesResponse = new ArrayList<IdNamePair>();
sourcesResponse.add(new IdNamePair(1L, "source1"));
connState.switchToSourcesSuccess(sourcesResponse, _HOSTNAME, _SVCNAME);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
String subsListString = "[{\"physicalSource\":{\"uri\":\"databus:physical-source:ANY\",\"role\":\"MASTER\"},\"physicalPartition\":{\"id\":-1,\"name\":\"*\"},\"logicalPartition\":{\"source\":{\"id\":0,\"name\":\"source1\"},\"id\":-1}}]";
String sourcesIdListString = "1";
connState.switchToRequestSourcesSchemas(sourcesIdListString, subsListString);
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_REQUEST_SENT,"");
// ServerSetChange when New Set includes CurrentServer
{
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer() != null, true, "Current Server not Null");
ServerInfo oldServer = relayPuller.getCurentServer();
Assert.assertEquals(relayPuller.getServers(),expServerInfo,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(true, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer(), oldServer, "Current Server unchanged");
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.REGISTER_REQUEST_SENT, "ServerSetChange while REGISTER_REQUEST_SENT");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: []", "Queue :ServerSetChange while REGISTER_REQUEST_SENT");
}
// ServerSetChange when New Set excludes CurrentServer and SuccessFul Response
{
int oldServerIndex = relayPuller.getCurrentServerIdx();
ServerInfo oldServer = relayPuller.getCurentServer();
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(false, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx(), oldServerIndex, "Current Server Index unchanged");
Assert.assertEquals(relayPuller.getCurentServer(), oldServer, "Current Server unchanged");
Assert.assertEquals(relayPuller.getServers(),expServerInfo3,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), true, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.REGISTER_REQUEST_SENT, "ServerSetChange while REQUEST_REGISTER");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: []", "Queue :ServerSetChange while REQUEST_REGISTER");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "Relay FellOff CHeck");
connState.switchToSourcesRequestError();
testTransitionCase(relayPuller, StateId.REGISTER_REQUEST_ERROR, StateId.PICK_SERVER);
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(relayPuller.getCurrentServerIdx() == -1, true, "Current Server Index undefined");
Assert.assertEquals(relayPuller.getCurentServer() == null, true, "Current Server Null");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), false, "Relay FellOff CHeck");
}
}
// When on REGISTER-REQUEST-SENT and Response Successful
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, true);
RelayPullThread relayPuller = bldr.createFellOffRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_REQUEST_SENT, "");
List<IdNamePair> sourcesResponse = new ArrayList<IdNamePair>();
sourcesResponse.add(new IdNamePair(1L, "source1"));
connState.switchToSourcesSuccess(sourcesResponse, _HOSTNAME, _SVCNAME);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
validateConnState(connState);
relayPuller.getMessageQueue().clear();
String subsListString = "[{\"physicalSource\":{\"uri\":\"databus:physical-source:ANY\",\"role\":\"MASTER\"},\"physicalPartition\":{\"id\":-1,\"name\":\"*\"},\"logicalPartition\":{\"source\":{\"id\":0,\"name\":\"source1\"},\"id\":-1}}]";
String sourcesIdListString = "1";
connState.switchToRequestSourcesSchemas(sourcesIdListString, subsListString);
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_REQUEST_SENT,"");
// ServerSetChange when New Set includes CurrentServer
{
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer() != null, true, "Current Server not Null");
ServerInfo oldServer = relayPuller.getCurentServer();
Assert.assertEquals(relayPuller.getServers(),expServerInfo,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(true, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer(), oldServer, "Current Server unchanged");
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.REGISTER_REQUEST_SENT, "ServerSetChange while REGISTER_REQUEST_SENT");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: []", "Queue :ServerSetChange while REGISTER_REQUEST_SENT");
}
// ServerSetChange when New Set excludes CurrentServer and SuccessFul Response
{
int oldServerIndex = relayPuller.getCurrentServerIdx();
ServerInfo oldServer = relayPuller.getCurentServer();
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(false, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx(), oldServerIndex, "Current Server Index unchanged");
Assert.assertEquals(relayPuller.getCurentServer(), oldServer, "Current Server unchanged");
Assert.assertEquals(relayPuller.getServers(),expServerInfo3,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), true, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.REGISTER_REQUEST_SENT, "ServerSetChange while REQUEST_REGISTER");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: []", "Queue :ServerSetChange while REQUEST_REGISTER");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "Relay FellOff CHeck");
// Now Response arrives
MockRelayConnection conn = (MockRelayConnection)connState.getRelayConnection();
connState.switchToRegisterSuccess(conn.getRegisterResponse(), conn.getRegisterResponse(), conn.getRegisterMetadataResponse());
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS, StateId.PICK_SERVER);
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(relayPuller.getCurrentServerIdx() == -1, true, "Current Server Index undefined");
Assert.assertEquals(relayPuller.getCurentServer() == null, true, "Current Server Null");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), false, "Relay FellOff CHeck");
}
}
// when on REQUEST_STREAM
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
RelayPullThread relayPuller = bldr.createFellOffRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS, StateId.REQUEST_STREAM);
// ServerSetChange when New Set includes CurrentServer
{
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer() != null, true, "Current Server not Null");
ServerInfo oldServer = relayPuller.getCurentServer();
Assert.assertEquals(relayPuller.getServers(),expServerInfo,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(true, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer(), oldServer, "Current Server unchanged");
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.REQUEST_STREAM, "ServerSetChange while REQUEST_STREAM");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: [REQUEST_STREAM]", "Queue :ServerSetChange while REQUEST_STREAM");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "Relay FellOff CHeck");
}
// ServerSetChange when New Set excludes CurrentServer
{
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(false, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx() == -1, true, "Current Server Index undefined");
Assert.assertEquals(relayPuller.getCurentServer() == null, true, "Current Server Null");
Assert.assertEquals(relayPuller.getServers(),expServerInfo3,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.PICK_SERVER, "ServerSetChange while REQUEST_STREAM");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: [PICK_SERVER]", "Queue :ServerSetChange while REQUEST_STREAM");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), false, "Relay FellOff CHeck");
}
}
// When on STREAM_REQUEST_SENT and response successful
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, true);
RelayPullThread relayPuller = bldr.createFellOffRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_REQUEST_SENT, "");
List<IdNamePair> sourcesResponse = new ArrayList<IdNamePair>();
sourcesResponse.add(new IdNamePair(1L, "source1"));
connState.switchToSourcesSuccess(sourcesResponse, _HOSTNAME, _SVCNAME);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
String subsListString = "[{\"physicalSource\":{\"uri\":\"databus:physical-source:ANY\",\"role\":\"MASTER\"},\"physicalPartition\":{\"id\":-1,\"name\":\"*\"},\"logicalPartition\":{\"source\":{\"id\":0,\"name\":\"source1\"},\"id\":-1}}]";
String sourcesIdListString = "1";
connState.switchToRequestSourcesSchemas(sourcesIdListString, subsListString);
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_REQUEST_SENT,"");
relayPuller.getMessageQueue().clear();
MockRelayConnection conn = (MockRelayConnection)connState.getRelayConnection();
connState.switchToRegisterSuccess(conn.getRegisterResponse(), conn.getRegisterResponse(), conn.getRegisterMetadataResponse());
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS, StateId.REQUEST_STREAM);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_STREAM, StateId.STREAM_REQUEST_SENT, "");
// ServerSetChange when New Set includes CurrentServer
{
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer() != null, true, "Current Server not Null");
ServerInfo oldServer = relayPuller.getCurentServer();
Assert.assertEquals(relayPuller.getServers(),expServerInfo,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(true, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer(), oldServer, "Current Server unchanged");
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.STREAM_REQUEST_SENT, "ServerSetChange while STREAM_REQUEST_SENT");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: []", "Queue :ServerSetChange while STREAM_REQUEST_SENT");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "Relay FellOff CHeck");
}
// ServerSetChange when New Set excludes CurrentServer and SuccessFul Response
{
int oldServerIndex = relayPuller.getCurrentServerIdx();
ServerInfo oldServer = relayPuller.getCurentServer();
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(false, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx(), oldServerIndex, "Current Server Index unchanged");
Assert.assertEquals(relayPuller.getCurentServer(), oldServer, "Current Server unchanged");
Assert.assertEquals(relayPuller.getServers(),expServerInfo3,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), true, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.STREAM_REQUEST_SENT, "ServerSetChange while REQUEST_STREAM");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: []", "Queue :ServerSetChange while REQUEST_STREAM");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "Relay FellOff CHeck");
// Now Response arrives
conn = (MockRelayConnection)connState.getRelayConnection();
connState.switchToStreamSuccess(conn.getStreamResponse());
testTransitionCase(relayPuller, StateId.STREAM_REQUEST_SUCCESS, StateId.PICK_SERVER);
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(relayPuller.getCurrentServerIdx() == -1, true, "Current Server Index undefined");
Assert.assertEquals(relayPuller.getCurentServer() == null, true, "Current Server Null");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), false, "Relay FellOff CHeck");
}
}
// When on STREAM_REQUEST_SENT and STREAM_RESPONSE_ERROR
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, true);
RelayPullThread relayPuller = bldr.createFellOffRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_REQUEST_SENT, "");
List<IdNamePair> sourcesResponse = new ArrayList<IdNamePair>();
sourcesResponse.add(new IdNamePair(1L, "source1"));
connState.switchToSourcesSuccess(sourcesResponse, _HOSTNAME, _SVCNAME);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
String subsListString = "[{\"physicalSource\":{\"uri\":\"databus:physical-source:ANY\",\"role\":\"MASTER\"},\"physicalPartition\":{\"id\":-1,\"name\":\"*\"},\"logicalPartition\":{\"source\":{\"id\":0,\"name\":\"source1\"},\"id\":-1}}]";
String sourcesIdListString = "1";
connState.switchToRequestSourcesSchemas(sourcesIdListString, subsListString);
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_REQUEST_SENT,"");
relayPuller.getMessageQueue().clear();
MockRelayConnection conn = (MockRelayConnection)connState.getRelayConnection();
connState.switchToRegisterSuccess(conn.getRegisterResponse(), conn.getRegisterResponse(), conn.getRegisterMetadataResponse());
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS, StateId.REQUEST_STREAM);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_STREAM, StateId.STREAM_REQUEST_SENT, "");
// ServerSetChange when New Set includes CurrentServer
{
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer() != null, true, "Current Server not Null");
ServerInfo oldServer = relayPuller.getCurentServer();
Assert.assertEquals(relayPuller.getServers(),expServerInfo,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(true, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer(), oldServer, "Current Server unchanged");
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.STREAM_REQUEST_SENT, "ServerSetChange while STREAM_REQUEST_SENT");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: []", "Queue :ServerSetChange while STREAM_REQUEST_SENT");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "Relay FellOff CHeck");
}
// ServerSetChange when New Set excludes CurrentServer and StreamResponse Error
{
int oldServerIndex = relayPuller.getCurrentServerIdx();
ServerInfo oldServer = relayPuller.getCurentServer();
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(false, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx(), oldServerIndex, "Current Server Index unchanged");
Assert.assertEquals(relayPuller.getCurentServer(), oldServer, "Current Server unchanged");
Assert.assertEquals(relayPuller.getServers(),expServerInfo3,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), true, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.STREAM_REQUEST_SENT, "ServerSetChange while REQUEST_STREAM");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: []", "Queue :ServerSetChange while REQUEST_STREAM");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "Relay FellOff CHeck");
// Now Response arrives
connState.switchToStreamResponseError();
testTransitionCase(relayPuller, StateId.STREAM_REQUEST_SUCCESS, StateId.PICK_SERVER);
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(relayPuller.getCurrentServerIdx() == -1, true, "Current Server Index undefined");
Assert.assertEquals(relayPuller.getCurentServer() == null, true, "Current Server Null");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), false, "Relay FellOff CHeck");
}
}
// When on STREAM_REQUEST_SENT and STREAM_REQUEST_ERROR
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, true);
RelayPullThread relayPuller = bldr.createFellOffRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_REQUEST_SENT, "");
List<IdNamePair> sourcesResponse = new ArrayList<IdNamePair>();
sourcesResponse.add(new IdNamePair(1L, "source1"));
connState.switchToSourcesSuccess(sourcesResponse, _HOSTNAME, _SVCNAME);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
validateConnState(connState);
relayPuller.getMessageQueue().clear();
String subsListString = "[{\"physicalSource\":{\"uri\":\"databus:physical-source:ANY\",\"role\":\"MASTER\"},\"physicalPartition\":{\"id\":-1,\"name\":\"*\"},\"logicalPartition\":{\"source\":{\"id\":0,\"name\":\"source1\"},\"id\":-1}}]";
String sourcesIdListString = "1";
connState.switchToRequestSourcesSchemas(sourcesIdListString, subsListString);
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_REQUEST_SENT,"");
relayPuller.getMessageQueue().clear();
MockRelayConnection conn = (MockRelayConnection)connState.getRelayConnection();
connState.switchToRegisterSuccess(conn.getRegisterResponse(), conn.getRegisterResponse(), conn.getRegisterMetadataResponse());
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS, StateId.REQUEST_STREAM);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_STREAM, StateId.STREAM_REQUEST_SENT, "");
// ServerSetChange when New Set includes CurrentServer
{
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer() != null, true, "Current Server not Null");
ServerInfo oldServer = relayPuller.getCurentServer();
Assert.assertEquals(relayPuller.getServers(),expServerInfo,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(true, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer(), oldServer, "Current Server unchanged");
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.STREAM_REQUEST_SENT, "ServerSetChange while STREAM_REQUEST_SENT");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: []", "Queue :ServerSetChange while STREAM_REQUEST_SENT");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "Relay FellOff CHeck");
}
// ServerSetChange when New Set excludes CurrentServer and StreamRequest Error
{
int oldServerIndex = relayPuller.getCurrentServerIdx();
ServerInfo oldServer = relayPuller.getCurentServer();
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(false, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx(), oldServerIndex, "Current Server Index unchanged");
Assert.assertEquals(relayPuller.getCurentServer(), oldServer, "Current Server unchanged");
Assert.assertEquals(relayPuller.getServers(),expServerInfo3,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), true, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.STREAM_REQUEST_SENT, "ServerSetChange while REQUEST_STREAM");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: []", "Queue :ServerSetChange while REQUEST_STREAM");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "Relay FellOff CHeck");
// Now Response arrives
connState.switchToStreamRequestError();
testTransitionCase(relayPuller, StateId.STREAM_REQUEST_SUCCESS, StateId.PICK_SERVER);
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(relayPuller.getCurrentServerIdx() == -1, true, "Current Server Index undefined");
Assert.assertEquals(relayPuller.getCurentServer() == null, true, "Current Server Null");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), false, "Relay FellOff CHeck");
}
}
// when Stream_Response_done
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
RelayPullThread relayPuller = bldr.createFellOffRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS, StateId.REQUEST_STREAM);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_STREAM, StateId.STREAM_REQUEST_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.STREAM_REQUEST_SUCCESS,StateId.STREAM_RESPONSE_DONE);
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), false, "Relay FellOff CHeck");
relayPuller.getConnectionState().setRelayFellOff(true);
// ServerSetChange when New Set includes CurrentServer
{
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer() != null, true, "Current Server not Null");
ServerInfo oldServer = relayPuller.getCurentServer();
Assert.assertEquals(relayPuller.getServers(),expServerInfo,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(true, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer(), oldServer, "Current Server unchanged");
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.STREAM_RESPONSE_DONE, "ServerSetChange while STREAM_RESPONSE_DONE");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: [STREAM_RESPONSE_DONE]", "Queue :ServerSetChange while STREAM_RESPONSE_DONE");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "Relay FellOff CHeck");
}
// ServerSetChange when New Set excludes CurrentServer
{
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(false, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx() == -1, true, "Current Server Index undefined");
Assert.assertEquals(relayPuller.getCurentServer() == null, true, "Current Server Null");
Assert.assertEquals(relayPuller.getServers(),expServerInfo3,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.PICK_SERVER, "ServerSetChange while STREAM_RESPONSE_DONE");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: [PICK_SERVER]", "Queue :ServerSetChange while STREAM_RESPONSE_DONE");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), false, "Relay FellOff CHeck");
}
}
// When doBootstrap
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
bldr.setBootstrapEnabled(true).setReadLatestScnEnabled(false).setReadDataThrowException(false)
.setReadDataException(true).setExceptionName(ScnNotFoundException.class.getName());
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS, StateId.REQUEST_STREAM);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_STREAM, StateId.STREAM_REQUEST_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.STREAM_REQUEST_SUCCESS,StateId.BOOTSTRAP);
// ServerSetChange when New Set includes CurrentServer
{
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer() != null, true, "Current Server not Null");
ServerInfo oldServer = relayPuller.getCurentServer();
Assert.assertEquals(relayPuller.getServers(),expServerInfo,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(true, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer(), oldServer, "Current Server unchanged");
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.BOOTSTRAP, "ServerSetChange while BOOTSTRAP");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: [BOOTSTRAP]", "Queue :ServerSetChange while BOOTSTRAP");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "Relay FellOff CHeck");
}
// ServerSetChange when New Set excludes CurrentServer
{
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(false, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx() == -1, true, "Current Server Index undefined");
Assert.assertEquals(relayPuller.getCurentServer() == null, true, "Current Server Null");
Assert.assertEquals(relayPuller.getServers(),expServerInfo3,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.PICK_SERVER, "ServerSetChange while BOOTSTRAP");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: [PICK_SERVER]", "Queue :ServerSetChange while BOOTSTRAP");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), false, "Relay FellOff CHeck");
}
}
// When doBootstrapRequested and bootstrap Successful
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
bldr.setBootstrapEnabled(true).setReadLatestScnEnabled(false).setReadDataThrowException(false)
.setReadDataException(true).setExceptionName(ScnNotFoundException.class.getName());
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS, StateId.REQUEST_STREAM);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_STREAM, StateId.STREAM_REQUEST_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.STREAM_REQUEST_SUCCESS,StateId.BOOTSTRAP);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.BOOTSTRAP,StateId.BOOTSTRAP_REQUESTED,"");
// ServerSetChange when New Set includes CurrentServer
{
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer() != null, true, "Current Server not Null");
ServerInfo oldServer = relayPuller.getCurentServer();
Assert.assertEquals(relayPuller.getServers(),expServerInfo,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(true, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer(), oldServer, "Current Server unchanged");
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.BOOTSTRAP_REQUESTED, "ServerSetChange while BOOTSTRAP_REQUESTED");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: []", "Queue :ServerSetChange while BOOTSTRAP_REQUESTED");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "Relay FellOff CHeck");
}
// ServerSetChange when New Set excludes CurrentServer and SuccessFul Response
{
int oldServerIndex = relayPuller.getCurrentServerIdx();
ServerInfo oldServer = relayPuller.getCurentServer();
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(false, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx(), oldServerIndex, "Current Server Index unchanged");
Assert.assertEquals(relayPuller.getCurentServer(), oldServer, "Current Server unchanged");
Assert.assertEquals(relayPuller.getServers(),expServerInfo3,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), true, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.BOOTSTRAP_REQUESTED, "ServerSetChange while BOOTSTRAP");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: []", "Queue :ServerSetChange while BOOTSTRAP");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "Relay FellOff CHeck");
// Now Response arrives
BootstrapResultMessage msg = BootstrapResultMessage.createBootstrapCompleteMessage(new Checkpoint());
doExecuteAndChangeState(relayPuller,msg);
Assert.assertEquals(connState.getStateId(),StateId.PICK_SERVER, "BOOTSTRAP_REQUESTED to PICK_SERVER");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: [PICK_SERVER]", "Queue :BOOTSTRAP_REQUESTED to REQUEST_STREAM");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(relayPuller.getCurrentServerIdx() == -1, true, "Current Server Index undefined");
Assert.assertEquals(relayPuller.getCurentServer() == null, true, "Current Server Null");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), false, "Relay FellOff CHeck");
}
}
// When doBootstrapRequested and bootstrap failed
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
bldr.setBootstrapEnabled(true).setReadLatestScnEnabled(false).setReadDataThrowException(false)
.setReadDataException(true).setExceptionName(ScnNotFoundException.class.getName());
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.SOURCES_RESPONSE_SUCCESS, StateId.REQUEST_REGISTER);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_REGISTER, StateId.REGISTER_RESPONSE_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REGISTER_RESPONSE_SUCCESS, StateId.REQUEST_STREAM);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_STREAM, StateId.STREAM_REQUEST_SUCCESS);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.STREAM_REQUEST_SUCCESS,StateId.BOOTSTRAP);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.BOOTSTRAP,StateId.BOOTSTRAP_REQUESTED,"");
// ServerSetChange when New Set includes CurrentServer
{
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer() != null, true, "Current Server not Null");
ServerInfo oldServer = relayPuller.getCurentServer();
Assert.assertEquals(relayPuller.getServers(),expServerInfo,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(true, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer(), oldServer, "Current Server unchanged");
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.BOOTSTRAP_REQUESTED, "ServerSetChange while BOOTSTRAP_REQUESTED");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: []", "Queue :ServerSetChange while BOOTSTRAP_REQUESTED");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "Relay FellOff CHeck");
}
// ServerSetChange when New Set excludes CurrentServer and SuccessFul Response
{
int oldServerIndex = relayPuller.getCurrentServerIdx();
ServerInfo oldServer = relayPuller.getCurentServer();
Assert.assertEquals(relayPuller.getServers(),expServerInfo2,"Server Set");
doExecuteAndChangeState(relayPuller,createSetServerMessage(false, relayPuller));
Assert.assertEquals(relayPuller.getCurrentServerIdx(), oldServerIndex, "Current Server Index unchanged");
Assert.assertEquals(relayPuller.getCurentServer(), oldServer, "Current Server unchanged");
Assert.assertEquals(relayPuller.getServers(),expServerInfo3,"Server Set");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), true, "Tear Conn After Handling Response");
Assert.assertEquals(connState.getStateId(),StateId.BOOTSTRAP_REQUESTED, "ServerSetChange while BOOTSTRAP");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: []", "Queue :ServerSetChange while BOOTSTRAP");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), true, "Relay FellOff CHeck");
// Now Response arrives
BootstrapResultMessage msg = BootstrapResultMessage.createBootstrapFailedMessage(new RuntimeException("dummy"));
doExecuteAndChangeState(relayPuller,msg);
Assert.assertEquals(connState.getStateId(),StateId.PICK_SERVER, "BOOTSTRAP_REQUESTED to PICK_SERVER");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: [PICK_SERVER]", "Queue :BOOTSTRAP_REQUESTED to REQUEST_STREAM");
Assert.assertEquals(relayPuller.toTearConnAfterHandlingResponse(), false, "Tear Conn After Handling Response");
Assert.assertEquals(relayPuller.getCurrentServerIdx() == -1, true, "Current Server Index undefined");
Assert.assertEquals(relayPuller.getCurentServer() == null, true, "Current Server Null");
Assert.assertEquals(relayPuller.getConnectionState().isRelayFellOff(), false, "Relay FellOff CHeck");
}
}
// Server-Set-Change message when suspended_due_to_error
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
bldr.setBootstrapEnabled(true).setReadLatestScnEnabled(false).setReadDataThrowException(false)
.setReadDataException(true).setExceptionName(ScnNotFoundException.class.getName()).setNumRetriesOnFellOff(5);
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_RESPONSE_SUCCESS);
ServerSetChangeMessage msg = createSetServerMessage(false, relayPuller);
relayPuller.enqueueMessage(msg);
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: [SOURCES_RESPONSE_SUCCESS, SET_SERVERS]", "Queue :ServerSetChange");
doExecuteAndChangeState(relayPuller,LifecycleMessage.createSuspendOnErroMessage(new RuntimeException("null")));
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: [SET_SERVERS]", "Queue :ServerSetChange");
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer() != null, true, "Current Server not Null");
Assert.assertEquals(relayPuller.getServers(),expServerInfo,"Server Set");
Assert.assertEquals(relayPuller.getComponentStatus().getStatus(),Status.SUSPENDED_ON_ERROR,"Suspended state check");
connState.switchToRequestSourcesSchemas(null, null);
relayPuller.getMessageQueue().clear();
doExecuteAndChangeState(relayPuller,msg);
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: [RESUME]", "Queue :ServerSetChange");
Assert.assertEquals(relayPuller.getCurentServer() == null, true, "Current Server null");
Assert.assertEquals(relayPuller.getServers(),expServerInfo3,"Server Set");
// on doResume verify if PICK_SERVER happens
doExecuteAndChangeState(relayPuller,relayPuller.getMessageQueue().poll());
Assert.assertEquals(relayPuller.getComponentStatus().getStatus(),Status.RUNNING," state check");
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: [PICK_SERVER]", "Queue :ServerSetChange");
}
// Server-Set-Change message when PAUSED
{
RelayPullThreadBuilder bldr = new RelayPullThreadBuilder(false, false);
bldr.setBootstrapEnabled(true).setReadLatestScnEnabled(false).setReadDataThrowException(false)
.setReadDataException(true).setExceptionName(ScnNotFoundException.class.getName());
RelayPullThread relayPuller = bldr.createRelayPullThread();
relayPuller.getComponentStatus().start();
ConnectionState connState = relayPuller.getConnectionState();
connState.switchToPickServer();
testTransitionCase(relayPuller, StateId.PICK_SERVER, StateId.REQUEST_SOURCES);
relayPuller.getMessageQueue().clear();
testTransitionCase(relayPuller, StateId.REQUEST_SOURCES, StateId.SOURCES_RESPONSE_SUCCESS);
ServerSetChangeMessage msg = createSetServerMessage(false, relayPuller);
relayPuller.enqueueMessage(msg);
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: [SOURCES_RESPONSE_SUCCESS, SET_SERVERS]", "Queue :ServerSetChange");
doExecuteAndChangeState(relayPuller,LifecycleMessage.createPauseMessage());
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: [SET_SERVERS]", "Queue :ServerSetChange");
Assert.assertEquals(relayPuller.getCurrentServerIdx() != -1, true, "Current Server Index defined");
Assert.assertEquals(relayPuller.getCurentServer() != null, true, "Current Server not Null");
Assert.assertEquals(relayPuller.getServers(),expServerInfo,"Server Set");
Assert.assertEquals(relayPuller.getComponentStatus().getStatus(),Status.PAUSED,"PAUSED state check");
connState.switchToRequestSourcesSchemas(null, null);
relayPuller.getMessageQueue().clear();
doExecuteAndChangeState(relayPuller,msg);
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: []", "Queue :ServerSetChange");
Assert.assertEquals(relayPuller.getCurentServer() == null, true, "Current Server null");
Assert.assertEquals(relayPuller.getServers(),expServerInfo3,"Server Set");
}
}
}
private ServerSetChangeMessage createSetServerMessage(boolean keepCurrent, BasePullThread puller)
{
Set<ServerInfo> serverInfoSet = new HashSet<ServerInfo>();
InetSocketAddress inetAddr1 = new InetSocketAddress("localhost",10000);
ServerInfo s = new ServerInfo("newRelay1", "ONLINE", inetAddr1, Arrays.asList("source1"));
serverInfoSet.add(s);
if ( keepCurrent )
{
serverInfoSet.addAll(puller.getServers());
}
ServerSetChangeMessage msg = ServerSetChangeMessage.createSetServersMessage(serverInfoSet);
return msg;
}
private void testTransitionCase(RelayPullThread relayPuller, StateId currState, StateId finalState)
{
testTransitionCase(relayPuller, currState, finalState, finalState.toString());
}
private void testTransitionCase(RelayPullThread relayPuller, StateId currState, StateId finalState, String msgQueueState)
{
ConnectionState connState = relayPuller.getConnectionState();
doExecuteAndChangeState(relayPuller,connState);
Assert.assertEquals(connState.getStateId(),finalState, "" + currState + " to " + finalState );
Assert.assertEquals(relayPuller.getQueueListString(), "RelayPuller queue: [" + msgQueueState + "]", "Queue :" + currState + " to " + finalState);
}
@Test(groups={"small", "functional"})
public void testRelayPendingEvent() throws Exception
{
final Logger log = Logger.getLogger("TestRelayPullThread.testRelayPendingEvent");
log.setLevel(Level.INFO);
log.info("-------------- start -------------------");
//set a clientReadBufferSize equal to maxSize ; this is also used to generate an event larger than what can fit in buffer
final int clientReadBufferSize = 100000;
//set initReadBufferSize to a value greater than default averageEventSize which is 20K but lesser than 0.25*maxSize.
//See DbsuEventBuffer.Config.DEFAULT_AVERAGE_EVENT_SIZE
final int averageEventSize=22500;
List<String> sources = Arrays.asList("source1");
Properties clientProps = new Properties();
clientProps.setProperty("client.runtime.bootstrap.enabled", "false");
clientProps.setProperty("client.runtime.relay(1).name", "relay1");
clientProps.setProperty("client.runtime.relay(1).port", "10001");
clientProps.setProperty("client.runtime.relay(1).sources", "source1");
clientProps.setProperty("client.connectionDefaults.eventBuffer.maxSize", Integer.toString(clientReadBufferSize));
//this setting should have no effect
clientProps.setProperty("client.connectionDefaults.eventBuffer.readBufferSize", Integer.toString(clientReadBufferSize));
//readBufferSize init size will be set to this value
clientProps.setProperty("client.connectionDefaults.eventBuffer.averageEventSize",Integer.toString(averageEventSize));
//set a high value of freeBufferThreshold which is unsafe; this setting should fail
clientProps.setProperty("client.connectionDefaults.freeBufferThreshold", "100000");
DatabusHttpClientImpl client = new DatabusHttpClientImpl("client.", clientProps);
Assert.assertNotNull(client, "client instantiation ok");
final DatabusHttpClientImpl.StaticConfig clientConf = client.getClientStaticConfig();
final DatabusSourcesConnection.StaticConfig srcConnConf = clientConf.getConnectionDefaults();
DatabusHttpClientImpl.RuntimeConfig clientRtConf = clientConf.getRuntime().build();
DbusEventBuffer.StaticConfig bufferConf = clientConf.getConnectionDefaults().getEventBuffer();
log.info("Buffer size="+bufferConf.getMaxSize() + " readBufferSize=" + bufferConf.getReadBufferSize()
+ " maxEventSize=" + bufferConf.getMaxEventSize());
Assert.assertEquals(bufferConf.getReadBufferSize(), averageEventSize);
//This should be equal to the maxEventSize if defaults are used for maxEventSize
Assert.assertTrue(bufferConf.getReadBufferSize() < bufferConf.getMaxEventSize());
Assert.assertEquals(clientConf.getConnectionDefaults().getFreeBufferThreshold(),clientConf.getConnectionDefaults().getFreeBufferThreshold());
DbusEventBuffer relayBuffer = new DbusEventBuffer(bufferConf);
AtomicInteger serverIdx = new AtomicInteger(-1);
Set<ServerInfo> relays = clientRtConf.getRelaysSet(); // just one relay defined in our clientProps
List<ServerInfo> relayOrder = new ArrayList<ServerInfo>(relays);
List<IdNamePair> sourcesResponse = new ArrayList<IdNamePair>();
sourcesResponse.add(new IdNamePair(1L, "source1"));
RegisterResponseEntry rre1 = new RegisterResponseEntry(1L, (short)1, SCHEMA$.toString());
final HashMap<Long, List<RegisterResponseEntry>> registerResponseSources =
new HashMap<Long, List<RegisterResponseEntry>>(); // mapping of sourceId to list of schema versions for that ID
registerResponseSources.put(1L, Arrays.asList(rre1));
ChunkedBodyReadableByteChannel channel = new MockChunkedBodyReadableByteChannel(clientReadBufferSize+10);
final MockRelayConnection mockConn = new MockRelayConnection(sourcesResponse, registerResponseSources, channel, serverIdx);
DatabusRelayConnectionFactory mockConnFactory =
EasyMock.createMock("mockRelayFactory", DatabusRelayConnectionFactory.class);
EasyMock.expect(mockConnFactory.createRelayConnection(
serverNameMatcher(serverIdx, relayOrder),
EasyMock.<ActorMessageQueue>notNull(),
EasyMock.<RemoteExceptionHandler>notNull())).andReturn(mockConn).times(1);
EasyMock.replay(mockConnFactory);
List<DatabusSubscription> sourcesSubList = DatabusSubscription.createSubscriptionList(sources);
//Dummy connection object as expected by the puller thread
// Note that in this case, it is ok to pass Set<relays> as all the relays serve the same source
//"source1"
ConnectionStateFactory connStateFactory = new ConnectionStateFactory(sources);
DatabusSourcesConnection sourcesConn = new DatabusSourcesConnection(
srcConnConf, sourcesSubList, relays, null, null, null, relayBuffer, null,
Executors.newCachedThreadPool(), null, null, null, null, null, null, null, mockConnFactory, null,
null, null, null, new DbusEventV1Factory(), connStateFactory);
final RelayPullThread relayPuller =
new RelayPullThread("RelayPuller", sourcesConn, relayBuffer, connStateFactory, relays,
new ArrayList<DbusKeyCompositeFilterConfig>(),
!clientConf.getRuntime().getBootstrap().isEnabled(),
clientConf.isReadLatestScnOnErrorEnabled(),
clientConf.getPullerBufferUtilizationPct(),
Integer.MAX_VALUE,
ManagementFactory.getPlatformMBeanServer(),
new DbusEventV1Factory(),
null);
final MockRemoteExceptionHandler mockRemoteExceptionHandler =
new MockRemoteExceptionHandler(sourcesConn, relayBuffer, relayPuller);
Field field = relayPuller.getClass().getDeclaredField("_remoteExceptionHandler");
field.setAccessible(true);
field.set(relayPuller, mockRemoteExceptionHandler);
mockConn.setCallback(relayPuller);
//Let the show begin
Thread relayPullerThread = new Thread(relayPuller);
relayPullerThread.setDaemon(true);
relayPullerThread.start();
relayPuller.enqueueMessage(LifecycleMessage.createStartMessage());
// We will try the same relay 3 times and then our remote exception handler will be invoked.
TestUtil.assertWithBackoff(new ConditionCheck()
{
@Override
public boolean check()
{
return relayPuller.getComponentStatus().getStatus() == Status.SUSPENDED_ON_ERROR;
}
}, "Reached SUSPEND_ON_ERROR state ", 500, log);
EasyMock.verify(mockConnFactory);
relayPuller.enqueueMessage(LifecycleMessage.createShutdownMessage());
relayPuller.awaitShutdown();
log.info("------------ done --------------");
}
@Test(groups={"small", "functional"})
public void testRelayFailOver() throws Exception
{
final Logger log = Logger.getLogger("TestRelayPullThread.testRelayFailOver");
log.setLevel(Level.INFO);
log.info("-------------- start -------------------");
List<String> sources = Arrays.asList("source1");
Properties clientProps = new Properties();
clientProps.setProperty("client.runtime.bootstrap.enabled", "false");
clientProps.setProperty("client.runtime.relay(1).name", "relay1");
clientProps.setProperty("client.runtime.relay(1).port", "10001");
clientProps.setProperty("client.runtime.relay(1).sources", "source1");
clientProps.setProperty("client.runtime.relay(2).name", "relay2");
clientProps.setProperty("client.runtime.relay(2).port", "10002");
clientProps.setProperty("client.runtime.relay(2).sources", "source1");
clientProps.setProperty("client.runtime.relay(3).name", "relay3");
clientProps.setProperty("client.runtime.relay(3).port", "10003");
clientProps.setProperty("client.runtime.relay(3).sources", "source1");
clientProps.setProperty("client.connectionDefaults.eventBuffer.maxSize", "100000");
clientProps.setProperty("client.connectionDefaults.pullerRetries.maxRetryNum", "9");
clientProps.setProperty("client.connectionDefaults.pullerRetries.sleepIncFactor", "1.0");
clientProps.setProperty("client.connectionDefaults.pullerRetries.sleepIncDelta", "1");
clientProps.setProperty("client.connectionDefaults.pullerRetries.initSleep", "1");
DatabusHttpClientImpl client = new DatabusHttpClientImpl("client.", clientProps);
Assert.assertNotNull(client, "client instantiation ok");
final DatabusHttpClientImpl.StaticConfig clientConf = client.getClientStaticConfig();
final DatabusSourcesConnection.StaticConfig srcConnConf = clientConf.getConnectionDefaults();
DatabusHttpClientImpl.RuntimeConfig clientRtConf = clientConf.getRuntime().build();
DbusEventBuffer.StaticConfig bufferConf = clientConf.getConnectionDefaults().getEventBuffer();
DbusEventBuffer relayBuffer = new DbusEventBuffer(bufferConf);
DbusEventBuffer bootstrapBuffer = new DbusEventBuffer(bufferConf);
//we keep the index of the next server we expect to see
AtomicInteger serverIdx = new AtomicInteger(-1);
Set<ServerInfo> relays = clientRtConf.getRelaysSet();
//generate the order in which we should see the servers
List<ServerInfo> relayOrder = new ArrayList<ServerInfo>(relays);
if (log.isInfoEnabled())
{
StringBuilder sb = new StringBuilder();
for (ServerInfo serverInfo: relayOrder)
{
sb.append(serverInfo.getName());
sb.append(" ");
}
log.info("Relay order:" + sb.toString());
}
//This guy always fails on /sources
final MockRelayConnection mockFailConn = new MockRelayConnection(null, null, null, serverIdx);
List<IdNamePair> sourcesResponse = new ArrayList<IdNamePair>();
sourcesResponse.add(new IdNamePair(1L, "source1"));
//This guy succeeds on /sources but fails on /register
final MockRelayConnection mockSuccessConn =
new MockRelayConnection(sourcesResponse, null, null, serverIdx);
DatabusRelayConnectionFactory mockConnFactory =
EasyMock.createMock("mockRelayFactory", DatabusRelayConnectionFactory.class);
//each server should be tried MAX_RETRIES time until all retries are exhausted
for (int i = 0; i < clientConf.getConnectionDefaults().getPullerRetries().getMaxRetryNum() / 3; ++i)
{
EasyMock.expect(mockConnFactory.createRelayConnection(
serverNameMatcher(serverIdx, relayOrder),
EasyMock.<ActorMessageQueue>notNull(),
EasyMock.<RemoteExceptionHandler>notNull())).andReturn(mockFailConn);
EasyMock.expect(mockConnFactory.createRelayConnection(
serverNameMatcher(serverIdx, relayOrder),
EasyMock.<ActorMessageQueue>notNull(),
EasyMock.<RemoteExceptionHandler>notNull())).andReturn(mockFailConn);
EasyMock.expect(mockConnFactory.createRelayConnection(
serverNameMatcher(serverIdx, relayOrder),
EasyMock.<ActorMessageQueue>notNull(),
EasyMock.<RemoteExceptionHandler>notNull())).andReturn(mockSuccessConn);
}
EasyMock.replay(mockConnFactory);
List<DatabusSubscription> sourcesSubList = DatabusSubscription.createSubscriptionList(sources);
//Dummy connection object as expected by the puller thread
// Note that in this case, it is ok to pass Set<relays> as all the relays serve the same source
//"source1"
ConnectionStateFactory connStateFactory = new ConnectionStateFactory(sources);
DatabusSourcesConnection sourcesConn = new DatabusSourcesConnection(
srcConnConf, sourcesSubList, relays, null, null, null, relayBuffer, bootstrapBuffer,
Executors.newCachedThreadPool(), null, null, null, null, null, null, null, mockConnFactory, null,
null, null, null, new DbusEventV1Factory(), connStateFactory);
final RelayPullThread relayPuller =
new RelayPullThread("RelayPuller", sourcesConn, relayBuffer, connStateFactory, relays,
new ArrayList<DbusKeyCompositeFilterConfig>(),
!clientConf.getRuntime().getBootstrap().isEnabled(),
clientConf.isReadLatestScnOnErrorEnabled(),
clientConf.getPullerBufferUtilizationPct(),
Integer.MAX_VALUE,
ManagementFactory.getPlatformMBeanServer(),
new DbusEventV1Factory(),
null);
RemoteExceptionHandler mockRemoteExceptionHandler =
new MockRemoteExceptionHandler(sourcesConn, relayBuffer, relayPuller);
Field field = relayPuller.getClass().getDeclaredField("_remoteExceptionHandler");
field.setAccessible(true);
field.set(relayPuller, mockRemoteExceptionHandler);
mockFailConn.setCallback(relayPuller);
mockSuccessConn.setCallback(relayPuller);
//Let the show begin
Thread relayPullerThread = new Thread(relayPuller);
relayPullerThread.setDaemon(true);
relayPullerThread.start();
relayPuller.enqueueMessage(LifecycleMessage.createStartMessage());
TestUtil.assertWithBackoff(new ConditionCheck()
{
@Override
public boolean check()
{
return mockFailConn.getSourcesCallCounter() == 6;
}
}, "failConn: correct number of /sources", 500, log);
Assert.assertEquals(mockFailConn.getRegisterCallCounter(),
0,
"failConn: correct number of /register");
Assert.assertEquals(mockFailConn.getStreamCallCounter(),
0,
"failConn: correct number of /stream");
TestUtil.assertWithBackoff(new ConditionCheck()
{
@Override
public boolean check()
{
return mockSuccessConn.getSourcesCallCounter() == 3;
}
}, "successConn: correct number of /sources", 500, log);
Assert.assertEquals(mockSuccessConn.getRegisterCallCounter(),
3,
"successConn: correct number of /register");
Assert.assertEquals(mockSuccessConn.getStreamCallCounter(),
0,
"successConn: correct number of /stream");
TestUtil.assertWithBackoff(new ConditionCheck()
{
@Override
public boolean check()
{
return relayPuller.getComponentStatus().getStatus() ==
DatabusComponentStatus.Status.SUSPENDED_ON_ERROR;
}
}, "puller suspended because of out of retries", 500, log);
EasyMock.verify(mockConnFactory);
relayPuller.enqueueMessage(LifecycleMessage.createShutdownMessage());
relayPuller.awaitShutdown();
log.info("------------ done --------------");
}
@Test
/**
* DDSDBUS-1904: test a race condition between shutting down a connection and a reconnect to the
* relay which may cause a Netty connection to be left open after the RelayPuller shutdown.
* The idea is to trigger a shutdown exactly while we are trying to connect to a relay. We achieve
* that by rigging MockRelayConnection to call RelayPuller.shutdown() right before responding
* to requestSources();
* */
public void testShutdownRace() throws Exception
{
final Logger log = Logger.getLogger("TestRelayPullThread.testShutdownRace");
log.setLevel(Level.INFO);
log.info("start");
//elaborate test setup
List<String> sources = Arrays.asList("source1");
Properties clientProps = new Properties();
clientProps.setProperty("client.container.httpPort", "0");
clientProps.setProperty("client.runtime.bootstrap.enabled", "false");
clientProps.setProperty("client.runtime.relay(1).name", "relay1");
clientProps.setProperty("client.runtime.relay(1).port", "10001");
clientProps.setProperty("client.runtime.relay(1).sources", "source1");
clientProps.setProperty("client.connectionDefaults.eventBuffer.maxSize", "100000");
clientProps.setProperty("client.connectionDefaults.pullerRetries.maxRetryNum", "9");
clientProps.setProperty("client.connectionDefaults.pullerRetries.sleepIncFactor", "1.0");
clientProps.setProperty("client.connectionDefaults.pullerRetries.sleepIncDelta", "1");
clientProps.setProperty("client.connectionDefaults.pullerRetries.initSleep", "1");
DatabusHttpClientImpl client = new DatabusHttpClientImpl("client.", clientProps);
Assert.assertNotNull(client, "client instantiation ok");
final DatabusHttpClientImpl.StaticConfig clientConf = client.getClientStaticConfig();
final DatabusSourcesConnection.StaticConfig srcConnConf = clientConf.getConnectionDefaults();
DatabusHttpClientImpl.RuntimeConfig clientRtConf = clientConf.getRuntime().build();
DbusEventBuffer.StaticConfig bufferConf = clientConf.getConnectionDefaults().getEventBuffer();
DbusEventBuffer relayBuffer = new DbusEventBuffer(bufferConf);
DbusEventBuffer bootstrapBuffer = new DbusEventBuffer(bufferConf);
//we keep the index of the next server we expect to see
AtomicInteger serverIdx = new AtomicInteger(-1);
Set<ServerInfo> relays = clientRtConf.getRelaysSet();
//generate the order in which we should see the servers
List<ServerInfo> relayOrder = new ArrayList<ServerInfo>(relays);
if (LOG.isInfoEnabled())
{
StringBuilder sb = new StringBuilder();
for (ServerInfo serverInfo: relayOrder)
{
sb.append(serverInfo.getName());
sb.append(" ");
}
LOG.info("Relay order:" + sb.toString());
}
List<IdNamePair> sourcesResponse = new ArrayList<IdNamePair>();
sourcesResponse.add(new IdNamePair(1L, "source1"));
RegisterResponseEntry rre1 = new RegisterResponseEntry(1L, (short)1, SCHEMA$.toString());
final HashMap<Long, List<RegisterResponseEntry>> registerResponse =
new HashMap<Long, List<RegisterResponseEntry>>();
registerResponse.put(1L, Arrays.asList(rre1));
//This guy succeeds on both /sources and /register
final MockRelayConnection relayConn1 =
new MockRelayConnection(sourcesResponse,
registerResponse,
null,
serverIdx);
//This guy will succeed on /sources but will force a shutdown so that
//the success message is ignored
final MockRelayConnection relayConn2 =
new MockRelayConnectionForTestShutdownRace(sourcesResponse,
null,
null,
serverIdx,
log);
DatabusRelayConnectionFactory mockConnFactory =
EasyMock.createMock("mockRelayFactory", DatabusRelayConnectionFactory.class);
// expected scenario: create relayConn1 -> /sources success -> /register success ->
// /stream error -> create relayConn2 -> call /sources -> shut down puller -> return
// success for /sources
EasyMock.expect(mockConnFactory.createRelayConnection(
serverNameMatcher(serverIdx, relayOrder),
EasyMock.<ActorMessageQueue>notNull(),
EasyMock.<RemoteExceptionHandler>notNull())).andReturn(relayConn1);
EasyMock.expect(mockConnFactory.createRelayConnection(
serverNameMatcher(serverIdx, relayOrder),
EasyMock.<ActorMessageQueue>notNull(),
EasyMock.<RemoteExceptionHandler>notNull())).andReturn(relayConn2);
EasyMock.replay(mockConnFactory);
List<DatabusSubscription> sourcesSubList = DatabusSubscription.createSubscriptionList(sources);
//Dummy connection object as expected by the puller thread
// Note that in this case, it is ok to pass Set<relays> as all the relays serve the same source "source1"
ConnectionStateFactory connStateFactory = new ConnectionStateFactory(sources);
DatabusSourcesConnection sourcesConn = new DatabusSourcesConnection(
srcConnConf, sourcesSubList, relays, null, null, null, relayBuffer, bootstrapBuffer,
Executors.newCachedThreadPool(), null, null, null, null, null, null, null, mockConnFactory, null,
null, null, null, new DbusEventV1Factory(), connStateFactory);
final RelayPullThread relayPuller =
new RelayPullThread("RelayPuller", sourcesConn, relayBuffer, connStateFactory, relays,
new ArrayList<DbusKeyCompositeFilterConfig>(),
!clientConf.getRuntime().getBootstrap().isEnabled(),
clientConf.isReadLatestScnOnErrorEnabled(),
clientConf.getPullerBufferUtilizationPct(),
Integer.MAX_VALUE,
ManagementFactory.getPlatformMBeanServer(),
new DbusEventV1Factory(),
null);
//relayPuller.getLog().setLevel(Level.INFO);
RemoteExceptionHandler mockRemoteExceptionHandler =
new MockRemoteExceptionHandler(sourcesConn, relayBuffer, relayPuller);
Field field = relayPuller.getClass().getDeclaredField("_remoteExceptionHandler");
field.setAccessible(true);
field.set(relayPuller, mockRemoteExceptionHandler);
relayConn1.setCallback(relayPuller);
relayConn2.setCallback(relayPuller);
//Let the show begin
final Thread relayPullerThread = new Thread(relayPuller, "testShutdownRace.RelayPuller");
relayPullerThread.setDaemon(true);
relayPullerThread.start();
relayPuller.enqueueMessage(LifecycleMessage.createStartMessage());
//wait for the puller to go the STREAM_REQUEST_SUCCESS state
TestUtil.assertWithBackoff(new ConditionCheck()
{
@Override
public boolean check()
{
return null != relayConn1.getLastStateMsg();
}
}, "wait for call from the puller to the relay connection", 500, log);
//wait for puller thread to shutdown
TestUtil.assertWithBackoff(new ConditionCheck()
{
@Override
public boolean check()
{
log.debug(relayPuller.getMessageHistoryLog());
return !relayPullerThread.isAlive();
}
}, "wait for puller to shutdown", 1000, log);
EasyMock.verify(mockConnFactory);
Assert.assertEquals(relayPuller.getLastOpenConnection(), null);
log.info("done");
}
public static ServerInfo serverNameMatcher(AtomicInteger serverIdx, List<ServerInfo> serverOrder)
{
EasyMock.reportMatcher(new ServerNameMatcher(serverIdx, serverOrder));
return null;
}
private void doExecuteAndChangeState(RelayPullThread thread, Object msg)
{
Object obj = msg;
if ( msg instanceof ConnectionState)
{
ConnectionState o = (ConnectionState)msg;
obj = new ConnectionStateMessage(o.getStateId(), o);
}
thread.doExecuteAndChangeState(obj);
}
}
class ServerNameMatcher implements IArgumentMatcher
{
private final AtomicInteger _sharedServerIdx;
private final List<ServerInfo> _serverOrder;
public ServerNameMatcher(AtomicInteger serverIdx, List<ServerInfo> serverOrder)
{
_sharedServerIdx = serverIdx;
_serverOrder = serverOrder;
Collections.sort(_serverOrder);
}
@Override
public void appendTo(StringBuffer sbuf)
{
int idx = _sharedServerIdx.get();
String serverName = idx < 0 ? "null" : _serverOrder.get(idx % _serverOrder.size()).getName();
sbuf.append("serverNameMatch(");
sbuf.append(idx % _serverOrder.size());
sbuf.append("-->");
sbuf.append(serverName);
sbuf.append(")");
}
@Override
public boolean matches(Object o)
{
boolean success = true;
ServerInfo serverInfo = null;
if (success) success = o instanceof ServerInfo;
if (success) serverInfo = (ServerInfo)o;
int serverIdx = -1;
if (success)
{
serverIdx = _serverOrder.indexOf(serverInfo);
success = serverIdx >= 0;
}
int expectedIndex = _sharedServerIdx.get() % _serverOrder.size();
if (success) success = -1 == expectedIndex || serverIdx == expectedIndex;
if (success && (-1 == expectedIndex)) _sharedServerIdx.set(serverIdx);
return success;
}
}
class MockRelayConnection implements DatabusRelayConnection
{
private final List<IdNamePair> _sourceIds;
private final Map<Long, List<RegisterResponseEntry>> _registerSourcesResponse;
private final List<RegisterResponseMetadataEntry> _registerMetadataResponse;
private final ChunkedBodyReadableByteChannel _streamResponse;
private final AtomicInteger _sharedServerIdx;
private AbstractActorMessageQueue _callback = null;
private int _sourcesCallCounter = 0;
private int _registerCallCounter = 0;
private int _streamCallCounter = 0;
private boolean _muteTransition = false;
private boolean enableReadLatest = false;
private DbusKeyCompositeFilter _relayFilter;
private int _protocolVersion = 0;
DatabusRelayConnectionStateMessage _lastStateMsg;
public MockRelayConnection(List<IdNamePair> sourceIds,
Map<Long, List<RegisterResponseEntry>> registerSourcesResponse,
ChunkedBodyReadableByteChannel streamResponse,
AtomicInteger sharedServerIdx)
{
this(sourceIds, registerSourcesResponse, null, null, streamResponse, sharedServerIdx, false);
}
public MockRelayConnection(List<IdNamePair> sourceIds,
Map<Long, List<RegisterResponseEntry>> registerSourcesResponse,
Map<Long, List<RegisterResponseEntry>> registerKeysResponse,
List<RegisterResponseMetadataEntry> registerMetadataResponse,
ChunkedBodyReadableByteChannel streamResponse,
AtomicInteger sharedServerIdx,
boolean muteTransition)
{
super();
_sourceIds = sourceIds;
_registerSourcesResponse = registerSourcesResponse;
_registerMetadataResponse = registerMetadataResponse;
_streamResponse = streamResponse;
_sharedServerIdx = sharedServerIdx;
_muteTransition = muteTransition;
}
@Override
public void close()
{
}
@Override
public void requestSources(DatabusRelayConnectionStateMessage stateReuse)
{
_lastStateMsg = stateReuse;
++ _sourcesCallCounter;
if (null == _sourceIds)
{
if ( !_muteTransition) stateReuse.switchToSourcesRequestError();
_sharedServerIdx.incrementAndGet();
}
else
{
if ( !_muteTransition) stateReuse.switchToSourcesSuccess(_sourceIds, TestRelayPullThread._HOSTNAME,
TestRelayPullThread._SVCNAME);
}
if (null != _callback && !_muteTransition) _callback.enqueueMessage(stateReuse);
}
@Override
public void requestRegister(String sourcesIdList,
DatabusRelayConnectionStateMessage stateReuse)
{
_lastStateMsg = stateReuse;
++ _registerCallCounter;
if (null == _registerSourcesResponse)
{
if ( !_muteTransition) stateReuse.switchToRegisterRequestError();
_sharedServerIdx.incrementAndGet();
}
else
{
if ( !_muteTransition) stateReuse.switchToRegisterSuccess(_registerSourcesResponse, _registerSourcesResponse, _registerMetadataResponse);
}
if (null != _callback && !_muteTransition) _callback.enqueueMessage(stateReuse);
}
@Override
public void requestStream(String sourcesIdList,
DbusKeyCompositeFilter filter,
int freeBufferSpace,
CheckpointMult cp,
Range keyRange,
DatabusRelayConnectionStateMessage stateReuse)
{
_lastStateMsg = stateReuse;
_relayFilter = filter;
++ _streamCallCounter;
if (null == _streamResponse)
{
if ( !_muteTransition) stateReuse.switchToStreamRequestError();
_sharedServerIdx.incrementAndGet();
}
else
{
if ( !_muteTransition) stateReuse.switchToStreamSuccess(_streamResponse);
}
if (null != _callback && !_muteTransition) _callback.enqueueMessage(stateReuse);
}
public DbusKeyCompositeFilter getRelayFilter() {
return _relayFilter;
}
public int getSourcesCallCounter()
{
return _sourcesCallCounter;
}
public void setSourcesCallCounter(int sourcesCallCounter)
{
_sourcesCallCounter = sourcesCallCounter;
}
public int getRegisterCallCounter()
{
return _registerCallCounter;
}
public void setRegisterCallCounter(int registerCallCounter)
{
_registerCallCounter = registerCallCounter;
}
public int getStreamCallCounter()
{
return _streamCallCounter;
}
public void setStreamCallCounter(int streamCallCounter)
{
_streamCallCounter = streamCallCounter;
}
public AbstractActorMessageQueue getCallback()
{
return _callback;
}
public void setCallback(AbstractActorMessageQueue callback)
{
_callback = callback;
}
@Override
public void enableReadFromLatestScn(boolean enable) { enableReadLatest = enable;}
public boolean isReadFromLatestScn()
{
return enableReadLatest;
}
public void setProtocolVersion(int ver)
{
_protocolVersion = ver;
}
@Override
public int getProtocolVersion()
{
return _protocolVersion;
}
public Map<Long, List<RegisterResponseEntry>> getRegisterResponse()
{
return _registerSourcesResponse;
}
public List<RegisterResponseMetadataEntry> getRegisterMetadataResponse()
{
return _registerMetadataResponse;
}
public ChunkedBodyReadableByteChannel getStreamResponse() {
return _streamResponse;
}
/**
* @return the lastStateMsg
*/
protected DatabusRelayConnectionStateMessage getLastStateMsg()
{
return _lastStateMsg;
}
/**
* @see com.linkedin.databus.client.DatabusBootstrapConnection#getRemoteHost()
*/
@Override
public String getRemoteHost()
{
return DbusConstants.UNKNOWN_HOST;
}
/**
* @see com.linkedin.databus.client.DatabusBootstrapConnection#getRemoteService()
*/
@Override
public String getRemoteService()
{
return DbusConstants.UNKNOWN_SERVICE_ID;
}
@Override
public int getMaxEventVersion()
{
return 0;
}
}
class MockChunkedBodyReadableByteChannel extends ChunkedBodyReadableByteChannel
{
private final int _pendingEventSize;
MockChunkedBodyReadableByteChannel(int pendingEventSize)
{
_pendingEventSize = pendingEventSize;
}
@Override
public int read(ByteBuffer buffer) throws IOException
{
return 0;
}
@Override
public String getMetadata(String key)
{
if (key.equals(DatabusHttpHeaders.DATABUS_PENDING_EVENT_SIZE))
{
return Integer.toString(_pendingEventSize);
}
return super.getMetadata(key);
}
}
/**
* Helper class for {@link TestRelayPullThread#testShutdownRace(). Shuts down the puller immediately
* after the /stream call.
*/
class MockRelayConnectionForTestShutdownRace extends MockRelayConnection
{
final private Logger _log;
public MockRelayConnectionForTestShutdownRace(
List<IdNamePair> sourceIds,
Map<Long, List<RegisterResponseEntry>> registerSourcesResponse,
ChunkedBodyReadableByteChannel streamResponse,
AtomicInteger sharedServerIdx,
Logger log)
{
super(sourceIds, registerSourcesResponse, streamResponse, sharedServerIdx);
_log = log;
}
/**
* @see com.linkedin.databus.client.MockRelayConnection#requestSources(com.linkedin.databus.client.DatabusRelayConnectionStateMessage)
*/
@Override
public void requestSources(DatabusRelayConnectionStateMessage stateReuse)
{
_log.info("async puller shutdown");
getCallback().shutdown(); //force shutdown while in PICK_SERVER state
super.requestSources(stateReuse);
}
}
class MockRemoteExceptionHandler extends RemoteExceptionHandler
{
RelayPullThread _rp;
public MockRemoteExceptionHandler(DatabusSourcesConnection sourcesConn,
DbusEventBuffer dataEventsBuffer,
RelayPullThread rp)
{
super(sourcesConn, dataEventsBuffer, new DbusEventV1Factory());
_rp = rp;
}
@Override
public void handleException(Throwable remoteException)
throws InvalidEventException, InterruptedException
{
_rp.enqueueMessage(LifecycleMessage.createSuspendOnErroMessage(new Exception("")));
return;
}
}