package rpcflags
import (
"context"
"encoding/pem"
"flag"
"os"
"testing"
"github.com/google/trillian"
"github.com/google/trillian/testonly/flagsaver"
"github.com/google/trillian/testonly/integration"
"github.com/google/trillian/testonly/setup"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"google.golang.org/grpc/credentials/insecure"
)
func TestNewClientDialOptionsFromFlagsWithTLSCertFileNotSet(t *testing.T) {
const numSequencers = 2
serverOpts := []grpc.ServerOption{}
clientOpts := []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())}
logEnv, err := integration.NewLogEnvWithGRPCOptions(context.Background(), numSequencers, serverOpts, clientOpts)
if err != nil {
t.Fatal(err)
}
defer logEnv.Close()
dialOpts, err := NewClientDialOptionsFromFlags()
if err != nil {
t.Errorf("Got an unexpected error: %v", err)
}
conn, err := grpc.Dial(logEnv.Address, dialOpts...)
if err != nil {
t.Errorf("failed to dial %v: %v", logEnv.Address, err)
}
defer func() {
if err := conn.Close(); err != nil {
t.Error(err)
}
}()
adminClient := trillian.NewTrillianAdminClient(conn)
if _, err = adminClient.ListTrees(context.Background(), &trillian.ListTreesRequest{}); err != nil {
t.Errorf("failed to request trees from the Admin Server: %v", err)
}
}
func TestNewClientDialOptionsFromFlagsWithTLSCertFileMissing(t *testing.T) {
defer flagsaver.Save().MustRestore()
if err := flag.Set("tls_cert_file", "/a/missing/file"); err != nil {
t.Errorf("Failed to set flag: %v", err)
}
dialOpts, err := NewClientDialOptionsFromFlags()
if err == nil {
t.Errorf("Expected to get an error due to the file not being found")
}
if _, ok := err.(*os.PathError); !ok {
t.Errorf("Expected to get an os.PathError due to the file not being found, instead got: %v", err)
}
if dialOpts != nil {
t.Errorf("Expected returned dialOpts to be nil, instead got: %v", dialOpts)
}
}
func TestNewClientDialOptionsFromFlagsWithTLSCertFileSet(t *testing.T) {
defer flagsaver.Save().MustRestore()
crtFile, cleanupCrtFile := setup.TempFile(t, "test.crt.")
defer cleanupCrtFile()
tlsCert := setup.NewTLSCertificate(t)
err := pem.Encode(crtFile, &pem.Block{Type: "CERTIFICATE", Bytes: tlsCert.Certificate[0]})
if err != nil {
t.Fatalf("Failed to encode the test TLS certificate %v", err)
}
clientCreds, err := credentials.NewClientTLSFromFile(crtFile.Name(), "")
if err != nil {
t.Fatalf("Failed to get credentials: %v", err)
}
const numSequencers = 0
serverCreds := credentials.NewServerTLSFromCert(&tlsCert)
serverOpts := []grpc.ServerOption{grpc.Creds(serverCreds)}
clientOpts := []grpc.DialOption{grpc.WithTransportCredentials(clientCreds)}
logEnv, err := integration.NewLogEnvWithGRPCOptions(context.Background(), numSequencers, serverOpts, clientOpts)
if err != nil {
t.Fatal(err)
}
defer logEnv.Close()
err = flag.Set("tls_cert_file", crtFile.Name())
if err != nil {
t.Errorf("Failed to set -tls_cert_file flag: %v", err)
}
dialOpts, err := NewClientDialOptionsFromFlags()
if err != nil {
t.Errorf("Got an unexpected error: %v", err)
}
conn, err := grpc.Dial(logEnv.Address, dialOpts...)
if err != nil {
t.Errorf("failed to dial %v: %v", logEnv.Address, err)
}
defer func() {
if err := conn.Close(); err != nil {
t.Error(err)
}
}()
adminClient := trillian.NewTrillianAdminClient(conn)
if _, err := adminClient.ListTrees(context.Background(), &trillian.ListTreesRequest{}); err != nil {
t.Errorf("failed to request trees from the Admin Server: %v", err)
}
}