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() {