// Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package profiler import ( "bytes" "io" "testing" "cloud.google.com/go/profiler/testdata" "github.com/google/pprof/profile" ) func TestGoHeapProfile(t *testing.T) { oldStartCPUProfile, oldStopCPUProfile, oldWriteHeapProfile, oldSleep := startCPUProfile, stopCPUProfile, writeHeapProfile, sleep defer func() { startCPUProfile, stopCPUProfile, writeHeapProfile, sleep = oldStartCPUProfile, oldStopCPUProfile, oldWriteHeapProfile, oldSleep }() tests := []struct { name string profile *profile.Profile wantErr bool }{ { name: "valid heap profile", profile: testdata.HeapProfileCollected1, }, { name: "profile with too few sample types", profile: testdata.AllocProfileUploaded, wantErr: true, }, { name: "profile with incorrect sample types", profile: &profile.Profile{ DurationNanos: 10e9, SampleType: []*profile.ValueType{ {Type: "objects", Unit: "count"}, {Type: "alloc_space", Unit: "bytes"}, {Type: "inuse_objects", Unit: "count"}, {Type: "inuse_space", Unit: "bytes"}, }, }, wantErr: true, }, } for _, tc := range tests { var profileBytes bytes.Buffer tc.profile.Write(&profileBytes) writeHeapProfile = func(w io.Writer) error { w.Write(profileBytes.Bytes()) return nil } _, err := goHeapProfile() if tc.wantErr { if err == nil { t.Errorf("%s: goHeapProfile() got no error, want error", tc.name) } continue } if err != nil { t.Errorf("%s: goHeapProfile() got %q, want no error", tc.name, err) } } }