You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by je...@apache.org on 2020/07/16 19:24:45 UTC

[geode] branch develop updated: GEODE-8358: Run Geode Redis session tests against native Redis (#5373)

This is an automated email from the ASF dual-hosted git repository.

jensdeppe pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/develop by this push:
     new 86e3266  GEODE-8358: Run Geode Redis session tests against native Redis (#5373)
86e3266 is described below

commit 86e3266962911c2914cdecd222418cdab87df62d
Author: Sarah Abbey <41...@users.noreply.github.com>
AuthorDate: Thu Jul 16 15:23:48 2020 -0400

    GEODE-8358: Run Geode Redis session tests against native Redis (#5373)
---
 geode-redis/build.gradle                           |  6 ++
 .../session/NativeRedisSessionAcceptanceTest.java  | 65 ++++++++++++++++++++++
 ...NativeRedisSessionExpirationAcceptanceTest.java | 53 ++++++++++++++++++
 ...stDUnitTest.java => RedisSessionDUnitTest.java} | 10 +++-
 .../geode/redis/session/SessionDUnitTest.java      | 63 ++++++++++++++++-----
 .../redis/session/SessionExpirationDUnitTest.java  |  2 +-
 6 files changed, 182 insertions(+), 17 deletions(-)

diff --git a/geode-redis/build.gradle b/geode-redis/build.gradle
index 6c98e03..c06acb5 100644
--- a/geode-redis/build.gradle
+++ b/geode-redis/build.gradle
@@ -53,12 +53,18 @@ dependencies {
   integrationTestRuntime(project(':geode-log4j'))
 
   acceptanceTestImplementation(sourceSets.integrationTest.output)
+  acceptanceTestImplementation(sourceSets.distributedTest.output)
   acceptanceTestImplementation(sourceSets.commonTest.output)
   acceptanceTestImplementation(project(':geode-dunit'))
   acceptanceTestImplementation(project(':geode-junit'))
   acceptanceTestImplementation('redis.clients:jedis')
   acceptanceTestImplementation('org.testcontainers:testcontainers')
   acceptanceTestRuntime(project(':geode-log4j'))
+  acceptanceTestImplementation('org.springframework.boot:spring-boot-starter-web') {
+    exclude module: 'spring-boot-starter-tomcat'
+  }
+  acceptanceTestImplementation('org.springframework.boot:spring-boot-starter-data-redis')
+  acceptanceTestImplementation('org.springframework.session:spring-session-data-redis')
 
   distributedTestCompile('org.apache.logging.log4j:log4j-core')
   distributedTestImplementation(project(':geode-dunit'))
diff --git a/geode-redis/src/acceptanceTest/java/session/NativeRedisSessionAcceptanceTest.java b/geode-redis/src/acceptanceTest/java/session/NativeRedisSessionAcceptanceTest.java
new file mode 100644
index 0000000..fcc45fd
--- /dev/null
+++ b/geode-redis/src/acceptanceTest/java/session/NativeRedisSessionAcceptanceTest.java
@@ -0,0 +1,65 @@
+/*
+ * 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 session;
+
+import org.junit.BeforeClass;
+import org.junit.ClassRule;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.rules.TestRule;
+import org.testcontainers.containers.GenericContainer;
+import redis.clients.jedis.Jedis;
+
+import org.apache.geode.internal.AvailablePortHelper;
+import org.apache.geode.redis.session.RedisSessionDUnitTest;
+import org.apache.geode.test.junit.rules.IgnoreOnWindowsRule;
+
+public class NativeRedisSessionAcceptanceTest extends RedisSessionDUnitTest {
+
+  @ClassRule
+  public static TestRule ignoreOnWindowsRule = new IgnoreOnWindowsRule();
+
+  @BeforeClass
+  public static void setup() {
+    GenericContainer redisContainer = new GenericContainer<>("redis:5.0.6").withExposedPorts(6379);
+    redisContainer.start();
+    int[] availablePorts = AvailablePortHelper.getRandomAvailableTCPPorts(2);
+    ports.put(APP1, availablePorts[0]);
+    ports.put(APP2, availablePorts[1]);
+    ports.put(SERVER1, redisContainer.getFirstMappedPort());
+
+    jedisConnetedToServer1 = new Jedis("localhost", ports.get(SERVER1), JEDIS_TIMEOUT);
+    startSpringApp(APP1, SERVER1, DEFAULT_SESSION_TIMEOUT);
+    startSpringApp(APP2, SERVER1, DEFAULT_SESSION_TIMEOUT);
+  }
+
+  @Test
+  @Ignore
+  public void should_getSessionFromServer1_whenServer2GoesDown() {
+    // Only using one server for Native Redis
+  }
+
+  @Test
+  @Ignore
+  public void should_getSessionFromServer_whenServerGoesDownAndIsRestarted() {
+    // Only using one server for Native Redis
+  }
+
+  @Test
+  @Ignore
+  public void should_getSession_whenServer2GoesDown_andAppFailsOverToServer1() {
+    // Only using one server for Native Redis
+  }
+}
diff --git a/geode-redis/src/acceptanceTest/java/session/NativeRedisSessionExpirationAcceptanceTest.java b/geode-redis/src/acceptanceTest/java/session/NativeRedisSessionExpirationAcceptanceTest.java
new file mode 100644
index 0000000..74ab68d
--- /dev/null
+++ b/geode-redis/src/acceptanceTest/java/session/NativeRedisSessionExpirationAcceptanceTest.java
@@ -0,0 +1,53 @@
+/*
+ * 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 session;
+
+import org.junit.BeforeClass;
+import org.junit.ClassRule;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.rules.TestRule;
+import org.testcontainers.containers.GenericContainer;
+import redis.clients.jedis.Jedis;
+
+import org.apache.geode.internal.AvailablePortHelper;
+import org.apache.geode.redis.session.SessionExpirationDUnitTest;
+import org.apache.geode.test.junit.rules.IgnoreOnWindowsRule;
+
+public class NativeRedisSessionExpirationAcceptanceTest extends SessionExpirationDUnitTest {
+
+  @ClassRule
+  public static TestRule ignoreOnWindowsRule = new IgnoreOnWindowsRule();
+
+  @BeforeClass
+  public static void setup() {
+    GenericContainer redisContainer = new GenericContainer<>("redis:5.0.6").withExposedPorts(6379);
+    redisContainer.start();
+    int[] availablePorts = AvailablePortHelper.getRandomAvailableTCPPorts(2);
+    ports.put(APP1, availablePorts[0]);
+    ports.put(APP2, availablePorts[1]);
+    ports.put(SERVER1, redisContainer.getFirstMappedPort());
+
+    jedisConnetedToServer1 = new Jedis("localhost", ports.get(SERVER1), JEDIS_TIMEOUT);
+    startSpringApp(APP1, SERVER1, SHORT_SESSION_TIMEOUT);
+    startSpringApp(APP2, SERVER1, SHORT_SESSION_TIMEOUT);
+  }
+
+  @Test
+  @Ignore
+  public void sessionShouldTimeout_whenAppFailsOverToAnotherRedisServer() {
+    // Only using one server for Native Redis
+  }
+}
diff --git a/geode-redis/src/distributedTest/java/org/apache/geode/redis/session/RedisSessionDistDUnitTest.java b/geode-redis/src/distributedTest/java/org/apache/geode/redis/session/RedisSessionDUnitTest.java
similarity index 91%
rename from geode-redis/src/distributedTest/java/org/apache/geode/redis/session/RedisSessionDistDUnitTest.java
rename to geode-redis/src/distributedTest/java/org/apache/geode/redis/session/RedisSessionDUnitTest.java
index eedc990..9b78837 100644
--- a/geode-redis/src/distributedTest/java/org/apache/geode/redis/session/RedisSessionDistDUnitTest.java
+++ b/geode-redis/src/distributedTest/java/org/apache/geode/redis/session/RedisSessionDUnitTest.java
@@ -25,7 +25,7 @@ import org.junit.experimental.categories.Category;
 import org.apache.geode.test.junit.categories.RedisTest;
 
 @Category({RedisTest.class})
-public class RedisSessionDistDUnitTest extends SessionDUnitTest {
+public class RedisSessionDUnitTest extends SessionDUnitTest {
 
   @BeforeClass
   public static void setup() {
@@ -85,7 +85,7 @@ public class RedisSessionDistDUnitTest extends SessionDUnitTest {
 
     String[] sessionNotes = getSessionNotes(APP2, sessionCookie);
 
-    assertThat(sessionNotes).containsExactly("noteFromClient2", "noteFromClient1");
+    assertThat(sessionNotes).containsExactlyInAnyOrder("noteFromClient2", "noteFromClient1");
   }
 
   @Test
@@ -112,7 +112,11 @@ public class RedisSessionDistDUnitTest extends SessionDUnitTest {
 
       assertThat(sessionNotes).containsExactly("noteFromClient2");
     } finally {
-      startSpringApp(APP2, SERVER1, SERVER2, DEFAULT_SESSION_TIMEOUT);
+      if (ports.get(SERVER2) == null) {
+        startSpringApp(APP2, SERVER1, DEFAULT_SESSION_TIMEOUT);
+      } else {
+        startSpringApp(APP2, SERVER1, SERVER2, DEFAULT_SESSION_TIMEOUT);
+      }
     }
   }
 }
diff --git a/geode-redis/src/distributedTest/java/org/apache/geode/redis/session/SessionDUnitTest.java b/geode-redis/src/distributedTest/java/org/apache/geode/redis/session/SessionDUnitTest.java
index 6d09cc2..8b3830b 100644
--- a/geode-redis/src/distributedTest/java/org/apache/geode/redis/session/SessionDUnitTest.java
+++ b/geode-redis/src/distributedTest/java/org/apache/geode/redis/session/SessionDUnitTest.java
@@ -16,7 +16,9 @@
 package org.apache.geode.redis.session;
 
 import java.net.HttpCookie;
+import java.util.ArrayList;
 import java.util.Base64;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -65,11 +67,12 @@ public abstract class SessionDUnitTest {
   protected static final int APP1 = 3;
   protected static final int APP2 = 4;
 
-  private static final Map<Integer, Integer> ports = new HashMap<>();
+  protected static final Map<Integer, Integer> ports = new HashMap<>();
   public static ConfigurableApplicationContext springApplicationContext;
 
   protected static Jedis jedisConnetedToServer1;
-  private static final int JEDIS_TIMEOUT = Math.toIntExact(GeodeAwaitility.getTimeout().toMillis());
+  protected static final int JEDIS_TIMEOUT =
+      Math.toIntExact(GeodeAwaitility.getTimeout().toMillis());
 
   @BeforeClass
   public static void setup() {
@@ -109,6 +112,19 @@ public abstract class SessionDUnitTest {
     });
   }
 
+  protected static void startSpringApp(int sessionApp, int primaryServer, long sessionTimeout) {
+    int primaryRedisPort = ports.get(primaryServer);
+    int httpPort = ports.get(sessionApp);
+    VM host = cluster.getVM(sessionApp);
+    host.invoke("Start a Spring app", () -> {
+      System.setProperty("server.port", "" + httpPort);
+      System.setProperty("spring.redis.port", "" + primaryRedisPort);
+      System.setProperty("server.servlet.session.timeout", "" + sessionTimeout + "s");
+      springApplicationContext = SpringApplication.run(
+          RedisSpringTestApplication.class, "" + primaryRedisPort);
+    });
+  }
+
   static void startSpringApp(int sessionApp, int primaryServer, int secondaryServer,
       long sessionTimeout) {
     int primaryRedisPort = ports.get(primaryServer);
@@ -131,15 +147,29 @@ public abstract class SessionDUnitTest {
 
   protected String createNewSessionWithNote(int sessionApp, String note) {
     HttpEntity<String> request = new HttpEntity<>(note);
-    HttpHeaders resultHeaders = new RestTemplate()
-        .postForEntity(
-            "http://localhost:" + ports.get(sessionApp)
-                + "/addSessionNote",
-            request,
-            String.class)
-        .getHeaders();
-
-    return resultHeaders.getFirst("Set-Cookie");
+    boolean noteAdded = false;
+    String sessionCookie = "";
+    do {
+      try {
+        HttpHeaders resultHeaders = new RestTemplate()
+            .postForEntity(
+                "http://localhost:" + ports.get(sessionApp)
+                    + "/addSessionNote",
+                request,
+                String.class)
+            .getHeaders();
+        sessionCookie = resultHeaders.getFirst("Set-Cookie");
+        noteAdded = true;
+      } catch (HttpServerErrorException e) {
+        if (e.getMessage().contains("memberDeparted")) {
+          // retry
+        } else {
+          throw e;
+        }
+      }
+    } while (!noteAdded);
+
+    return sessionCookie;
   }
 
   protected String[] getSessionNotes(int sessionApp, String sessionCookie) {
@@ -172,6 +202,8 @@ public abstract class SessionDUnitTest {
   void addNoteToSession(int sessionApp, String sessionCookie, String note) {
     HttpHeaders requestHeaders = new HttpHeaders();
     requestHeaders.add("Cookie", sessionCookie);
+    List<String> notes = new ArrayList<>();
+    Collections.addAll(notes, getSessionNotes(sessionApp, sessionCookie));
     HttpEntity<String> request = new HttpEntity<>(note, requestHeaders);
     boolean noteAdded = false;
     do {
@@ -184,8 +216,13 @@ public abstract class SessionDUnitTest {
             .getHeaders();
         noteAdded = true;
       } catch (HttpServerErrorException e) {
-        if (e.getMessage().contains("Internal Server Error")) {
-          // retry
+        if (e.getMessage().contains("memberDeparted")) {
+          List<String> updatedNotes = new ArrayList<>();
+          Collections.addAll(updatedNotes, getSessionNotes(sessionApp, sessionCookie));
+          if (notes.containsAll(updatedNotes)) {
+            noteAdded = true;
+          }
+          e.printStackTrace();
         } else {
           throw e;
         }
diff --git a/geode-redis/src/distributedTest/java/org/apache/geode/redis/session/SessionExpirationDUnitTest.java b/geode-redis/src/distributedTest/java/org/apache/geode/redis/session/SessionExpirationDUnitTest.java
index 2f58342..8e7d265 100644
--- a/geode-redis/src/distributedTest/java/org/apache/geode/redis/session/SessionExpirationDUnitTest.java
+++ b/geode-redis/src/distributedTest/java/org/apache/geode/redis/session/SessionExpirationDUnitTest.java
@@ -26,7 +26,7 @@ import org.apache.geode.test.awaitility.GeodeAwaitility;
 
 public class SessionExpirationDUnitTest extends SessionDUnitTest {
 
-  private static final int SHORT_SESSION_TIMEOUT = 5;
+  protected static final int SHORT_SESSION_TIMEOUT = 5;
 
   @BeforeClass
   public static void setup() {