launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/state/apiserver/root_test.go (about)

     1  // Copyright 2012, 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package apiserver_test
     5  
     6  import (
     7  	gc "launchpad.net/gocheck"
     8  	"time"
     9  
    10  	"launchpad.net/juju-core/rpc/rpcreflect"
    11  	"launchpad.net/juju-core/state/apiserver"
    12  	"launchpad.net/juju-core/testing"
    13  )
    14  
    15  type rootSuite struct{}
    16  
    17  var _ = gc.Suite(&rootSuite{})
    18  
    19  var allowedDiscardedMethods = []string{
    20  	"AuthClient",
    21  	"AuthEnvironManager",
    22  	"AuthMachineAgent",
    23  	"AuthOwner",
    24  	"AuthUnitAgent",
    25  	"GetAuthEntity",
    26  	"GetAuthTag",
    27  }
    28  
    29  func (*rootSuite) TestDiscardedAPIMethods(c *gc.C) {
    30  	t := rpcreflect.TypeOf(apiserver.RootType)
    31  	// We must have some root-level methods.
    32  	c.Assert(t.MethodNames(), gc.Not(gc.HasLen), 0)
    33  	c.Assert(t.DiscardedMethods(), gc.DeepEquals, allowedDiscardedMethods)
    34  
    35  	for _, name := range t.MethodNames() {
    36  		m, err := t.Method(name)
    37  		c.Assert(err, gc.IsNil)
    38  		// We must have some methods on every object returned
    39  		// by a root-level method.
    40  		c.Assert(m.ObjType.MethodNames(), gc.Not(gc.HasLen), 0)
    41  		// We don't allow any methods that don't implement
    42  		// an RPC entry point.
    43  		c.Assert(m.ObjType.DiscardedMethods(), gc.HasLen, 0)
    44  	}
    45  }
    46  
    47  func (r *rootSuite) TestPingTimeout(c *gc.C) {
    48  	closedc := make(chan time.Time, 1)
    49  	action := func() {
    50  		closedc <- time.Now()
    51  	}
    52  	timeout := apiserver.NewPingTimeout(action, 50*time.Millisecond)
    53  	for i := 0; i < 2; i++ {
    54  		time.Sleep(10 * time.Millisecond)
    55  		timeout.Ping()
    56  	}
    57  	// Expect action to be executed about 50ms after last ping.
    58  	broken := time.Now()
    59  	var closed time.Time
    60  	time.Sleep(100 * time.Millisecond)
    61  	select {
    62  	case closed = <-closedc:
    63  	case <-time.After(testing.LongWait):
    64  		c.Fatalf("action never executed")
    65  	}
    66  	closeDiff := closed.Sub(broken) / time.Millisecond
    67  	c.Assert(50 <= closeDiff && closeDiff <= 100, gc.Equals, true)
    68  }