• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2023 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// Regression test for #55160.
6//
7// The issue is that the parser reads ahead to the first batch of the
8// next generation to find generation boundaries, but if it finds an
9// error, it needs to delay handling that error until later. Previously
10// it would handle that error immediately and a totally valid generation
11// would be skipped for parsing and rejected because of an error in a
12// batch in the following generation.
13//
14// This test captures this behavior by making both the first generation
15// and second generation bad. It requires that the issue in the first
16// generation, which is caught when actually ordering events, be reported
17// instead of the second one.
18
19package main
20
21import (
22	"internal/trace/event/go122"
23	testgen "internal/trace/internal/testgen/go122"
24)
25
26func main() {
27	testgen.Main(gen)
28}
29
30func gen(t *testgen.Trace) {
31	// A running goroutine emits a task begin.
32	t.RawEvent(go122.EvEventBatch, nil, 1 /*gen*/, 0 /*thread ID*/, 0 /*timestamp*/, 5 /*batch length*/)
33	t.RawEvent(go122.EvFrequency, nil, 15625000)
34
35	// A running goroutine emits a task begin.
36	t.RawEvent(go122.EvEventBatch, nil, 1 /*gen*/, 0 /*thread ID*/, 0 /*timestamp*/, 5 /*batch length*/)
37	t.RawEvent(go122.EvGoCreate, nil, 0 /*timestamp delta*/, 1 /*go ID*/, 0, 0)
38
39	// Write an invalid batch event for the next generation.
40	t.RawEvent(go122.EvEventBatch, nil, 2 /*gen*/, 0 /*thread ID*/, 0 /*timestamp*/, 50 /*batch length (invalid)*/)
41
42	// We should fail at the first issue, not the second one.
43	t.ExpectFailure("expected a proc but didn't have one")
44}
45