Onward!
[groupbasedpolicy.git] / groupbasedpolicy / src / test / java / org / opendaylight / groupbasedpolicy / resolver / InheritanceUtilsTest.java
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.groupbasedpolicy.resolver;
10
11 import java.util.HashSet;
12 import java.util.List;
13
14 import org.junit.Test;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ActionName;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.CapabilityMatcherName;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.CapabilityName;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierName;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClauseName;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ConditionMatcherName;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ConditionName;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContractId;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.QualityMatcherName;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.QualityName;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.RequirementMatcherName;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.RequirementName;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.RuleName;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SelectorName;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubjectName;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TargetName;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.CapabilityBase;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.Label.InclusionRule;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.Matcher.MatchType;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.QualityBase;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.RequirementBase;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.action.refs.ActionRef;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.action.refs.ActionRefBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.capabilities.Capability;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.capabilities.CapabilityBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.classifier.refs.ClassifierRef;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.classifier.refs.ClassifierRefBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.condition.matchers.ConditionMatcher;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.condition.matchers.ConditionMatcherBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.conditions.Condition;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.conditions.ConditionBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.qualities.Quality;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.qualities.QualityBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.requirements.Requirement;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.requirements.RequirementBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.target.selector.QualityMatcher;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.target.selector.QualityMatcherBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.target.selector.quality.matcher.MatcherQuality;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.target.selector.quality.matcher.MatcherQualityBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.Tenant;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.TenantBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.Contract;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.ContractBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.EndpointGroup;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.EndpointGroupBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.Clause;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.ClauseBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.Subject;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.SubjectBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.Target;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.TargetBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.ConsumerMatchersBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.ProviderMatchersBuilder;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.RequirementMatcher;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.RequirementMatcherBuilder;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.requirement.matcher.MatcherRequirementBuilder;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.CapabilityMatcher;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.CapabilityMatcherBuilder;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.capability.matcher.MatcherCapabilityBuilder;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.subject.Rule;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.subject.RuleBuilder;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerNamedSelector;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerNamedSelectorBuilder;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerTargetSelector;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerTargetSelectorBuilder;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ProviderNamedSelector;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ProviderNamedSelectorBuilder;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ProviderTargetSelector;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ProviderTargetSelectorBuilder;
86
87 import com.google.common.collect.ImmutableList;
88 import com.google.common.collect.ImmutableSet;
89
90 import static org.junit.Assert.*;
91
92 public class InheritanceUtilsTest {
93     // ******
94     // Labels
95     // ******
96     
97     Quality q1 = new QualityBuilder()
98         .setName(new QualityName("q1"))
99         .build();
100     Quality q1Include = new QualityBuilder(q1)
101         .setInclusionRule(InclusionRule.Include)
102         .build();
103     Quality q1Exclude = new QualityBuilder(q1)
104         .setInclusionRule(InclusionRule.Exclude)
105         .build();
106     Quality q2 = new QualityBuilder()
107         .setName(new QualityName("q2"))
108         .build();
109     Quality q2Exclude = new QualityBuilder()
110         .setName(new QualityName("q2"))
111         .setInclusionRule(InclusionRule.Exclude)
112         .build();
113     Quality q3 = new QualityBuilder()
114         .setName(new QualityName("q3"))
115         .build();
116
117     Requirement r1 = new RequirementBuilder()
118         .setName(new RequirementName("r1"))
119         .build();
120     Requirement r2 = new RequirementBuilder()
121         .setName(new RequirementName("r2"))
122         .build();
123     Requirement r1exclude = new RequirementBuilder()
124         .setName(new RequirementName("r1"))
125         .setInclusionRule(InclusionRule.Exclude)
126         .build();
127     Requirement r3 = new RequirementBuilder()
128         .setName(new RequirementName("r3"))
129         .build();
130
131     Capability c1 = new CapabilityBuilder()
132         .setName(new CapabilityName("c1"))
133         .build();
134     Capability c2 = new CapabilityBuilder()
135         .setName(new CapabilityName("c2"))
136         .build();
137     Capability c1exclude = new CapabilityBuilder()
138         .setName(new CapabilityName("c1"))
139         .setInclusionRule(InclusionRule.Exclude)
140         .build();
141     Capability c3 = new CapabilityBuilder()
142         .setName(new CapabilityName("c3"))
143         .build();
144     
145     Condition cond1 = new ConditionBuilder()
146         .setName(new ConditionName("cond1"))
147         .build();
148     Condition cond2 = new ConditionBuilder()
149         .setName(new ConditionName("cond2"))
150         .build();
151     Condition cond2exlude = new ConditionBuilder()
152         .setName(new ConditionName("cond2"))
153         .setInclusionRule(InclusionRule.Exclude)
154         .build();
155
156     // *********
157     // Contracts
158     // *********
159
160     TargetName q2TargetName = new TargetName("q2");
161     Target q2Target = new TargetBuilder()
162         .setName(q2TargetName)
163         .setQuality(ImmutableList.of(q2))
164         .build();
165     
166     TargetName q1ExcludeTargetName = new TargetName("q1_exclude");
167     Target q1ExcludeTarget = new TargetBuilder()
168         .setName(q1ExcludeTargetName)
169         .setQuality(ImmutableList.of(q1Exclude, q2))
170         .build();
171     
172     TargetName q1IncludeTargetName = new TargetName("q1_include");
173     Target q1IncludeTarget = new TargetBuilder()
174         .setName(q1IncludeTargetName)
175         .setQuality(ImmutableList.of(q1Include))
176         .build();
177
178     Target q2PlusTarget = new TargetBuilder()
179         .setName(q2TargetName)
180         .setQuality(ImmutableList.of(q3))
181         .build();
182
183     SubjectName subject1 = new SubjectName("subject1");
184     SubjectName subject2 = new SubjectName("subject2");
185     
186     RequirementMatcher rm_r1 = new RequirementMatcherBuilder()
187         .setName(new RequirementMatcherName("rm_r1"))
188         .setMatcherRequirement(ImmutableList.of(new MatcherRequirementBuilder(r1)
189                                                     .build()))
190         .build();
191     RequirementMatcher rm_r1_plus = new RequirementMatcherBuilder()
192         .setName(new RequirementMatcherName("rm_r1"))
193         .setMatchType(MatchType.All)
194         .setMatcherRequirement(ImmutableList.of(new MatcherRequirementBuilder(r2)
195                                                     .build()))
196         .build();
197
198     CapabilityMatcher capm_c1 = new CapabilityMatcherBuilder()
199         .setName(new CapabilityMatcherName("capm_c1"))
200         .setMatcherCapability(ImmutableList.of(new MatcherCapabilityBuilder(c1)
201                                                 .build()))
202         .build();
203
204     ConditionMatcher cm_c1 = new ConditionMatcherBuilder()
205         .setName(new ConditionMatcherName("cm_c1"))
206         .setCondition(ImmutableList.of(cond1))
207         .build();
208     ConditionMatcher cm_c2 = new ConditionMatcherBuilder()
209         .setName(new ConditionMatcherName("cm_c2"))
210         .setMatchType(MatchType.All)
211         .setCondition(ImmutableList.of(cond2))
212         .build();
213     ConditionMatcher cm_c2_plus = new ConditionMatcherBuilder()
214         .setName(new ConditionMatcherName("cm_c2"))
215         .setCondition(ImmutableList.of(cond2exlude))
216         .build();
217     
218     ClauseName clauseName1 = new ClauseName("clauseName1");
219     Clause clause1 = new ClauseBuilder()
220         .setName(clauseName1)
221         .setSubjectRefs(ImmutableList.of(subject1))
222         .setProviderMatchers(new ProviderMatchersBuilder()
223             .setCapabilityMatcher(ImmutableList.of(capm_c1))
224             .setConditionMatcher(ImmutableList.of(cm_c1))
225             .build())
226         .setConsumerMatchers(new ConsumerMatchersBuilder()
227             .setRequirementMatcher(ImmutableList.of(rm_r1))
228             .setConditionMatcher(ImmutableList.of(cm_c2))
229             .build())
230         .build();
231
232     Clause clause1plus = new ClauseBuilder()
233         .setName(clauseName1)
234         .setSubjectRefs(ImmutableList.of(subject2))
235         .setConsumerMatchers(new ConsumerMatchersBuilder()
236             .setRequirementMatcher(ImmutableList.of(rm_r1_plus))
237             .setConditionMatcher(ImmutableList.of(cm_c2_plus))
238             .build())
239         .build();
240
241     ActionRef a1 = new ActionRefBuilder()
242         .setName(new ActionName("a1"))
243         .build();
244     ClassifierRef cr1 = new ClassifierRefBuilder()
245         .setName(new ClassifierName("cr1"))
246         .build();
247     Rule rule1 = new RuleBuilder()
248         .setName(new RuleName("r1"))
249         .setActionRef(ImmutableList.of(a1))
250         .setClassifierRef(ImmutableList.of(cr1))
251         .build();
252     Rule rule2 = new RuleBuilder()
253         .setName(new RuleName("r2"))
254         .setOrder(5)
255         .build();
256     Rule rule3 = new RuleBuilder()
257         .setName(new RuleName("r3"))
258         .setOrder(7)
259         .build();
260     Rule rule4 = new RuleBuilder()
261         .setName(new RuleName("r4"))
262         .setOrder(1)
263         .build();
264
265     Subject s1 = new SubjectBuilder()
266         .setName(new SubjectName("s1"))
267         .setRule(ImmutableList.of(rule1, rule2))
268         .build();
269     Subject s1_plus = new SubjectBuilder()
270         .setName(s1.getName())
271         .setRule(ImmutableList.of(rule3, rule4))
272         .setOrder(4)
273         .build();
274     Subject s2 = new SubjectBuilder()
275         .setName(new SubjectName("s2"))
276         .setOrder(5)
277         .build();
278
279     ContractId contractId1 = 
280             new ContractId("e7e6804f-7fcb-46cf-9bc6-abfec0896d95");
281     Contract contract1 = new ContractBuilder()
282         .setId(contractId1)
283         .setQuality(ImmutableList.of(q1))
284         .setTarget(ImmutableList.of(q2Target, 
285                                     q1IncludeTarget, 
286                                     q1ExcludeTarget))
287         .setClause(ImmutableList.of(clause1))
288         .setSubject(ImmutableList.of(s1))
289         .build();
290
291     ContractId contractId2 = 
292             new ContractId("3f56ae44-d1e4-4617-95af-c809dfc50149");
293     Contract contract2 = new ContractBuilder()
294         .setId(contractId2)
295         .setParent(contractId1)
296         .setTarget(ImmutableList.of(q2PlusTarget, q1IncludeTarget))
297         .setClause(ImmutableList.of(clause1plus))
298         .setSubject(ImmutableList.of(s1_plus, s2))
299         .build();
300
301     ContractId cloop2Id = new ContractId("89700928-7316-4216-a853-a7ea3934b8f4");
302     Contract cloop1 = new ContractBuilder()
303         .setId(new ContractId("56bbce36-e60b-473d-92de-bb63b5a6dbb5"))
304         .setParent(cloop2Id)
305         .setClause(ImmutableList.of(clause1))
306         .setSubject(ImmutableList.of(s1, s2))
307         .build();
308     Contract cloop2 = new ContractBuilder()
309         .setId(cloop2Id)
310         .setParent(cloop1.getId())
311         .build();
312     ContractId cselfloopid = 
313             new ContractId("63edead2-d6f1-4acf-9f78-831595d194ee");
314     Contract cselfloop = new ContractBuilder()
315         .setId(cselfloopid)
316         .setParent(cselfloopid)
317         .build();
318     Contract corphan = new ContractBuilder()
319         .setId(new ContractId("f72c15f3-76ab-4c7e-a817-eb5f6efcb654"))
320         .setParent(new ContractId("eca4d0d5-8c62-4f46-ad42-71c1f4d3da12"))
321         .build();
322     
323     // ***************
324     // Endpoint Groups
325     // ***************
326     
327     SelectorName cnsName1 = new SelectorName("cns1");
328     ConsumerNamedSelector cns1 = new ConsumerNamedSelectorBuilder()
329         .setName(cnsName1)
330         .setContract(ImmutableList.of(contractId1))
331         .setRequirement(ImmutableList.of(r2))
332         .build();
333
334     ConsumerNamedSelector cns1_plus = new ConsumerNamedSelectorBuilder()
335         .setName(cnsName1)
336         .setContract(ImmutableList.of(contractId2))
337         .setRequirement(ImmutableList.of(r3))
338         .build();
339     
340     ProviderNamedSelector pns1 = new ProviderNamedSelectorBuilder()
341         .setName(cnsName1)
342         .setContract(ImmutableList.of(contractId1))
343         .setCapability(ImmutableList.of(c2))
344         .build();
345
346     ProviderNamedSelector pns1_plus = new ProviderNamedSelectorBuilder()
347         .setName(cnsName1)
348         .setContract(ImmutableList.of(contractId2))
349         .setCapability(ImmutableList.of(c3))
350         .build();
351     
352     QualityMatcher qm_q1_all = new QualityMatcherBuilder()
353         .setName(new QualityMatcherName("qm_q1_all"))
354         .setMatcherQuality(ImmutableList.of(new MatcherQualityBuilder(q1)
355                                                 .build()))
356         .setMatchType(MatchType.All)
357         .build();
358     QualityMatcher qm_q1_any = new QualityMatcherBuilder()
359         .setName(new QualityMatcherName("qm_q1_any"))
360         .setMatcherQuality(ImmutableList.of(new MatcherQualityBuilder(q1)
361                                             .build()))
362         .setMatchType(MatchType.Any)
363         .build();
364     QualityMatcher qm_q2q3_any = new QualityMatcherBuilder()
365         .setName(new QualityMatcherName("qm_q2q3_any"))
366         .setMatcherQuality(ImmutableList.of(new MatcherQualityBuilder(q2)
367                                                 .build(),
368                                               new MatcherQualityBuilder(q3)
369                                                 .build()))
370         .setMatchType(MatchType.Any)
371         .build();
372
373     QualityMatcher qm_q2tq2 = new QualityMatcherBuilder()
374         .setName(new QualityMatcherName("qm_q2tq2"))
375         .setMatcherQuality(ImmutableList.of(new MatcherQualityBuilder(q2)
376                                                 .setTargetNamespace(q2TargetName)
377                                                 .build()))
378         .setMatchType(MatchType.Any)
379         .build();
380     QualityMatcher qm_q2q3_plus = new QualityMatcherBuilder()
381         .setName(new QualityMatcherName("qm_q2q3_any"))
382         .setMatcherQuality(ImmutableList.of(new MatcherQualityBuilder(q3)
383                                                 .setTargetNamespace(q2TargetName)
384                                                 .build(),
385                                               new MatcherQualityBuilder(q2Exclude)
386                                                 .build()))
387         .setMatchType(MatchType.All)
388         .build();
389     QualityMatcher qm_q1_plus = new QualityMatcherBuilder()
390         .setName(new QualityMatcherName("qm_q1_any"))
391         .build();
392     
393     SelectorName ctsName1 = new SelectorName("cts1");
394     ConsumerTargetSelector cts1 = new ConsumerTargetSelectorBuilder()
395         .setName(ctsName1)
396         .setQualityMatcher(ImmutableList.of(qm_q1_all, qm_q1_any))
397         .setRequirement(ImmutableList.of(r2))
398         .build();
399     SelectorName ctsName2 = new SelectorName("cts2");
400     ConsumerTargetSelector cts2 = new ConsumerTargetSelectorBuilder()
401         .setName(ctsName2)
402         .setQualityMatcher(ImmutableList.of(qm_q2q3_any))
403         .setRequirement(ImmutableList.of(r1exclude, r3))
404         .build();
405     ConsumerTargetSelector cts1_plus = new ConsumerTargetSelectorBuilder()
406         .setName(ctsName1)
407         .setQualityMatcher(ImmutableList.of(qm_q1_plus,
408                                               qm_q2q3_any, 
409                                               qm_q1_plus))
410         .setRequirement(ImmutableList.of(r3))
411         .build();
412     ConsumerTargetSelector cts2_plus = new ConsumerTargetSelectorBuilder()
413         .setName(ctsName2)
414         .setQualityMatcher(ImmutableList.of(qm_q2tq2, 
415                                               qm_q2q3_plus))
416         .setRequirement(ImmutableList.of(r3))
417         .build();
418     
419     SelectorName ptsName1 = new SelectorName("pts1");
420     ProviderTargetSelector pts1 = new ProviderTargetSelectorBuilder()
421         .setName(ptsName1)
422         .setQualityMatcher(ImmutableList.of(qm_q1_all, qm_q1_any))
423         .setCapability(ImmutableList.of(c2))
424         .build();
425     SelectorName ptsName2 = new SelectorName("pts2");
426     ProviderTargetSelector pts2 = new ProviderTargetSelectorBuilder()
427         .setName(ptsName2)
428         .setQualityMatcher(ImmutableList.of(qm_q2q3_any))
429         .setCapability(ImmutableList.of(c1exclude, c3))
430         .build();
431     ProviderTargetSelector pts1_plus = new ProviderTargetSelectorBuilder()
432         .setName(ptsName1)
433         .setQualityMatcher(ImmutableList.of(qm_q1_plus,
434                                               qm_q2q3_any, 
435                                               qm_q1_plus))
436         .setCapability(ImmutableList.of(c3))
437         .build();
438     ProviderTargetSelector pts2_plus = new ProviderTargetSelectorBuilder()
439         .setName(ptsName2)
440         .setQualityMatcher(ImmutableList.of(qm_q2tq2, 
441                                               qm_q2q3_plus))
442         .setCapability(ImmutableList.of(c3))
443         .build();
444     
445     EndpointGroupId egId1 = 
446             new EndpointGroupId("c0e5edfb-02d2-412b-8757-a77b3daeb5d4");
447     EndpointGroup eg1 = new EndpointGroupBuilder()
448         .setId(egId1)
449         .setRequirement(ImmutableList.of(r1))
450         .setCapability(ImmutableList.of(c1))
451         .setConsumerTargetSelector(ImmutableList.of(cts1, cts2))
452         .setConsumerNamedSelector(ImmutableList.of(cns1))
453         .setProviderTargetSelector(ImmutableList.of(pts1, pts2))
454         .setProviderNamedSelector(ImmutableList.of(pns1))
455         .build();
456     EndpointGroupId egId2 = 
457             new EndpointGroupId("60483327-ad76-43dd-b3bf-54ffb73ef4b8"); 
458     EndpointGroup eg2 = new EndpointGroupBuilder()
459         .setId(egId2)
460         .setParent(egId1)
461         .setConsumerTargetSelector(ImmutableList.of(cts1_plus, cts2_plus))
462         .setConsumerNamedSelector(ImmutableList.of(cns1_plus))
463         .setProviderTargetSelector(ImmutableList.of(pts1_plus, pts2_plus))
464         .setProviderNamedSelector(ImmutableList.of(pns1_plus))
465         .build();
466
467     EndpointGroupId egloop2Id = 
468             new EndpointGroupId("cb5be574-9836-4053-8ec4-4b4a43331d65");
469     EndpointGroup egloop1 = new EndpointGroupBuilder()
470         .setId(new EndpointGroupId("a33fdd4d-f58b-4741-a69f-08aecab9af2e"))
471         .setParent(egloop2Id)
472         .setConsumerNamedSelector(ImmutableList.of(cns1))
473         .setProviderNamedSelector(ImmutableList.of(pns1))
474         .setConsumerTargetSelector(ImmutableList.of(cts1))
475         .setProviderTargetSelector(ImmutableList.of(pts1))
476         .build();
477     EndpointGroup egloop2 = new EndpointGroupBuilder()
478         .setId(egloop2Id)
479         .setParent(egloop1.getId())
480         .build();
481     EndpointGroupId egselfloopid = 
482             new EndpointGroupId("996ad104-f852-4d77-96cf-cddde5cebb84");
483     EndpointGroup egselfloop = new EndpointGroupBuilder()
484         .setId(egselfloopid)
485         .setParent(egselfloopid)
486         .build();
487     EndpointGroup egorphan = new EndpointGroupBuilder()
488         .setId(new EndpointGroupId("feafeac9-ce1a-4b19-8455-8fcc9a4ff013"))
489         .setParent(new EndpointGroupId("aa9dfcf1-610c-42f9-8c3a-f67b43196821"))
490         .build();
491     
492     // *******
493     // Tenants
494     // *******
495     
496     TenantId tenantId1 = new TenantId("0ac5d219-979c-4cca-8f90-83b69bc414ad");
497     Tenant tenant1 = new TenantBuilder()
498         .setId(tenantId1)
499         .setEndpointGroup(ImmutableList.of(eg1, eg2))
500         .setContract(ImmutableList.of(contract1, contract2))
501         .build();
502
503     Tenant malformed = new TenantBuilder()
504         .setId(new TenantId("b26e6b18-8e74-4062-a7d2-e8437132030d"))
505         .setContract(ImmutableList.of(cloop1, cloop2, cselfloop, corphan))
506         .setEndpointGroup(ImmutableList.of(egloop1, egloop2, egselfloop, egorphan))
507         .build();
508     
509     // ****************
510     // Other test state
511     // ****************
512
513     public boolean containsQuality(List<? extends QualityBase> qualities, 
514                                    QualityBase quality) {
515         for (QualityBase q : qualities) {
516             if (q.getName().equals(quality.getName()))
517                 return true;
518         }
519         return false;
520     }
521
522     @Test
523     public void testTargetSimple() throws Exception {
524         Tenant tenant = InheritanceUtils.resolveTenant(tenant1);
525         Contract c1 = TenantUtils.findContract(tenant, contractId1);
526
527         // target with a quality directly in the target and one in 
528         // the containing contract
529         Target result = TenantUtils.findTarget(c1, q2TargetName);
530         assertEquals(q2TargetName, result.getName());
531         List<Quality> qualities = result.getQuality();
532         assertTrue(q1.getName() + " found in q2target", 
533                    containsQuality(qualities, q1));
534         assertTrue(q2.getName() + " found in q2target", 
535                    containsQuality(qualities, q2));
536
537         // target with a quality directly in the target with explicit "include"
538         result = TenantUtils.findTarget(c1, q1IncludeTargetName);
539         qualities = result.getQuality();
540         assertTrue(q1.getName() + " found in q1IncludeTargetName", 
541                    containsQuality(qualities, q1));
542         
543         // target with a quality from the containing contract but overridden
544         // in the target
545         result = TenantUtils.findTarget(c1, q1ExcludeTargetName);
546         qualities = result.getQuality();
547         assertFalse(q1.getName() + " found in q1ExcludeTargetName", 
548                     containsQuality(qualities, q1));
549         assertTrue(q2.getName() + " found in q1ExcludeTargetName", 
550                    containsQuality(qualities, q2));
551     }
552
553     @Test
554     public void testTargetInheritance() throws Exception {
555         Tenant tenant = InheritanceUtils.resolveTenant(tenant1);
556         Contract c2 = TenantUtils.findContract(tenant, contractId2);
557
558         // hits the q2PlusTarget which should include everything in q2Target
559         // plus q3
560         Target result = TenantUtils.findTarget(c2, q2TargetName);
561         List<Quality> qualities = result.getQuality();
562         assertTrue(q1.getName() + " found in q2target", 
563                    containsQuality(qualities, q1));
564         assertTrue(q2.getName() + " found in q2target", 
565                    containsQuality(qualities, q2));
566         assertTrue(q3.getName() + " found in q2target", 
567                    containsQuality(qualities, q3));
568
569         // Simple case of inheriting the behavior from the base but not messing
570         // it up
571         result = TenantUtils.findTarget(c2, q1IncludeTargetName);
572         qualities = result.getQuality();
573         assertTrue(q1.getName() + " found in q1IncludeTargetName", 
574                    containsQuality(qualities, q1));
575         assertFalse(q2.getName() + " found in q1IncludeTargetName", 
576                    containsQuality(qualities, q2));
577         assertFalse(q3.getName() + " found in q1IncludeTargetName", 
578                     containsQuality(qualities, q3));
579
580         // Inherit a target from the base that isn't found in the child at all
581         result = TenantUtils.findTarget(c2, q1ExcludeTargetName);
582         qualities = result.getQuality();
583         assertFalse(q1.getName() + " found in q1ExcludeTargetName", 
584                     containsQuality(qualities, q1));
585         assertTrue(q2.getName() + " found in q1ExcludeTargetName", 
586                    containsQuality(qualities, q2));
587         assertFalse(q3.getName() + " found in q1ExcludeTargetName", 
588                     containsQuality(qualities, q3));
589     }
590     
591     private boolean containsRequirement(List<? extends RequirementBase> requirements, 
592                                        RequirementBase requirement) {
593         for (RequirementBase r : requirements) {
594             if (r.getName().equals(requirement.getName()))
595                 return true;
596         }
597         return false;
598     }
599     
600     private boolean containsCapability(List<? extends CapabilityBase> capabilities, 
601                                       CapabilityBase capability) {
602         for (CapabilityBase r : capabilities) {
603             if (r.getName().equals(capability.getName()))
604                 return true;
605         }
606         return false;
607     }
608
609     private boolean containsCondition(List<? extends Condition> conditions, 
610                                       Condition condition) {
611         for (Condition r : conditions) {
612             if (r.getName().equals(condition.getName()))
613                 return true;
614         }
615         return false;
616     }
617     
618     @Test
619     public void testConsumerTargetSelectorSimple() throws Exception {
620         Tenant tenant = InheritanceUtils.resolveTenant(tenant1);
621         EndpointGroup egResult1 = TenantUtils.findEndpointGroup(tenant, egId1);
622         
623         // should get r1 from eg1 and r2 from target selector
624         ConsumerTargetSelector result =
625                 TenantUtils.findCts(egResult1, ctsName1);
626         assertEquals(ctsName1, result.getName());
627         List<Requirement> requirements = result.getRequirement();
628         assertTrue(r1.getName() + " found in " + requirements,
629                    containsRequirement(requirements, r1));
630         assertTrue(r2.getName() + " found in " + requirements,
631                    containsRequirement(requirements, r2));
632         
633         List<QualityMatcher> matchers = result.getQualityMatcher();
634         assertEquals(2, matchers.size());
635         for (QualityMatcher m : matchers) {
636             if (m.getName().equals(new QualityMatcherName("qm_q1_all"))) {
637                 assertTrue(containsQuality(m.getMatcherQuality(), q1));
638                 assertEquals(MatchType.All, m.getMatchType());                
639             } else {
640                 assertTrue(containsQuality(m.getMatcherQuality(), q1));
641                 assertEquals(MatchType.Any, m.getMatchType());
642             }
643         }
644
645         // should get r1 from eg1 but excluded in target selector
646         // r3 comes from target selector
647         result = TenantUtils.findCts(egResult1, ctsName2);
648         assertEquals(ctsName2, result.getName());
649         requirements = result.getRequirement();
650         assertFalse(r1.getName() + " found in " + requirements,
651                    containsRequirement(requirements, r1));
652         assertFalse(r2.getName() + " found in " + requirements,
653                    containsRequirement(requirements, r2));
654         assertTrue(r3.getName() + " found in " + requirements,
655                    containsRequirement(requirements, r3));
656         
657         matchers = result.getQualityMatcher();
658         assertEquals(1, matchers.size());
659         assertTrue(containsQuality(matchers.get(0).getMatcherQuality(), q2));
660         assertTrue(containsQuality(matchers.get(0).getMatcherQuality(), q3));
661         assertEquals(MatchType.Any, matchers.get(0).getMatchType());
662     }
663
664     @Test
665     public void testConsumerTargetSelectorInheritance() throws Exception {
666         Tenant tenant = InheritanceUtils.resolveTenant(tenant1);
667         EndpointGroup egResult2 = TenantUtils.findEndpointGroup(tenant, egId2);
668
669         ConsumerTargetSelector result = 
670                 TenantUtils.findCts(egResult2, ctsName1);
671
672         List<Requirement> requirements = result.getRequirement();
673         assertTrue(r1.getName() + " found in " + requirements,
674                    containsRequirement(requirements, r1));
675         assertTrue(r3.getName() + " found in " + requirements,
676                    containsRequirement(requirements, r3));
677         
678         // should have three matchers, 
679         // (1) qm_q1_all inherited from endpoint group 1
680         // (2) qm_q1_any inherited from endpoint group 1, but overridden in 
681         //     endpoint group 2 with no new semantics
682         // (3) qm_q2q3_any defined in endpoint group 2
683         List<QualityMatcher> matchers = result.getQualityMatcher();
684         assertEquals(3, matchers.size());
685         for (QualityMatcher m : matchers) {
686             if (m.getName().equals(new QualityMatcherName("qm_q1_all"))) {
687                 assertEquals(1, m.getMatcherQuality().size());
688                 assertTrue(containsQuality(m.getMatcherQuality(), q1));
689                 assertEquals(MatchType.All, m.getMatchType());
690             } else if (m.getName().equals(new QualityMatcherName("qm_q1_any"))) {
691                 assertEquals(1, m.getMatcherQuality().size());
692                 assertTrue(containsQuality(m.getMatcherQuality(), q1));
693                 assertEquals(MatchType.Any, m.getMatchType());
694             } else {
695                 assertTrue(containsQuality(m.getMatcherQuality(), q2));
696                 assertTrue(containsQuality(m.getMatcherQuality(), q3));
697                 assertEquals(MatchType.Any, m.getMatchType());
698             }
699         }
700         
701         result = TenantUtils.findCts(egResult2, ctsName2);
702         assertEquals(ctsName2, result.getName());
703         requirements = result.getRequirement();
704         
705         // should get r1 from eg1 but excluded in target selector
706         // r3 comes from target selector
707         assertFalse(r1.getName() + " found in " + requirements,
708                    containsRequirement(requirements, r1));
709         assertFalse(r2.getName() + " found in " + requirements,
710                    containsRequirement(requirements, r2));
711         assertTrue(r3.getName() + " found in " + requirements,
712                    containsRequirement(requirements, r3));
713         
714         // Should get 2 matchers: 
715         // (1) qm_q2q2_any inherited from eg1, except that q2 is excluded 
716         //     by qm_q2q3_plus and q3 has a target namespace added 
717         // (2) qm_q2tq2_any newly-defined with a target namespace
718         matchers = result.getQualityMatcher();
719         assertEquals(2, matchers.size());
720         for (QualityMatcher m : matchers) {
721             if (m.getName().equals(new QualityMatcherName("qm_q2q3_any"))) {
722                 assertFalse(containsQuality(m.getMatcherQuality(), q1));
723                 assertFalse(containsQuality(m.getMatcherQuality(), q2));
724                 assertTrue(containsQuality(m.getMatcherQuality(), q3));
725                 for (MatcherQuality mq : m.getMatcherQuality()) {
726                     if (mq.getName().equals(q3.getName())) {
727                         assertEquals(q2TargetName, mq.getTargetNamespace());
728                     } else {
729                         assertNull(mq.getTargetNamespace());
730                     }
731                 }
732                 assertEquals(MatchType.All, m.getMatchType());
733             } else {
734                 assertTrue(containsQuality(m.getMatcherQuality(), q2));
735                 assertEquals(MatchType.Any, m.getMatchType());
736                 assertEquals(1, m.getMatcherQuality().size());
737                 assertEquals(q2TargetName,
738                              m.getMatcherQuality().get(0).getTargetNamespace());
739             }
740         }
741     }
742     
743     @Test
744     public void testConsumerNamedSelectorSimple() throws Exception {
745         Tenant tenant = InheritanceUtils.resolveTenant(tenant1);
746         EndpointGroup egResult1 = TenantUtils.findEndpointGroup(tenant, egId1);
747         
748         // should get r1 from eg1 and r2 from selector
749         ConsumerNamedSelector result =
750                 TenantUtils.findCns(egResult1, cnsName1);
751         assertEquals(cnsName1, result.getName());
752         List<Requirement> requirements = result.getRequirement();
753         assertEquals(2, requirements.size());
754         assertTrue(r1.getName() + " found in " + requirements,
755                    containsRequirement(requirements, r1));
756         assertTrue(r2.getName() + " found in " + requirements,
757                    containsRequirement(requirements, r2));
758         
759         assertEquals(1, result.getContract().size());
760         HashSet<ContractId> cids = new HashSet<>();
761         cids.addAll(result.getContract());
762         assertEquals(ImmutableSet.of(contractId1), cids);
763     }
764
765     @Test
766     public void testConsumerNamedSelectorInheritance() throws Exception {
767         Tenant tenant = InheritanceUtils.resolveTenant(tenant1);
768         EndpointGroup egResult2 = TenantUtils.findEndpointGroup(tenant, egId2);
769
770         // should get r1 from eg1 and r2 from eg1 selector, 
771         // and r3 from eg2 selector
772         ConsumerNamedSelector result =
773                 TenantUtils.findCns(egResult2, cnsName1);
774         assertEquals(cnsName1, result.getName());
775         List<Requirement> requirements = result.getRequirement();
776         assertEquals(3, requirements.size());
777         assertTrue(r1.getName() + " found in " + requirements,
778                    containsRequirement(requirements, r1));
779         assertTrue(r2.getName() + " found in " + requirements,
780                    containsRequirement(requirements, r2));
781         assertTrue(r3.getName() + " found in " + requirements,
782                    containsRequirement(requirements, r3));
783
784         assertEquals(2, result.getContract().size());
785         HashSet<ContractId> cids = new HashSet<>();
786         cids.addAll(result.getContract());
787         assertEquals(ImmutableSet.of(contractId1, contractId2), cids);
788     }
789
790     @Test
791     public void testProviderTargetSelectorSimple() throws Exception {
792         Tenant tenant = InheritanceUtils.resolveTenant(tenant1);
793         EndpointGroup egResult1 = TenantUtils.findEndpointGroup(tenant, egId1);
794         
795         // should get c1 from eg1 and c2 from target selector
796         ProviderTargetSelector result =
797                 TenantUtils.findPts(egResult1, ptsName1);
798         assertEquals(ptsName1, result.getName());
799         List<Capability> capabilities = result.getCapability();
800         assertTrue(c1.getName() + " found in " + capabilities,
801                    containsCapability(capabilities, c1));
802         assertTrue(c2.getName() + " found in " + capabilities,
803                    containsCapability(capabilities, c2));
804         
805         List<QualityMatcher> matchers = result.getQualityMatcher();
806         assertEquals(2, matchers.size());
807         for (QualityMatcher m : matchers) {
808             if (m.getName().equals(new QualityMatcherName("qm_q1_all"))) {
809                 assertTrue(containsQuality(m.getMatcherQuality(), q1));
810                 assertEquals(MatchType.All, m.getMatchType());                
811             } else {
812                 assertTrue(containsQuality(m.getMatcherQuality(), q1));
813                 assertEquals(MatchType.Any, m.getMatchType());
814             }
815         }
816
817         // should get c1 from eg1 but excluded in target selector
818         // c3 comes from target selector
819         result = TenantUtils.findPts(egResult1, ptsName2);
820         assertEquals(ptsName2, result.getName());
821         capabilities = result.getCapability();
822         assertFalse(c1.getName() + " found in " + capabilities,
823                    containsCapability(capabilities, c1));
824         assertFalse(c2.getName() + " found in " + capabilities,
825                    containsCapability(capabilities, c2));
826         assertTrue(c3.getName() + " found in " + capabilities,
827                    containsCapability(capabilities, c3));
828         
829         matchers = result.getQualityMatcher();
830         assertEquals(1, matchers.size());
831         assertTrue(containsQuality(matchers.get(0).getMatcherQuality(), q2));
832         assertTrue(containsQuality(matchers.get(0).getMatcherQuality(), q3));
833         assertEquals(MatchType.Any, matchers.get(0).getMatchType());
834     }
835
836     @Test
837     public void testProviderTargetSelectorInheritance() throws Exception {
838         Tenant tenant = InheritanceUtils.resolveTenant(tenant1);
839         EndpointGroup egResult2 = TenantUtils.findEndpointGroup(tenant, egId2);
840
841         ProviderTargetSelector result = 
842                 TenantUtils.findPts(egResult2, ptsName1);
843
844         List<Capability> capabilities = result.getCapability();
845         assertTrue(c1.getName() + " found in " + capabilities,
846                    containsCapability(capabilities, c1));
847         assertTrue(c3.getName() + " found in " + capabilities,
848                    containsCapability(capabilities, c3));
849         
850         // should have three matchers, 
851         // (1) qm_q1_all inherited from endpoint group 1
852         // (2) qm_q1_any inherited from endpoint group 1, but overridden in 
853         //     endpoint group 2 with no new semantics
854         // (3) qm_q2q3_any defined in endpoint group 2
855         List<QualityMatcher> matchers = result.getQualityMatcher();
856         assertEquals(3, matchers.size());
857         for (QualityMatcher m : matchers) {
858             if (m.getName().equals(new QualityMatcherName("qm_q1_all"))) {
859                 assertEquals(1, m.getMatcherQuality().size());
860                 assertTrue(containsQuality(m.getMatcherQuality(), q1));
861                 assertEquals(MatchType.All, m.getMatchType());
862             } else if (m.getName().equals(new QualityMatcherName("qm_q1_any"))) {
863                 assertEquals(1, m.getMatcherQuality().size());
864                 assertTrue(containsQuality(m.getMatcherQuality(), q1));
865                 assertEquals(MatchType.Any, m.getMatchType());
866             } else {
867                 assertTrue(containsQuality(m.getMatcherQuality(), q2));
868                 assertTrue(containsQuality(m.getMatcherQuality(), q3));
869                 assertEquals(MatchType.Any, m.getMatchType());
870             }
871         }
872         
873         result = TenantUtils.findPts(egResult2, ptsName2);
874         assertEquals(ptsName2, result.getName());
875         capabilities = result.getCapability();
876         
877         // should get c1 from eg1 but excluded in target selector
878         // c3 comes from target selector
879         assertFalse(c1.getName() + " found in " + capabilities,
880                    containsCapability(capabilities, c1));
881         assertFalse(c2.getName() + " found in " + capabilities,
882                    containsCapability(capabilities, c2));
883         assertTrue(c3.getName() + " found in " + capabilities,
884                    containsCapability(capabilities, c3));
885         
886         // Should get 2 matchers: 
887         // (1) qm_q2q2_any inherited from eg1, except that q2 is excluded 
888         //     by qm_q2q3_plus and q3 has a target namespace added 
889         // (2) qm_q2tq2_any newly-defined with a target namespace
890         matchers = result.getQualityMatcher();
891         assertEquals(2, matchers.size());
892         for (QualityMatcher m : matchers) {
893             if (m.getName().equals(new QualityMatcherName("qm_q2q3_any"))) {
894                 assertFalse(containsQuality(m.getMatcherQuality(), q1));
895                 assertFalse(containsQuality(m.getMatcherQuality(), q2));
896                 assertTrue(containsQuality(m.getMatcherQuality(), q3));
897                 for (MatcherQuality mq : m.getMatcherQuality()) {
898                     if (mq.getName().equals(q3.getName())) {
899                         assertEquals(q2TargetName, mq.getTargetNamespace());
900                     } else {
901                         assertNull(mq.getTargetNamespace());
902                     }
903                 }
904                 assertEquals(MatchType.All, m.getMatchType());
905             } else {
906                 assertTrue(containsQuality(m.getMatcherQuality(), q2));
907                 assertEquals(MatchType.Any, m.getMatchType());
908                 assertEquals(1, m.getMatcherQuality().size());
909                 assertEquals(q2TargetName,
910                              m.getMatcherQuality().get(0).getTargetNamespace());
911             }
912         }
913     }
914
915     @Test
916     public void testProviderNamedSelectorSimple() throws Exception {
917         Tenant tenant = InheritanceUtils.resolveTenant(tenant1);
918         EndpointGroup egResult1 = TenantUtils.findEndpointGroup(tenant, egId1);
919         
920         // should get c1 from eg1 and c2 from selector
921         ProviderNamedSelector result =
922                 TenantUtils.findPns(egResult1, cnsName1);
923         assertEquals(cnsName1, result.getName());
924         List<Capability> capabilities = result.getCapability();
925         assertEquals(2, capabilities.size());
926         assertTrue(c1.getName() + " found in " + capabilities,
927                    containsCapability(capabilities, c1));
928         assertTrue(c2.getName() + " found in " + capabilities,
929                    containsCapability(capabilities, c2));
930         
931         assertEquals(1, result.getContract().size());
932         HashSet<ContractId> cids = new HashSet<>();
933         cids.addAll(result.getContract());
934         assertEquals(ImmutableSet.of(contractId1), cids);
935     }
936
937     @Test
938     public void testProviderNamedSelectorInheritance() throws Exception {
939         Tenant tenant = InheritanceUtils.resolveTenant(tenant1);
940         EndpointGroup egResult2 = TenantUtils.findEndpointGroup(tenant, egId2);
941
942         // should get c1 from eg1 and c2 from eg1 selector, 
943         // and c3 from eg2 selector
944         ProviderNamedSelector result =
945                 TenantUtils.findPns(egResult2, cnsName1);
946         assertEquals(cnsName1, result.getName());
947         List<Capability> capabilities = result.getCapability();
948         assertEquals(3, capabilities.size());
949         assertTrue(c1.getName() + " found in " + capabilities,
950                    containsCapability(capabilities, c1));
951         assertTrue(c2.getName() + " found in " + capabilities,
952                    containsCapability(capabilities, c2));
953         assertTrue(c3.getName() + " found in " + capabilities,
954                    containsCapability(capabilities, c3));
955
956         assertEquals(2, result.getContract().size());
957         HashSet<ContractId> cids = new HashSet<>();
958         cids.addAll(result.getContract());
959         assertEquals(ImmutableSet.of(contractId1, contractId2), cids);
960     }
961
962     @Test
963     public void testClauseSimple() throws Exception {
964         Tenant tenant = InheritanceUtils.resolveTenant(tenant1);
965         Contract cresult1 = TenantUtils.findContract(tenant, contractId1);
966         
967         Clause result = TenantUtils.findClause(cresult1, clauseName1);
968         assertEquals(clauseName1, result.getName());
969         
970         // subject refs: subject1 from clause1
971         assertEquals(1, result.getSubjectRefs().size());
972         assertEquals(ImmutableSet.of(subject1), 
973                      ImmutableSet.copyOf(result.getSubjectRefs()));
974
975         assertNotNull(result.getProviderMatchers());
976         List<ConditionMatcher> cm = 
977                 result.getProviderMatchers().getConditionMatcher();
978         assertEquals(1, cm.size());
979         assertEquals(1, cm.get(0).getCondition().size());
980         assertTrue(containsCondition(cm.get(0).getCondition(), cond1));
981
982         List<CapabilityMatcher> capm = 
983                 result.getProviderMatchers().getCapabilityMatcher();
984         assertEquals(1, capm.size());
985         assertEquals(1, capm.get(0).getMatcherCapability().size());
986         assertTrue(containsCapability(capm.get(0).getMatcherCapability(), c1));
987         
988         assertNotNull(result.getConsumerMatchers());
989         cm = result.getConsumerMatchers().getConditionMatcher();
990         assertEquals(1, cm.size());
991         assertEquals(1, cm.get(0).getCondition().size());
992         assertTrue(containsCondition(cm.get(0).getCondition(), cond2));
993
994         List<RequirementMatcher> pm = 
995                 result.getConsumerMatchers().getRequirementMatcher();
996         assertEquals(1, pm.size());
997         assertEquals(1, pm.get(0).getMatcherRequirement().size());
998         assertTrue(containsRequirement(pm.get(0).getMatcherRequirement(), r1));
999         
1000     }
1001
1002     @Test
1003     public void testClauseInheritance() throws Exception {
1004         Tenant tenant = InheritanceUtils.resolveTenant(tenant1);
1005         Contract cresult2 = TenantUtils.findContract(tenant, contractId2);
1006         
1007         Clause result = TenantUtils.findClause(cresult2, clauseName1);
1008         assertEquals(clauseName1, result.getName());
1009  
1010         // subject refs: subject1 from clause1, subject2 from clause2
1011         assertEquals(2, result.getSubjectRefs().size());
1012         assertEquals(ImmutableSet.of(subject1, subject2), 
1013                      ImmutableSet.copyOf(result.getSubjectRefs()));
1014
1015         assertNotNull(result.getProviderMatchers());
1016         List<ConditionMatcher> cm = 
1017                 result.getProviderMatchers().getConditionMatcher();
1018         assertEquals(1, cm.size());
1019         assertEquals(1, cm.get(0).getCondition().size());
1020         assertTrue(containsCondition(cm.get(0).getCondition(), cond1));
1021         
1022         List<CapabilityMatcher> capm = 
1023                 result.getProviderMatchers().getCapabilityMatcher();
1024         assertEquals(1, capm.size());
1025         assertEquals(1, capm.get(0).getMatcherCapability().size());
1026         assertTrue(containsCapability(capm.get(0).getMatcherCapability(), c1));
1027         
1028         assertNotNull(result.getConsumerMatchers());
1029         cm = result.getConsumerMatchers().getConditionMatcher();
1030         assertEquals(1, cm.size());
1031         assertEquals(cm_c2.getName(), cm.get(0).getName());
1032         assertEquals(MatchType.All, cm.get(0).getMatchType());
1033         assertEquals(0, cm.get(0).getCondition().size());
1034
1035         List<RequirementMatcher> pm = 
1036                 result.getConsumerMatchers().getRequirementMatcher();
1037         assertEquals(1, pm.size());
1038         assertEquals(2, pm.get(0).getMatcherRequirement().size());
1039         assertTrue(containsRequirement(pm.get(0).getMatcherRequirement(), r1));
1040         assertTrue(containsRequirement(pm.get(0).getMatcherRequirement(), r2));
1041     }
1042
1043     @Test
1044     public void testSubjectSimple() throws Exception {
1045         Tenant tenant = InheritanceUtils.resolveTenant(tenant1);
1046
1047         Contract result = TenantUtils.findContract(tenant, contractId1);
1048         List<Subject> subjects = result.getSubject();
1049         assertEquals(1, subjects.size());
1050         
1051         assertEquals(s1.getName(), subjects.get(0).getName());
1052         List<Rule> rules = subjects.get(0).getRule();
1053         assertEquals(2, rules.size());
1054         assertEquals(rule2.getName(), rules.get(0).getName());
1055         assertEquals(rule1.getName(), rules.get(1).getName());
1056     }
1057
1058     @Test
1059     public void testSubjectInheritance() throws Exception {
1060         Tenant tenant = InheritanceUtils.resolveTenant(tenant1);
1061
1062         Contract result = TenantUtils.findContract(tenant, contractId2);
1063         List<Subject> subjects = result.getSubject();
1064         assertEquals(2, subjects.size());
1065         for (Subject s: subjects) {
1066             if (s1.getName().equals(s.getName())) {
1067                 assertEquals(Integer.valueOf(4), s.getOrder());
1068                 List<Rule> rules = s.getRule();
1069                 assertEquals(4, rules.size());
1070                 assertEquals(rule4.getName(), rules.get(0).getName());
1071                 assertEquals(rule3.getName(), rules.get(1).getName());
1072                 assertEquals(rule2.getName(), rules.get(2).getName());
1073                 assertEquals(rule1.getName(), rules.get(3).getName());
1074             } else if (s2.getName().equals(s.getName())) {
1075                 assertEquals(0, s.getRule().size());
1076                 assertEquals(Integer.valueOf(5), s.getOrder());
1077             } else {
1078                 fail("extra subject?");
1079             }
1080         }
1081     }
1082     
1083     @Test
1084     public void testMalformedPolicy() throws Exception {
1085         Tenant tenant = 
1086                 InheritanceUtils.resolveTenant(malformed);
1087         Contract c = TenantUtils.findContract(tenant, cloop2Id);
1088         assertEquals(1, c.getClause().size());
1089         Clause clause = c.getClause().get(0);
1090         assertEquals(1, clause.getConsumerMatchers().getConditionMatcher().size());
1091         assertEquals(1, clause.getConsumerMatchers().getRequirementMatcher().size());
1092         assertEquals(1, clause.getProviderMatchers().getConditionMatcher().size());
1093         assertEquals(1, clause.getProviderMatchers().getCapabilityMatcher().size());
1094         assertEquals(2, c.getSubject().size());
1095         
1096         EndpointGroup eg = TenantUtils.findEndpointGroup(tenant, egloop2Id);
1097         assertEquals(1, eg.getConsumerNamedSelector().size());
1098         assertEquals(1, eg.getConsumerTargetSelector().size());
1099         assertEquals(1, eg.getProviderNamedSelector().size());
1100         assertEquals(1, eg.getProviderTargetSelector().size());
1101         
1102     }
1103 }