Package net.floodlightcontroller.core.internal

Source Code of net.floodlightcontroller.core.internal.OFStatisticsFutureTest$FutureFetcher

package net.floodlightcontroller.core.internal;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

import net.floodlightcontroller.core.IOFSwitch;
import net.floodlightcontroller.core.test.MockThreadPoolService;

import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
import org.openflow.protocol.OFStatisticsReply;
import org.openflow.protocol.statistics.OFFlowStatisticsReply;
import org.openflow.protocol.statistics.OFStatistics;
import org.openflow.protocol.statistics.OFStatisticsType;

import static org.easymock.EasyMock.*;

public class OFStatisticsFutureTest {
    private MockThreadPoolService tp;

    @Before
    public void setUp() {
        tp = new MockThreadPoolService();
    }

    private OFStatisticsReply getStatisticsReply(int transactionId,
                                                   int count, boolean moreReplies) {
        OFStatisticsReply sr = new OFStatisticsReply();
        sr.setXid(transactionId);
        sr.setStatisticType(OFStatisticsType.FLOW);
        List<OFStatistics> statistics = new ArrayList<OFStatistics>();
        for (int i = 0; i < count; ++i) {
            statistics.add(new OFFlowStatisticsReply());
        }
        sr.setStatistics(statistics);
        if (moreReplies)
            sr.setFlags((short) 1);
        return sr;
    }

    public class FutureFetcher<E> implements Runnable {
        public E value;
        public Future<E> future;

        public FutureFetcher(Future<E> future) {
            this.future = future;
        }

        @Override
        public void run() {
            try {
                value = future.get();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }

        /**
         * @return the value
         */
        public E getValue() {
            return value;
        }

        /**
         * @return the future
         */
        public Future<E> getFuture() {
            return future;
        }
    }

    /**
    *
    * @throws Exception
    */
   @Test
   public void testOFStatisticsFuture() throws Exception {
       // Test for a single stats reply
       IOFSwitch sw = createMock(IOFSwitch.class);
       sw.cancelStatisticsReply(1);
       OFStatisticsFuture sf = new OFStatisticsFuture(tp, sw, 1);

       replay(sw);
       List<OFStatistics> stats;
       FutureFetcher<List<OFStatistics>> ff = new FutureFetcher<List<OFStatistics>>(sf);
       Thread t = new Thread(ff);
       t.start();
       sf.deliverFuture(sw, getStatisticsReply(1, 10, false));

       t.join();
       stats = ff.getValue();
       verify(sw);
       assertEquals(10, stats.size());

       // Test multiple stats replies
       reset(sw);
       sw.cancelStatisticsReply(1);

       sf = new OFStatisticsFuture(tp, sw, 1);

       replay(sw);
       ff = new FutureFetcher<List<OFStatistics>>(sf);
       t = new Thread(ff);
       t.start();
       sf.deliverFuture(sw, getStatisticsReply(1, 10, true));
       sf.deliverFuture(sw, getStatisticsReply(1, 5, false));
       t.join();

       stats = sf.get();
       verify(sw);
       assertEquals(15, stats.size());

       // Test cancellation
       reset(sw);
       sw.cancelStatisticsReply(1);
       sf = new OFStatisticsFuture(tp, sw, 1);

       replay(sw);
       ff = new FutureFetcher<List<OFStatistics>>(sf);
       t = new Thread(ff);
       t.start();
       sf.cancel(true);
       t.join();

       stats = sf.get();
       verify(sw);
       assertEquals(0, stats.size());

       // Test self timeout
       reset(sw);
       sw.cancelStatisticsReply(1);
       sf = new OFStatisticsFuture(tp, sw, 1, 75, TimeUnit.MILLISECONDS);

       replay(sw);
       ff = new FutureFetcher<List<OFStatistics>>(sf);
       t = new Thread(ff);
       t.start();
       t.join(2000);

       stats = sf.get();
       verify(sw);
       assertEquals(0, stats.size());
   }

}
TOP

Related Classes of net.floodlightcontroller.core.internal.OFStatisticsFutureTest$FutureFetcher

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.