/*
* Copyright © 2015, 2017 Inocybe Technologies 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.ovsdb.southbound.ovsdb.transact;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import com.google.common.collect.ImmutableMap;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
import org.opendaylight.ovsdb.lib.notation.Column;
import org.opendaylight.ovsdb.lib.operations.Mutate;
import org.opendaylight.ovsdb.lib.operations.Operation;
import org.opendaylight.ovsdb.lib.operations.Operations;
import org.opendaylight.ovsdb.lib.operations.TransactionBuilder;
import org.opendaylight.ovsdb.lib.schema.ColumnSchema;
import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
import org.opendaylight.ovsdb.lib.schema.GenericTableSchema;
import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils;
import org.opendaylight.ovsdb.schema.openvswitch.OpenVSwitch;
import org.opendaylight.ovsdb.southbound.InstanceIdentifierCodec;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ConnectionInfo;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.OpenvswitchExternalIds;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.OpenvswitchOtherConfigs;
import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.api.support.membermodification.MemberMatcher;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest({TransactUtils.class, TyperUtils.class, OvsdbNodeUpdateCommand.class, InstanceIdentifier.class})
public class OvsdbNodeUpdateCommandTest {
private static final String EXTERNAL_ID_KEY = "external id key";
private static final String EXTERNAL_ID_VALUE = "external id value";
private static final String OTHER_CONFIG_KEY = "other config key";
private static final String OTHER_CONFIG_VALUE = "other config value";
@Mock private AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes;
private OvsdbNodeUpdateCommand ovsdbNodeUpdateCommand;
@Before
public void setUp() {
ovsdbNodeUpdateCommand = mock(OvsdbNodeUpdateCommand.class, Mockito.CALLS_REAL_METHODS);
}
@SuppressWarnings("unchecked")
@Test
public void testExecute() throws Exception {
Map<InstanceIdentifier<OvsdbNodeAugmentation>, OvsdbNodeAugmentation> updated = new HashMap<>();
InstanceIdentifier<OvsdbNodeAugmentation> iid = mock(InstanceIdentifier.class);
OvsdbNodeAugmentation ovsdbNode = mock(OvsdbNodeAugmentation.class);
updated.put(iid, ovsdbNode);
PowerMockito.mockStatic(TransactUtils.class);
PowerMockito.when(
TransactUtils.extractCreatedOrUpdated(any(AsyncDataChangeEvent.class), eq(OvsdbNodeAugmentation.class)))
.thenReturn(updated);
ConnectionInfo connectionInfo = mock(ConnectionInfo.class);
when(ovsdbNode.getConnectionInfo()).thenReturn(connectionInfo);
when(connectionInfo.getRemoteIp()).thenReturn(mock(IpAddress.class));
when(connectionInfo.getRemotePort()).thenReturn(mock(PortNumber.class));
OpenVSwitch ovs = mock(OpenVSwitch.class);
TransactionBuilder transaction = mock(TransactionBuilder.class);
when(transaction.getDatabaseSchema()).thenReturn(mock(DatabaseSchema.class));
PowerMockito.mockStatic(TyperUtils.class);
PowerMockito.when(TyperUtils.getTypedRowWrapper(any(DatabaseSchema.class), eq(OpenVSwitch.class)))
.thenReturn(ovs);
List<OpenvswitchExternalIds> externalIds = new ArrayList<>();
OpenvswitchExternalIds externalId = mock(OpenvswitchExternalIds.class);
externalIds.add(externalId);
when(externalId.getExternalIdKey()).thenReturn(EXTERNAL_ID_KEY);
when(externalId.getExternalIdValue()).thenReturn(EXTERNAL_ID_VALUE);
when(ovsdbNode.getOpenvswitchExternalIds()).thenReturn(externalIds);
PowerMockito.suppress(MemberMatcher.method(OvsdbNodeUpdateCommand.class, "stampInstanceIdentifier",
TransactionBuilder.class, InstanceIdentifier.class, InstanceIdentifierCodec.class));
PowerMockito.suppress(MemberMatcher.methodsDeclaredIn(InstanceIdentifier.class));
doNothing().when(ovs).setExternalIds(any(ImmutableMap.class));
Mutate<GenericTableSchema> mutate = mock(Mutate.class);
Operations op = (Operations) setField("op");
Column<GenericTableSchema, Map<String, String>> column = mock(Column.class);
when(ovs.getExternalIdsColumn()).thenReturn(column);
when(column.getSchema()).thenReturn(mock(ColumnSchema.class));
when(column.getData()).thenReturn(new HashMap<>());
when(op.mutate(any(OpenVSwitch.class))).thenReturn(mutate);
when(transaction.add(any(Operation.class))).thenReturn(transaction);
List<OpenvswitchOtherConfigs> otherConfigs = new ArrayList<>();
OpenvswitchOtherConfigs otherConfig = mock(OpenvswitchOtherConfigs.class);
otherConfigs.add(otherConfig);
when(ovsdbNode.getOpenvswitchOtherConfigs()).thenReturn(otherConfigs);
when(otherConfig.getOtherConfigKey()).thenReturn(OTHER_CONFIG_KEY);
when(otherConfig.getOtherConfigValue()).thenReturn(OTHER_CONFIG_VALUE);
doNothing().when(ovs).setOtherConfig(any(ImmutableMap.class));
when(ovs.getOtherConfigColumn()).thenReturn(column);
ovsdbNodeUpdateCommand.execute(transaction, mock(BridgeOperationalState.class), changes,
mock(InstanceIdentifierCodec.class));
verify(externalId).getExternalIdKey();
verify(otherConfig).getOtherConfigKey();
verify(ovs, times(2)).getExternalIdsColumn();
verify(transaction, times(2)).add(any(Operation.class));
}
private Object setField(String fieldName) throws Exception {
Field field = Operations.class.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(field.get(Operations.class), mock(Operations.class));
return field.get(Operations.class);
}
}