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  }