Source file src/runtime/pprof/runtime_test.go

     1  // Copyright 2017 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 pprof
     6  
     7  import (
     8  	"context"
     9  	"fmt"
    10  	"reflect"
    11  	"testing"
    12  )
    13  
    14  func TestSetGoroutineLabels(t *testing.T) {
    15  	sync := make(chan struct{})
    16  
    17  	wantLabels := map[string]string{}
    18  	if gotLabels := getProfLabel(); !reflect.DeepEqual(gotLabels, wantLabels) {
    19  		t.Errorf("Expected parent goroutine's profile labels to be empty before test, got %v", gotLabels)
    20  	}
    21  	go func() {
    22  		if gotLabels := getProfLabel(); !reflect.DeepEqual(gotLabels, wantLabels) {
    23  			t.Errorf("Expected child goroutine's profile labels to be empty before test, got %v", gotLabels)
    24  		}
    25  		sync <- struct{}{}
    26  	}()
    27  	<-sync
    28  
    29  	wantLabels = map[string]string{"key": "value"}
    30  	ctx := WithLabels(context.Background(), Labels("key", "value"))
    31  	SetGoroutineLabels(ctx)
    32  	if gotLabels := getProfLabel(); !reflect.DeepEqual(gotLabels, wantLabels) {
    33  		t.Errorf("parent goroutine's profile labels: got %v, want %v", gotLabels, wantLabels)
    34  	}
    35  	go func() {
    36  		if gotLabels := getProfLabel(); !reflect.DeepEqual(gotLabels, wantLabels) {
    37  			t.Errorf("child goroutine's profile labels: got %v, want %v", gotLabels, wantLabels)
    38  		}
    39  		sync <- struct{}{}
    40  	}()
    41  	<-sync
    42  
    43  	wantLabels = map[string]string{}
    44  	ctx = context.Background()
    45  	SetGoroutineLabels(ctx)
    46  	if gotLabels := getProfLabel(); !reflect.DeepEqual(gotLabels, wantLabels) {
    47  		t.Errorf("Expected parent goroutine's profile labels to be empty, got %v", gotLabels)
    48  	}
    49  	go func() {
    50  		if gotLabels := getProfLabel(); !reflect.DeepEqual(gotLabels, wantLabels) {
    51  			t.Errorf("Expected child goroutine's profile labels to be empty, got %v", gotLabels)
    52  		}
    53  		sync <- struct{}{}
    54  	}()
    55  	<-sync
    56  }
    57  
    58  func TestDo(t *testing.T) {
    59  	wantLabels := map[string]string{}
    60  	if gotLabels := getProfLabel(); !reflect.DeepEqual(gotLabels, wantLabels) {
    61  		t.Errorf("Expected parent goroutine's profile labels to be empty before Do, got %v", gotLabels)
    62  	}
    63  
    64  	Do(context.Background(), Labels("key1", "value1", "key2", "value2"), func(ctx context.Context) {
    65  		wantLabels := map[string]string{"key1": "value1", "key2": "value2"}
    66  		if gotLabels := getProfLabel(); !reflect.DeepEqual(gotLabels, wantLabels) {
    67  			t.Errorf("parent goroutine's profile labels: got %v, want %v", gotLabels, wantLabels)
    68  		}
    69  
    70  		sync := make(chan struct{})
    71  		go func() {
    72  			wantLabels := map[string]string{"key1": "value1", "key2": "value2"}
    73  			if gotLabels := getProfLabel(); !reflect.DeepEqual(gotLabels, wantLabels) {
    74  				t.Errorf("child goroutine's profile labels: got %v, want %v", gotLabels, wantLabels)
    75  			}
    76  			sync <- struct{}{}
    77  		}()
    78  		<-sync
    79  
    80  	})
    81  
    82  	wantLabels = map[string]string{}
    83  	if gotLabels := getProfLabel(); !reflect.DeepEqual(gotLabels, wantLabels) {
    84  		fmt.Printf("%#v", gotLabels)
    85  		fmt.Printf("%#v", wantLabels)
    86  		t.Errorf("Expected parent goroutine's profile labels to be empty after Do, got %v", gotLabels)
    87  	}
    88  }
    89  
    90  func getProfLabel() map[string]string {
    91  	l := (*labelMap)(runtime_getProfLabel())
    92  	if l == nil {
    93  		return map[string]string{}
    94  	}
    95  	return *l
    96  }
    97  

View as plain text