File: rpcflags_test.go

package info (click to toggle)
trillian 1.7.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,600 kB
  • sloc: sh: 1,181; javascript: 474; sql: 330; makefile: 39
file content (143 lines) | stat: -rw-r--r-- 4,700 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
// Copyright 2018 Google LLC. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

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"
)

func TestNewClientDialOptionsFromFlagsWithTLSCertFileNotSet(t *testing.T) {
	// Set up Trillian servers
	const numSequencers = 2
	serverOpts := []grpc.ServerOption{}
	clientOpts := []grpc.DialOption{grpc.WithInsecure()}
	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)
	}

	// Check that the returned dial options can be used to connect and make
	// requests against the Trillian services created above.
	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()
	// Create new TLS certificates for the test services, and write the Client
	// certificate to a file (so we can refer to it using the flag).
	crtFile, cleanupCrtFile := setup.TempFile(t, "test.crt.")
	defer cleanupCrtFile()

	tlsCert := setup.NewTLSCertificate(t)

	// Certificate file and client dial options.
	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)
	}

	// Set up Trillian servers (with TLS enabled)
	const numSequencers = 0 // we don't actually need any sequencers.
	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()

	// Set up the flag.
	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)
	}

	// Check that the returned dial options can be used to connect and make
	// requests against the Trillian services created above.
	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)
	}
}