mirror of
https://github.com/dutchcoders/transfer.sh.git
synced 2020-11-18 19:53:40 -08:00
172 lines
3.6 KiB
Go
172 lines
3.6 KiB
Go
// 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))
|
|
}
|
|
}
|