GEODE-3075: Add an integration test for the ServerConnectionFactory the current implementation is bogus, but does test that the flow works.
Project: http://git-wip-us.apache.org/repos/asf/geode/repo Commit: http://git-wip-us.apache.org/repos/asf/geode/commit/4ace36af Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/4ace36af Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/4ace36af Branch: refs/heads/develop Commit: 4ace36af00a22e0995a2e0d07db75f5508524a25 Parents: dfdde4a Author: Galen OSullivan <gosulli...@pivotal.io> Authored: Fri Jun 16 09:59:11 2017 -0700 Committer: Hitesh Khamesra <hkhame...@pivotal.io> Committed: Mon Jun 26 09:26:22 2017 -0700 ---------------------------------------------------------------------- .../sockets/ClientProtocolMessageHandler.java | 8 ++- .../sockets/NewProtocolServerConnection.java | 7 ++- .../ServerConnectionFactoryIntegrationTest.java | 66 ++++++++++++++++++++ .../sockets/ServerConnectionFactoryTest.java | 44 ++++++------- 4 files changed, 100 insertions(+), 25 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/geode/blob/4ace36af/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/ClientProtocolMessageHandler.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/ClientProtocolMessageHandler.java b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/ClientProtocolMessageHandler.java index db42330..702609d 100644 --- a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/ClientProtocolMessageHandler.java +++ b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/ClientProtocolMessageHandler.java @@ -17,6 +17,7 @@ package org.apache.geode.internal.cache.tier.sockets; import org.apache.geode.internal.cache.InternalCache; +import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -24,6 +25,11 @@ import java.io.OutputStream; * Stub, this will be hooked up to the new client protocol when it's implemented. */ public class ClientProtocolMessageHandler { + /** + * Bogus, but it lets us write an integration test so that nobody breaks our flow. + */ public void receiveMessage(InputStream inputStream, OutputStream outputStream, - InternalCache cache) {} + InternalCache cache) throws IOException { + outputStream.write(inputStream.read()); + } } http://git-wip-us.apache.org/repos/asf/geode/blob/4ace36af/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/NewProtocolServerConnection.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/NewProtocolServerConnection.java b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/NewProtocolServerConnection.java index a78cd1c..83b23b1 100644 --- a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/NewProtocolServerConnection.java +++ b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/NewProtocolServerConnection.java @@ -50,9 +50,9 @@ public class NewProtocolServerConnection extends ServerConnection { * @param acceptor */ public NewProtocolServerConnection(Socket s, InternalCache c, CachedRegionHelper helper, - CacheServerStats stats, int hsTimeout, int socketBufferSize, String communicationModeStr, - byte communicationMode, Acceptor acceptor, ClientProtocolMessageHandler newClientProtocol, - SecurityService securityService) { + CacheServerStats stats, int hsTimeout, int socketBufferSize, String communicationModeStr, + byte communicationMode, Acceptor acceptor, ClientProtocolMessageHandler newClientProtocol, + SecurityService securityService) { super(s, c, helper, stats, hsTimeout, socketBufferSize, communicationModeStr, communicationMode, acceptor, securityService); assert (communicationMode == AcceptorImpl.CLIENT_TO_SERVER_NEW_PROTOCOL); @@ -65,6 +65,7 @@ public class NewProtocolServerConnection extends ServerConnection { Socket socket = this.getSocket(); InputStream inputStream = socket.getInputStream(); OutputStream outputStream = socket.getOutputStream(); + // TODO serialization types? newClientProtocol.receiveMessage(inputStream, outputStream, this.getCache()); } catch (IOException e) { http://git-wip-us.apache.org/repos/asf/geode/blob/4ace36af/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/ServerConnectionFactoryIntegrationTest.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/ServerConnectionFactoryIntegrationTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/ServerConnectionFactoryIntegrationTest.java new file mode 100644 index 0000000..007d1d6 --- /dev/null +++ b/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/ServerConnectionFactoryIntegrationTest.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. You may obtain a + * copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ + +package org.apache.geode.internal.cache.tier.sockets; + +import org.apache.geode.cache.Cache; +import org.apache.geode.cache.CacheFactory; +import org.apache.geode.cache.server.CacheServer; +import org.apache.geode.internal.AvailablePortHelper; +import org.apache.geode.internal.cache.tier.Acceptor; +import org.apache.geode.test.junit.categories.IntegrationTest; +import org.awaitility.Awaitility; +import org.junit.Test; +import org.junit.experimental.categories.Category; + +import java.io.IOException; +import java.net.Socket; +import java.util.concurrent.TimeUnit; + +import static org.junit.Assert.assertEquals; + +/** + * Test that switching on the header byte makes instances of {@link NewProtocolServerConnection}. + */ +@Category(IntegrationTest.class) +public class ServerConnectionFactoryIntegrationTest { + /** + * + * @throws IOException + */ + @Test + public void testNewProtocolHeaderLeadsToNewProtocolServerConnection() throws IOException { + System.setProperty("geode.feature-protobuf-protocol", "true"); + try { + CacheFactory cacheFactory = new CacheFactory(); + Cache cache = cacheFactory.create(); + + CacheServer cacheServer = cache.addCacheServer(); + final int cacheServerPort = AvailablePortHelper.getRandomAvailableTCPPort(); + cacheServer.setPort(cacheServerPort); + cacheServer.start(); + + Socket socket = new Socket("localhost", cacheServerPort); + Awaitility.await().atMost(5, TimeUnit.SECONDS).until(socket::isConnected); + socket.getOutputStream().write(Acceptor.CLIENT_TO_SERVER_NEW_PROTOCOL); + socket.getOutputStream().write(222); + assertEquals(222, socket.getInputStream().read()); + + cache.close(); + } finally { + System.clearProperty("geode.feature-protobuf-protocol"); + } + } +} http://git-wip-us.apache.org/repos/asf/geode/blob/4ace36af/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/ServerConnectionFactoryTest.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/ServerConnectionFactoryTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/ServerConnectionFactoryTest.java index c314944..8e241b2 100644 --- a/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/ServerConnectionFactoryTest.java +++ b/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/ServerConnectionFactoryTest.java @@ -19,18 +19,23 @@ import org.apache.geode.internal.cache.InternalCache; import org.apache.geode.internal.cache.tier.Acceptor; import org.apache.geode.internal.cache.tier.CachedRegionHelper; import org.apache.geode.internal.security.SecurityService; +import org.apache.geode.test.junit.categories.UnitTest; import org.junit.Test; +import org.junit.experimental.categories.Category; import java.io.IOException; import java.net.InetAddress; import java.net.Socket; -import static org.junit.Assert.*; -import static org.mockito.Mockito.*; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +@Category(UnitTest.class) public class ServerConnectionFactoryTest { /** - * Safeguard that we won't create the new client protocol object unless the feature flag is enabled. + * Safeguard that we won't create the new client protocol object unless the feature flag is + * enabled. */ @Test(expected = IOException.class) public void newClientProtocolThrows() throws Exception { @@ -40,38 +45,35 @@ public class ServerConnectionFactoryTest { @Test public void newClientProtocolSucceedsWithSystemPropertySet() throws Exception { System.setProperty("geode.feature-protobuf-protocol", "true"); - ServerConnection serverConnection = serverConnectionMockedExceptForCommunicationMode(Acceptor.CLIENT_TO_SERVER_NEW_PROTOCOL); + ServerConnection serverConnection = + serverConnectionMockedExceptForCommunicationMode(Acceptor.CLIENT_TO_SERVER_NEW_PROTOCOL); assertTrue(serverConnection instanceof NewProtocolServerConnection); System.clearProperty("geode.feature-protobuf-protocol"); } @Test public void makeServerConnection() throws Exception { - byte[] communicationModes = new byte[]{ - Acceptor.CLIENT_TO_SERVER, - Acceptor.PRIMARY_SERVER_TO_CLIENT, - Acceptor.SECONDARY_SERVER_TO_CLIENT, - Acceptor.GATEWAY_TO_GATEWAY, - Acceptor.MONITOR_TO_SERVER, - Acceptor.SUCCESSFUL_SERVER_TO_CLIENT, - Acceptor.UNSUCCESSFUL_SERVER_TO_CLIENT, - Acceptor.CLIENT_TO_SERVER_FOR_QUEUE, - }; + byte[] communicationModes = + new byte[] {Acceptor.CLIENT_TO_SERVER, Acceptor.PRIMARY_SERVER_TO_CLIENT, + Acceptor.SECONDARY_SERVER_TO_CLIENT, Acceptor.GATEWAY_TO_GATEWAY, + Acceptor.MONITOR_TO_SERVER, Acceptor.SUCCESSFUL_SERVER_TO_CLIENT, + Acceptor.UNSUCCESSFUL_SERVER_TO_CLIENT, Acceptor.CLIENT_TO_SERVER_FOR_QUEUE,}; for (byte communicationMode : communicationModes) { - ServerConnection serverConnection = serverConnectionMockedExceptForCommunicationMode(communicationMode); + ServerConnection serverConnection = + serverConnectionMockedExceptForCommunicationMode(communicationMode); assertTrue(serverConnection instanceof LegacyServerConnection); } } - private static ServerConnection serverConnectionMockedExceptForCommunicationMode(byte communicationMode) throws IOException { + private static ServerConnection serverConnectionMockedExceptForCommunicationMode( + byte communicationMode) throws IOException { Socket socketMock = mock(Socket.class); when(socketMock.getInetAddress()).thenReturn(InetAddress.getByName("localhost")); - return ServerConnectionFactory.makeServerConnection( - socketMock, mock(InternalCache.class), mock(CachedRegionHelper.class), - mock(CacheServerStats.class), 0, 0, "", - communicationMode, mock(AcceptorImpl.class), mock(SecurityService.class)); + return ServerConnectionFactory.makeServerConnection(socketMock, mock(InternalCache.class), + mock(CachedRegionHelper.class), mock(CacheServerStats.class), 0, 0, "", communicationMode, + mock(AcceptorImpl.class), mock(SecurityService.class)); } -} \ No newline at end of file +}