| // Copyright 2015 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package vc |
| |
| import ( |
| "testing" |
| |
| inaming "v.io/x/ref/runtime/internal/naming" |
| "v.io/x/ref/test/testutil" |
| ) |
| |
| func TestInsertDelete(t *testing.T) { |
| cache := NewVCCache() |
| ep, err := inaming.NewEndpoint("foo:8888") |
| if err != nil { |
| t.Fatal(err) |
| } |
| p := testutil.NewPrincipal("test") |
| vc := &VC{remoteEP: ep, localPrincipal: p} |
| otherEP, err := inaming.NewEndpoint("foo:8888") |
| if err != nil { |
| t.Fatal(err) |
| } |
| otherP := testutil.NewPrincipal("test") |
| otherVC := &VC{remoteEP: otherEP, localPrincipal: otherP} |
| |
| cache.Insert(vc) |
| cache.Insert(otherVC) |
| cache.Delete(vc) |
| if got, want := cache.Close(), []*VC{otherVC}; !vcsEqual(got, want) { |
| t.Errorf("got %v, want %v", got, want) |
| } |
| } |
| |
| func TestInsertClose(t *testing.T) { |
| cache := NewVCCache() |
| ep, err := inaming.NewEndpoint("foo:8888") |
| if err != nil { |
| t.Fatal(err) |
| } |
| p := testutil.NewPrincipal("test") |
| vc := &VC{remoteEP: ep, localPrincipal: p} |
| |
| if err := cache.Insert(vc); err != nil { |
| t.Errorf("the cache is not closed yet") |
| } |
| if got, want := cache.Close(), []*VC{vc}; !vcsEqual(got, want) { |
| t.Errorf("got %v, want %v", got, want) |
| } |
| if err := cache.Insert(vc); err == nil { |
| t.Errorf("the cache has been closed") |
| } |
| } |
| |
| func TestReservedFind(t *testing.T) { |
| cache := NewVCCache() |
| ep, err := inaming.NewEndpoint("foo:8888") |
| if err != nil { |
| t.Fatal(err) |
| } |
| p := testutil.NewPrincipal("test") |
| vc := &VC{remoteEP: ep, localPrincipal: p} |
| cache.Insert(vc) |
| |
| // We should be able to find the vc in the cache. |
| if got, err := cache.ReservedFind(ep, p); err != nil || got != vc { |
| t.Errorf("got %v, want %v, err: %v", got, vc, err) |
| } |
| |
| // If we change the endpoint or the principal, we should get nothing. |
| otherEP, err := inaming.NewEndpoint("bar: 7777") |
| if err != nil { |
| t.Fatal(err) |
| } |
| if got, err := cache.ReservedFind(otherEP, p); err != nil || got != nil { |
| t.Errorf("got %v, want <nil>, err: %v", got, err) |
| } |
| if got, err := cache.ReservedFind(ep, testutil.NewPrincipal("wrong")); err != nil || got != nil { |
| t.Errorf("got %v, want <nil>, err: %v", got, err) |
| } |
| |
| // A subsequent ReservedFind call that matches a previous failed ReservedFind |
| // should block until a matching Unreserve call is made. |
| ch := make(chan *VC, 1) |
| go func(ch chan *VC) { |
| vc, err := cache.ReservedFind(otherEP, p) |
| if err != nil { |
| t.Fatal(err) |
| } |
| ch <- vc |
| }(ch) |
| |
| // We insert the otherEP into the cache. |
| otherVC := &VC{remoteEP: otherEP, localPrincipal: p} |
| cache.Insert(otherVC) |
| cache.Unreserve(otherEP, p) |
| |
| // Now the cache.BlcokingFind should have returned the correct otherVC. |
| if cachedVC := <-ch; cachedVC != otherVC { |
| t.Errorf("got %v, want %v", cachedVC, otherVC) |
| } |
| } |
| |
| func vcsEqual(a, b []*VC) bool { |
| if len(a) != len(b) { |
| return false |
| } |
| m := make(map[*VC]int) |
| for _, v := range a { |
| m[v]++ |
| } |
| for _, v := range b { |
| m[v]-- |
| } |
| for _, i := range m { |
| if i != 0 { |
| return false |
| } |
| } |
| return true |
| } |