| // Copyright 2025 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package runtime_test | |
| import ( | |
| "os" | |
| "regexp" | |
| "runtime" | |
| "testing" | |
| ) | |
| func validateMapLabels(t *testing.T, labels []string) { | |
| // These are the specific region labels that need get added during the | |
| // runtime phase. Hence they are the ones that need to be confirmed as | |
| // present at the time the test reads its own region labels, which | |
| // is sufficient to validate that the default `decoratemappings` value | |
| // (enabled) was set early enough in the init process. | |
| regions := map[string]bool{ | |
| "allspans array": false, | |
| "gc bits": false, | |
| "heap": false, | |
| "heap index": false, | |
| "heap reservation": false, | |
| "immortal metadata": false, | |
| "page alloc": false, | |
| "page alloc index": false, | |
| "page summary": false, | |
| "scavenge index": false, | |
| } | |
| for _, label := range labels { | |
| if _, ok := regions[label]; !ok { | |
| t.Logf("unexpected region label found: \"%s\"", label) | |
| } | |
| regions[label] = true | |
| } | |
| for label, found := range regions { | |
| if !found { | |
| t.Logf("region label missing: \"%s\"", label) | |
| } | |
| } | |
| } | |
| func TestDecorateMappings(t *testing.T) { | |
| if runtime.GOOS != "linux" { | |
| t.Skip("decoratemappings is only supported on Linux") | |
| // /proc/self/maps is also Linux-specific | |
| } | |
| var labels []string | |
| if rawMaps, err := os.ReadFile("/proc/self/maps"); err != nil { | |
| t.Fatalf("failed to read /proc/self/maps: %v", err) | |
| } else { | |
| t.Logf("maps:%s\n", string(rawMaps)) | |
| matches := regexp.MustCompile("[^[]+ \\[anon: Go: (.+)\\]\n").FindAllSubmatch(rawMaps, -1) | |
| for _, match_pair := range matches { | |
| // match_pair consists of the matching substring and the parenthesized group | |
| labels = append(labels, string(match_pair[1])) | |
| } | |
| } | |
| t.Logf("DebugDecorateMappings: %v", *runtime.DebugDecorateMappings) | |
| if *runtime.DebugDecorateMappings != 0 && runtime.SetVMANameSupported() { | |
| validateMapLabels(t, labels) | |
| } else { | |
| if len(labels) > 0 { | |
| t.Errorf("unexpected mapping labels present: %v", labels) | |
| } else { | |
| t.Skip("mapping labels absent as expected") | |
| } | |
| } | |
| } |