1// Copyright 2014 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
5package trace_test
6
7import (
8	"bytes"
9	"flag"
10	"os"
11	. "runtime/trace"
12	"testing"
13	"time"
14)
15
16var saveTraces = flag.Bool("savetraces", false, "save traces collected by tests")
17
18func TestTraceStartStop(t *testing.T) {
19	if IsEnabled() {
20		t.Skip("skipping because -test.trace is set")
21	}
22	buf := new(bytes.Buffer)
23	if err := Start(buf); err != nil {
24		t.Fatalf("failed to start tracing: %v", err)
25	}
26	Stop()
27	size := buf.Len()
28	if size == 0 {
29		t.Fatalf("trace is empty")
30	}
31	time.Sleep(100 * time.Millisecond)
32	if size != buf.Len() {
33		t.Fatalf("trace writes after stop: %v -> %v", size, buf.Len())
34	}
35	saveTrace(t, buf, "TestTraceStartStop")
36}
37
38func TestTraceDoubleStart(t *testing.T) {
39	if IsEnabled() {
40		t.Skip("skipping because -test.trace is set")
41	}
42	Stop()
43	buf := new(bytes.Buffer)
44	if err := Start(buf); err != nil {
45		t.Fatalf("failed to start tracing: %v", err)
46	}
47	if err := Start(buf); err == nil {
48		t.Fatalf("succeed to start tracing second time")
49	}
50	Stop()
51	Stop()
52}
53
54func saveTrace(t *testing.T, buf *bytes.Buffer, name string) {
55	if !*saveTraces {
56		return
57	}
58	if err := os.WriteFile(name+".trace", buf.Bytes(), 0600); err != nil {
59		t.Errorf("failed to write trace file: %s", err)
60	}
61}
62