blob: a4cbcd4dd326d3693f28adbd275dc403c298d1ed [file] [log] [blame]
giolekva1f6577a2020-03-25 12:53:06 +04001package testing
2
3import (
4 "context"
5 "fmt"
6 "net"
7 "syscall"
8 "time"
9
10 "google.golang.org/grpc"
11
12 "pcloud/api"
13 "pcloud/chunk"
14 "pcloud/master"
15)
16
17type InMemoryEnv struct {
18 m *grpc.Server
19 c []*grpc.Server
20 masterConn *grpc.ClientConn
21}
22
23func NewInMemoryEnv(numChunkServers int) (*InMemoryEnv, error) {
24 env := new(InMemoryEnv)
25 syscall.Unlink("/tmp/pcloud/master")
26 lis, err := net.Listen("unix", "/tmp/pcloud/master")
27 if err != nil {
28 return nil, err
29 }
30 server := grpc.NewServer()
31 api.RegisterMetadataStorageServer(server, master.NewMasterServer())
32 go server.Serve(lis)
33
34 var opts []grpc.DialOption
35 opts = append(opts, grpc.WithInsecure())
36 opts = append(opts, grpc.WithBlock())
37 conn, err := grpc.Dial("unix:/tmp/pcloud/master", opts...)
38 if err != nil {
39 return nil, err
40 }
41 env.masterConn = conn
42 client := api.NewMetadataStorageClient(conn)
43
44 env.c = make([]*grpc.Server, numChunkServers)
45 for i := 0; i < numChunkServers; i++ {
46 unixSocket := fmt.Sprintf("/tmp/pcloud/chunk-%d", i)
47 syscall.Unlink(unixSocket)
48 lis, err := net.Listen("unix", unixSocket)
49 if err != nil {
50 return nil, err
51 }
52 server := grpc.NewServer()
53 api.RegisterChunkStorageServer(server, chunk.NewChunkServer(&chunk.InMemoryChunkFactory{}))
54 go server.Serve(lis)
55 env.c[i] = server
56 }
57
58 for i := 0; i < numChunkServers; i++ {
59 ctx, _ := context.WithTimeout(context.Background(), 5*time.Second)
60 _, err = client.AddChunkServer(
61 ctx,
62 &api.AddChunkServerRequest{Address: fmt.Sprintf("unix:///tmp/pcloud/chunk-%d", i)})
63 if err != nil {
64 return nil, err
65 }
66 }
67 return env, nil
68}
69
70func (e *InMemoryEnv) Stop() {
71 if e.masterConn != nil {
72 e.masterConn.Close()
73 }
74 for _, s := range e.c {
75 if s != nil {
76 s.GracefulStop()
77 }
78 }
79 if e.m != nil {
80 e.m.GracefulStop()
81 }
82}