github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/swarmkit/manager/watchapi/server_test.go (about) 1 package watchapi 2 3 import ( 4 "context" 5 "io/ioutil" 6 "net" 7 "os" 8 "testing" 9 "time" 10 11 "github.com/docker/swarmkit/api" 12 cautils "github.com/docker/swarmkit/ca/testutils" 13 "github.com/docker/swarmkit/manager/state/store" 14 stateutils "github.com/docker/swarmkit/manager/state/testutils" 15 "github.com/sirupsen/logrus" 16 "github.com/stretchr/testify/assert" 17 "github.com/stretchr/testify/require" 18 "google.golang.org/grpc" 19 "google.golang.org/grpc/grpclog" 20 ) 21 22 type testServer struct { 23 Server *Server 24 Client api.WatchClient 25 Store *store.MemoryStore 26 27 grpcServer *grpc.Server 28 clientConn *grpc.ClientConn 29 30 tempUnixSocket string 31 } 32 33 func (ts *testServer) Stop() { 34 ts.Server.Stop() 35 ts.clientConn.Close() 36 ts.grpcServer.Stop() 37 ts.Store.Close() 38 os.RemoveAll(ts.tempUnixSocket) 39 } 40 41 func newTestServer(t *testing.T) *testServer { 42 ts := &testServer{} 43 44 // Create a testCA just to get a usable RootCA object 45 tc := cautils.NewTestCA(t) 46 tc.Stop() 47 48 ts.Store = store.NewMemoryStore(&stateutils.MockProposer{}) 49 assert.NotNil(t, ts.Store) 50 ts.Server = NewServer(ts.Store) 51 assert.NotNil(t, ts.Server) 52 53 require.NoError(t, ts.Server.Start(context.Background())) 54 55 temp, err := ioutil.TempFile("", "test-socket") 56 assert.NoError(t, err) 57 assert.NoError(t, temp.Close()) 58 assert.NoError(t, os.Remove(temp.Name())) 59 60 ts.tempUnixSocket = temp.Name() 61 62 lis, err := net.Listen("unix", temp.Name()) 63 assert.NoError(t, err) 64 65 ts.grpcServer = grpc.NewServer() 66 api.RegisterWatchServer(ts.grpcServer, ts.Server) 67 go func() { 68 // Serve will always return an error (even when properly stopped). 69 // Explicitly ignore it. 70 _ = ts.grpcServer.Serve(lis) 71 }() 72 73 conn, err := grpc.Dial(temp.Name(), grpc.WithInsecure(), grpc.WithTimeout(10*time.Second), 74 grpc.WithDialer(func(addr string, timeout time.Duration) (net.Conn, error) { 75 return net.DialTimeout("unix", addr, timeout) 76 })) 77 assert.NoError(t, err) 78 ts.clientConn = conn 79 80 ts.Client = api.NewWatchClient(conn) 81 82 return ts 83 } 84 85 func createNode(t *testing.T, ts *testServer, id string, role api.NodeRole, membership api.NodeSpec_Membership, state api.NodeStatus_State) *api.Node { 86 node := &api.Node{ 87 ID: id, 88 Spec: api.NodeSpec{ 89 Membership: membership, 90 }, 91 Status: api.NodeStatus{ 92 State: state, 93 }, 94 Role: role, 95 } 96 err := ts.Store.Update(func(tx store.Tx) error { 97 return store.CreateNode(tx, node) 98 }) 99 assert.NoError(t, err) 100 return node 101 } 102 103 func init() { 104 grpclog.SetLoggerV2(grpclog.NewLoggerV2(ioutil.Discard, ioutil.Discard, ioutil.Discard)) 105 logrus.SetOutput(ioutil.Discard) 106 }