blob: c76de5fff767c15d7a76b8a8cd8f507969cc5257 [file] [log] [blame]
/*
* Copyright 2017-present Open Networking Laboratory
*
* 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.mapping.codec;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.hamcrest.Description;
import org.hamcrest.TypeSafeDiagnosingMatcher;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.onlab.packet.IpPrefix;
import org.onosproject.codec.CodecContext;
import org.onosproject.codec.JsonCodec;
import org.onosproject.codec.impl.CodecManager;
import org.onosproject.mapping.DefaultMapping;
import org.onosproject.mapping.DefaultMappingEntry;
import org.onosproject.mapping.DefaultMappingKey;
import org.onosproject.mapping.DefaultMappingTreatment;
import org.onosproject.mapping.DefaultMappingValue;
import org.onosproject.mapping.Mapping;
import org.onosproject.mapping.MappingCodecRegistrator;
import org.onosproject.mapping.MappingEntry;
import org.onosproject.mapping.MappingEntry.MappingEntryState;
import org.onosproject.mapping.MappingKey;
import org.onosproject.mapping.MappingTreatment;
import org.onosproject.mapping.MappingValue;
import org.onosproject.mapping.actions.MappingAction;
import org.onosproject.mapping.actions.MappingActions;
import org.onosproject.mapping.addresses.MappingAddress;
import org.onosproject.mapping.addresses.MappingAddresses;
import org.onosproject.mapping.codec.MappingKeyCodecTest.MappingKeyJsonMatcher;
import org.onosproject.mapping.codec.MappingValueCodecTest.MappingValueJsonMatcher;
import org.onosproject.mapping.instructions.MappingInstruction;
import org.onosproject.mapping.instructions.MappingInstructions;
import org.onosproject.net.DeviceId;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.notNullValue;
/**
* Unit tests for MappingEntryCodec.
*/
public class MappingEntryCodecTest {
private static final String IPV4_STRING = "1.2.3.4";
private static final String PORT_STRING = "32";
private static final IpPrefix IPV4_PREFIX =
IpPrefix.valueOf(IPV4_STRING + "/" + PORT_STRING);
private static final int UNICAST_WEIGHT = 1;
private static final int UNICAST_PRIORITY = 1;
private static final int MULTICAST_WEIGHT = 2;
private static final int MULTICAST_PRIORITY = 2;
private static final long ID = 1L;
private static final DeviceId DEVICE_ID = DeviceId.deviceId("lisp:5.6.7.8");
private static final MappingEntryState STATE = MappingEntryState.ADDED;
private CodecContext context;
private JsonCodec<MappingEntry> entryCodec;
private MappingCodecRegistrator registrator;
/**
* Sets up for each test.
* Creates a context and fetches the mapping entry codec.
*/
@Before
public void setUp() {
CodecManager manager = new CodecManager();
registrator = new MappingCodecRegistrator();
registrator.codecService = manager;
registrator.activate();
context = new MappingCodecContextAdapter(registrator.codecService);
entryCodec = context.codec(MappingEntry.class);
assertThat(entryCodec, notNullValue());
}
/**
* Deactivates the codec registrator.
*/
@After
public void tearDown() {
registrator.deactivate();
}
/**
* Tests encoding of a mapping entry object.
*/
@Test
public void testMappingEntryEncode() {
MappingAddress address = MappingAddresses.ipv4MappingAddress(IPV4_PREFIX);
MappingInstruction unicastWeight = MappingInstructions.unicastWeight(UNICAST_WEIGHT);
MappingInstruction unicastPriority = MappingInstructions.unicastPriority(UNICAST_PRIORITY);
MappingInstruction multicastWeight = MappingInstructions.multicastWeight(MULTICAST_WEIGHT);
MappingInstruction multicastPriority = MappingInstructions.multicastPriority(MULTICAST_PRIORITY);
MappingKey key = DefaultMappingKey.builder()
.withAddress(address)
.build();
MappingTreatment treatment = DefaultMappingTreatment.builder()
.add(unicastWeight)
.add(unicastPriority)
.add(multicastWeight)
.add(multicastPriority)
.withAddress(address)
.build();
MappingAction action = MappingActions.noAction();
MappingValue value = DefaultMappingValue.builder()
.add(treatment)
.withAction(action)
.build();
Mapping mapping = DefaultMapping.builder()
.withId(ID)
.forDevice(DEVICE_ID)
.withKey(key)
.withValue(value)
.build();
MappingEntry entry = new DefaultMappingEntry(mapping, STATE);
ObjectNode entryJson = entryCodec.encode(entry, context);
assertThat(entryJson, MappingEntryJsonMatcher.matchesMappingEntry(entry));
}
/**
* Hamcrest matcher for mapping entry.
*/
public static final class MappingEntryJsonMatcher
extends TypeSafeDiagnosingMatcher<JsonNode> {
private final MappingEntry mappingEntry;
/**
* A default constructor.
*
* @param mappingEntry mapping entry
*/
private MappingEntryJsonMatcher(MappingEntry mappingEntry) {
this.mappingEntry = mappingEntry;
}
@Override
protected boolean matchesSafely(JsonNode jsonNode, Description description) {
// check mapping id
final JsonNode jsonIdNode = jsonNode.get(MappingEntryCodec.ID);
final long jsonId = jsonIdNode.asLong();
final long id = mappingEntry.id().value();
if (jsonId != id) {
description.appendText("mapping id was " + id);
return false;
}
// check device id
final JsonNode jsonDeviceIdNode = jsonNode.get(MappingEntryCodec.DEVICE_ID);
final String jsonDeviceId = jsonDeviceIdNode.textValue();
final String deviceId = mappingEntry.deviceId().toString();
if (!jsonDeviceId.equals(deviceId)) {
description.appendText("device id was " + deviceId);
return false;
}
// check state
final JsonNode jsonStateNode = jsonNode.get(MappingEntryCodec.STATE);
final String jsonState = jsonStateNode.textValue();
final String state = mappingEntry.state().name();
if (!jsonState.equals(state)) {
description.appendText("state was " + state);
return false;
}
// check mapping key
final JsonNode jsonKeyNode = jsonNode.get(MappingEntryCodec.KEY);
assertThat(jsonKeyNode, MappingKeyJsonMatcher.matchesMappingKey(mappingEntry.key()));
// check mapping value
final JsonNode jsonValueNode = jsonNode.get(MappingEntryCodec.VALUE);
assertThat(jsonValueNode, MappingValueJsonMatcher.matchesMappingValue(mappingEntry.value()));
return true;
}
@Override
public void describeTo(Description description) {
description.appendText(mappingEntry.toString());
}
/**
* Factory to allocate a mapping entry matcher.
*
* @param entry mapping entry object we are looking for
* @return matcher
*/
public static MappingEntryJsonMatcher matchesMappingEntry(MappingEntry entry) {
return new MappingEntryJsonMatcher(entry);
}
}
}