From bd17f054b89eb23af8c11e98c3988a65271423b7 Mon Sep 17 00:00:00 2001 From: Michael Vorburger Date: Thu, 16 Mar 2017 12:13:11 +0100 Subject: [PATCH] Fix broken hashCode & equals in FlowEntity related classes This in turn then fixes TestIMdsalApiManager assertFlowsInAnyOrder bug. Change includes new TestIMdsalApiManagerTest non-regression test. Also includes missing toString() - not directly related, but useful. Change-Id: I92ec5948a91ecd41eaa75777d44545fc7adc142a Signed-off-by: Michael Vorburger --- mdsalutil/mdsalutil-api/pom.xml | 4 + .../genius/mdsalutil/InstructionInfo.java | 2 + .../AbstractInstructionInfoImpl.java | 41 +++++++++ .../instructions/InstructionApplyActions.java | 21 ++++- .../instructions/InstructionClearActions.java | 24 +++++- .../instructions/InstructionGotoTable.java | 12 ++- .../instructions/InstructionWriteActions.java | 21 ++++- .../InstructionWriteMetadata.java | 12 ++- .../genius/mdsalutil/matches/MatchArpOp.java | 6 ++ .../genius/mdsalutil/matches/MatchArpSha.java | 6 ++ .../genius/mdsalutil/matches/MatchArpSpa.java | 6 ++ .../genius/mdsalutil/matches/MatchArpTha.java | 7 ++ .../genius/mdsalutil/matches/MatchArpTpa.java | 7 ++ .../matches/MatchEthernetDestination.java | 6 ++ .../matches/MatchEthernetSource.java | 7 ++ .../mdsalutil/matches/MatchEthernetType.java | 6 ++ .../genius/mdsalutil/matches/MatchIcmpv4.java | 7 ++ .../genius/mdsalutil/matches/MatchIcmpv6.java | 7 ++ .../genius/mdsalutil/matches/MatchInPort.java | 6 ++ .../mdsalutil/matches/MatchIpProtocol.java | 7 ++ .../matches/MatchIpv4Destination.java | 7 ++ .../mdsalutil/matches/MatchIpv4Source.java | 8 ++ .../matches/MatchIpv6Destination.java | 7 ++ .../mdsalutil/matches/MatchIpv6NdTarget.java | 7 ++ .../mdsalutil/matches/MatchIpv6Source.java | 7 ++ .../mdsalutil/matches/MatchMetadata.java | 7 ++ .../mdsalutil/matches/MatchMplsLabel.java | 7 ++ .../mdsalutil/matches/MatchPbbIsid.java | 7 ++ .../matches/MatchTcpDestinationPort.java | 7 ++ .../mdsalutil/matches/MatchTcpFlags.java | 7 ++ .../mdsalutil/matches/MatchTcpSourcePort.java | 7 ++ .../mdsalutil/matches/MatchTunnelId.java | 7 ++ .../matches/MatchUdpDestinationPort.java | 7 ++ .../mdsalutil/matches/MatchUdpSourcePort.java | 7 ++ .../mdsalutil/matches/MatchVlanVid.java | 7 ++ .../testutils/TestIMdsalApiManager.java | 6 +- .../tests/TestIMdsalApiManagerTest.java | 85 +++++++++++++++++++ 37 files changed, 396 insertions(+), 16 deletions(-) create mode 100644 mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/instructions/AbstractInstructionInfoImpl.java create mode 100644 mdsalutil/mdsalutil-api/src/test/java/org/opendaylight/genius/mdsalutil/interfaces/testutils/tests/TestIMdsalApiManagerTest.java diff --git a/mdsalutil/mdsalutil-api/pom.xml b/mdsalutil/mdsalutil-api/pom.xml index c8379808f..c237c56e3 100644 --- a/mdsalutil/mdsalutil-api/pom.xml +++ b/mdsalutil/mdsalutil-api/pom.xml @@ -110,6 +110,10 @@ and is available at http://www.eclipse.org/legal/epl-v10.html truth test + + com.google.guava + guava-testlib + diff --git a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/InstructionInfo.java b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/InstructionInfo.java index 1e798f75c..0dfc5b45d 100644 --- a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/InstructionInfo.java +++ b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/InstructionInfo.java @@ -11,5 +11,7 @@ import java.io.Serializable; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction; public interface InstructionInfo extends Serializable { + Instruction buildInstruction(int instructionKey); + } diff --git a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/instructions/AbstractInstructionInfoImpl.java b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/instructions/AbstractInstructionInfoImpl.java new file mode 100644 index 000000000..482ecae81 --- /dev/null +++ b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/instructions/AbstractInstructionInfoImpl.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2017 Red Hat, 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.genius.mdsalutil.instructions; + +import org.opendaylight.genius.mdsalutil.InstructionInfo; + +/** + * Abstract base class for InstructionInfo implementations, to enforce + * implementation of equals(), hashCode() and toString. + * + * @author Michael Vorburger.ch + */ +/* can remain package local instead of public (unless there are InstructionInfo impls elsewhere?) */ +abstract class AbstractInstructionInfoImpl implements InstructionInfo { + + @Override + public final boolean equals(Object obj) { + return equals2(obj); + } + + @Override + public final int hashCode() { + return hashCode2(); + } + + @Override + public String toString() { + return toString2(); + } + + protected abstract boolean equals2(Object other); + + protected abstract int hashCode2(); + + protected abstract String toString2(); +} diff --git a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/instructions/InstructionApplyActions.java b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/instructions/InstructionApplyActions.java index 8d0df507a..83941f4fd 100644 --- a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/instructions/InstructionApplyActions.java +++ b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/instructions/InstructionApplyActions.java @@ -8,19 +8,20 @@ package org.opendaylight.genius.mdsalutil.instructions; import java.util.List; +import java.util.Objects; import org.opendaylight.genius.mdsalutil.ActionInfo; import org.opendaylight.genius.mdsalutil.ActionInfoList; -import org.opendaylight.genius.mdsalutil.InstructionInfo; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionKey; +import org.opendaylight.yangtools.util.EvenMoreObjects; /** * Apply actions instruction. */ -public class InstructionApplyActions implements InstructionInfo { +public class InstructionApplyActions extends AbstractInstructionInfoImpl { private final ActionInfoList actions; @@ -45,4 +46,20 @@ public class InstructionApplyActions implements InstructionInfo { public List getActionInfos() { return actions.getActionInfos(); } + + @Override + protected boolean equals2(Object obj) { + return EvenMoreObjects.equalsHelper(this, obj, + (self, other) -> Objects.equals(self.actions, other.actions)); + } + + @Override + protected int hashCode2() { + return Objects.hash(actions); + } + + @Override + protected String toString2() { + return "InstructionApplyActions[" + actions + "]"; + } } diff --git a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/instructions/InstructionClearActions.java b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/instructions/InstructionClearActions.java index d883e036f..c29e11ba1 100644 --- a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/instructions/InstructionClearActions.java +++ b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/instructions/InstructionClearActions.java @@ -7,7 +7,6 @@ */ package org.opendaylight.genius.mdsalutil.instructions; -import org.opendaylight.genius.mdsalutil.InstructionInfo; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ClearActionsCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder; @@ -16,7 +15,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instru /** * Clear actions instruction. */ -public class InstructionClearActions implements InstructionInfo { +public class InstructionClearActions extends AbstractInstructionInfoImpl { @Override public Instruction buildInstruction(int instructionKey) { @@ -25,4 +24,25 @@ public class InstructionClearActions implements InstructionInfo { .setKey(new InstructionKey(instructionKey)) .build(); } + + @Override + public boolean equals2(Object other) { + if (this == other) { + return true; + } + if (other == null || getClass() != other.getClass()) { + return false; + } + return true; + } + + @Override + public int hashCode2() { + return 17; + } + + @Override + protected String toString2() { + return "InstructionClearActions"; + } } diff --git a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/instructions/InstructionGotoTable.java b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/instructions/InstructionGotoTable.java index 0b01402bf..12689f6d3 100644 --- a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/instructions/InstructionGotoTable.java +++ b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/instructions/InstructionGotoTable.java @@ -7,7 +7,6 @@ */ package org.opendaylight.genius.mdsalutil.instructions; -import org.opendaylight.genius.mdsalutil.InstructionInfo; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.GoToTableCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.go.to.table._case.GoToTableBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction; @@ -17,7 +16,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instru /** * Goto table instruction. */ -public class InstructionGotoTable implements InstructionInfo { +public class InstructionGotoTable extends AbstractInstructionInfoImpl { private final short tableId; @@ -44,7 +43,7 @@ public class InstructionGotoTable implements InstructionInfo { } @Override - public boolean equals(Object other) { + public boolean equals2(Object other) { if (this == other) { return true; } @@ -58,7 +57,12 @@ public class InstructionGotoTable implements InstructionInfo { } @Override - public int hashCode() { + public int hashCode2() { return tableId; } + + @Override + protected String toString2() { + return "InstructionGotoTable[" + tableId + "]"; + } } diff --git a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/instructions/InstructionWriteActions.java b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/instructions/InstructionWriteActions.java index 37efcd2ab..d8b011324 100644 --- a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/instructions/InstructionWriteActions.java +++ b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/instructions/InstructionWriteActions.java @@ -8,19 +8,20 @@ package org.opendaylight.genius.mdsalutil.instructions; import java.util.List; +import java.util.Objects; import org.opendaylight.genius.mdsalutil.ActionInfo; import org.opendaylight.genius.mdsalutil.ActionInfoList; -import org.opendaylight.genius.mdsalutil.InstructionInfo; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteActionsCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.write.actions._case.WriteActionsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionKey; +import org.opendaylight.yangtools.util.EvenMoreObjects; /** * Write actions instruction. */ -public class InstructionWriteActions implements InstructionInfo { +public class InstructionWriteActions extends AbstractInstructionInfoImpl { private final ActionInfoList actions; @@ -46,4 +47,20 @@ public class InstructionWriteActions implements InstructionInfo { return actions.getActionInfos(); } + @Override + protected boolean equals2(Object obj) { + return EvenMoreObjects.equalsHelper(this, obj, + (self, other) -> Objects.equals(self.actions, other.actions)); + } + + @Override + protected int hashCode2() { + return Objects.hash(actions); + } + + @Override + protected String toString2() { + return "InstructionWriteActions[" + actions + "]"; + } + } diff --git a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/instructions/InstructionWriteMetadata.java b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/instructions/InstructionWriteMetadata.java index 074c5c546..fd67c8a09 100644 --- a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/instructions/InstructionWriteMetadata.java +++ b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/instructions/InstructionWriteMetadata.java @@ -8,7 +8,6 @@ package org.opendaylight.genius.mdsalutil.instructions; import java.math.BigInteger; -import org.opendaylight.genius.mdsalutil.InstructionInfo; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteMetadataCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.write.metadata._case.WriteMetadataBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction; @@ -18,7 +17,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instru /** * Write metadata instruction. */ -public class InstructionWriteMetadata implements InstructionInfo { +public class InstructionWriteMetadata extends AbstractInstructionInfoImpl { private final BigInteger metadata; private final BigInteger mask; @@ -52,7 +51,7 @@ public class InstructionWriteMetadata implements InstructionInfo { } @Override - public boolean equals(Object other) { + public boolean equals2(Object other) { if (this == other) { return true; } @@ -69,9 +68,14 @@ public class InstructionWriteMetadata implements InstructionInfo { } @Override - public int hashCode() { + public int hashCode2() { int result = metadata != null ? metadata.hashCode() : 0; result = 31 * result + (mask != null ? mask.hashCode() : 0); return result; } + + @Override + protected String toString2() { + return "InstructionWriteMetadata[metadata=" + metadata + ", mask=" + mask + "]"; + } } diff --git a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchArpOp.java b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchArpOp.java index 737ba3d60..a1ce7f3bc 100644 --- a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchArpOp.java +++ b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchArpOp.java @@ -16,6 +16,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026 * ARP OP match. */ public class MatchArpOp extends MatchInfoHelper { + public static final MatchArpOp REQUEST = new MatchArpOp(NwConstants.ARP_REQUEST); public static final MatchArpOp REPLY = new MatchArpOp(NwConstants.ARP_REPLY); @@ -62,4 +63,9 @@ public class MatchArpOp extends MatchInfoHelper { result = 31 * result + op; return result; } + + @Override + public String toString() { + return "MatchArpOp[" + op + "]"; + } } diff --git a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchArpSha.java b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchArpSha.java index af83e876a..8a5aafdfc 100644 --- a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchArpSha.java +++ b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchArpSha.java @@ -17,6 +17,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026 * ARP source hardware address match. */ public class MatchArpSha extends MatchInfoHelper { + private final MacAddress address; public MatchArpSha(MacAddress address) { @@ -60,4 +61,9 @@ public class MatchArpSha extends MatchInfoHelper { result = 31 * result + (address != null ? address.hashCode() : 0); return result; } + + @Override + public String toString() { + return "MatchArpSha[" + address + "]"; + } } diff --git a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchArpSpa.java b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchArpSpa.java index c3d4130e9..614be8f29 100644 --- a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchArpSpa.java +++ b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchArpSpa.java @@ -17,6 +17,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026 * ARP source transport address match. */ public class MatchArpSpa extends MatchInfoHelper { + private final Ipv4Prefix address; public MatchArpSpa(Ipv4Prefix address) { @@ -68,4 +69,9 @@ public class MatchArpSpa extends MatchInfoHelper { result = 31 * result + (address != null ? address.hashCode() : 0); return result; } + + @Override + public String toString() { + return "MatchArpSpa[" + address + "]"; + } } diff --git a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchArpTha.java b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchArpTha.java index e9dfe9e34..8b37daf04 100644 --- a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchArpTha.java +++ b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchArpTha.java @@ -17,6 +17,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026 * ARP target hardware address match. */ public class MatchArpTha extends MatchInfoHelper { + private final MacAddress address; public MatchArpTha(MacAddress address) { @@ -60,4 +61,10 @@ public class MatchArpTha extends MatchInfoHelper { result = 31 * result + (address != null ? address.hashCode() : 0); return result; } + + @Override + public String toString() { + return "MatchArpTha[" + address + "]"; + } + } diff --git a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchArpTpa.java b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchArpTpa.java index 5b7a026ff..808174b6d 100644 --- a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchArpTpa.java +++ b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchArpTpa.java @@ -17,6 +17,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026 * ARP target transport address match. */ public class MatchArpTpa extends MatchInfoHelper { + private final Ipv4Prefix address; public MatchArpTpa(Ipv4Prefix address) { @@ -68,4 +69,10 @@ public class MatchArpTpa extends MatchInfoHelper { result = 31 * result + (address != null ? address.hashCode() : 0); return result; } + + @Override + public String toString() { + return "MatchArpTpa[" + address + "]"; + } + } diff --git a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchEthernetDestination.java b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchEthernetDestination.java index a3efe8bfa..86f3ee2a5 100644 --- a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchEthernetDestination.java +++ b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchEthernetDestination.java @@ -17,6 +17,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026 * Ethernet destination match. */ public class MatchEthernetDestination extends MatchInfoHelper { + private final MacAddress address; private final MacAddress mask; @@ -78,4 +79,9 @@ public class MatchEthernetDestination extends MatchInfoHelper { + private final MacAddress address; private final MacAddress mask; @@ -78,4 +79,10 @@ public class MatchEthernetSource extends MatchInfoHelper { + public static final MatchEthernetType IPV4 = new MatchEthernetType(0x0800L); public static final MatchEthernetType ARP = new MatchEthernetType(0x0806L); public static final MatchEthernetType RARP = new MatchEthernetType(0x8035L); @@ -67,4 +68,9 @@ public class MatchEthernetType extends MatchInfoHelper>> 32); return result; } + + @Override + public String toString() { + return "MatchEthernetType[" + type + "]"; + } } diff --git a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchIcmpv4.java b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchIcmpv4.java index 101a6fbbd..1dba3f723 100644 --- a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchIcmpv4.java +++ b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchIcmpv4.java @@ -15,6 +15,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026 * ICMPv4 match. */ public class MatchIcmpv4 extends MatchInfoHelper { + private final short type; private final short code; @@ -68,4 +69,10 @@ public class MatchIcmpv4 extends MatchInfoHelper { + private final short type; private final short code; @@ -68,4 +69,10 @@ public class MatchIcmpv6 extends MatchInfoHelper>> 32); return result; } + + @Override + public String toString() { + return "MatchInPort[dpId=" + dpId + ", portNumber=" + portNumber + "]"; + } } diff --git a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchIpProtocol.java b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchIpProtocol.java index 80adf2ed1..abfc4a110 100644 --- a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchIpProtocol.java +++ b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchIpProtocol.java @@ -16,6 +16,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026 * IP protocol match. */ public class MatchIpProtocol extends MatchInfoHelper { + public static final MatchIpProtocol TCP = new MatchIpProtocol(IPProtocols.TCP.shortValue()); public static final MatchIpProtocol UDP = new MatchIpProtocol(IPProtocols.UDP.shortValue()); public static final MatchIpProtocol ICMP = new MatchIpProtocol(IPProtocols.ICMP.shortValue()); @@ -64,4 +65,10 @@ public class MatchIpProtocol extends MatchInfoHelper { result = 31 * result + protocol; return result; } + + @Override + public String toString() { + return "MatchIpProtocol[" + protocol + "]"; + } + } diff --git a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchIpv4Destination.java b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchIpv4Destination.java index 1e2a7fdab..7723db8b9 100644 --- a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchIpv4Destination.java +++ b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchIpv4Destination.java @@ -17,6 +17,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026 * IPv4 destination match. */ public class MatchIpv4Destination extends MatchInfoHelper { + private final Ipv4Prefix prefix; public MatchIpv4Destination(Ipv4Prefix prefix) { @@ -68,4 +69,10 @@ public class MatchIpv4Destination extends MatchInfoHelper { + private final Ipv4Prefix prefix; public MatchIpv4Source(Ipv4Prefix prefix) { @@ -68,4 +69,11 @@ public class MatchIpv4Source extends MatchInfoHelper { + private final Ipv6Prefix prefix; public MatchIpv6Destination(String address) { @@ -63,4 +64,10 @@ public class MatchIpv6Destination extends MatchInfoHelper { + private final Ipv6Address address; public MatchIpv6NdTarget(Ipv6Address address) { @@ -59,4 +60,10 @@ public class MatchIpv6NdTarget extends MatchInfoHelper { + private final Ipv6Prefix prefix; public MatchIpv6Source(String address) { @@ -63,4 +64,10 @@ public class MatchIpv6Source extends MatchInfoHelper { + private final BigInteger metadata; private final BigInteger mask; @@ -69,4 +70,10 @@ public class MatchMetadata extends MatchInfoHelper { result = 31 * result + (mask != null ? mask.hashCode() : 0); return result; } + + @Override + public String toString() { + return "MatchMetadata[metadata=" + metadata + ", mask=" + mask + "]"; + } + } diff --git a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchMplsLabel.java b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchMplsLabel.java index 3057a0e87..d0b0a073b 100644 --- a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchMplsLabel.java +++ b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchMplsLabel.java @@ -15,6 +15,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026 * MPLS label match. */ public class MatchMplsLabel extends MatchInfoHelper { + private final long label; public MatchMplsLabel(long label) { @@ -58,4 +59,10 @@ public class MatchMplsLabel extends MatchInfoHelper>> 32); return result; } + + @Override + public String toString() { + return "MatchMplsLabel[" + label + "]"; + } + } diff --git a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchPbbIsid.java b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchPbbIsid.java index a0649caf6..fb7749021 100644 --- a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchPbbIsid.java +++ b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchPbbIsid.java @@ -16,6 +16,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026 * PBB ISID match. */ public class MatchPbbIsid extends MatchInfoHelper { + private final long isid; public MatchPbbIsid(long isid) { @@ -59,4 +60,10 @@ public class MatchPbbIsid extends MatchInfoHelper>> 32); return result; } + + @Override + public String toString() { + return "MatchPbbIsid[" + isid + "]"; + } + } diff --git a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchTcpDestinationPort.java b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchTcpDestinationPort.java index 2bbb8f363..01ce2376a 100644 --- a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchTcpDestinationPort.java +++ b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchTcpDestinationPort.java @@ -16,6 +16,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026 * TCP destination port match. */ public class MatchTcpDestinationPort extends MatchInfoHelper { + private final int port; public MatchTcpDestinationPort(int port) { @@ -59,4 +60,10 @@ public class MatchTcpDestinationPort extends MatchInfoHelper { + public static final MatchTcpFlags SYN = new MatchTcpFlags(1 << 1); public static final MatchTcpFlags ACK = new MatchTcpFlags(1 << 4); public static final MatchTcpFlags SYN_ACK = new MatchTcpFlags((1 << 1) + (1 << 4)); @@ -62,4 +63,10 @@ public class MatchTcpFlags extends MatchInfoHelper { + private final int port; public MatchTcpSourcePort(int port) { @@ -59,4 +60,10 @@ public class MatchTcpSourcePort extends MatchInfoHelper { + private final BigInteger tunnelId; private final BigInteger tunnelMask; @@ -77,4 +78,10 @@ public class MatchTunnelId extends MatchInfoHelper { result = 31 * result + (tunnelMask != null ? tunnelMask.hashCode() : 0); return result; } + + @Override + public String toString() { + return "MatchTunnelId[tunnelId=" + tunnelId + ", tunnelMask=" + tunnelMask + "]"; + } + } diff --git a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchUdpDestinationPort.java b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchUdpDestinationPort.java index db9bb01c1..10021586a 100644 --- a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchUdpDestinationPort.java +++ b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/matches/MatchUdpDestinationPort.java @@ -16,6 +16,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026 * UDP destination port match. */ public class MatchUdpDestinationPort extends MatchInfoHelper { + private final int port; public MatchUdpDestinationPort(int port) { @@ -59,4 +60,10 @@ public class MatchUdpDestinationPort extends MatchInfoHelper { + private final int port; public MatchUdpSourcePort(int port) { @@ -59,4 +60,10 @@ public class MatchUdpSourcePort extends MatchInfoHelper { + private final int vlanId; public MatchVlanVid(int vlanId) { @@ -63,4 +64,10 @@ public class MatchVlanVid extends MatchInfoHelper { result = 31 * result + vlanId; return result; } + + @Override + public String toString() { + return "MatchVlanVid[" + vlanId + "]"; + } + } diff --git a/mdsalutil/mdsalutil-api/src/test/java/org/opendaylight/genius/mdsalutil/interfaces/testutils/TestIMdsalApiManager.java b/mdsalutil/mdsalutil-api/src/test/java/org/opendaylight/genius/mdsalutil/interfaces/testutils/TestIMdsalApiManager.java index a26654bb3..8160465a0 100644 --- a/mdsalutil/mdsalutil-api/src/test/java/org/opendaylight/genius/mdsalutil/interfaces/testutils/TestIMdsalApiManager.java +++ b/mdsalutil/mdsalutil-api/src/test/java/org/opendaylight/genius/mdsalutil/interfaces/testutils/TestIMdsalApiManager.java @@ -108,13 +108,15 @@ public abstract class TestIMdsalApiManager implements IMdsalApiManager { try { assertThat(flows).containsExactlyElementsIn(expectedFlowsAsNewArrayList); } catch (AssertionError e) { + // We LOG the AssertionError just for clarity why containsExactlyElementsIn() failed + LOG.warn("assert containsExactlyElementsIn() failed", e); // We LOG the expected and actual flow in case of a failed assertion // because, even though that is typically just a HUGE String that's // hard to read (the diff printed subsequently by assertEqualBeans // is, much, more readable), there are cases when looking more closely // at the full toString() output of the flows is still useful, so: - LOG.warn("assert fail; expected flows: {}", expectedFlowsAsNewArrayList); - LOG.warn("assert fail; actual flows : {}", flows); + LOG.warn("assert failed [order ignored!]; expected flows: {}", expectedFlowsAsNewArrayList); + LOG.warn("assert failed [order ignored!]; actual flows : {}", flows); // The point of this is basically just that our assertEqualBeans output, // in case of a comparison failure, is *A LOT* more clearly readable // than what G Truth (or Hamcrest) can do based on toString. diff --git a/mdsalutil/mdsalutil-api/src/test/java/org/opendaylight/genius/mdsalutil/interfaces/testutils/tests/TestIMdsalApiManagerTest.java b/mdsalutil/mdsalutil-api/src/test/java/org/opendaylight/genius/mdsalutil/interfaces/testutils/tests/TestIMdsalApiManagerTest.java new file mode 100644 index 000000000..e00a9c42c --- /dev/null +++ b/mdsalutil/mdsalutil-api/src/test/java/org/opendaylight/genius/mdsalutil/interfaces/testutils/tests/TestIMdsalApiManagerTest.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2017 Red Hat, 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.genius.mdsalutil.interfaces.testutils.tests; + +import com.google.common.collect.ImmutableList; +import com.google.common.testing.EqualsTester; +import java.math.BigInteger; +import java.util.List; +import org.junit.Test; +import org.opendaylight.genius.mdsalutil.FlowEntity; +import org.opendaylight.genius.mdsalutil.InstructionInfo; +import org.opendaylight.genius.mdsalutil.MatchInfoBase; +import org.opendaylight.genius.mdsalutil.instructions.InstructionClearActions; +import org.opendaylight.genius.mdsalutil.instructions.InstructionGotoTable; +import org.opendaylight.genius.mdsalutil.interfaces.testutils.TestIMdsalApiManager; +import org.opendaylight.genius.mdsalutil.matches.MatchArpSpa; + +/** + * Unit test for {@link TestIMdsalApiManager}. + * @author Michael Vorburger.ch + */ +public class TestIMdsalApiManagerTest { + + private final TestIMdsalApiManager mdsalApiManager = TestIMdsalApiManager.newInstance(); + + @Test + public void testEqualsAndHashCode() { + new EqualsTester() + .addEqualityGroup(getNewFlow1(), getNewFlow1()) + .addEqualityGroup(getNewFlow2(), getNewFlow2()) + .testEquals(); + } + + @Test + public void testAssertFlowsInAnyOrder() { + mdsalApiManager.installFlow(getNewFlow1()); + mdsalApiManager.installFlow(getNewFlow2()); + mdsalApiManager.assertFlows(ImmutableList.of(getNewFlow1(), getNewFlow2())); + mdsalApiManager.assertFlowsInAnyOrder(ImmutableList.of(getNewFlow2(), getNewFlow1())); + } + + private FlowEntity getNewFlow1() { + FlowEntity flow1 = new FlowEntity(123); + flow1.setTableId(1); + flow1.setCookie(BigInteger.valueOf(456789)); + flow1.setFlowId("ThisIsFlow1"); + flow1.setHardTimeOut(456); + flow1.setIdleTimeOut(789); + flow1.setPriority(1); + flow1.setSendFlowRemFlag(true); + flow1.setStrictFlag(true); + List instructionInfos = ImmutableList.of( + new InstructionClearActions(), new InstructionGotoTable((short) 2)); + flow1.setInstructionInfoList(instructionInfos); + List matchInfos = ImmutableList.of( + new MatchArpSpa("192.168.1.1", "24")); + flow1.setMatchInfoList(matchInfos); + return flow1; + } + + private FlowEntity getNewFlow2() { + FlowEntity flow2 = new FlowEntity(321); + flow2.setTableId(2); + flow2.setCookie(BigInteger.valueOf(987654)); + flow2.setFlowId("ThisIsflow2"); + flow2.setHardTimeOut(654); + flow2.setIdleTimeOut(987); + flow2.setPriority(2); + flow2.setSendFlowRemFlag(false); + flow2.setStrictFlag(false); + List instructionInfos = ImmutableList.of( + new InstructionGotoTable((short) 1), new InstructionClearActions()); + flow2.setInstructionInfoList(instructionInfos); + List matchInfos = ImmutableList.of( + new MatchArpSpa("10.11.12.30", "24")); + flow2.setMatchInfoList(matchInfos); + return flow2; + } + +} -- 2.36.6