/* * * Copyright 2015 AT&T Foundry * * 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.onosproject.aaa; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; public class StateMachineTest { StateMachine stateMachine = null; @Before public void setUp() { System.out.println("Set Up."); StateMachine.bitSet.clear(); StateMachine.initializeMaps(); stateMachine = new StateMachine("session0", null); } @After public void tearDown() { System.out.println("Tear Down."); StateMachine.bitSet.clear(); StateMachine.destroyMaps(); stateMachine = null; } @Test /** * Test all the basic inputs from state to state: IDLE -> STARTED -> PENDING -> AUTHORIZED -> IDLE */ public void basic() throws StateMachineException { System.out.println("======= BASIC =======."); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_IDLE); stateMachine.start(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_STARTED); stateMachine.requestAccess(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_PENDING); stateMachine.authorizeAccess(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_AUTHORIZED); stateMachine.logoff(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_IDLE); } @Test /** * Test all inputs from an IDLE state (starting with the ones that are not impacting the current state) */ public void testIdleState() throws StateMachineException { System.out.println("======= IDLE STATE TEST =======."); stateMachine.requestAccess(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_IDLE); stateMachine.authorizeAccess(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_IDLE); stateMachine.denyAccess(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_IDLE); stateMachine.logoff(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_IDLE); stateMachine.start(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_STARTED); } @Test /** * Test all inputs from an STARTED state (starting with the ones that are not impacting the current state) */ public void testStartedState() throws StateMachineException { System.out.println("======= STARTED STATE TEST =======."); stateMachine.start(); stateMachine.authorizeAccess(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_STARTED); stateMachine.denyAccess(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_STARTED); stateMachine.logoff(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_STARTED); stateMachine.start(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_STARTED); stateMachine.requestAccess(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_PENDING); } @Test /** * Test all inputs from a PENDING state (starting with the ones that are not impacting the current state). * The next valid state for this test is AUTHORIZED */ public void testPendingStateToAuthorized() throws StateMachineException { System.out.println("======= PENDING STATE TEST (AUTHORIZED) =======."); stateMachine.start(); stateMachine.requestAccess(); stateMachine.logoff(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_PENDING); stateMachine.start(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_PENDING); stateMachine.requestAccess(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_PENDING); stateMachine.authorizeAccess(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_AUTHORIZED); stateMachine.denyAccess(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_AUTHORIZED); } @Test /** * Test all inputs from an PENDING state (starting with the ones that are not impacting the current state). * The next valid state for this test is UNAUTHORIZED */ public void testPendingStateToUnauthorized() throws StateMachineException { System.out.println("======= PENDING STATE TEST (DENIED) =======."); stateMachine.start(); stateMachine.requestAccess(); stateMachine.logoff(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_PENDING); stateMachine.start(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_PENDING); stateMachine.requestAccess(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_PENDING); stateMachine.denyAccess(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_UNAUTHORIZED); stateMachine.authorizeAccess(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_UNAUTHORIZED); } @Test /** * Test all inputs from an AUTHORIZED state (starting with the ones that are not impacting the current state). */ public void testAuthorizedState() throws StateMachineException { System.out.println("======= AUTHORIZED STATE TEST =======."); stateMachine.start(); stateMachine.requestAccess(); stateMachine.authorizeAccess(); stateMachine.start(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_AUTHORIZED); stateMachine.requestAccess(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_AUTHORIZED); stateMachine.authorizeAccess(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_AUTHORIZED); stateMachine.denyAccess(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_AUTHORIZED); stateMachine.logoff(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_IDLE); } @Test /** * Test all inputs from an UNAUTHORIZED state (starting with the ones that are not impacting the current state). */ public void testUnauthorizedState() throws StateMachineException { System.out.println("======= UNAUTHORIZED STATE TEST =======."); stateMachine.start(); stateMachine.requestAccess(); stateMachine.denyAccess(); stateMachine.start(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_UNAUTHORIZED); stateMachine.requestAccess(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_UNAUTHORIZED); stateMachine.authorizeAccess(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_UNAUTHORIZED); stateMachine.denyAccess(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_UNAUTHORIZED); stateMachine.logoff(); Assert.assertEquals(stateMachine.state(), StateMachine.STATE_IDLE); } @Test public void testIdentifierAvailability() throws StateMachineException { System.out.println("======= IDENTIFIER TEST =======."); byte identifier = stateMachine.identifier(); System.out.println("State: " + stateMachine.state()); System.out.println("Identifier: " + Byte.toUnsignedInt(identifier)); Assert.assertEquals(-1, identifier); stateMachine.start(); StateMachine sm247 = null; StateMachine sm3 = null; //create 255 others state machines for (int i = 1; i <= 255; i++) { StateMachine sm = new StateMachine("session" + i, null); sm.start(); byte id = sm.identifier(); Assert.assertEquals(i, Byte.toUnsignedInt(id)); if (i == 3) { sm3 = sm; System.out.println("SM3: " + sm3.toString()); } if (i == 247) { sm247 = sm; System.out.println("SM247: " + sm247.toString()); } } //simulate the state machine for a specific session and logoff so we can free up a spot for an identifier //let's choose identifier 247 then we free up 3 Assert.assertNotNull(sm247); sm247.requestAccess(); sm247.authorizeAccess(); sm247.logoff(); Assert.assertNotNull(sm3); sm3.requestAccess(); sm3.authorizeAccess(); sm3.logoff(); StateMachine otherSM3 = new StateMachine("session3b", null); otherSM3.start(); otherSM3.requestAccess(); byte id3 = otherSM3.identifier(); Assert.assertEquals(3, Byte.toUnsignedInt(id3)); StateMachine otherSM247 = new StateMachine("session247b", null); otherSM247.start(); otherSM247.requestAccess(); byte id247 = otherSM247.identifier(); Assert.assertEquals(247, Byte.toUnsignedInt(id247)); } @Test public void testSessionIdLookups() { String sessionId1 = "session1"; String sessionId2 = "session2"; String sessionId3 = "session3"; StateMachine machine1ShouldBeNull = StateMachine.lookupStateMachineBySessionId(sessionId1); assertNull(machine1ShouldBeNull); StateMachine machine2ShouldBeNull = StateMachine.lookupStateMachineBySessionId(sessionId2); assertNull(machine2ShouldBeNull); StateMachine stateMachine1 = new StateMachine(sessionId1, null); StateMachine stateMachine2 = new StateMachine(sessionId2, null); assertEquals(stateMachine1, StateMachine.lookupStateMachineBySessionId(sessionId1)); assertEquals(stateMachine2, StateMachine.lookupStateMachineBySessionId(sessionId2)); assertNull(StateMachine.lookupStateMachineBySessionId(sessionId3)); } @Test public void testIdentifierLookups() throws StateMachineException { String sessionId1 = "session1"; String sessionId2 = "session2"; StateMachine machine1ShouldBeNull = StateMachine.lookupStateMachineById((byte) 1); assertNull(machine1ShouldBeNull); StateMachine machine2ShouldBeNull = StateMachine.lookupStateMachineById((byte) 2); assertNull(machine2ShouldBeNull); StateMachine stateMachine1 = new StateMachine(sessionId1, null); stateMachine1.start(); StateMachine stateMachine2 = new StateMachine(sessionId2, null); stateMachine2.start(); assertEquals(stateMachine1, StateMachine.lookupStateMachineById(stateMachine1.identifier())); assertEquals(stateMachine2, StateMachine.lookupStateMachineById(stateMachine2.identifier())); } }