/*
* Copyright (c) 2014 Brocade Communications 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.openflowjava.protocol.impl.core;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyShort;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.GenericFutureListener;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
import org.opendaylight.openflowjava.protocol.impl.core.connection.MessageListenerWrapper;
import org.opendaylight.openflowjava.protocol.impl.serialization.SerializationFactory;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
import org.opendaylight.yangtools.yang.binding.DataObject;
/**
*
* @author jameshall
*/
public class OFEncoderTest {
@Mock ChannelHandlerContext mockChHndlrCtx ;
@Mock SerializationFactory mockSerializationFactory ;
@Mock MessageListenerWrapper wrapper;
@Mock OfHeader mockMsg ;
@Mock ByteBuf mockOut ;
@Mock Future<Void> future;
@Mock GenericFutureListener<Future<Void>> listener;
OFEncoder ofEncoder = new OFEncoder() ;
/**
* Sets up test environment
*/
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
ofEncoder = new OFEncoder() ;
ofEncoder.setSerializationFactory( mockSerializationFactory ) ;
}
/**
* Test successful write (no clear)
*/
@Test
public void testEncodeSuccess() {
when(mockOut.readableBytes()).thenReturn(1);
when(wrapper.getMsg()).thenReturn(mockMsg);
when(wrapper.getMsg().getVersion()).thenReturn((short) EncodeConstants.OF13_VERSION_ID);
try {
ofEncoder.encode(mockChHndlrCtx, wrapper, mockOut);
} catch (Exception e) {
Assert.fail();
}
// Verify that the channel was flushed after the ByteBuf was retained.
verify(mockOut, times(0)).clear();
}
/**
* Test Bytebuf clearing after serialization failure
*/
@Test
public void testEncodeSerializationException() {
when(wrapper.getMsg()).thenReturn(mockMsg);
when(wrapper.getListener()).thenReturn(listener);
when(wrapper.getMsg().getVersion()).thenReturn((short) EncodeConstants.OF13_VERSION_ID);
doThrow(new IllegalArgumentException()).when(mockSerializationFactory).messageToBuffer(anyShort(),any(ByteBuf.class), any(DataObject.class));
try {
ofEncoder.encode(mockChHndlrCtx, wrapper, mockOut);
} catch (Exception e) {
Assert.fail();
}
// Verify that the output message buf was cleared...
verify(mockOut, times(1)).clear();
}
/**
* Test no action on empty bytebuf
*/
@Test
public void testEncodeSerializesNoBytes() {
when(mockOut.readableBytes()).thenReturn(0);
when(wrapper.getMsg()).thenReturn(mockMsg);
when(wrapper.getMsg().getVersion()).thenReturn((short) EncodeConstants.OF13_VERSION_ID);
try {
ofEncoder.encode(mockChHndlrCtx, wrapper, mockOut);
} catch (Exception e) {
Assert.fail();
}
// Verify that the output message buf was cleared...
verify(mockOut, times(0)).clear();
verify(mockChHndlrCtx, times(0)).writeAndFlush(mockOut);
verify(mockOut, times(0)).retain();
}
}