github.com/hellobchain/newcryptosm@v0.0.0-20221019060107-edb949a317e9/tls/credentials/credentials_test.go (about) 1 package credentials 2 3 import ( 4 "fmt" 5 "github.com/hellobchain/newcryptosm/tls" 6 "github.com/hellobchain/newcryptosm/tls/credentials/echo" 7 "github.com/hellobchain/newcryptosm/x509" 8 "io/ioutil" 9 "log" 10 "net" 11 "testing" 12 13 "golang.org/x/net/context" 14 "google.golang.org/grpc" 15 ) 16 17 const ( 18 port = ":50051" 19 address = "localhost:50051" 20 ) 21 22 var end chan bool 23 24 type server struct{} 25 26 func (s *server) Echo(ctx context.Context, req *echo.EchoRequest) (*echo.EchoResponse, error) { 27 return &echo.EchoResponse{Result: req.Req}, nil 28 } 29 30 const ca = "testdata/ca.pem" 31 const cakey = "testdata/cakey.pem" 32 33 const admin = "testdata/admin.pem" 34 const adminkey = "testdata/adminkey.pem" 35 36 func serverRun() { 37 cert, err := tls.LoadX509KeyPair(ca, cakey) 38 if err != nil { 39 log.Fatal(err) 40 } 41 certPool := x509.NewCertPool() 42 cacert, err := ioutil.ReadFile(ca) 43 if err != nil { 44 log.Fatal(err) 45 } 46 certPool.AppendCertsFromPEM(cacert) 47 48 lis, err := net.Listen("tcp", port) 49 if err != nil { 50 log.Fatalf("fail to listen: %v", err) 51 } 52 creds := NewTLS(&tls.Config{ 53 ClientAuth: tls.RequireAndVerifyClientCert, 54 Certificates: []tls.Certificate{cert}, 55 ClientCAs: certPool, 56 }) 57 s := grpc.NewServer(grpc.Creds(creds)) 58 echo.RegisterEchoServer(s, &server{}) 59 err = s.Serve(lis) 60 if err != nil { 61 log.Fatalf("Serve: %v", err) 62 } 63 } 64 65 func clientRun() { 66 cert, err := tls.LoadX509KeyPair(admin, adminkey) 67 if err != nil { 68 log.Fatal(err) 69 } 70 certPool := x509.NewCertPool() 71 cacert, err := ioutil.ReadFile(ca) 72 if err != nil { 73 log.Fatal(err) 74 } 75 certPool.AppendCertsFromPEM(cacert) 76 creds := NewTLS(&tls.Config{ 77 ServerName: "test.example.com", 78 Certificates: []tls.Certificate{cert}, 79 RootCAs: certPool, 80 }) 81 conn, err := grpc.Dial(address, grpc.WithTransportCredentials(creds)) 82 if err != nil { 83 log.Fatalf("cannot to connect: %v", err) 84 } 85 defer conn.Close() 86 c := echo.NewEchoClient(conn) 87 echoTest(c) 88 end <- true 89 } 90 91 func echoTest(c echo.EchoClient) { 92 r, err := c.Echo(context.Background(), &echo.EchoRequest{Req: "hello"}) 93 if err != nil { 94 log.Fatalf("failed to echo: %v", err) 95 } 96 fmt.Printf("%s\n", r.Result) 97 } 98 99 func Test(t *testing.T) { 100 end = make(chan bool, 64) 101 go serverRun() 102 go clientRun() 103 <-end 104 }