Home | History | Annotate | Download | only in pprof
      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