Source file src/internal/trace/tracev1_test.go

     1  // Copyright 2024 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package trace_test
     6  
     7  import (
     8  	"internal/trace"
     9  	"internal/trace/testtrace"
    10  	"internal/trace/version"
    11  	"io"
    12  	"os"
    13  	"path/filepath"
    14  	"testing"
    15  )
    16  
    17  func TestTraceV1(t *testing.T) {
    18  	traces, err := filepath.Glob("./internal/tracev1/testdata/*_good")
    19  	if err != nil {
    20  		t.Fatalf("failed to glob for tests: %s", err)
    21  	}
    22  	var testedUserRegions bool
    23  	for _, p := range traces {
    24  		p := p
    25  		testName, err := filepath.Rel("./internal/tracev1/testdata", p)
    26  		if err != nil {
    27  			t.Fatalf("failed to relativize testdata path: %s", err)
    28  		}
    29  		t.Run(testName, func(t *testing.T) {
    30  			f, err := os.Open(p)
    31  			if err != nil {
    32  				t.Fatalf("failed to open test %q: %s", p, err)
    33  			}
    34  			defer f.Close()
    35  
    36  			tr, err := trace.NewReader(f)
    37  			if err != nil {
    38  				t.Fatalf("failed to create reader: %s", err)
    39  			}
    40  
    41  			v := testtrace.NewValidator()
    42  			v.GoVersion = version.Go121
    43  			for {
    44  				ev, err := tr.ReadEvent()
    45  				if err != nil {
    46  					if err == io.EOF {
    47  						break
    48  					}
    49  					t.Fatalf("couldn't read converted event: %s", err)
    50  				}
    51  				if err := v.Event(ev); err != nil {
    52  					t.Fatalf("converted event did not validate; event: \n%s\nerror: %s", ev, err)
    53  				}
    54  
    55  				if testName == "user_task_region_1_21_good" {
    56  					testedUserRegions = true
    57  					validRegions := map[string]struct{}{
    58  						"post-existing region": {},
    59  						"region0":              {},
    60  						"region1":              {},
    61  					}
    62  					// Check that we correctly convert user regions. These
    63  					// strings were generated by
    64  					// runtime/trace.TestUserTaskRegion, which is the basis for
    65  					// the user_task_region_* test cases. We only check for the
    66  					// Go 1.21 traces because earlier traces used different
    67  					// strings.
    68  					switch ev.Kind() {
    69  					case trace.EventRegionBegin, trace.EventRegionEnd:
    70  						if _, ok := validRegions[ev.Region().Type]; !ok {
    71  							t.Fatalf("converted event has unexpected region type:\n%s", ev)
    72  						}
    73  					case trace.EventTaskBegin, trace.EventTaskEnd:
    74  						if ev.Task().Type != "task0" {
    75  							t.Fatalf("converted event has unexpected task type name:\n%s", ev)
    76  						}
    77  					case trace.EventLog:
    78  						l := ev.Log()
    79  						if l.Task != 1 || l.Category != "key0" || l.Message != "0123456789abcdef" {
    80  							t.Fatalf("converted event has unexpected user log:\n%s", ev)
    81  						}
    82  					}
    83  				}
    84  			}
    85  		})
    86  	}
    87  	if !testedUserRegions {
    88  		t.Fatal("didn't see expected test case user_task_region_1_21_good")
    89  	}
    90  }
    91  

View as plain text