/*
* JBoss, Home of Professional Open Source.
* Copyright 2013, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.wildfly.clustering.web.undertow.session;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import java.time.Duration;
import java.time.Instant;
import java.util.Collections;
import java.util.Set;
import io.undertow.server.HttpServerExchange;
import io.undertow.server.session.SessionConfig;
import io.undertow.server.session.SessionListener;
import io.undertow.server.session.SessionListeners;
import org.junit.Before;
import org.junit.Test;
import org.wildfly.clustering.ee.Batch;
import org.wildfly.clustering.ee.Batcher;
import org.wildfly.clustering.web.session.ImmutableSession;
import org.wildfly.clustering.web.session.ImmutableSessionAttributes;
import org.wildfly.clustering.web.session.ImmutableSessionMetaData;
import org.wildfly.clustering.web.session.Session;
import org.wildfly.clustering.web.session.SessionManager;
public class DistributableSessionManagerTestCase {
private final String deploymentName = "mydeployment.war";
private final SessionManager<LocalSessionContext, Batch> manager = mock(SessionManager.class);
private final SessionListener listener = mock(SessionListener.class);
private final SessionListeners listeners = new SessionListeners();
private final RecordableSessionManagerStatistics statistics = mock(RecordableSessionManagerStatistics.class);
private final DistributableSessionManager adapter = new DistributableSessionManager(this.deploymentName, this.manager, this.listeners, this.statistics);
@Before
public void init() {
this.adapter.registerSessionListener(this.listener);
}
@Test
public void getDeploymentName() {
assertSame(this.deploymentName, this.adapter.getDeploymentName());
}
@Test
public void start() {
this.adapter.start();
verify(this.manager).start();
verify(this.statistics).reset();
}
@Test
public void stop() {
this.adapter.stop();
verify(this.manager).stop();
}
@Test
public void setDefaultSessionTimeout() {
this.adapter.setDefaultSessionTimeout(10);
verify(this.manager).setDefaultMaxInactiveInterval(Duration.ofSeconds(10L));
}
@Test
public void createSessionNoSessionId() {
HttpServerExchange exchange = new HttpServerExchange(null);
Batcher<Batch> batcher = mock(Batcher.class);
Batch batch = mock(Batch.class);
SessionConfig config = mock(SessionConfig.class);
Session<LocalSessionContext> session = mock(Session.class);
String sessionId = "session";
when(this.manager.createIdentifier()).thenReturn(sessionId);
when(this.manager.createSession(sessionId)).thenReturn(session);
when(this.manager.getBatcher()).thenReturn(batcher);
when(batcher.createBatch()).thenReturn(batch);
when(session.getId()).thenReturn(sessionId);
io.undertow.server.session.Session sessionAdapter = this.adapter.createSession(exchange, config);
assertNotNull(sessionAdapter);
verify(this.listener).sessionCreated(sessionAdapter, exchange);
verify(config).setSessionId(exchange, sessionId);
verify(batcher).suspendBatch();
verify(this.statistics).record(sessionAdapter);
String expected = "expected";
when(session.getId()).thenReturn(expected);
String result = sessionAdapter.getId();
assertSame(expected, result);
}
@Test
public void createSessionSpecifiedSessionId() {
HttpServerExchange exchange = new HttpServerExchange(null);
Batcher<Batch> batcher = mock(Batcher.class);
Batch batch = mock(Batch.class);
SessionConfig config = mock(SessionConfig.class);
Session<LocalSessionContext> session = mock(Session.class);
String sessionId = "session";
when(config.findSessionId(exchange)).thenReturn(sessionId);
when(this.manager.createSession(sessionId)).thenReturn(session);
when(this.manager.getBatcher()).thenReturn(batcher);
when(batcher.createBatch()).thenReturn(batch);
when(session.getId()).thenReturn(sessionId);
io.undertow.server.session.Session sessionAdapter = this.adapter.createSession(exchange, config);
assertNotNull(sessionAdapter);
verify(this.listener).sessionCreated(sessionAdapter, exchange);
verify(batcher).suspendBatch();
verify(this.statistics).record(sessionAdapter);
String expected = "expected";
when(session.getId()).thenReturn(expected);
String result = sessionAdapter.getId();
assertSame(expected, result);
}
@Test
public void createSessionAlreadyExists() {
HttpServerExchange exchange = new HttpServerExchange(null);
Batcher<Batch> batcher = mock(Batcher.class);
Batch batch = mock(Batch.class);
SessionConfig config = mock(SessionConfig.class);
String sessionId = "session";
when(config.findSessionId(exchange)).thenReturn(sessionId);
when(this.manager.createSession(sessionId)).thenReturn(null);
when(this.manager.getBatcher()).thenReturn(batcher);
when(batcher.createBatch()).thenReturn(batch);
IllegalStateException exception = null;
try {
this.adapter.createSession(exchange, config);
} catch (IllegalStateException e) {
exception = e;
}
assertNotNull(exception);
verify(batch).discard();
verify(batch).close();
}
@Test
public void getSession() {
HttpServerExchange exchange = new HttpServerExchange(null);
Batcher<Batch> batcher = mock(Batcher.class);
Batch batch = mock(Batch.class);
SessionConfig config = mock(SessionConfig.class);
Session<LocalSessionContext> session = mock(Session.class);
String sessionId = "session";
when(config.findSessionId(exchange)).thenReturn(sessionId);
when(this.manager.findSession(sessionId)).thenReturn(session);
when(this.manager.getBatcher()).thenReturn(batcher);
when(batcher.createBatch()).thenReturn(batch);
when(session.getId()).thenReturn(sessionId);
io.undertow.server.session.Session sessionAdapter = this.adapter.getSession(exchange, config);
assertNotNull(sessionAdapter);
verifyZeroInteractions(this.statistics);
verify(batcher).suspendBatch();
String expected = "expected";
when(session.getId()).thenReturn(expected);
String result = sessionAdapter.getId();
assertSame(expected, result);
}
@Test
public void getSessionNoSessionId() {
HttpServerExchange exchange = new HttpServerExchange(null);
SessionConfig config = mock(SessionConfig.class);
when(config.findSessionId(exchange)).thenReturn(null);
io.undertow.server.session.Session sessionAdapter = this.adapter.getSession(exchange, config);
assertNull(sessionAdapter);
}
@Test
public void getSessionInvalidCharacters() {
HttpServerExchange exchange = new HttpServerExchange(null);
SessionConfig config = mock(SessionConfig.class);
String sessionId = "session+";
when(config.findSessionId(exchange)).thenReturn(sessionId);
io.undertow.server.session.Session sessionAdapter = this.adapter.getSession(exchange, config);
assertNull(sessionAdapter);
verify(this.manager, never()).findSession(sessionId);
}
@Test
public void getSessionNotExists() {
HttpServerExchange exchange = new HttpServerExchange(null);
Batcher<Batch> batcher = mock(Batcher.class);
Batch batch = mock(Batch.class);
SessionConfig config = mock(SessionConfig.class);
String sessionId = "session";
when(config.findSessionId(exchange)).thenReturn(sessionId);
when(this.manager.findSession(sessionId)).thenReturn(null);
when(this.manager.getBatcher()).thenReturn(batcher);
when(batcher.createBatch()).thenReturn(batch);
io.undertow.server.session.Session sessionAdapter = this.adapter.getSession(exchange, config);
assertNull(sessionAdapter);
verify(batch).close();
verify(batcher, never()).suspendBatch();
}
@Test
public void activeSessions() {
when(this.manager.getActiveSessions()).thenReturn(Collections.singleton("expected"));
int result = this.adapter.getActiveSessions().size();
assertEquals(1, result);
}
@Test
public void getTransientSessions() {
Set<String> result = this.adapter.getTransientSessions();
assertTrue(result.isEmpty());
}
@Test
public void getActiveSessions() {
String expected = "expected";
when(this.manager.getActiveSessions()).thenReturn(Collections.singleton(expected));
Set<String> result = this.adapter.getActiveSessions();
assertEquals(1, result.size());
assertSame(expected, result.iterator().next());
}
@Test
public void getAllSessions() {
String expected = "expected";
when(this.manager.getLocalSessions()).thenReturn(Collections.singleton(expected));
Set<String> result = this.adapter.getAllSessions();
assertEquals(1, result.size());
assertSame(expected, result.iterator().next());
}
@Test
public void getSessionByIdentifier() {
Batcher<Batch> batcher = mock(Batcher.class);
Batch batch = mock(Batch.class);
ImmutableSession session = mock(ImmutableSession.class);
ImmutableSessionAttributes attributes = mock(ImmutableSessionAttributes.class);
ImmutableSessionMetaData metaData = mock(ImmutableSessionMetaData.class);
String id = "session";
String name = "name";
Object value = new Object();
Set<String> names = Collections.singleton(name);
Instant creationTime = Instant.now();
Instant lastAccessedTime = Instant.now();
Duration maxInactiveInterval = Duration.ofMinutes(30L);
when(this.manager.getBatcher()).thenReturn(batcher);
when(this.manager.viewSession(id)).thenReturn(session);
when(session.getId()).thenReturn(id);
when(session.getAttributes()).thenReturn(attributes);
when(attributes.getAttributeNames()).thenReturn(names);
when(attributes.getAttribute(name)).thenReturn(value);
when(session.getMetaData()).thenReturn(metaData);
when(metaData.getCreationTime()).thenReturn(creationTime);
when(metaData.getLastAccessedTime()).thenReturn(lastAccessedTime);
when(metaData.getMaxInactiveInterval()).thenReturn(maxInactiveInterval);
when(batcher.createBatch()).thenReturn(batch);
io.undertow.server.session.Session result = this.adapter.getSession(id);
assertSame(this.adapter, result.getSessionManager());
assertSame(id, result.getId());
assertEquals(creationTime.toEpochMilli(), result.getCreationTime());
assertEquals(lastAccessedTime.toEpochMilli(), result.getLastAccessedTime());
assertEquals(maxInactiveInterval.getSeconds(), result.getMaxInactiveInterval());
assertEquals(names, result.getAttributeNames());
assertSame(value, result.getAttribute(name));
verify(batch).close();
}
@Test
public void getSessionByIdentifierNotExists() {
String id = "session";
Batcher<Batch> batcher = mock(Batcher.class);
Batch batch = mock(Batch.class);
when(this.manager.getBatcher()).thenReturn(batcher);
when(this.manager.viewSession(id)).thenReturn(null);
when(batcher.createBatch()).thenReturn(batch);
io.undertow.server.session.Session result = this.adapter.getSession(id);
assertNull(result);
verify(batch).close();
}
@Test
public void getStatistics() {
assertSame(this.statistics, this.adapter.getStatistics());
}
}