/* * Copyright 2002-2014 the original author or authors. * * Licensed 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.springframework.messaging.simp; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.mockito.Mockito; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; import static org.mockito.Mockito.*; /** * Unit tests for * {@link org.springframework.messaging.simp.SimpAttributes}. * * @author Rossen Stoyanchev * @since 4.1 */ public class SimpAttributesTests { private SimpAttributes simpAttributes; private Map<String, Object> map; @Rule public ExpectedException thrown = ExpectedException.none(); @Before public void setup() { this.map = new ConcurrentHashMap<>(); this.simpAttributes = new SimpAttributes("session1", this.map); } @Test public void getAttribute() { this.simpAttributes.setAttribute("name1", "value1"); assertThat(this.simpAttributes.getAttribute("name1"), is("value1")); assertThat(this.simpAttributes.getAttribute("name2"), nullValue()); } @Test public void getAttributeNames() { this.simpAttributes.setAttribute("name1", "value1"); this.simpAttributes.setAttribute("name2", "value1"); this.simpAttributes.setAttribute("name3", "value1"); assertThat(this.simpAttributes.getAttributeNames(), arrayContainingInAnyOrder("name1", "name2", "name3")); } @Test public void registerDestructionCallback() { Runnable callback = Mockito.mock(Runnable.class); this.simpAttributes.registerDestructionCallback("name1", callback); assertThat(this.simpAttributes.getAttribute( SimpAttributes.DESTRUCTION_CALLBACK_NAME_PREFIX + "name1"), sameInstance(callback)); } @Test public void registerDestructionCallbackAfterSessionCompleted() { this.simpAttributes.sessionCompleted(); this.thrown.expect(IllegalStateException.class); this.thrown.expectMessage(containsString("already completed")); this.simpAttributes.registerDestructionCallback("name1", Mockito.mock(Runnable.class)); } @Test public void removeDestructionCallback() { Runnable callback1 = Mockito.mock(Runnable.class); Runnable callback2 = Mockito.mock(Runnable.class); this.simpAttributes.registerDestructionCallback("name1", callback1); this.simpAttributes.registerDestructionCallback("name2", callback2); assertThat(this.simpAttributes.getAttributeNames().length, is(2)); } @Test public void getSessionMutex() { assertThat(this.simpAttributes.getSessionMutex(), sameInstance(this.map)); } @Test public void getSessionMutexExplicit() { Object mutex = new Object(); this.simpAttributes.setAttribute(SimpAttributes.SESSION_MUTEX_NAME, mutex); assertThat(this.simpAttributes.getSessionMutex(), sameInstance(mutex)); } @Test public void sessionCompleted() { Runnable callback1 = Mockito.mock(Runnable.class); Runnable callback2 = Mockito.mock(Runnable.class); this.simpAttributes.registerDestructionCallback("name1", callback1); this.simpAttributes.registerDestructionCallback("name2", callback2); this.simpAttributes.sessionCompleted(); verify(callback1, times(1)).run(); verify(callback2, times(1)).run(); } @Test public void sessionCompletedIsIdempotent() { Runnable callback1 = Mockito.mock(Runnable.class); this.simpAttributes.registerDestructionCallback("name1", callback1); this.simpAttributes.sessionCompleted(); this.simpAttributes.sessionCompleted(); this.simpAttributes.sessionCompleted(); verify(callback1, times(1)).run(); } }