func TestIntersects(t *testing.T) { prng := rand.New(rand.NewSource(0)) for i := uint(0); i < 12; i++ { X, Y := randomPset(prng, 1<<i), randomPset(prng, 1<<i) x, y := &X.bits, &Y.bits // test the slow way var z intsets.Sparse z.Copy(x) z.IntersectionWith(y) if got, want := x.Intersects(y), !z.IsEmpty(); got != want { t.Errorf("Intersects: got %v, want %v", got, want) } // make it false a := x.AppendTo(nil) for _, v := range a { y.Remove(v) } if got, want := x.Intersects(y), false; got != want { t.Errorf("Intersects: got %v, want %v", got, want) } // make it true if x.IsEmpty() { continue } i := prng.Intn(len(a)) y.Insert(a[i]) if got, want := x.Intersects(y), true; got != want { t.Errorf("Intersects: got %v, want %v", got, want) } } }
func computeChainFrom(from, to canvas.Node) (chain []canvas.NodeIfc) { // For each link, there is a chain of modules to be invoked: the // ingress policy modules, the egress policy modules, and the final // forwarding nexthop. // // To compute the chain in each direction, the following algorithm is // followed: // Let T and F represent the set of groups for the 'to' and 'from' // nodes, respectively. // The leaving set L is the set difference between F and T. // L := F - T // The entering set E is the set difference between T and F // E := T - F // // For the directed edge from:to, the chain is built as follows: // For each module e in E, invoke the ingress policy (e.ifc[1]) // For each module l in L, invoke the egress policy (l.ifc[2]) // // The directed edge to:from is calculated by calling this function // with to/from reversed. var e, l, x intsets.Sparse l.Difference(from.Groups(), to.Groups()) e.Difference(to.Groups(), from.Groups()) var id int x.Copy(&e) for x.TakeMin(&id) { chain = append(chain, canvas.NodeIfc{id, 1}) } x.Copy(&l) for x.TakeMin(&id) { chain = append(chain, canvas.NodeIfc{id, 2}) } return chain }
func TestSubsetOf(t *testing.T) { prng := rand.New(rand.NewSource(0)) for i := uint(0); i < 12; i++ { X, Y := randomPset(prng, 1<<i), randomPset(prng, 1<<i) x, y := &X.bits, &Y.bits // test the slow way var z intsets.Sparse z.Copy(x) z.DifferenceWith(y) if got, want := x.SubsetOf(y), z.IsEmpty(); got != want { t.Errorf("SubsetOf: got %v, want %v", got, want) } // make it true y.UnionWith(x) if got, want := x.SubsetOf(y), true; got != want { t.Errorf("SubsetOf: got %v, want %v", got, want) } // make it false if x.IsEmpty() { continue } a := x.AppendTo(nil) i := prng.Intn(len(a)) y.Remove(a[i]) if got, want := x.SubsetOf(y), false; got != want { t.Errorf("SubsetOf: got %v, want %v", got, want) } } }