// Copyright 2014 Google Inc. All Rights Reserved. // // 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 profile import ( "bytes" "testing" "github.com/google/pprof/internal/proftest" ) var testM = []*Mapping{ { ID: 1, Start: 1, Limit: 10, Offset: 0, File: "file1", BuildID: "buildid1", HasFunctions: true, HasFilenames: true, HasLineNumbers: true, HasInlineFrames: true, }, { ID: 2, Start: 10, Limit: 30, Offset: 9, File: "file1", BuildID: "buildid2", HasFunctions: true, HasFilenames: true, HasLineNumbers: true, HasInlineFrames: true, }, } var testF = []*Function{ {ID: 1, Name: "func1", SystemName: "func1", Filename: "file1"}, {ID: 2, Name: "func2", SystemName: "func2", Filename: "file1"}, {ID: 3, Name: "func3", SystemName: "func3", Filename: "file2"}, {ID: 4, Name: "func4", SystemName: "func4", Filename: "file3"}, {ID: 5, Name: "func5", SystemName: "func5", Filename: "file4"}, } var testL = []*Location{ { ID: 1, Address: 1, Mapping: testM[0], Line: []Line{ { Function: testF[0], Line: 2, }, { Function: testF[1], Line: 2222222, }, }, }, { ID: 2, Mapping: testM[1], Address: 11, Line: []Line{ { Function: testF[2], Line: 2, }, }, }, { ID: 3, Mapping: testM[1], Address: 12, }, { ID: 4, Mapping: testM[1], Address: 12, Line: []Line{ { Function: testF[4], Line: 6, }, { Function: testF[4], Line: 6, }, }, IsFolded: true, }, } var all = &Profile{ PeriodType: &ValueType{Type: "cpu", Unit: "milliseconds"}, Period: 10, DurationNanos: 10e9, SampleType: []*ValueType{ {Type: "cpu", Unit: "cycles"}, {Type: "object", Unit: "count"}, }, Sample: []*Sample{ { Location: []*Location{testL[0], testL[1], testL[2], testL[1], testL[1]}, Label: map[string][]string{ "key1": {"value1"}, "key2": {"value2"}, }, Value: []int64{10, 20}, }, { Location: []*Location{testL[1], testL[2], testL[0], testL[1]}, Value: []int64{30, 40}, Label: map[string][]string{ "key1": {"value1"}, "key2": {"value2"}, }, NumLabel: map[string][]int64{ "key1": {1, 2}, "key2": {3, 4}, "bytes": {3, 4}, "requests": {1, 1, 3, 4, 5}, "alignment": {3, 4}, }, NumUnit: map[string][]string{ "requests": {"", "", "seconds", "", "s"}, "alignment": {"kilobytes", "kilobytes"}, }, }, }, Function: testF, Mapping: testM, Location: testL, Comments: []string{"Comment 1", "Comment 2"}, } func TestMarshalUnmarshal(t *testing.T) { // Write the profile, parse it, and ensure they're equal. var buf bytes.Buffer all.Write(&buf) all2, err := Parse(&buf) if err != nil { t.Fatal(err) } js1 := proftest.EncodeJSON(&all) js2 := proftest.EncodeJSON(&all2) if string(js1) != string(js2) { t.Errorf("profiles differ") d, err := proftest.Diff(js1, js2) if err != nil { t.Fatal(err) } t.Error("\n" + string(d)) } }