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
5package runtime_test
6
7import (
8	. "runtime"
9	"strconv"
10	"sync"
11	"testing"
12)
13
14func TestTraceMap(t *testing.T) {
15	var m TraceMap
16
17	// Try all these operations multiple times between resets, to make sure
18	// we're resetting properly.
19	for range 3 {
20		var d = [...]string{
21			"a",
22			"b",
23			"aa",
24			"ab",
25			"ba",
26			"bb",
27		}
28		for i, s := range d {
29			id, inserted := m.PutString(s)
30			if !inserted {
31				t.Errorf("expected to have inserted string %q, but did not", s)
32			}
33			if id != uint64(i+1) {
34				t.Errorf("expected string %q to have ID %d, but got %d instead", s, i+1, id)
35			}
36		}
37		for i, s := range d {
38			id, inserted := m.PutString(s)
39			if inserted {
40				t.Errorf("inserted string %q, but expected to have not done so", s)
41			}
42			if id != uint64(i+1) {
43				t.Errorf("expected string %q to have ID %d, but got %d instead", s, i+1, id)
44			}
45		}
46		m.Reset()
47	}
48}
49
50func TestTraceMapConcurrent(t *testing.T) {
51	var m TraceMap
52
53	var wg sync.WaitGroup
54	for i := range 3 {
55		wg.Add(1)
56		go func(i int) {
57			defer wg.Done()
58
59			si := strconv.Itoa(i)
60			var d = [...]string{
61				"a" + si,
62				"b" + si,
63				"aa" + si,
64				"ab" + si,
65				"ba" + si,
66				"bb" + si,
67			}
68			ids := make([]uint64, 0, len(d))
69			for _, s := range d {
70				id, inserted := m.PutString(s)
71				if !inserted {
72					t.Errorf("expected to have inserted string %q, but did not", s)
73				}
74				ids = append(ids, id)
75			}
76			for i, s := range d {
77				id, inserted := m.PutString(s)
78				if inserted {
79					t.Errorf("inserted string %q, but expected to have not done so", s)
80				}
81				if id != ids[i] {
82					t.Errorf("expected string %q to have ID %d, but got %d instead", s, ids[i], id)
83				}
84			}
85		}(i)
86	}
87	wg.Wait()
88	m.Reset()
89}
90