// Copyright 2015 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 profile import ( "bytes" "testing" ) func TestEmptyProfile(t *testing.T) { var buf bytes.Buffer p, err := Parse(&buf) if err != nil { t.Error("Want no error, got", err) } if p == nil { t.Fatal("Want a valid profile, got <nil>") } if !p.Empty() { t.Errorf("Profile should be empty, got %#v", p) } } func TestParseContention(t *testing.T) { tests := []struct { name string in string wantErr bool }{ { name: "valid", in: `--- mutex: cycles/second=3491920901 sampling period=1 43227965305 1659640 @ 0x45e851 0x45f764 0x4a2be1 0x44ea31 34035731690 15760 @ 0x45e851 0x45f764 0x4a2b17 0x44ea31 `, }, { name: "valid with comment", in: `--- mutex: cycles/second=3491920901 sampling period=1 43227965305 1659640 @ 0x45e851 0x45f764 0x4a2be1 0x44ea31 # 0x45e850 sync.(*Mutex).Unlock+0x80 /go/src/sync/mutex.go:126 # 0x45f763 sync.(*RWMutex).Unlock+0x83 /go/src/sync/rwmutex.go:125 # 0x4a2be0 main.main.func3+0x70 /go/src/internal/pprof/profile/a_binary.go:58 34035731690 15760 @ 0x45e851 0x45f764 0x4a2b17 0x44ea31 # 0x45e850 sync.(*Mutex).Unlock+0x80 /go/src/sync/mutex.go:126 # 0x45f763 sync.(*RWMutex).Unlock+0x83 /go/src/sync/rwmutex.go:125 # 0x4a2b16 main.main.func2+0xd6 /go/src/internal/pprof/profile/a_binary.go:48 `, }, { name: "empty", in: `--- mutex:`, wantErr: true, }, { name: "invalid header", in: `--- channel: 43227965305 1659640 @ 0x45e851 0x45f764 0x4a2be1 0x44ea31`, wantErr: true, }, } for _, tc := range tests { _, err := parseContention([]byte(tc.in)) if tc.wantErr && err == nil { t.Errorf("parseContention(%q) succeeded unexpectedly", tc.name) } if !tc.wantErr && err != nil { t.Errorf("parseContention(%q) failed unexpectedly: %v", tc.name, err) } } }