Merge "Tests for GBP-base"
authorMartin Sunal <msunal@cisco.com>
Tue, 19 Jul 2016 13:15:52 +0000 (13:15 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Tue, 19 Jul 2016 13:15:52 +0000 (13:15 +0000)
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/renderer/DtoEquivalenceUtils.java
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/util/PolicyInfoUtils.java
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/util/PolicyResolverUtils.java
groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/DtoEquivalenceUtilsTest.java [new file with mode: 0644]
groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/InheritanceUtilsTest.java
groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/util/PolicyInfoUtilsTest.java [new file with mode: 0644]

index be65d9f2a495947d518627e9ce9897604663ed56..b9e9c96205241042de59796ff2c11bdc98bf261e 100644 (file)
@@ -14,6 +14,7 @@ import java.util.Objects;
 
 import javax.annotation.Nullable;
 
+import com.google.common.annotations.VisibleForTesting;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.CommonEndpointFields;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoint.locations.AddressEndpointLocation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoint.locations.ContainmentEndpointLocation;
@@ -42,7 +43,9 @@ class DtoEquivalenceUtils {
                     return input.getTenantId();
                 }
             };
-    private static final Equivalence<AddressEndpoint> ADDR_EP_EQ = new Equivalence<AddressEndpoint>() {
+
+    @VisibleForTesting
+    static final Equivalence<AddressEndpoint> ADDR_EP_EQ = new Equivalence<AddressEndpoint>() {
 
         @Override
         protected boolean doEquivalent(AddressEndpoint a, AddressEndpoint b) {
@@ -67,7 +70,8 @@ class DtoEquivalenceUtils {
         }
     };
 
-    private static final Equivalence<ContainmentEndpoint> CONT_EP_EQ = new Equivalence<ContainmentEndpoint>() {
+    @VisibleForTesting
+    static final Equivalence<ContainmentEndpoint> CONT_EP_EQ = new Equivalence<ContainmentEndpoint>() {
 
         @Override
         protected boolean doEquivalent(ContainmentEndpoint a, ContainmentEndpoint b) {
@@ -89,7 +93,8 @@ class DtoEquivalenceUtils {
         }
     };
 
-    private static final Equivalence<AddressEndpointLocation> ADDR_EP_LOC_EQ =
+    @VisibleForTesting
+    static final Equivalence<AddressEndpointLocation> ADDR_EP_LOC_EQ =
             new Equivalence<AddressEndpointLocation>() {
 
                 @Override
@@ -112,7 +117,8 @@ class DtoEquivalenceUtils {
                 }
             };
 
-    private static final Equivalence<ContainmentEndpointLocation> CONT_EP_LOC_EQ =
+    @VisibleForTesting
+    static final Equivalence<ContainmentEndpointLocation> CONT_EP_LOC_EQ =
             new Equivalence<ContainmentEndpointLocation>() {
 
                 @Override
@@ -132,7 +138,8 @@ class DtoEquivalenceUtils {
                 }
             };
 
-    private static final Equivalence<ForwardingByTenant> FWD_BY_TENANT_EQ = new Equivalence<ForwardingByTenant>() {
+    @VisibleForTesting
+    static final Equivalence<ForwardingByTenant> FWD_BY_TENANT_EQ = new Equivalence<ForwardingByTenant>() {
 
         @Override
         protected boolean doEquivalent(ForwardingByTenant x, ForwardingByTenant y) {
index 4384d5d88da219e27b1dc639de908fd78cf5e322..72f44a643b21a8e0150ba5ad6389885d5e0c09db 100644 (file)
@@ -14,6 +14,7 @@ import java.util.List;
 import java.util.Set;
 import java.util.concurrent.ConcurrentMap;
 
+import com.google.common.annotations.VisibleForTesting;
 import org.opendaylight.groupbasedpolicy.dto.ConditionSet;
 import org.opendaylight.groupbasedpolicy.dto.EgKey;
 import org.opendaylight.groupbasedpolicy.dto.EndpointConstraint;
@@ -180,7 +181,8 @@ public class PolicyInfoUtils {
         return policyRuleGroupWithEndpointConstraintsList;
     }
 
-    private static List<ResolvedRule> buildResolvedRules(List<Rule> rules, Tenant tenant) {
+    @VisibleForTesting
+    static List<ResolvedRule> buildResolvedRules(List<Rule> rules, Tenant tenant) {
         if (rules == null) {
             return null;
         }
index cac7c4f26fc6ced0694649a5864e9753346584d9..bd51dd3ca6f398ef1eb08c1db203448ebf66db42 100644 (file)
@@ -37,7 +37,7 @@ public class PolicyResolverUtils {
      * endpoint groups and the conditions that can apply for for each endpoint in those groups.
      */
     public static Table<EgKey, EgKey, Policy> resolvePolicy(Set<IndexedTenant> tenants) {
-        return resolvePolicy(tenants, new HashMap<EgKey, Set<ConditionSet>>());
+        return resolvePolicy(tenants, new HashMap<>());
     }
 
     /**
diff --git a/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/DtoEquivalenceUtilsTest.java b/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/renderer/DtoEquivalenceUtilsTest.java
new file mode 100644 (file)
index 0000000..436118d
--- /dev/null
@@ -0,0 +1,278 @@
+/*
+ * Copyright (c) 2015 Cisco 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.groupbasedpolicy.renderer;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.google.common.collect.ImmutableList;
+import org.junit.Test;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.common.endpoint.fields.NetworkContainmentBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoint.locations.AddressEndpointLocation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoint.locations.AddressEndpointLocationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoint.locations.ContainmentEndpointLocationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoints.address.endpoints.AddressEndpoint;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoints.address.endpoints.AddressEndpointBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoints.address.endpoints.AddressEndpointKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.endpoints.containment.endpoints.ContainmentEndpointBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.absolute.location.AbsoluteLocationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.child.endpoints.ChildEndpointBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.relative.location.RelativeLocationsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.relative.location.relative.locations.ExternalLocation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.relative.location.relative.locations.ExternalLocationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.relative.location.relative.locations.InternalLocation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.relative.location.relative.locations.InternalLocationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.parent.child.endpoints.parent.endpoint.choice.ParentEndpointCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ConditionName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContextId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.NetworkDomainId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.AddressType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.ContextType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.forwarding.ForwardingByTenantBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.forwarding.forwarding.by.tenant.ForwardingContext;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.forwarding.forwarding.by.tenant.ForwardingContextBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.forwarding.forwarding.by.tenant.NetworkDomain;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.forwarding.forwarding.by.tenant.NetworkDomainBuilder;
+
+public class DtoEquivalenceUtilsTest {
+
+    @Test
+    public void testEqualsAddrEpLocByAddrEpKey() {
+        Map<AddressEndpointKey, AddressEndpointLocation> o1 = new HashMap<>();
+        Map<AddressEndpointKey, AddressEndpointLocation> o1_equal = new HashMap<>();
+        AddressEndpoint ep1_1 = new AddressEndpointBuilder().setContextType(ContextType.class)
+            .setContextId(new ContextId("ctx1"))
+            .setAddressType(AddressType.class)
+            .setAddress("adr1_1")
+            .build();
+        AddressEndpointLocation loc1_1 = new AddressEndpointLocationBuilder().setContextType(ep1_1.getContextType())
+            .setContextId(ep1_1.getContextId())
+            .setAddressType(ep1_1.getAddressType())
+            .setAddress(ep1_1.getAddress())
+            .build();
+        o1.put(ep1_1.getKey(), loc1_1);
+        o1_equal.put(ep1_1.getKey(), loc1_1);
+
+        Map<AddressEndpointKey, AddressEndpointLocation> o2 = new HashMap<>();
+        AddressEndpoint ep2_1 = new AddressEndpointBuilder().setContextType(ContextType.class)
+            .setContextId(new ContextId("ctx2"))
+            .setAddressType(AddressType.class)
+            .setAddress("adr2_1")
+            .build();
+        AddressEndpointLocation loc2_1 = new AddressEndpointLocationBuilder().setContextType(ep2_1.getContextType())
+            .setContextId(ep2_1.getContextId())
+            .setAddressType(ep2_1.getAddressType())
+            .setAddress(ep2_1.getAddress())
+            .build();
+        AddressEndpoint ep2_2 = new AddressEndpointBuilder().setContextType(ContextType.class)
+            .setContextId(new ContextId("ctx2"))
+            .setAddressType(AddressType.class)
+            .setAddress("adr2_2")
+            .build();
+        AddressEndpointLocation loc2_2 = new AddressEndpointLocationBuilder().setContextType(ep2_2.getContextType())
+            .setContextId(ep2_2.getContextId())
+            .setAddressType(ep2_2.getAddressType())
+            .setAddress(ep2_2.getAddress())
+            .build();
+        o2.put(ep2_1.getKey(), loc2_1);
+        o2.put(ep2_2.getKey(), loc2_2);
+
+        Map<AddressEndpointKey, AddressEndpointLocation> o3 = new HashMap<>();
+        AddressEndpoint ep3_1 = new AddressEndpointBuilder().setContextType(ContextType.class)
+            .setContextId(new ContextId("ctx3"))
+            .setAddressType(AddressType.class)
+            .setAddress("adr3_1")
+            .build();
+        AddressEndpointLocation loc3_1 = new AddressEndpointLocationBuilder().setContextType(ep3_1.getContextType())
+            .setContextId(ep3_1.getContextId())
+            .setAddressType(ep3_1.getAddressType())
+            .setAddress(ep3_1.getAddress())
+            .build();
+        o3.put(ep3_1.getKey(), loc3_1);
+
+        assertFalse(DtoEquivalenceUtils.equalsAddrEpLocByAddrEpKey(null, o2));
+        assertFalse(DtoEquivalenceUtils.equalsAddrEpLocByAddrEpKey(o1, null));
+        assertTrue(DtoEquivalenceUtils.equalsAddrEpLocByAddrEpKey(null, null));
+        assertTrue(DtoEquivalenceUtils.equalsAddrEpLocByAddrEpKey(o1, o1));
+        assertTrue(DtoEquivalenceUtils.equalsAddrEpLocByAddrEpKey(o1, o1_equal));
+        assertFalse(DtoEquivalenceUtils.equalsAddrEpLocByAddrEpKey(o1, o2));
+        assertFalse(DtoEquivalenceUtils.equalsAddrEpLocByAddrEpKey(o1, o3));
+    }
+
+    @Test
+    public void test_ADDR_EP_EQ() {
+        AddressEndpointBuilder epA = new AddressEndpointBuilder().setContextType(ContextType.class)
+            .setContextId(new ContextId("ctx1"))
+            .setAddressType(AddressType.class)
+            .setAddress("adr1_1");
+        AddressEndpointBuilder epA_parent = new AddressEndpointBuilder(epA.build())
+            .setParentEndpointChoice(new ParentEndpointCaseBuilder().build());
+        AddressEndpointBuilder epA_child = new AddressEndpointBuilder(epA_parent.build())
+            .setChildEndpoint(ImmutableList.of(new ChildEndpointBuilder().build()));
+        AddressEndpointBuilder epA_networkContainment = new AddressEndpointBuilder(epA_child.build())
+            .setNetworkContainment(new NetworkContainmentBuilder().build());
+        AddressEndpointBuilder epA_tenant =
+                new AddressEndpointBuilder(epA_networkContainment.build()).setTenant(new TenantId("tenantId"));
+        AddressEndpointBuilder epA_timestamp = new AddressEndpointBuilder(epA_tenant.build()).setTimestamp(1L);
+        AddressEndpointBuilder epA_condition = new AddressEndpointBuilder(epA_timestamp.build())
+            .setCondition(ImmutableList.of(new ConditionName("conditionName")));
+        AddressEndpointBuilder epA_epg = new AddressEndpointBuilder(epA_condition.build())
+            .setEndpointGroup(ImmutableList.of(new EndpointGroupId("epgId")));
+        AddressEndpointBuilder epB = new AddressEndpointBuilder().setContextType(ContextType.class)
+            .setContextId(new ContextId("ctx2"))
+            .setAddressType(AddressType.class)
+            .setAddress("adr2_1");
+
+        assertTrue(DtoEquivalenceUtils.ADDR_EP_EQ.equivalent(epA.build(),
+                new AddressEndpointBuilder(epA.build()).build()));
+        assertFalse(DtoEquivalenceUtils.ADDR_EP_EQ.equivalent(epA.build(), epA_parent.build()));
+        assertFalse(DtoEquivalenceUtils.ADDR_EP_EQ.equivalent(epA_parent.build(), epA_child.build()));
+        assertFalse(DtoEquivalenceUtils.ADDR_EP_EQ.equivalent(epA_child.build(), epA_networkContainment.build()));
+        assertFalse(DtoEquivalenceUtils.ADDR_EP_EQ.equivalent(epA_networkContainment.build(), epA_tenant.build()));
+        assertFalse(DtoEquivalenceUtils.ADDR_EP_EQ.equivalent(epA_tenant.build(), epA_timestamp.build()));
+        assertFalse(DtoEquivalenceUtils.ADDR_EP_EQ.equivalent(epA_timestamp.build(), epA_condition.build()));
+        assertFalse(DtoEquivalenceUtils.ADDR_EP_EQ.equivalent(epA_condition.build(), epA_epg.build()));
+        assertFalse(DtoEquivalenceUtils.ADDR_EP_EQ.equivalent(epA.build(), epB.build()));
+    }
+
+    @Test
+    public void test_CONT_EP_EQ() {
+        ContainmentEndpointBuilder epA =
+                new ContainmentEndpointBuilder().setContextType(ContextType.class).setContextId(new ContextId("ctx1"));
+        ContainmentEndpointBuilder epA_child = new ContainmentEndpointBuilder(epA.build())
+            .setChildEndpoint(ImmutableList.of(new ChildEndpointBuilder().build()));
+        ContainmentEndpointBuilder epA_networkContainment = new ContainmentEndpointBuilder(epA_child.build())
+            .setNetworkContainment(new NetworkContainmentBuilder().build());
+        ContainmentEndpointBuilder epA_tenant =
+                new ContainmentEndpointBuilder(epA_networkContainment.build()).setTenant(new TenantId("tenantId"));
+        ContainmentEndpointBuilder epA_timestamp = new ContainmentEndpointBuilder(epA_tenant.build()).setTimestamp(1L);
+        ContainmentEndpointBuilder epA_condition = new ContainmentEndpointBuilder(epA_timestamp.build())
+            .setCondition(ImmutableList.of(new ConditionName("conditionName")));
+        ContainmentEndpointBuilder epA_epg = new ContainmentEndpointBuilder(epA_condition.build())
+            .setEndpointGroup(ImmutableList.of(new EndpointGroupId("epgId")));
+        ContainmentEndpointBuilder epB =
+                new ContainmentEndpointBuilder().setContextType(ContextType.class).setContextId(new ContextId("ctx2"));
+
+        assertTrue(DtoEquivalenceUtils.CONT_EP_EQ.equivalent(epA.build(),
+                new ContainmentEndpointBuilder(epA.build()).build()));
+        assertFalse(DtoEquivalenceUtils.CONT_EP_EQ.equivalent(epA.build(), epA_child.build()));
+        assertFalse(DtoEquivalenceUtils.CONT_EP_EQ.equivalent(epA_child.build(), epA_networkContainment.build()));
+        assertFalse(DtoEquivalenceUtils.CONT_EP_EQ.equivalent(epA_networkContainment.build(), epA_tenant.build()));
+        assertFalse(DtoEquivalenceUtils.CONT_EP_EQ.equivalent(epA_tenant.build(), epA_timestamp.build()));
+        assertFalse(DtoEquivalenceUtils.CONT_EP_EQ.equivalent(epA_timestamp.build(), epA_condition.build()));
+        assertFalse(DtoEquivalenceUtils.CONT_EP_EQ.equivalent(epA_condition.build(), epA_epg.build()));
+        assertFalse(DtoEquivalenceUtils.CONT_EP_EQ.equivalent(epA.build(), epB.build()));
+    }
+
+    @Test
+    public void test_ADDR_EP_LOC_EQ() {
+        List<ExternalLocation> externalLocations =
+                ImmutableList.of(new ExternalLocationBuilder().setExternalNode("extNode").build());
+        List<InternalLocation> internalLocations =
+                ImmutableList.of(new InternalLocationBuilder().setInternalNode(null).build());
+        RelativeLocationsBuilder relativeLocationsBuilder_ext =
+                new RelativeLocationsBuilder().setExternalLocation(externalLocations);
+        RelativeLocationsBuilder relativeLocationsBuilder_int =
+                new RelativeLocationsBuilder().setInternalLocation(internalLocations);
+        RelativeLocationsBuilder relativeLocationsBuilder_both =
+                new RelativeLocationsBuilder(relativeLocationsBuilder_ext.build())
+                    .setInternalLocation(internalLocations);
+
+        AddressEndpointLocationBuilder locA = new AddressEndpointLocationBuilder().setContextType(ContextType.class)
+            .setContextId(new ContextId("ctx1"))
+            .setAddressType(AddressType.class)
+            .setAddress("adr1_1");
+        AddressEndpointLocationBuilder locA_absLoc = new AddressEndpointLocationBuilder(locA.build())
+            .setAbsoluteLocation(new AbsoluteLocationBuilder().build());
+        AddressEndpointLocationBuilder locA_extLoc = new AddressEndpointLocationBuilder(locA_absLoc.build())
+            .setRelativeLocations(relativeLocationsBuilder_ext.build());
+        AddressEndpointLocationBuilder locA_intLoc = new AddressEndpointLocationBuilder(locA_absLoc.build())
+            .setRelativeLocations(relativeLocationsBuilder_int.build());
+        AddressEndpointLocationBuilder locA_bothLoc = new AddressEndpointLocationBuilder(locA_absLoc.build())
+            .setRelativeLocations(relativeLocationsBuilder_both.build());
+        AddressEndpointLocationBuilder locB = new AddressEndpointLocationBuilder().setContextType(ContextType.class)
+            .setContextId(new ContextId("ctx2"))
+            .setAddressType(AddressType.class)
+            .setAddress("adr2_1");
+
+        assertTrue(DtoEquivalenceUtils.ADDR_EP_LOC_EQ.equivalent(locA.build(),
+                new AddressEndpointLocationBuilder(locA.build()).build()));
+        assertFalse(DtoEquivalenceUtils.ADDR_EP_LOC_EQ.equivalent(locA.build(), locA_absLoc.build()));
+        assertFalse(DtoEquivalenceUtils.ADDR_EP_LOC_EQ.equivalent(locA_absLoc.build(), locA_extLoc.build()));
+        assertFalse(DtoEquivalenceUtils.ADDR_EP_LOC_EQ.equivalent(locA_extLoc.build(), locA_intLoc.build()));
+        assertFalse(DtoEquivalenceUtils.ADDR_EP_LOC_EQ.equivalent(locA_extLoc.build(), locA_bothLoc.build()));
+        assertFalse(DtoEquivalenceUtils.ADDR_EP_LOC_EQ.equivalent(locA_intLoc.build(), locA_bothLoc.build()));
+        assertTrue(DtoEquivalenceUtils.ADDR_EP_LOC_EQ.equivalent(locA_bothLoc.build(),
+                new AddressEndpointLocationBuilder(locA_bothLoc.build()).build()));
+        assertFalse(DtoEquivalenceUtils.ADDR_EP_LOC_EQ.equivalent(locA.build(), locB.build()));
+    }
+
+    @Test
+    public void test_CONT_EP_LOC_EQ() {
+        List<ExternalLocation> externalLocations =
+                ImmutableList.of(new ExternalLocationBuilder().setExternalNode("extNode").build());
+        List<InternalLocation> internalLocations =
+                ImmutableList.of(new InternalLocationBuilder().setInternalNode(null).build());
+        RelativeLocationsBuilder relativeLocationsBuilder_ext =
+                new RelativeLocationsBuilder().setExternalLocation(externalLocations);
+        RelativeLocationsBuilder relativeLocationsBuilder_int =
+                new RelativeLocationsBuilder().setInternalLocation(internalLocations);
+        RelativeLocationsBuilder relativeLocationsBuilder_both =
+                new RelativeLocationsBuilder(relativeLocationsBuilder_ext.build())
+                    .setInternalLocation(internalLocations);
+
+        ContainmentEndpointLocationBuilder locA = new ContainmentEndpointLocationBuilder()
+            .setContextType(ContextType.class).setContextId(new ContextId("ctx1"));
+        ContainmentEndpointLocationBuilder locA_extLoc = new ContainmentEndpointLocationBuilder(locA.build())
+            .setRelativeLocations(relativeLocationsBuilder_ext.build());
+        ContainmentEndpointLocationBuilder locA_intLoc = new ContainmentEndpointLocationBuilder(locA.build())
+            .setRelativeLocations(relativeLocationsBuilder_int.build());
+        ContainmentEndpointLocationBuilder locA_bothLoc = new ContainmentEndpointLocationBuilder(locA.build())
+            .setRelativeLocations(relativeLocationsBuilder_both.build());
+        ContainmentEndpointLocationBuilder locB = new ContainmentEndpointLocationBuilder()
+            .setContextType(ContextType.class).setContextId(new ContextId("ctx2"));
+
+        assertTrue(DtoEquivalenceUtils.CONT_EP_LOC_EQ.equivalent(locA.build(),
+                new ContainmentEndpointLocationBuilder(locA.build()).build()));
+        assertFalse(DtoEquivalenceUtils.CONT_EP_LOC_EQ.equivalent(locA.build(), locA_extLoc.build()));
+        assertFalse(DtoEquivalenceUtils.CONT_EP_LOC_EQ.equivalent(locA_extLoc.build(), locA_intLoc.build()));
+        assertFalse(DtoEquivalenceUtils.CONT_EP_LOC_EQ.equivalent(locA_extLoc.build(), locA_bothLoc.build()));
+        assertFalse(DtoEquivalenceUtils.CONT_EP_LOC_EQ.equivalent(locA_intLoc.build(), locA_bothLoc.build()));
+        assertTrue(DtoEquivalenceUtils.CONT_EP_LOC_EQ.equivalent(locA_bothLoc.build(),
+                new ContainmentEndpointLocationBuilder(locA_bothLoc.build()).build()));
+        assertFalse(DtoEquivalenceUtils.CONT_EP_LOC_EQ.equivalent(locA.build(), locB.build()));
+    }
+
+    @Test
+    public void test_FWD_BY_TENANT_EQ() {
+        ForwardingContext fctx = new ForwardingContextBuilder().setContextId(new ContextId("contextId")).build();
+        NetworkDomain networkDomain =
+                new NetworkDomainBuilder().setNetworkDomainId(new NetworkDomainId("networkDomainId")).build();
+
+        ForwardingByTenantBuilder fwA = new ForwardingByTenantBuilder().setTenantId(new TenantId("tenantA"));
+        ForwardingByTenantBuilder fwA_fctx =
+                new ForwardingByTenantBuilder(fwA.build()).setForwardingContext(ImmutableList.of(fctx));
+        ForwardingByTenantBuilder fwA_network =
+                new ForwardingByTenantBuilder(fwA_fctx.build()).setNetworkDomain(ImmutableList.of(networkDomain));
+        ForwardingByTenantBuilder fwB = new ForwardingByTenantBuilder().setTenantId(new TenantId("tenantB"));
+
+        assertTrue(DtoEquivalenceUtils.FWD_BY_TENANT_EQ.equivalent(fwA.build(),
+                new ForwardingByTenantBuilder(fwA.build()).build()));
+        assertFalse(DtoEquivalenceUtils.FWD_BY_TENANT_EQ.equivalent(fwA.build(), fwA_fctx.build()));
+        assertFalse(DtoEquivalenceUtils.FWD_BY_TENANT_EQ.equivalent(fwA_fctx.build(), fwA_network.build()));
+        assertFalse(DtoEquivalenceUtils.FWD_BY_TENANT_EQ.equivalent(fwA.build(), fwB.build()));
+    }
+
+}
index 55d71311968ff489cf9fe334876bef6ae1991b7f..1aba45f6d70ebf236d4bf4eba1817fdfecf9b272 100755 (executable)
@@ -104,77 +104,77 @@ public class InheritanceUtilsTest {
     // Labels
     // ******
 
-    Quality q1 = new QualityBuilder().setName(new QualityName("q1")).build();
-    Quality q1Include = new QualityBuilder(q1).setInclusionRule(InclusionRule.Include).build();
-    Quality q1Exclude = new QualityBuilder(q1).setInclusionRule(InclusionRule.Exclude).build();
-    Quality q2 = new QualityBuilder().setName(new QualityName("q2")).build();
-    Quality q2Exclude =
+    private Quality q1 = new QualityBuilder().setName(new QualityName("q1")).build();
+    private Quality q1Include = new QualityBuilder(q1).setInclusionRule(InclusionRule.Include).build();
+    private Quality q1Exclude = new QualityBuilder(q1).setInclusionRule(InclusionRule.Exclude).build();
+    private Quality q2 = new QualityBuilder().setName(new QualityName("q2")).build();
+    private Quality q2Exclude =
             new QualityBuilder().setName(new QualityName("q2")).setInclusionRule(InclusionRule.Exclude).build();
-    Quality q3 = new QualityBuilder().setName(new QualityName("q3")).build();
+    private Quality q3 = new QualityBuilder().setName(new QualityName("q3")).build();
 
-    Requirement r1 = new RequirementBuilder().setName(new RequirementName("r1")).build();
-    Requirement r2 = new RequirementBuilder().setName(new RequirementName("r2")).build();
-    Requirement r1exclude =
+    private Requirement r1 = new RequirementBuilder().setName(new RequirementName("r1")).build();
+    private Requirement r2 = new RequirementBuilder().setName(new RequirementName("r2")).build();
+    private Requirement r1exclude =
             new RequirementBuilder().setName(new RequirementName("r1")).setInclusionRule(InclusionRule.Exclude).build();
-    Requirement r3 = new RequirementBuilder().setName(new RequirementName("r3")).build();
+    private Requirement r3 = new RequirementBuilder().setName(new RequirementName("r3")).build();
 
-    Capability c1 = new CapabilityBuilder().setName(new CapabilityName("c1")).build();
-    Capability c2 = new CapabilityBuilder().setName(new CapabilityName("c2")).build();
-    Capability c1exclude =
+    private Capability c1 = new CapabilityBuilder().setName(new CapabilityName("c1")).build();
+    private Capability c2 = new CapabilityBuilder().setName(new CapabilityName("c2")).build();
+    private Capability c1exclude =
             new CapabilityBuilder().setName(new CapabilityName("c1")).setInclusionRule(InclusionRule.Exclude).build();
-    Capability c3 = new CapabilityBuilder().setName(new CapabilityName("c3")).build();
+    private Capability c3 = new CapabilityBuilder().setName(new CapabilityName("c3")).build();
 
-    Condition cond1 = new ConditionBuilder().setName(new ConditionName("cond1")).build();
-    Condition cond2 = new ConditionBuilder().setName(new ConditionName("cond2")).build();
-    Condition cond2exlude =
+    private Condition cond1 = new ConditionBuilder().setName(new ConditionName("cond1")).build();
+    private Condition cond2 = new ConditionBuilder().setName(new ConditionName("cond2")).build();
+    private Condition cond2exlude =
             new ConditionBuilder().setName(new ConditionName("cond2")).setInclusionRule(InclusionRule.Exclude).build();
 
     // *********
     // Contracts
     // *********
 
-    TargetName q2TargetName = new TargetName("q2");
-    Target q2Target = new TargetBuilder().setName(q2TargetName).setQuality(ImmutableList.of(q2)).build();
+    private TargetName q2TargetName = new TargetName("q2");
+    private Target q2Target = new TargetBuilder().setName(q2TargetName).setQuality(ImmutableList.of(q2)).build();
 
-    TargetName q1ExcludeTargetName = new TargetName("q1_exclude");
-    Target q1ExcludeTarget =
+    private TargetName q1ExcludeTargetName = new TargetName("q1_exclude");
+    private Target q1ExcludeTarget =
             new TargetBuilder().setName(q1ExcludeTargetName).setQuality(ImmutableList.of(q1Exclude, q2)).build();
 
-    TargetName q1IncludeTargetName = new TargetName("q1_include");
-    Target q1IncludeTarget =
+    private TargetName q1IncludeTargetName = new TargetName("q1_include");
+    private Target q1IncludeTarget =
             new TargetBuilder().setName(q1IncludeTargetName).setQuality(ImmutableList.of(q1Include)).build();
 
-    Target q2PlusTarget = new TargetBuilder().setName(q2TargetName).setQuality(ImmutableList.of(q3)).build();
+    private Target q2PlusTarget = new TargetBuilder().setName(q2TargetName).setQuality(ImmutableList.of(q3)).build();
 
-    SubjectName subject1 = new SubjectName("subject1");
-    SubjectName subject2 = new SubjectName("subject2");
-    SubjectName subject3 = new SubjectName("subject3");
+    private SubjectName subject1 = new SubjectName("subject1");
+    private SubjectName subject2 = new SubjectName("subject2");
+    private SubjectName subject3 = new SubjectName("subject3");
 
-    RequirementMatcher rm_r1 = new RequirementMatcherBuilder().setName(new RequirementMatcherName("rm_r1"))
+    private RequirementMatcher rm_r1 = new RequirementMatcherBuilder().setName(new RequirementMatcherName("rm_r1"))
         .setMatcherRequirement(ImmutableList.of(new MatcherRequirementBuilder(r1).build()))
         .build();
-    RequirementMatcher rm_r1_plus = new RequirementMatcherBuilder().setName(new RequirementMatcherName("rm_r1"))
+    private RequirementMatcher rm_r1_plus = new RequirementMatcherBuilder().setName(new RequirementMatcherName("rm_r1"))
         .setMatchType(MatchType.All)
         .setMatcherRequirement(ImmutableList.of(new MatcherRequirementBuilder(r2).build()))
         .build();
 
-    CapabilityMatcher capm_c1 = new CapabilityMatcherBuilder().setName(new CapabilityMatcherName("capm_c1"))
+    private CapabilityMatcher capm_c1 = new CapabilityMatcherBuilder().setName(new CapabilityMatcherName("capm_c1"))
         .setMatcherCapability(ImmutableList.of(new MatcherCapabilityBuilder(c1).build()))
         .build();
 
-    ConditionMatcher cm_c1 = new ConditionMatcherBuilder().setName(new ConditionMatcherName("cm_c1"))
+    private ConditionMatcher cm_c1 = new ConditionMatcherBuilder().setName(new ConditionMatcherName("cm_c1"))
         .setCondition(ImmutableList.of(cond1))
         .build();
-    ConditionMatcher cm_c2 = new ConditionMatcherBuilder().setName(new ConditionMatcherName("cm_c2"))
+    private ConditionMatcher cm_c2 = new ConditionMatcherBuilder().setName(new ConditionMatcherName("cm_c2"))
         .setMatchType(MatchType.All)
         .setCondition(ImmutableList.of(cond2))
         .build();
-    ConditionMatcher cm_c2_plus = new ConditionMatcherBuilder().setName(new ConditionMatcherName("cm_c2"))
+    private ConditionMatcher cm_c2_plus = new ConditionMatcherBuilder().setName(new ConditionMatcherName("cm_c2"))
         .setCondition(ImmutableList.of(cond2exlude))
         .build();
 
-    ClauseName clauseName1 = new ClauseName("clauseName1");
-    Clause clause1 =
+    private ClauseName clauseName1 = new ClauseName("clauseName1");
+    private Clause clause1 =
             new ClauseBuilder().setName(clauseName1)
                 .setSubjectRefs(ImmutableList.of(subject1))
                 .setProviderMatchers(new ProviderMatchersBuilder()
@@ -189,7 +189,7 @@ public class InheritanceUtilsTest {
                     .build())
                 .build();
 
-    Clause clause1withConsMatcher = new ClauseBuilder().setName(clauseName1)
+    private Clause clause1withConsMatcher = new ClauseBuilder().setName(clauseName1)
         .setSubjectRefs(ImmutableList.of(subject2))
         .setConsumerMatchers(new ConsumerMatchersBuilder()
             .setGroupIdentificationConstraints(new GroupRequirementConstraintCaseBuilder()
@@ -198,7 +198,7 @@ public class InheritanceUtilsTest {
             .build())
         .build();
 
-    Clause clause1withProvMatcher =
+    private Clause clause1withProvMatcher =
             new ClauseBuilder().setName(clauseName1)
                 .setSubjectRefs(ImmutableList.of(subject3))
                 .setProviderMatchers(new ProviderMatchersBuilder()
@@ -208,56 +208,56 @@ public class InheritanceUtilsTest {
                     .build())
                 .build();
 
-    ActionRef a1 = new ActionRefBuilder().setName(new ActionName("a1")).build();
-    ClassifierRef cr1 = new ClassifierRefBuilder().setName(new ClassifierName("cr1")).build();
-    Rule rule1 = new RuleBuilder().setName(new RuleName("r1"))
+    private ActionRef a1 = new ActionRefBuilder().setName(new ActionName("a1")).build();
+    private ClassifierRef cr1 = new ClassifierRefBuilder().setName(new ClassifierName("cr1")).build();
+    private Rule rule1 = new RuleBuilder().setName(new RuleName("r1"))
         .setActionRef(ImmutableList.of(a1))
         .setClassifierRef(ImmutableList.of(cr1))
         .build();
-    Rule rule2 = new RuleBuilder().setName(new RuleName("r2")).setOrder(5).build();
-    Rule rule3 = new RuleBuilder().setName(new RuleName("r3")).setOrder(7).build();
-    Rule rule4 = new RuleBuilder().setName(new RuleName("r4")).setOrder(1).build();
+    private Rule rule2 = new RuleBuilder().setName(new RuleName("r2")).setOrder(5).build();
+    private Rule rule3 = new RuleBuilder().setName(new RuleName("r3")).setOrder(7).build();
+    private Rule rule4 = new RuleBuilder().setName(new RuleName("r4")).setOrder(1).build();
 
-    Subject s1 = new SubjectBuilder().setName(new SubjectName("s1")).setRule(ImmutableList.of(rule1, rule2)).build();
-    Subject s1_plus =
+    private Subject s1 = new SubjectBuilder().setName(new SubjectName("s1")).setRule(ImmutableList.of(rule1, rule2)).build();
+    private Subject s1_plus =
             new SubjectBuilder().setName(s1.getName()).setRule(ImmutableList.of(rule3, rule4)).setOrder(4).build();
-    Subject s2 = new SubjectBuilder().setName(new SubjectName("s2")).setOrder(5).build();
-    Subject s2_plus = new SubjectBuilder().setName(new SubjectName(s2.getName())).setOrder(6).build();
+    private Subject s2 = new SubjectBuilder().setName(new SubjectName("s2")).setOrder(5).build();
+    private Subject s2_plus = new SubjectBuilder().setName(new SubjectName(s2.getName())).setOrder(6).build();
 
-    ContractId contractId1 = new ContractId("e7e6804f-7fcb-46cf-9bc6-abfec0896d95");
-    Contract contract1 = new ContractBuilder().setId(contractId1)
+    private ContractId contractId1 = new ContractId("e7e6804f-7fcb-46cf-9bc6-abfec0896d95");
+    private Contract contract1 = new ContractBuilder().setId(contractId1)
         .setQuality(ImmutableList.of(q1))
         .setTarget(ImmutableList.of(q2Target, q1IncludeTarget, q1ExcludeTarget))
         .setClause(ImmutableList.of(clause1))
         .setSubject(ImmutableList.of(s1))
         .build();
 
-    ContractId contractId2 = new ContractId("3f56ae44-d1e4-4617-95af-c809dfc50149");
-    Contract contract2 = new ContractBuilder().setId(contractId2)
+    private ContractId contractId2 = new ContractId("3f56ae44-d1e4-4617-95af-c809dfc50149");
+    private Contract contract2 = new ContractBuilder().setId(contractId2)
         .setParent(contractId1)
         .setTarget(ImmutableList.of(q2PlusTarget, q1IncludeTarget))
         .setClause(ImmutableList.of(clause1withConsMatcher))
         .setSubject(ImmutableList.of(s1_plus, s2))
         .build();
 
-    ContractId contractId3 = new ContractId("38d52ec1-301b-453a-88a6-3ffa777d7795");
-    Contract contract3 = new ContractBuilder().setId(contractId3)
+    private ContractId contractId3 = new ContractId("38d52ec1-301b-453a-88a6-3ffa777d7795");
+    private Contract contract3 = new ContractBuilder().setId(contractId3)
         .setParent(contractId1)
         .setTarget(ImmutableList.of(q2PlusTarget, q1IncludeTarget))
         .setClause(ImmutableList.of(clause1withProvMatcher))
         .setSubject(ImmutableList.of(s2_plus, s2))
         .build();
 
-    ContractId cloop2Id = new ContractId("89700928-7316-4216-a853-a7ea3934b8f4");
-    Contract cloop1 = new ContractBuilder().setId(new ContractId("56bbce36-e60b-473d-92de-bb63b5a6dbb5"))
+    private ContractId cloop2Id = new ContractId("89700928-7316-4216-a853-a7ea3934b8f4");
+    private Contract cloop1 = new ContractBuilder().setId(new ContractId("56bbce36-e60b-473d-92de-bb63b5a6dbb5"))
         .setParent(cloop2Id)
         .setClause(ImmutableList.of(clause1))
         .setSubject(ImmutableList.of(s1, s2))
         .build();
-    Contract cloop2 = new ContractBuilder().setId(cloop2Id).setParent(cloop1.getId()).build();
-    ContractId cselfloopid = new ContractId("63edead2-d6f1-4acf-9f78-831595d194ee");
-    Contract cselfloop = new ContractBuilder().setId(cselfloopid).setParent(cselfloopid).build();
-    Contract corphan = new ContractBuilder().setId(new ContractId("f72c15f3-76ab-4c7e-a817-eb5f6efcb654"))
+    private Contract cloop2 = new ContractBuilder().setId(cloop2Id).setParent(cloop1.getId()).build();
+    private ContractId cselfloopid = new ContractId("63edead2-d6f1-4acf-9f78-831595d194ee");
+    private Contract cselfloop = new ContractBuilder().setId(cselfloopid).setParent(cselfloopid).build();
+    private Contract corphan = new ContractBuilder().setId(new ContractId("f72c15f3-76ab-4c7e-a817-eb5f6efcb654"))
         .setParent(new ContractId("eca4d0d5-8c62-4f46-ad42-71c1f4d3da12"))
         .build();
 
@@ -265,96 +265,96 @@ public class InheritanceUtilsTest {
     // Endpoint Groups
     // ***************
 
-    SelectorName cnsName1 = new SelectorName("cns1");
-    ConsumerNamedSelector cns1 = new ConsumerNamedSelectorBuilder().setName(cnsName1)
+    private SelectorName cnsName1 = new SelectorName("cns1");
+    private ConsumerNamedSelector cns1 = new ConsumerNamedSelectorBuilder().setName(cnsName1)
         .setContract(ImmutableList.of(contractId1))
         .setRequirement(ImmutableList.of(r2))
         .build();
 
-    ConsumerNamedSelector cns1_plus = new ConsumerNamedSelectorBuilder().setName(cnsName1)
+    private ConsumerNamedSelector cns1_plus = new ConsumerNamedSelectorBuilder().setName(cnsName1)
         .setContract(ImmutableList.of(contractId2))
         .setRequirement(ImmutableList.of(r3))
         .build();
 
-    ProviderNamedSelector pns1 = new ProviderNamedSelectorBuilder().setName(cnsName1)
+    private ProviderNamedSelector pns1 = new ProviderNamedSelectorBuilder().setName(cnsName1)
         .setContract(ImmutableList.of(contractId1))
         .setCapability(ImmutableList.of(c2))
         .build();
 
-    ProviderNamedSelector pns1_plus = new ProviderNamedSelectorBuilder().setName(cnsName1)
+    private ProviderNamedSelector pns1_plus = new ProviderNamedSelectorBuilder().setName(cnsName1)
         .setContract(ImmutableList.of(contractId2))
         .setCapability(ImmutableList.of(c3))
         .build();
 
-    QualityMatcher qm_q1_all = new QualityMatcherBuilder().setName(new QualityMatcherName("qm_q1_all"))
+    private QualityMatcher qm_q1_all = new QualityMatcherBuilder().setName(new QualityMatcherName("qm_q1_all"))
         .setMatcherQuality(ImmutableList.of(new MatcherQualityBuilder(q1).build()))
         .setMatchType(MatchType.All)
         .build();
-    QualityMatcher qm_q1_any = new QualityMatcherBuilder().setName(new QualityMatcherName("qm_q1_any"))
+    private QualityMatcher qm_q1_any = new QualityMatcherBuilder().setName(new QualityMatcherName("qm_q1_any"))
         .setMatcherQuality(ImmutableList.of(new MatcherQualityBuilder(q1).build()))
         .setMatchType(MatchType.Any)
         .build();
-    QualityMatcher qm_q2q3_any = new QualityMatcherBuilder().setName(new QualityMatcherName("qm_q2q3_any"))
+    private QualityMatcher qm_q2q3_any = new QualityMatcherBuilder().setName(new QualityMatcherName("qm_q2q3_any"))
         .setMatcherQuality(
                 ImmutableList.of(new MatcherQualityBuilder(q2).build(), new MatcherQualityBuilder(q3).build()))
         .setMatchType(MatchType.Any)
         .build();
 
-    QualityMatcher qm_q2tq2 =
+    private QualityMatcher qm_q2tq2 =
             new QualityMatcherBuilder().setName(new QualityMatcherName("qm_q2tq2"))
                 .setMatcherQuality(
                         ImmutableList.of(new MatcherQualityBuilder(q2).setTargetNamespace(q2TargetName).build()))
                 .setMatchType(MatchType.Any)
                 .build();
-    QualityMatcher qm_q2q3_plus =
+    private QualityMatcher qm_q2q3_plus =
             new QualityMatcherBuilder().setName(new QualityMatcherName("qm_q2q3_any"))
                 .setMatcherQuality(
                         ImmutableList.of(new MatcherQualityBuilder(q3).setTargetNamespace(q2TargetName).build(),
                                 new MatcherQualityBuilder(q2Exclude).build()))
                 .setMatchType(MatchType.All)
                 .build();
-    QualityMatcher qm_q1_plus = new QualityMatcherBuilder().setName(new QualityMatcherName("qm_q1_any")).build();
+    private QualityMatcher qm_q1_plus = new QualityMatcherBuilder().setName(new QualityMatcherName("qm_q1_any")).build();
 
-    SelectorName ctsName1 = new SelectorName("cts1");
-    ConsumerTargetSelector cts1 = new ConsumerTargetSelectorBuilder().setName(ctsName1)
+    private SelectorName ctsName1 = new SelectorName("cts1");
+    private ConsumerTargetSelector cts1 = new ConsumerTargetSelectorBuilder().setName(ctsName1)
         .setQualityMatcher(ImmutableList.of(qm_q1_all, qm_q1_any))
         .setRequirement(ImmutableList.of(r2))
         .build();
-    SelectorName ctsName2 = new SelectorName("cts2");
-    ConsumerTargetSelector cts2 = new ConsumerTargetSelectorBuilder().setName(ctsName2)
+    private SelectorName ctsName2 = new SelectorName("cts2");
+    private ConsumerTargetSelector cts2 = new ConsumerTargetSelectorBuilder().setName(ctsName2)
         .setQualityMatcher(ImmutableList.of(qm_q2q3_any))
         .setRequirement(ImmutableList.of(r1exclude, r3))
         .build();
-    ConsumerTargetSelector cts1_plus = new ConsumerTargetSelectorBuilder().setName(ctsName1)
+    private ConsumerTargetSelector cts1_plus = new ConsumerTargetSelectorBuilder().setName(ctsName1)
         .setQualityMatcher(ImmutableList.of(qm_q1_plus, qm_q2q3_any, qm_q1_plus))
         .setRequirement(ImmutableList.of(r3))
         .build();
-    ConsumerTargetSelector cts2_plus = new ConsumerTargetSelectorBuilder().setName(ctsName2)
+    private ConsumerTargetSelector cts2_plus = new ConsumerTargetSelectorBuilder().setName(ctsName2)
         .setQualityMatcher(ImmutableList.of(qm_q2tq2, qm_q2q3_plus))
         .setRequirement(ImmutableList.of(r3))
         .build();
 
-    SelectorName ptsName1 = new SelectorName("pts1");
-    ProviderTargetSelector pts1 = new ProviderTargetSelectorBuilder().setName(ptsName1)
+    private SelectorName ptsName1 = new SelectorName("pts1");
+    private ProviderTargetSelector pts1 = new ProviderTargetSelectorBuilder().setName(ptsName1)
         .setQualityMatcher(ImmutableList.of(qm_q1_all, qm_q1_any))
         .setCapability(ImmutableList.of(c2))
         .build();
-    SelectorName ptsName2 = new SelectorName("pts2");
-    ProviderTargetSelector pts2 = new ProviderTargetSelectorBuilder().setName(ptsName2)
+    private SelectorName ptsName2 = new SelectorName("pts2");
+    private ProviderTargetSelector pts2 = new ProviderTargetSelectorBuilder().setName(ptsName2)
         .setQualityMatcher(ImmutableList.of(qm_q2q3_any))
         .setCapability(ImmutableList.of(c1exclude, c3))
         .build();
-    ProviderTargetSelector pts1_plus = new ProviderTargetSelectorBuilder().setName(ptsName1)
+    private ProviderTargetSelector pts1_plus = new ProviderTargetSelectorBuilder().setName(ptsName1)
         .setQualityMatcher(ImmutableList.of(qm_q1_plus, qm_q2q3_any, qm_q1_plus))
         .setCapability(ImmutableList.of(c3))
         .build();
-    ProviderTargetSelector pts2_plus = new ProviderTargetSelectorBuilder().setName(ptsName2)
+    private ProviderTargetSelector pts2_plus = new ProviderTargetSelectorBuilder().setName(ptsName2)
         .setQualityMatcher(ImmutableList.of(qm_q2tq2, qm_q2q3_plus))
         .setCapability(ImmutableList.of(c3))
         .build();
 
-    EndpointGroupId egId1 = new EndpointGroupId("c0e5edfb-02d2-412b-8757-a77b3daeb5d4");
-    EndpointGroup eg1 = new EndpointGroupBuilder().setId(egId1)
+    private EndpointGroupId egId1 = new EndpointGroupId("c0e5edfb-02d2-412b-8757-a77b3daeb5d4");
+    private EndpointGroup eg1 = new EndpointGroupBuilder().setId(egId1)
         .setRequirement(ImmutableList.of(r1))
         .setCapability(ImmutableList.of(c1))
         .setConsumerTargetSelector(ImmutableList.of(cts1, cts2))
@@ -362,8 +362,8 @@ public class InheritanceUtilsTest {
         .setProviderTargetSelector(ImmutableList.of(pts1, pts2))
         .setProviderNamedSelector(ImmutableList.of(pns1))
         .build();
-    EndpointGroupId egId2 = new EndpointGroupId("60483327-ad76-43dd-b3bf-54ffb73ef4b8");
-    EndpointGroup eg2 = new EndpointGroupBuilder().setId(egId2)
+    private EndpointGroupId egId2 = new EndpointGroupId("60483327-ad76-43dd-b3bf-54ffb73ef4b8");
+    private EndpointGroup eg2 = new EndpointGroupBuilder().setId(egId2)
         .setParent(egId1)
         .setConsumerTargetSelector(ImmutableList.of(cts1_plus, cts2_plus))
         .setConsumerNamedSelector(ImmutableList.of(cns1_plus))
@@ -371,8 +371,8 @@ public class InheritanceUtilsTest {
         .setProviderNamedSelector(ImmutableList.of(pns1_plus))
         .build();
 
-    EndpointGroupId egloop2Id = new EndpointGroupId("cb5be574-9836-4053-8ec4-4b4a43331d65");
-    EndpointGroup egloop1 = new EndpointGroupBuilder()
+    private EndpointGroupId egloop2Id = new EndpointGroupId("cb5be574-9836-4053-8ec4-4b4a43331d65");
+    private EndpointGroup egloop1 = new EndpointGroupBuilder()
         .setId(new EndpointGroupId("a33fdd4d-f58b-4741-a69f-08aecab9af2e"))
         .setParent(egloop2Id)
         .setConsumerNamedSelector(ImmutableList.of(cns1))
@@ -380,10 +380,10 @@ public class InheritanceUtilsTest {
         .setConsumerTargetSelector(ImmutableList.of(cts1))
         .setProviderTargetSelector(ImmutableList.of(pts1))
         .build();
-    EndpointGroup egloop2 = new EndpointGroupBuilder().setId(egloop2Id).setParent(egloop1.getId()).build();
-    EndpointGroupId egselfloopid = new EndpointGroupId("996ad104-f852-4d77-96cf-cddde5cebb84");
-    EndpointGroup egselfloop = new EndpointGroupBuilder().setId(egselfloopid).setParent(egselfloopid).build();
-    EndpointGroup egorphan =
+    private EndpointGroup egloop2 = new EndpointGroupBuilder().setId(egloop2Id).setParent(egloop1.getId()).build();
+    private EndpointGroupId egselfloopid = new EndpointGroupId("996ad104-f852-4d77-96cf-cddde5cebb84");
+    private EndpointGroup egselfloop = new EndpointGroupBuilder().setId(egselfloopid).setParent(egselfloopid).build();
+    private EndpointGroup egorphan =
             new EndpointGroupBuilder().setId(new EndpointGroupId("feafeac9-ce1a-4b19-8455-8fcc9a4ff013"))
                 .setParent(new EndpointGroupId("aa9dfcf1-610c-42f9-8c3a-f67b43196821"))
                 .build();
@@ -392,14 +392,14 @@ public class InheritanceUtilsTest {
     // Tenants
     // *******
 
-    TenantId tenantId1 = new TenantId("0ac5d219-979c-4cca-8f90-83b69bc414ad");
-    Tenant tenant1 = new TenantBuilder().setId(tenantId1)
+    private TenantId tenantId1 = new TenantId("0ac5d219-979c-4cca-8f90-83b69bc414ad");
+    private Tenant tenant1 = new TenantBuilder().setId(tenantId1)
         .setPolicy(new PolicyBuilder().setEndpointGroup(ImmutableList.of(eg1, eg2))
             .setContract(ImmutableList.of(contract1, contract2, contract3))
             .build())
         .build();
 
-    Tenant malformed = new TenantBuilder().setId(new TenantId("b26e6b18-8e74-4062-a7d2-e8437132030d"))
+    private Tenant malformed = new TenantBuilder().setId(new TenantId("b26e6b18-8e74-4062-a7d2-e8437132030d"))
         .setPolicy(new PolicyBuilder().setContract(ImmutableList.of(cloop1, cloop2, cselfloop, corphan))
             .setEndpointGroup(ImmutableList.of(egloop1, egloop2, egselfloop, egorphan))
             .build())
@@ -409,7 +409,7 @@ public class InheritanceUtilsTest {
     // Other test state
     // ****************
 
-    public boolean containsQuality(List<? extends QualityBase> qualities, QualityBase quality) {
+    private boolean containsQuality(List<? extends QualityBase> qualities, QualityBase quality) {
         for (QualityBase q : qualities) {
             if (q.getName().equals(quality.getName()))
                 return true;
diff --git a/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/util/PolicyInfoUtilsTest.java b/groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/util/PolicyInfoUtilsTest.java
new file mode 100644 (file)
index 0000000..90567b1
--- /dev/null
@@ -0,0 +1,412 @@
+/*
+ * Copyright (c) 2015 Cisco 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.groupbasedpolicy.util;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.stream.Collectors;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Table;
+import org.junit.Test;
+import org.opendaylight.groupbasedpolicy.dto.EgKey;
+import org.opendaylight.groupbasedpolicy.dto.IndexedTenant;
+import org.opendaylight.groupbasedpolicy.dto.Policy;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ActionName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.CapabilityMatcherName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.CapabilityName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClauseName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ConditionMatcherName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ConditionName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContractId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.QualityMatcherName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.QualityName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.RequirementMatcherName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.RequirementName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.RuleName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SelectorName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubjectName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TargetName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.Label;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.Matcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.action.refs.ActionRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.action.refs.ActionRefBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.capabilities.Capability;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.capabilities.CapabilityBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.classifier.refs.ClassifierRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.classifier.refs.ClassifierRefBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.condition.matchers.ConditionMatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.condition.matchers.ConditionMatcherBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.conditions.Condition;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.conditions.ConditionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.qualities.Quality;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.qualities.QualityBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.requirements.Requirement;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.requirements.RequirementBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.target.selector.QualityMatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.target.selector.QualityMatcherBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.target.selector.quality.matcher.MatcherQualityBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.Tenant;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.TenantBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.PolicyBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.Contract;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.ContractBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.EndpointGroup;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.EndpointGroupBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.ExternalImplicitGroupBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.Clause;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.ClauseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.Subject;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.SubjectBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.Target;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.TargetBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.clause.ConsumerMatchersBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.clause.ProviderMatchersBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.clause.consumer.matchers.group.identification.constraints.GroupRequirementConstraintCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.clause.consumer.matchers.group.identification.constraints.group.requirement.constraint._case.RequirementMatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.clause.consumer.matchers.group.identification.constraints.group.requirement.constraint._case.RequirementMatcherBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.clause.consumer.matchers.group.identification.constraints.group.requirement.constraint._case.requirement.matcher.MatcherRequirementBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.clause.provider.matchers.group.identification.constraints.GroupCapabilityConstraintCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.clause.provider.matchers.group.identification.constraints.group.capability.constraint._case.CapabilityMatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.clause.provider.matchers.group.identification.constraints.group.capability.constraint._case.CapabilityMatcherBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.clause.provider.matchers.group.identification.constraints.group.capability.constraint._case.capability.matcher.MatcherCapabilityBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.subject.Rule;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.subject.RuleBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.endpoint.group.ConsumerNamedSelector;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.endpoint.group.ConsumerNamedSelectorBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.endpoint.group.ConsumerTargetSelector;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.endpoint.group.ConsumerTargetSelectorBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.endpoint.group.ProviderNamedSelector;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.endpoint.group.ProviderNamedSelectorBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.endpoint.group.ProviderTargetSelector;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.endpoint.group.ProviderTargetSelectorBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.resolved.rules.ResolvedRule;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.ResolvedPolicy;
+
+public class PolicyInfoUtilsTest {
+    // ******
+    // Labels
+    // ******
+
+    private Quality q1 = new QualityBuilder().setName(new QualityName("q1")).build();
+    private Quality q1Include = new QualityBuilder(q1).setInclusionRule(Label.InclusionRule.Include).build();
+    private Quality q1Exclude = new QualityBuilder(q1).setInclusionRule(Label.InclusionRule.Exclude).build();
+    private Quality q2 = new QualityBuilder().setName(new QualityName("q2")).build();
+    private Quality q2Exclude =
+            new QualityBuilder().setName(new QualityName("q2")).setInclusionRule(Label.InclusionRule.Exclude).build();
+    private Quality q3 = new QualityBuilder().setName(new QualityName("q3")).build();
+
+    private Requirement r1 = new RequirementBuilder().setName(new RequirementName("r1")).build();
+    private Requirement r2 = new RequirementBuilder().setName(new RequirementName("r2")).build();
+    private Requirement r1exclude = new RequirementBuilder().setName(new RequirementName("r1"))
+        .setInclusionRule(Label.InclusionRule.Exclude)
+        .build();
+    private Requirement r3 = new RequirementBuilder().setName(new RequirementName("r3")).build();
+
+    private Capability c1 = new CapabilityBuilder().setName(new CapabilityName("c1")).build();
+    private Capability c2 = new CapabilityBuilder().setName(new CapabilityName("c2")).build();
+    private Capability c1exclude = new CapabilityBuilder().setName(new CapabilityName("c1"))
+        .setInclusionRule(Label.InclusionRule.Exclude)
+        .build();
+    private Capability c3 = new CapabilityBuilder().setName(new CapabilityName("c3")).build();
+
+    private Condition cond1 = new ConditionBuilder().setName(new ConditionName("cond1")).build();
+    private Condition cond2 = new ConditionBuilder().setName(new ConditionName("cond2")).build();
+    private Condition cond3 = new ConditionBuilder().setName(new ConditionName("cond3")).build();
+    private Condition cond4 = new ConditionBuilder().setName(new ConditionName("cond4")).build();
+    private Condition cond2exlude = new ConditionBuilder().setName(new ConditionName("cond2"))
+        .setInclusionRule(Label.InclusionRule.Exclude)
+        .build();
+
+    // *********
+    // Contracts
+    // *********
+
+    private TargetName q2TargetName = new TargetName("q2");
+    private Target q2Target = new TargetBuilder().setName(q2TargetName).setQuality(ImmutableList.of(q2)).build();
+
+    private TargetName q1ExcludeTargetName = new TargetName("q1_exclude");
+    private Target q1ExcludeTarget =
+            new TargetBuilder().setName(q1ExcludeTargetName).setQuality(ImmutableList.of(q1Exclude, q2)).build();
+
+    private TargetName q1IncludeTargetName = new TargetName("q1_include");
+    private Target q1IncludeTarget =
+            new TargetBuilder().setName(q1IncludeTargetName).setQuality(ImmutableList.of(q1Include)).build();
+
+    private Target q2PlusTarget = new TargetBuilder().setName(q2TargetName).setQuality(ImmutableList.of(q3)).build();
+
+    private SubjectName subject1 = new SubjectName("subject1");
+    private SubjectName subject2 = new SubjectName("subject2");
+    private SubjectName subject3 = new SubjectName("subject3");
+
+    private RequirementMatcher rm_r1 = new RequirementMatcherBuilder().setName(new RequirementMatcherName("rm_r1"))
+        .setMatcherRequirement(ImmutableList.of(new MatcherRequirementBuilder(r1).build()))
+        .build();
+    private RequirementMatcher rm_r1_plus = new RequirementMatcherBuilder().setName(new RequirementMatcherName("rm_r1"))
+        .setMatchType(Matcher.MatchType.All)
+        .setMatcherRequirement(ImmutableList.of(new MatcherRequirementBuilder(r2).build()))
+        .build();
+
+    private CapabilityMatcher capm_c1 = new CapabilityMatcherBuilder().setName(new CapabilityMatcherName("capm_c1"))
+        .setMatcherCapability(ImmutableList.of(new MatcherCapabilityBuilder(c1).build()))
+        .build();
+
+    private ConditionMatcher cm_c1 = new ConditionMatcherBuilder().setName(new ConditionMatcherName("cm_c1"))
+        .setCondition(ImmutableList.of(cond1))
+        .build();
+    private ConditionMatcher cm_c2 = new ConditionMatcherBuilder().setName(new ConditionMatcherName("cm_c2"))
+        .setMatchType(Matcher.MatchType.All)
+        .setCondition(ImmutableList.of(cond2))
+        .build();
+    private ConditionMatcher cm_c3 = new ConditionMatcherBuilder().setName(new ConditionMatcherName("cm_c3"))
+        .setMatchType(Matcher.MatchType.None)
+        .setCondition(ImmutableList.of(cond3))
+        .build();
+    private ConditionMatcher cm_c4 = new ConditionMatcherBuilder().setName(new ConditionMatcherName("cm_c4"))
+        .setMatchType(Matcher.MatchType.Any)
+        .setCondition(ImmutableList.of(cond4))
+        .build();
+    private ConditionMatcher cm_c2_plus = new ConditionMatcherBuilder().setName(new ConditionMatcherName("cm_c2"))
+        .setCondition(ImmutableList.of(cond2exlude))
+        .build();
+
+    private ClauseName clauseName1 = new ClauseName("clauseName1");
+    private Clause clause1 =
+            new ClauseBuilder().setName(clauseName1)
+                .setSubjectRefs(ImmutableList.of(subject1))
+                .setProviderMatchers(new ProviderMatchersBuilder()
+                    .setGroupIdentificationConstraints(new GroupCapabilityConstraintCaseBuilder()
+                        .setCapabilityMatcher(ImmutableList.of(capm_c1)).build())
+                    .setConditionMatcher(ImmutableList.of(cm_c1))
+                    .build())
+                .setConsumerMatchers(new ConsumerMatchersBuilder()
+                    .setGroupIdentificationConstraints(new GroupRequirementConstraintCaseBuilder()
+                        .setRequirementMatcher(ImmutableList.of(rm_r1)).build())
+                    .setConditionMatcher(ImmutableList.of(cm_c2, cm_c3, cm_c4))
+                    .build())
+                .build();
+
+    private Clause clause1withConsMatcher = new ClauseBuilder().setName(clauseName1)
+        .setSubjectRefs(ImmutableList.of(subject2))
+        .setConsumerMatchers(new ConsumerMatchersBuilder()
+            .setGroupIdentificationConstraints(new GroupRequirementConstraintCaseBuilder()
+                .setRequirementMatcher(ImmutableList.of(rm_r1_plus)).build())
+            .setConditionMatcher(ImmutableList.of(cm_c2_plus))
+            .build())
+        .build();
+
+    private Clause clause1withProvMatcher =
+            new ClauseBuilder().setName(clauseName1)
+                .setSubjectRefs(ImmutableList.of(subject3))
+                .setProviderMatchers(new ProviderMatchersBuilder()
+                    .setGroupIdentificationConstraints(new GroupCapabilityConstraintCaseBuilder()
+                        .setCapabilityMatcher(ImmutableList.of(capm_c1)).build())
+                    .setConditionMatcher(ImmutableList.of(cm_c2_plus))
+                    .build())
+                .build();
+
+    private ActionRef a1 = new ActionRefBuilder().setName(new ActionName("a1")).build();
+    private ClassifierRef cr1 = new ClassifierRefBuilder().setName(new ClassifierName("cr1")).build();
+    private Rule rule1 = new RuleBuilder().setName(new RuleName("r1"))
+        .setActionRef(ImmutableList.of(a1))
+        .setClassifierRef(ImmutableList.of(cr1))
+        .build();
+    private Rule rule2 = new RuleBuilder().setName(new RuleName("r2")).setOrder(5).build();
+    private Rule rule3 = new RuleBuilder().setName(new RuleName("r3")).setOrder(7).build();
+    private Rule rule4 = new RuleBuilder().setName(new RuleName("r4")).setOrder(1).build();
+
+    private Subject s1 =
+            new SubjectBuilder().setName(new SubjectName("s1")).setRule(ImmutableList.of(rule1, rule2)).build();
+    private Subject s1_plus =
+            new SubjectBuilder().setName(s1.getName()).setRule(ImmutableList.of(rule3, rule4)).setOrder(4).build();
+    private Subject s2 = new SubjectBuilder().setName(new SubjectName("s2")).setOrder(5).build();
+    private Subject s2_plus = new SubjectBuilder().setName(new SubjectName(s2.getName())).setOrder(6).build();
+
+    private ContractId contractId1 = new ContractId("e7e6804f-7fcb-46cf-9bc6-abfec0896d95");
+    private Contract contract1 = new ContractBuilder().setId(contractId1)
+        .setQuality(ImmutableList.of(q1))
+        .setTarget(ImmutableList.of(q2Target, q1IncludeTarget, q1ExcludeTarget))
+        .setClause(ImmutableList.of(clause1))
+        .setSubject(ImmutableList.of(s1))
+        .build();
+
+    private ContractId contractId2 = new ContractId("3f56ae44-d1e4-4617-95af-c809dfc50149");
+    private Contract contract2 = new ContractBuilder().setId(contractId2)
+        .setParent(contractId1)
+        .setTarget(ImmutableList.of(q2PlusTarget, q1IncludeTarget))
+        .setClause(ImmutableList.of(clause1withConsMatcher))
+        .setSubject(ImmutableList.of(s1_plus, s2))
+        .build();
+
+    private ContractId contractId3 = new ContractId("38d52ec1-301b-453a-88a6-3ffa777d7795");
+    private Contract contract3 = new ContractBuilder().setId(contractId3)
+        .setParent(contractId1)
+        .setTarget(ImmutableList.of(q2PlusTarget, q1IncludeTarget))
+        .setClause(ImmutableList.of(clause1withProvMatcher))
+        .setSubject(ImmutableList.of(s2_plus, s2))
+        .build();
+
+    // ***************
+    // Endpoint Groups
+    // ***************
+
+    private SelectorName cnsName1 = new SelectorName("cns1");
+    private ConsumerNamedSelector cns1 = new ConsumerNamedSelectorBuilder().setName(cnsName1)
+        .setContract(ImmutableList.of(contractId1))
+        .setRequirement(ImmutableList.of(r2))
+        .build();
+
+    private ConsumerNamedSelector cns1_plus = new ConsumerNamedSelectorBuilder().setName(cnsName1)
+        .setContract(ImmutableList.of(contractId2))
+        .setRequirement(ImmutableList.of(r3))
+        .build();
+
+    private ProviderNamedSelector pns1 = new ProviderNamedSelectorBuilder().setName(cnsName1)
+        .setContract(ImmutableList.of(contractId1))
+        .setCapability(ImmutableList.of(c2))
+        .build();
+
+    private ProviderNamedSelector pns1_plus = new ProviderNamedSelectorBuilder().setName(cnsName1)
+        .setContract(ImmutableList.of(contractId2))
+        .setCapability(ImmutableList.of(c3))
+        .build();
+
+    private QualityMatcher qm_q1_all = new QualityMatcherBuilder().setName(new QualityMatcherName("qm_q1_all"))
+        .setMatcherQuality(ImmutableList.of(new MatcherQualityBuilder(q1).build()))
+        .setMatchType(Matcher.MatchType.All)
+        .build();
+    private QualityMatcher qm_q1_any = new QualityMatcherBuilder().setName(new QualityMatcherName("qm_q1_any"))
+        .setMatcherQuality(ImmutableList.of(new MatcherQualityBuilder(q1).build()))
+        .setMatchType(Matcher.MatchType.Any)
+        .build();
+    private QualityMatcher qm_q2q3_any = new QualityMatcherBuilder().setName(new QualityMatcherName("qm_q2q3_any"))
+        .setMatcherQuality(
+                ImmutableList.of(new MatcherQualityBuilder(q2).build(), new MatcherQualityBuilder(q3).build()))
+        .setMatchType(Matcher.MatchType.Any)
+        .build();
+
+    private QualityMatcher qm_q2tq2 =
+            new QualityMatcherBuilder().setName(new QualityMatcherName("qm_q2tq2"))
+                .setMatcherQuality(
+                        ImmutableList.of(new MatcherQualityBuilder(q2).setTargetNamespace(q2TargetName).build()))
+                .setMatchType(Matcher.MatchType.Any)
+                .build();
+    private QualityMatcher qm_q2q3_plus = new QualityMatcherBuilder().setName(new QualityMatcherName("qm_q2q3_any"))
+        .setMatcherQuality(ImmutableList.of(new MatcherQualityBuilder(q3).setTargetNamespace(q2TargetName).build(),
+                new MatcherQualityBuilder(q2Exclude).build()))
+        .setMatchType(Matcher.MatchType.All)
+        .build();
+    private QualityMatcher qm_q1_plus =
+            new QualityMatcherBuilder().setName(new QualityMatcherName("qm_q1_any")).build();
+
+    private SelectorName ctsName1 = new SelectorName("cts1");
+    private ConsumerTargetSelector cts1 = new ConsumerTargetSelectorBuilder().setName(ctsName1)
+        .setQualityMatcher(ImmutableList.of(qm_q1_all, qm_q1_any))
+        .setRequirement(ImmutableList.of(r2))
+        .build();
+    private SelectorName ctsName2 = new SelectorName("cts2");
+    private ConsumerTargetSelector cts2 = new ConsumerTargetSelectorBuilder().setName(ctsName2)
+        .setQualityMatcher(ImmutableList.of(qm_q2q3_any))
+        .setRequirement(ImmutableList.of(r1exclude, r3))
+        .build();
+    private ConsumerTargetSelector cts1_plus = new ConsumerTargetSelectorBuilder().setName(ctsName1)
+        .setQualityMatcher(ImmutableList.of(qm_q1_plus, qm_q2q3_any, qm_q1_plus))
+        .setRequirement(ImmutableList.of(r3))
+        .build();
+    private ConsumerTargetSelector cts2_plus = new ConsumerTargetSelectorBuilder().setName(ctsName2)
+        .setQualityMatcher(ImmutableList.of(qm_q2tq2, qm_q2q3_plus))
+        .setRequirement(ImmutableList.of(r3))
+        .build();
+
+    private SelectorName ptsName1 = new SelectorName("pts1");
+    private ProviderTargetSelector pts1 = new ProviderTargetSelectorBuilder().setName(ptsName1)
+        .setQualityMatcher(ImmutableList.of(qm_q1_all, qm_q1_any))
+        .setCapability(ImmutableList.of(c2))
+        .build();
+    private SelectorName ptsName2 = new SelectorName("pts2");
+    private ProviderTargetSelector pts2 = new ProviderTargetSelectorBuilder().setName(ptsName2)
+        .setQualityMatcher(ImmutableList.of(qm_q2q3_any))
+        .setCapability(ImmutableList.of(c1exclude, c3))
+        .build();
+    private ProviderTargetSelector pts1_plus = new ProviderTargetSelectorBuilder().setName(ptsName1)
+        .setQualityMatcher(ImmutableList.of(qm_q1_plus, qm_q2q3_any, qm_q1_plus))
+        .setCapability(ImmutableList.of(c3))
+        .build();
+    private ProviderTargetSelector pts2_plus = new ProviderTargetSelectorBuilder().setName(ptsName2)
+        .setQualityMatcher(ImmutableList.of(qm_q2tq2, qm_q2q3_plus))
+        .setCapability(ImmutableList.of(c3))
+        .build();
+
+    private EndpointGroupId egId1 = new EndpointGroupId("c0e5edfb-02d2-412b-8757-a77b3daeb5d4");
+    private EndpointGroup eg1 = new EndpointGroupBuilder().setId(egId1)
+        .setRequirement(ImmutableList.of(r1))
+        .setCapability(ImmutableList.of(c1))
+        .setConsumerTargetSelector(ImmutableList.of(cts1, cts2))
+        .setConsumerNamedSelector(ImmutableList.of(cns1))
+        .setProviderTargetSelector(ImmutableList.of(pts1, pts2))
+        .setProviderNamedSelector(ImmutableList.of(pns1))
+        .build();
+    private EndpointGroupId egId2 = new EndpointGroupId("60483327-ad76-43dd-b3bf-54ffb73ef4b8");
+    private EndpointGroup eg2 = new EndpointGroupBuilder().setId(egId2)
+        .setParent(egId1)
+        .setConsumerTargetSelector(ImmutableList.of(cts1_plus, cts2_plus))
+        .setConsumerNamedSelector(ImmutableList.of(cns1_plus))
+        .setProviderTargetSelector(ImmutableList.of(pts1_plus, pts2_plus))
+        .setProviderNamedSelector(ImmutableList.of(pns1_plus))
+        .build();
+
+    // *******
+    // Tenants
+    // *******
+
+    private TenantId tenantId1 = new TenantId("0ac5d219-979c-4cca-8f90-83b69bc414ad");
+    private Tenant tenant1 = new TenantBuilder().setId(tenantId1)
+        .setPolicy(new PolicyBuilder().setEndpointGroup(ImmutableList.of(eg1, eg2))
+            .setContract(ImmutableList.of(contract1, contract2, contract3))
+            .build())
+        .build();
+
+    private Tenant tenant1_with_eig = new TenantBuilder().setId(tenantId1)
+        .setPolicy(new PolicyBuilder().setEndpointGroup(ImmutableList.of(eg1, eg2))
+            .setContract(ImmutableList.of(contract1, contract2, contract3))
+            .setExternalImplicitGroup(ImmutableList.of(new ExternalImplicitGroupBuilder().setId(egId1).build()))
+            .build())
+        .build();
+
+    @Test
+    public void testBuildResolvedPolicy() {
+        IndexedTenant indexedTenant = new IndexedTenant(tenant1_with_eig);
+        ConcurrentMap<TenantId, IndexedTenant> resolvedTenants = new ConcurrentHashMap<>();
+        resolvedTenants.put(indexedTenant.getTenant().getId(), indexedTenant);
+        Set<IndexedTenant> indexedTenants =
+                resolvedTenants.values().stream().filter(t -> t != null).collect(Collectors.toSet());
+        Table<EgKey, EgKey, Policy> policyMap = PolicyResolverUtils.resolvePolicy(indexedTenants);
+
+        List<ResolvedPolicy> resolvedPolicies = PolicyInfoUtils.buildResolvedPolicy(policyMap, resolvedTenants);
+        assertEquals(4, resolvedPolicies.size());
+    }
+
+    @Test
+    public void testBuildResolvedRules() {
+        List<ResolvedRule> res = PolicyInfoUtils.buildResolvedRules(ImmutableList.of(rule1), tenant1);
+
+        assertNotNull(res);
+        assertEquals(1, res.size());
+        assertEquals(rule1.getName(), res.get(0).getName());
+    }
+
+}