| package testing |
| |
| import ( |
| "context" |
| "fmt" |
| "net" |
| "syscall" |
| "time" |
| |
| "google.golang.org/grpc" |
| |
| "pcloud/api" |
| "pcloud/chunk" |
| "pcloud/master" |
| ) |
| |
| type InMemoryEnv struct { |
| m *grpc.Server |
| c []*grpc.Server |
| masterConn *grpc.ClientConn |
| } |
| |
| func NewInMemoryEnv(numChunkServers int) (*InMemoryEnv, error) { |
| env := new(InMemoryEnv) |
| syscall.Unlink("/tmp/pcloud/master") |
| lis, err := net.Listen("unix", "/tmp/pcloud/master") |
| if err != nil { |
| return nil, err |
| } |
| server := grpc.NewServer() |
| api.RegisterMetadataStorageServer(server, master.NewMasterServer()) |
| go server.Serve(lis) |
| |
| var opts []grpc.DialOption |
| opts = append(opts, grpc.WithInsecure()) |
| opts = append(opts, grpc.WithBlock()) |
| conn, err := grpc.Dial("unix:/tmp/pcloud/master", opts...) |
| if err != nil { |
| return nil, err |
| } |
| env.masterConn = conn |
| client := api.NewMetadataStorageClient(conn) |
| |
| env.c = make([]*grpc.Server, numChunkServers) |
| for i := 0; i < numChunkServers; i++ { |
| unixSocket := fmt.Sprintf("/tmp/pcloud/chunk-%d", i) |
| syscall.Unlink(unixSocket) |
| lis, err := net.Listen("unix", unixSocket) |
| if err != nil { |
| return nil, err |
| } |
| server := grpc.NewServer() |
| api.RegisterChunkStorageServer(server, chunk.NewChunkServer(&chunk.InMemoryChunkFactory{})) |
| go server.Serve(lis) |
| env.c[i] = server |
| } |
| |
| for i := 0; i < numChunkServers; i++ { |
| ctx, _ := context.WithTimeout(context.Background(), 5*time.Second) |
| _, err = client.AddChunkServer( |
| ctx, |
| &api.AddChunkServerRequest{Address: fmt.Sprintf("unix:///tmp/pcloud/chunk-%d", i)}) |
| if err != nil { |
| return nil, err |
| } |
| } |
| return env, nil |
| } |
| |
| func (e *InMemoryEnv) Stop() { |
| if e.masterConn != nil { |
| e.masterConn.Close() |
| } |
| for _, s := range e.c { |
| if s != nil { |
| s.GracefulStop() |
| } |
| } |
| if e.m != nil { |
| e.m.GracefulStop() |
| } |
| } |