package org.openflow.protocol;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.util.EnumSet;
import org.junit.Test;
import org.openflow.protocol.Wildcards.Flag;
public class WildcardsTest {
@Test
public void testBasic() {
int[] intMasks = { 0, 0x3820e0, OFMatch.OFPFW_ALL_SANITIZED };
for (int i : intMasks) {
Wildcards w = Wildcards.of(i);
assertEquals(i, w.getInt());
}
}
@Test
public void testAllSanitize() {
Wildcards w = Wildcards.of(OFMatch.OFPFW_ALL);
assertEquals(OFMatch.OFPFW_ALL_SANITIZED, w.getInt());
assertTrue(w.isFull());
assertFalse(w.isExact());
}
@Test
public void testAll() {
Wildcards all = Wildcards.FULL;
assertTrue(all.isFull());
assertFalse(all.isExact());
assertEquals(0, all.getNwDstMask());
assertEquals(0, all.getNwSrcMask());
// unsetting flags from NONE is a no-op
Wildcards stillAll = all.wildcard(Flag.IN_PORT);
assertTrue(stillAll.isFull());
assertEquals(all, stillAll);
// so is setting a >= 32 netmask
stillAll = all.withNwSrcMask(0);
assertTrue(stillAll.isFull());
assertEquals(all, stillAll);
stillAll = all.withNwDstMask(0);
assertTrue(stillAll.isFull());
assertEquals(all, stillAll);
}
@Test
public void testNone() {
Wildcards none = Wildcards.EXACT;
assertTrue(none.isExact());
assertEquals(32, none.getNwDstMask());
assertEquals(32, none.getNwSrcMask());
// unsetting flags from NONE is a no-op
Wildcards stillNone = none.matchOn(Flag.IN_PORT);
assertTrue(stillNone.isExact());
assertEquals(none, stillNone);
// so is setting a >= 32 netmask
stillNone = none.withNwSrcMask(32);
assertTrue(stillNone.isExact());
assertEquals(none, stillNone);
stillNone = none.withNwDstMask(32);
assertTrue(stillNone.isExact());
assertEquals(none, stillNone);
}
@Test
public void testSetOneFlag() {
Wildcards none = Wildcards.EXACT;
assertTrue(none.isExact());
assertFalse(none.isWildcarded(Flag.DL_SRC));
Wildcards one = none.wildcard(Flag.DL_SRC);
assertFalse(one.isExact());
assertTrue(one.isWildcarded(Flag.DL_SRC));
assertEquals(OFMatch.OFPFW_DL_SRC, one.getInt());
assertEquals(EnumSet.of(Flag.DL_SRC), one.getWildcardedFlags());
}
@Test
public void testSetTwoFlags() {
Wildcards none = Wildcards.EXACT;
// set two flags
Wildcards two = none.wildcard(Flag.DL_SRC, Flag.DL_DST);
assertFalse(two.isExact());
assertTrue(two.isWildcarded(Flag.DL_SRC));
assertTrue(two.isWildcarded(Flag.DL_DST));
assertEquals(OFMatch.OFPFW_DL_SRC | OFMatch.OFPFW_DL_DST, two.getInt());
assertEquals(EnumSet.of(Flag.DL_SRC, Flag.DL_DST), two.getWildcardedFlags());
// unset dl_dst
Wildcards gone = two.matchOn(Flag.DL_DST);
assertFalse(gone.isExact());
assertTrue(gone.isWildcarded(Flag.DL_SRC));
assertFalse(gone.isWildcarded(Flag.DL_DST));
assertEquals(OFMatch.OFPFW_DL_SRC, gone.getInt());
assertEquals(EnumSet.of(Flag.DL_SRC), gone.getWildcardedFlags());
}
@Test
public void testSetNwSrc() {
Wildcards none = Wildcards.EXACT;
assertEquals(32, none.getNwSrcMask());
// unsetting flags from NONE is a no-op
Wildcards nwSet = none.withNwSrcMask(8);
assertFalse(nwSet.isExact());
assertEquals(EnumSet.noneOf(Flag.class), nwSet.getWildcardedFlags());
assertEquals(8, nwSet.getNwSrcMask());
assertEquals((32 - 8) << OFMatch.OFPFW_NW_SRC_SHIFT, nwSet.getInt());
}
@Test
public void testSetNwDst() {
Wildcards none = Wildcards.EXACT;
assertEquals(32, none.getNwDstMask());
// unsetting flags from NONE is a no-op
Wildcards nwSet = none.withNwDstMask(8);
assertFalse(nwSet.isExact());
assertEquals(EnumSet.noneOf(Flag.class), nwSet.getWildcardedFlags());
assertEquals(8, nwSet.getNwDstMask());
assertEquals((32 - 8) << OFMatch.OFPFW_NW_DST_SHIFT, nwSet.getInt());
}
@Test
public void testToString() {
String s = Wildcards.FULL.toString();
assertNotNull(s);
assertTrue(s.length() > 0);
}
@Test
public void testInvert() {
assertEquals(Wildcards.FULL, Wildcards.EXACT.inverted());
Wildcards some = Wildcards.of(Flag.DL_VLAN, Flag.DL_VLAN_PCP);
Wildcards inv = some.inverted();
for(Flag f : Flag.values()) {
boolean shouldBeSet = (f == Flag.DL_VLAN || f == Flag.DL_VLAN_PCP);
assertEquals("Flag " + f + " "
+ (shouldBeSet ? "should be set " : "should not be set"),
shouldBeSet, some.isWildcarded(f));
assertEquals(!(f == Flag.DL_VLAN || f == Flag.DL_VLAN_PCP), inv.isWildcarded(f));
}
assertEquals(0, inv.getNwDstMask());
assertEquals(0, inv.getNwSrcMask());
}
}