xref: /aosp_15_r20/external/grpc-grpc/tools/http2_interop/testsuite.go (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker// Copyright 2019 The gRPC Authors
2*cc02d7e2SAndroid Build Coastguard Worker//
3*cc02d7e2SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*cc02d7e2SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*cc02d7e2SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*cc02d7e2SAndroid Build Coastguard Worker//
7*cc02d7e2SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*cc02d7e2SAndroid Build Coastguard Worker//
9*cc02d7e2SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*cc02d7e2SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*cc02d7e2SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*cc02d7e2SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*cc02d7e2SAndroid Build Coastguard Worker// limitations under the License.
14*cc02d7e2SAndroid Build Coastguard Worker
15*cc02d7e2SAndroid Build Coastguard Workerpackage http2interop
16*cc02d7e2SAndroid Build Coastguard Worker
17*cc02d7e2SAndroid Build Coastguard Workerimport (
18*cc02d7e2SAndroid Build Coastguard Worker	"path"
19*cc02d7e2SAndroid Build Coastguard Worker	"runtime"
20*cc02d7e2SAndroid Build Coastguard Worker	"strings"
21*cc02d7e2SAndroid Build Coastguard Worker	"sync"
22*cc02d7e2SAndroid Build Coastguard Worker	"testing"
23*cc02d7e2SAndroid Build Coastguard Worker)
24*cc02d7e2SAndroid Build Coastguard Worker
25*cc02d7e2SAndroid Build Coastguard Worker// When a test is skipped or fails, runtime.Goexit() is called which destroys the callstack.
26*cc02d7e2SAndroid Build Coastguard Worker// This means the name of the test case is lost, so we need to grab a copy of pc before.
27*cc02d7e2SAndroid Build Coastguard Workerfunc Report(t testing.TB) {
28*cc02d7e2SAndroid Build Coastguard Worker	// If the goroutine panics, Fatal()s, or Skip()s, the function name is at the 3rd callstack
29*cc02d7e2SAndroid Build Coastguard Worker	// layer.  On success, its at 1st.  Since it's hard to check which happened, just try both.
30*cc02d7e2SAndroid Build Coastguard Worker	pcs := make([]uintptr, 10)
31*cc02d7e2SAndroid Build Coastguard Worker	total := runtime.Callers(1, pcs)
32*cc02d7e2SAndroid Build Coastguard Worker	var name string
33*cc02d7e2SAndroid Build Coastguard Worker	for _, pc := range pcs[:total] {
34*cc02d7e2SAndroid Build Coastguard Worker		fn := runtime.FuncForPC(pc)
35*cc02d7e2SAndroid Build Coastguard Worker		fullName := fn.Name()
36*cc02d7e2SAndroid Build Coastguard Worker		if strings.HasPrefix(path.Ext(fullName), ".Test") {
37*cc02d7e2SAndroid Build Coastguard Worker			// Skip the leading .
38*cc02d7e2SAndroid Build Coastguard Worker			name = string([]byte(path.Ext(fullName))[1:])
39*cc02d7e2SAndroid Build Coastguard Worker			break
40*cc02d7e2SAndroid Build Coastguard Worker		}
41*cc02d7e2SAndroid Build Coastguard Worker	}
42*cc02d7e2SAndroid Build Coastguard Worker	if name == "" {
43*cc02d7e2SAndroid Build Coastguard Worker		return
44*cc02d7e2SAndroid Build Coastguard Worker	}
45*cc02d7e2SAndroid Build Coastguard Worker
46*cc02d7e2SAndroid Build Coastguard Worker	allCaseInfos.lock.Lock()
47*cc02d7e2SAndroid Build Coastguard Worker	defer allCaseInfos.lock.Unlock()
48*cc02d7e2SAndroid Build Coastguard Worker	allCaseInfos.Cases = append(allCaseInfos.Cases, &caseInfo{
49*cc02d7e2SAndroid Build Coastguard Worker		Name:    name,
50*cc02d7e2SAndroid Build Coastguard Worker		Passed:  !t.Failed() && !t.Skipped(),
51*cc02d7e2SAndroid Build Coastguard Worker		Skipped: t.Skipped(),
52*cc02d7e2SAndroid Build Coastguard Worker		Fatal:   t.Failed() && !strings.HasPrefix(name, "TestSoon"),
53*cc02d7e2SAndroid Build Coastguard Worker	})
54*cc02d7e2SAndroid Build Coastguard Worker}
55*cc02d7e2SAndroid Build Coastguard Worker
56*cc02d7e2SAndroid Build Coastguard Workertype caseInfo struct {
57*cc02d7e2SAndroid Build Coastguard Worker	Name    string `json:"name"`
58*cc02d7e2SAndroid Build Coastguard Worker	Passed  bool   `json:"passed"`
59*cc02d7e2SAndroid Build Coastguard Worker	Skipped bool   `json:"skipped,omitempty"`
60*cc02d7e2SAndroid Build Coastguard Worker	Fatal   bool   `json:"fatal,omitempty"`
61*cc02d7e2SAndroid Build Coastguard Worker}
62*cc02d7e2SAndroid Build Coastguard Worker
63*cc02d7e2SAndroid Build Coastguard Workertype caseInfos struct {
64*cc02d7e2SAndroid Build Coastguard Worker	lock  sync.Mutex
65*cc02d7e2SAndroid Build Coastguard Worker	Cases []*caseInfo `json:"cases"`
66*cc02d7e2SAndroid Build Coastguard Worker}
67*cc02d7e2SAndroid Build Coastguard Worker
68*cc02d7e2SAndroid Build Coastguard Workervar (
69*cc02d7e2SAndroid Build Coastguard Worker	allCaseInfos = caseInfos{}
70*cc02d7e2SAndroid Build Coastguard Worker)
71