• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2019 The gRPC Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package http2interop
16
17import (
18	"crypto/tls"
19	"crypto/x509"
20	"encoding/json"
21	"flag"
22	"fmt"
23	"io/ioutil"
24	"os"
25	"strconv"
26	"strings"
27	"testing"
28)
29
30var (
31	serverHost = flag.String("server_host", "", "The host to test")
32	serverPort = flag.Int("server_port", 443, "The port to test")
33	useTls     = flag.Bool("use_tls", true, "Should TLS tests be run")
34	testCase   = flag.String("test_case", "", "What test cases to run (tls, framing)")
35
36	// The rest of these are unused, but present to fulfill the client interface
37	serverHostOverride    = flag.String("server_host_override", "", "Unused")
38	useTestCa             = flag.Bool("use_test_ca", false, "Unused")
39	defaultServiceAccount = flag.String("default_service_account", "", "Unused")
40	oauthScope            = flag.String("oauth_scope", "", "Unused")
41	serviceAccountKeyFile = flag.String("service_account_key_file", "", "Unused")
42)
43
44func InteropCtx(t *testing.T) *HTTP2InteropCtx {
45	ctx := &HTTP2InteropCtx{
46		ServerHost:             *serverHost,
47		ServerPort:             *serverPort,
48		ServerHostnameOverride: *serverHostOverride,
49		UseTLS:                 *useTls,
50		UseTestCa:              *useTestCa,
51		T:                      t,
52	}
53
54	ctx.serverSpec = ctx.ServerHost
55	if ctx.ServerPort != -1 {
56		ctx.serverSpec += ":" + strconv.Itoa(ctx.ServerPort)
57	}
58	if ctx.ServerHostnameOverride == "" {
59		ctx.authority = ctx.ServerHost
60	} else {
61		ctx.authority = ctx.ServerHostnameOverride
62	}
63
64	if ctx.UseTestCa {
65		// It would be odd if useTestCa was true, but not useTls.  meh
66		certData, err := ioutil.ReadFile("src/core/tsi/test_creds/ca.pem")
67		if err != nil {
68			t.Fatal(err)
69		}
70
71		ctx.rootCAs = x509.NewCertPool()
72		if !ctx.rootCAs.AppendCertsFromPEM(certData) {
73			t.Fatal(fmt.Errorf("Unable to parse pem data"))
74		}
75	}
76
77	return ctx
78}
79
80func (ctx *HTTP2InteropCtx) Close() error {
81	// currently a noop
82	return nil
83}
84
85func TestSoonClientShortSettings(t *testing.T) {
86	defer Report(t)
87	if *testCase != "framing" {
88		t.SkipNow()
89	}
90	ctx := InteropCtx(t)
91	for i := 1; i <= 5; i++ {
92		err := testClientShortSettings(ctx, i)
93		matchError(t, err, "EOF")
94	}
95}
96
97func TestSoonShortPreface(t *testing.T) {
98	defer Report(t)
99	if *testCase != "framing" {
100		t.SkipNow()
101	}
102	ctx := InteropCtx(t)
103	for i := 0; i < len(Preface)-1; i++ {
104		err := testShortPreface(ctx, Preface[:i]+"X")
105		matchError(t, err, "EOF")
106	}
107}
108
109func TestSoonUnknownFrameType(t *testing.T) {
110	defer Report(t)
111	if *testCase != "framing" {
112		t.SkipNow()
113	}
114	ctx := InteropCtx(t)
115	if err := testUnknownFrameType(ctx); err != nil {
116		t.Fatal(err)
117	}
118}
119
120func TestSoonClientPrefaceWithStreamId(t *testing.T) {
121	defer Report(t)
122	if *testCase != "framing" {
123		t.SkipNow()
124	}
125	ctx := InteropCtx(t)
126	err := testClientPrefaceWithStreamId(ctx)
127	matchError(t, err, "EOF")
128}
129
130func TestSoonTLSApplicationProtocol(t *testing.T) {
131	defer Report(t)
132	if *testCase != "tls" {
133		t.SkipNow()
134	}
135	ctx := InteropCtx(t)
136	err := testTLSApplicationProtocol(ctx)
137	matchError(t, err, "EOF", "broken pipe")
138}
139
140func TestSoonTLSMaxVersion(t *testing.T) {
141	defer Report(t)
142	if *testCase != "tls" {
143		t.SkipNow()
144	}
145	ctx := InteropCtx(t)
146	err := testTLSMaxVersion(ctx, tls.VersionTLS11)
147	// TODO(carl-mastrangelo): maybe this should be some other error.  If the server picks
148	// the wrong protocol version, that's bad too.
149	matchError(t, err, "EOF", "server selected unsupported protocol")
150}
151
152func TestSoonTLSBadCipherSuites(t *testing.T) {
153	defer Report(t)
154	if *testCase != "tls" {
155		t.SkipNow()
156	}
157	ctx := InteropCtx(t)
158	err := testTLSBadCipherSuites(ctx)
159	matchError(t, err, "EOF", "Got goaway frame")
160}
161
162func matchError(t *testing.T, err error, matches ...string) {
163	if err == nil {
164		t.Fatal("Expected an error")
165	}
166	for _, s := range matches {
167		if strings.Contains(err.Error(), s) {
168			return
169		}
170	}
171	t.Fatalf("Error %v not in %+v", err, matches)
172}
173
174func TestMain(m *testing.M) {
175	flag.Parse()
176	m.Run()
177	var fatal bool
178	var any bool
179	for _, ci := range allCaseInfos.Cases {
180		if ci.Skipped {
181			continue
182		}
183		any = true
184		if !ci.Passed && ci.Fatal {
185			fatal = true
186		}
187	}
188
189	if err := json.NewEncoder(os.Stderr).Encode(&allCaseInfos); err != nil {
190		fmt.Println("Failed to encode", err)
191	}
192	var code int
193	if !any || fatal {
194		code = 1
195	}
196	os.Exit(code)
197}
198