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

bross pushed a commit to branch feature/GEODE-10093
in repository https://gitbox.apache.org/repos/asf/geode.git

commit f3c043f89af8d4064ff6f8d86d02662caa85fcea
Author: Ben Ross <ro...@vmware.com>
AuthorDate: Mon Feb 28 16:07:24 2022 -0800

    GEODE-10093 - Fixed attr issue in Delta Session
---
 .../AbstractDeltaSessionIntegrationTest.java       | 83 ++++++++++++++++++++--
 .../modules/session/catalina/DeltaSession.java     |  8 ++-
 2 files changed, 84 insertions(+), 7 deletions(-)

diff --git 
a/extensions/geode-modules-test/src/main/java/org/apache/geode/modules/session/catalina/AbstractDeltaSessionIntegrationTest.java
 
b/extensions/geode-modules-test/src/main/java/org/apache/geode/modules/session/catalina/AbstractDeltaSessionIntegrationTest.java
index 5008b17..1c3a270 100644
--- 
a/extensions/geode-modules-test/src/main/java/org/apache/geode/modules/session/catalina/AbstractDeltaSessionIntegrationTest.java
+++ 
b/extensions/geode-modules-test/src/main/java/org/apache/geode/modules/session/catalina/AbstractDeltaSessionIntegrationTest.java
@@ -17,11 +17,8 @@ package org.apache.geode.modules.session.catalina;
 
 import static org.apache.geode.cache.RegionShortcut.PARTITION;
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.when;
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.*;
 
 import java.io.IOException;
 
@@ -30,6 +27,8 @@ import javax.servlet.http.HttpSessionAttributeListener;
 import javax.servlet.http.HttpSessionBindingEvent;
 
 import org.apache.catalina.Context;
+import 
org.apache.geode.modules.session.catalina.internal.DeltaSessionDestroyAttributeEvent;
+import 
org.apache.geode.modules.session.catalina.internal.DeltaSessionUpdateAttributeEvent;
 import org.apache.juli.logging.Log;
 import org.junit.Before;
 import org.junit.Rule;
@@ -41,6 +40,8 @@ import org.apache.geode.internal.util.BlobHelper;
 import 
org.apache.geode.modules.session.catalina.callback.SessionExpirationCacheListener;
 import 
org.apache.geode.modules.session.catalina.internal.DeltaSessionStatistics;
 import org.apache.geode.test.junit.rules.ServerStarterRule;
+import org.mockito.InOrder;
+import org.mockito.Mockito;
 
 public abstract class AbstractDeltaSessionIntegrationTest<DeltaSessionManagerT 
extends DeltaSessionManager<?>, DeltaSessionT extends DeltaSession> {
   protected static final String KEY = "key1";
@@ -107,4 +108,76 @@ public abstract class 
AbstractDeltaSessionIntegrationTest<DeltaSessionManagerT e
     verifyNoMoreInteractions(listener);
     assertThat(event.getValue().getValue()).isEqualTo(value1);
   }
+
+  @Test
+  public void setNewAttributeWithNullValueInvokesRemove() {
+    final HttpSessionAttributeListener listener = 
mock(HttpSessionAttributeListener.class);
+    when(context.getApplicationEventListeners()).thenReturn(new Object[] 
{listener});
+    when(manager.isBackingCacheAvailable()).thenReturn(true);
+
+    final DeltaSessionT session = spy(newSession(manager));
+    session.setId(KEY, false);
+    session.setValid(true);
+    session.setOwner(manager);
+
+    final String name = "attribute";
+    final Object nullValue = null;
+
+    session.setAttribute(name, nullValue);
+    assertThat(session.getAttributes().size()).isEqualTo(0);
+
+    //Mockito.inOrder
+    
verify(session).queueAttributeEvent(any(DeltaSessionDestroyAttributeEvent.class),
 anyBoolean());
+    verify(session, 
times(0)).queueAttributeEvent(any(DeltaSessionUpdateAttributeEvent.class), 
anyBoolean());
+    verify(session).removeAttribute(eq(name));
+  }
+
+  @Test
+  public void setExistingAttributeWithNullValueInvokesRemove() {
+    final HttpSessionAttributeListener listener = 
mock(HttpSessionAttributeListener.class);
+    when(context.getApplicationEventListeners()).thenReturn(new Object[] 
{listener});
+    when(manager.isBackingCacheAvailable()).thenReturn(true);
+
+    final DeltaSessionT session = spy(newSession(manager));
+    session.setId(KEY, false);
+    session.setValid(true);
+    session.setOwner(manager);
+
+    final String name = "attribute";
+    final Object value = "value";
+    final Object nullValue = null;
+
+    session.setAttribute(name, value);
+    assertThat(session.getAttributes().size()).isEqualTo(1);
+
+    session.setAttribute(name, nullValue);
+    assertThat(session.getAttributes().size()).isEqualTo(0);
+
+
+    InOrder inOrder = Mockito.inOrder(session);
+    
inOrder.verify(session).queueAttributeEvent(any(DeltaSessionUpdateAttributeEvent.class),
 anyBoolean());
+    inOrder.verify(session).removeAttribute(eq(name));
+    
inOrder.verify(session).queueAttributeEvent(any(DeltaSessionDestroyAttributeEvent.class),
 anyBoolean());
+  }
+
+  @Test
+  public void getAttributeWithNullValueReturnsNull() throws IOException, 
ClassNotFoundException {
+    final HttpSessionAttributeListener listener = 
mock(HttpSessionAttributeListener.class);
+    when(context.getApplicationEventListeners()).thenReturn(new Object[] 
{listener});
+    when(manager.isBackingCacheAvailable()).thenReturn(true);
+
+    final DeltaSessionT session = spy(newSession(manager));
+    session.setId(KEY, false);
+    session.setValid(true);
+    session.setOwner(manager);
+
+    final String name = "attribute";
+    final Object value = null;
+
+    final byte[] serializedValue1 = BlobHelper.serializeToBlob(value);
+    // simulates initial deserialized state with serialized attribute values.
+    session.getAttributes().put(name, serializedValue1);
+
+    assertThat(session.getAttribute(name)).isNull();
+  }
 }
diff --git 
a/extensions/geode-modules/src/main/java/org/apache/geode/modules/session/catalina/DeltaSession.java
 
b/extensions/geode-modules/src/main/java/org/apache/geode/modules/session/catalina/DeltaSession.java
index e745ffe..c4661ca 100644
--- 
a/extensions/geode-modules/src/main/java/org/apache/geode/modules/session/catalina/DeltaSession.java
+++ 
b/extensions/geode-modules/src/main/java/org/apache/geode/modules/session/catalina/DeltaSession.java
@@ -266,7 +266,7 @@ public class DeltaSession extends StandardSession
         super.setAttribute(name, serializedValue, true);
       }
 
-      if (serializedValue == null) {
+      if (value == null) {
         return;
       }
 
@@ -353,6 +353,10 @@ public class DeltaSession extends StandardSession
     if (value instanceof byte[]) {
       try {
         final Object deserialized = BlobHelper.deserializeBlob((byte[]) value);
+        if(deserialized == null) {
+          removeAttributeInternal(name, false);
+          return null;
+        }
         if (store) {
           setAttributeInternal(name, deserialized);
         }
@@ -478,7 +482,7 @@ public class DeltaSession extends StandardSession
     }
   }
 
-  private void queueAttributeEvent(DeltaSessionAttributeEvent event,
+  void queueAttributeEvent(DeltaSessionAttributeEvent event,
       boolean checkAddToCurrentGatewayDelta) {
     // Add to current gateway delta if necessary
     if (checkAddToCurrentGatewayDelta) {

Reply via email to