/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.openflowplugin.openflow.md.util; import java.util.Queue; import java.util.concurrent.ArrayBlockingQueue; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; import org.opendaylight.openflowplugin.api.openflow.md.core.ConnectionConductor; import org.opendaylight.openflowplugin.api.openflow.md.queue.WaterMarkListener; import org.opendaylight.openflowplugin.openflow.md.queue.WrapperQueueImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @RunWith(MockitoJUnitRunner.class) public class WrapperQueueImplTest { protected static final Logger LOG = LoggerFactory .getLogger(WrapperQueueImplTest.class); @Mock private ConnectionConductor connectionConductor; @Mock private WaterMarkListener waterMarkListener; private WrapperQueueImpl<Integer> wrapperQueueImpl; private final int capacity = 100; private Queue<Integer> queueDefault; private int highWaterMark = 80; private int lowWaterMark = 65; /** * Setup before tests */ @Before public void setUp() { queueDefault = new ArrayBlockingQueue<>(capacity); wrapperQueueImpl = new WrapperQueueImpl<>(capacity, queueDefault, waterMarkListener); } /** * Test for check if wrapper is not null */ @Test public void testWrapperQueueImpl() { Assert.assertNotNull("Wrapper can not be null.", wrapperQueueImpl); } /** * Test for set setAutoRead on false on high water mark */ @Test public void testReadOnHighWaterMark() { Assert.assertFalse("Wrapper must be not flooded at the start.", wrapperQueueImpl.isFlooded()); push(79); Assert.assertFalse("Wrapper should not be flooded.", wrapperQueueImpl.isFlooded()); Mockito.verify(waterMarkListener, Mockito.times(0)).onHighWaterMark(); push(1); Assert.assertTrue("Wrapper should be flooded.", wrapperQueueImpl.isFlooded()); Mockito.verify(waterMarkListener, Mockito.times(1)).onHighWaterMark(); Assert.assertEquals( "Size of queue has to be equals to 80% of capacity of queue", highWaterMark, queueDefault.size()); } /** * */ private void push(int size) { for (int i = 0; i < size; i++) { try { wrapperQueueImpl.offer(i); } catch (Exception e) { LOG.error("Failed to offer item to queue.", e); } } } /** * Test for setAutoRead on true on low water mark */ @Test public void testReadOnLowWaterMark() { Mockito.verify(waterMarkListener, Mockito.times(0)).onHighWaterMark(); push(80); Assert.assertTrue("Wrapper should be flooded.", wrapperQueueImpl.isFlooded()); Mockito.verify(waterMarkListener, Mockito.times(1)).onHighWaterMark(); Assert.assertEquals( "Size of queue has to be equals to 80% of capacity of queue", highWaterMark, queueDefault.size()); poll(14); Mockito.verify(waterMarkListener, Mockito.times(0)).onLowWaterMark(); Assert.assertTrue("Wrapper should be still flooded.", wrapperQueueImpl.isFlooded()); poll(1); Mockito.verify(waterMarkListener, Mockito.times(1)).onLowWaterMark(); Assert.assertEquals( "Size of queue has to be equals to 65% on lowWaterMark.", lowWaterMark, queueDefault.size()); Assert.assertFalse("Wrapped should be not flooded.", wrapperQueueImpl.isFlooded()); } /** * Polling messages */ private void poll(int size) { for (int i = 0; i < size; i++) { wrapperQueueImpl.poll(); } } /** * Test for one cycle. */ @Test public void testEndReadOnHWMStartOnLWM() { Assert.assertFalse("Wrapper should not be flooded", wrapperQueueImpl.isFlooded()); Mockito.verify(waterMarkListener, Mockito.times(0)).onLowWaterMark(); Mockito.verify(waterMarkListener, Mockito.times(0)).onHighWaterMark(); push(81); Assert.assertTrue("Wrapper should be flooded", wrapperQueueImpl.isFlooded()); Mockito.verify(waterMarkListener, Mockito.times(0)).onLowWaterMark(); Mockito.verify(waterMarkListener, Mockito.times(1)).onHighWaterMark(); poll(17); Assert.assertFalse("Wrapper should not be flooded", wrapperQueueImpl.isFlooded()); Mockito.verify(waterMarkListener, Mockito.times(1)).onLowWaterMark(); Mockito.verify(waterMarkListener, Mockito.times(1)).onHighWaterMark(); push(18); Assert.assertTrue("Wrapper should be flooded", wrapperQueueImpl.isFlooded()); Mockito.verify(waterMarkListener, Mockito.times(1)).onLowWaterMark(); Mockito.verify(waterMarkListener, Mockito.times(2)).onHighWaterMark(); } }