blob: e2aace37e7a6fb68f3a706b7710d61a4a84e6ba4 [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
giolekvad2a029d2020-03-25 23:06:08 +040012 "github.com/giolekva/pcloud/api"
13 "github.com/giolekva/pcloud/chunk"
14 "github.com/giolekva/pcloud/master"
giolekva1f6577a2020-03-25 12:53:06 +040015)
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()
giolekva2babef22020-03-25 23:27:29 +040053 api.RegisterChunkStorageServer(server, chunk.NewChunkServer(
54 &chunk.InMemoryChunkFactory{},
55 &chunk.NonChangingReplicaAssignment{}))
giolekva1f6577a2020-03-25 12:53:06 +040056 go server.Serve(lis)
57 env.c[i] = server
58 }
59
60 for i := 0; i < numChunkServers; i++ {
61 ctx, _ := context.WithTimeout(context.Background(), 5*time.Second)
62 _, err = client.AddChunkServer(
63 ctx,
64 &api.AddChunkServerRequest{Address: fmt.Sprintf("unix:///tmp/pcloud/chunk-%d", i)})
65 if err != nil {
66 return nil, err
67 }
68 }
69 return env, nil
70}
71
72func (e *InMemoryEnv) Stop() {
73 if e.masterConn != nil {
74 e.masterConn.Close()
75 }
76 for _, s := range e.c {
77 if s != nil {
78 s.GracefulStop()
79 }
80 }
81 if e.m != nil {
82 e.m.GracefulStop()
83 }
84}