blob: 4823d6ac819254067217a63a32ccc6206a04cef0 [file] [log] [blame]
package analyzer
import (
"context"
"path/filepath"
"testing"
"go.skia.org/infra/bazel/go/bazel"
cpb "go.skia.org/infra/cabe/go/proto"
"go.skia.org/infra/cabe/go/replaybackends"
cabe_stats "go.skia.org/infra/cabe/go/stats"
"github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts"
"google.golang.org/protobuf/testing/protocmp"
"github.com/stretchr/testify/assert"
)
const fakeBenchmarkName = "fake benchmark name"
var (
cabeSpec = &cpb.ExperimentSpec{
Analysis: &cpb.AnalysisSpec{
Benchmark: []*cpb.Benchmark{{
Name: "fake benchmark name",
Workload: []string{
"Compositing.Display.DrawToSwapUs",
"Graphics.Smoothness.Jank.AllAnimations",
"Graphics.Smoothness.Jank.AllSequences",
"Graphics.Smoothness.PercentDroppedFrames3.AllAnimations",
"Graphics.Smoothness.PercentDroppedFrames3.AllSequences",
"Memory.GPU.PeakMemoryUsage2.PageLoad",
"metrics_duration",
"motionmark",
"motionmarkLower",
"motionmarkUpper",
"renderingMetric_duration",
"trace_import_duration",
"umaMetric_duration",
},
}},
},
Common: &cpb.ArmSpec{
BuildSpec: []*cpb.BuildSpec{{
GitilesCommit: &cpb.GitilesCommit{
Project: "chromium",
Id: "b692c01",
},
}},
RunSpec: []*cpb.RunSpec{{
Os: "Mac",
SyntheticProductName: "Macmini9,1_arm64-64-Apple_M1_apple m1_16384_1_5693005.2",
}},
},
Control: &cpb.ArmSpec{},
Treatment: &cpb.ArmSpec{
BuildSpec: []*cpb.BuildSpec{{
GerritChanges: []*cpb.GerritChange{{
PatchsetHash: "d4565f9",
}},
}},
},
}
cabeResults = []Results{
{
Benchmark: fakeBenchmarkName,
WorkLoad: "Compositing.Display.DrawToSwapUs",
BuildConfig: "",
RunConfig: "Mac,arm",
Statistics: &cabe_stats.BerfWilcoxonSignedRankedTestResult{
Estimate: -66.30783735699579,
LowerCi: -67.77167618955136,
UpperCi: -64.67566905094428,
PValue: 3.610001186871159e-12,
XMedian: 4220.841672500003,
YMedian: 12861.869927307689,
},
},
{
Benchmark: fakeBenchmarkName,
WorkLoad: "Graphics.Smoothness.Jank.AllAnimations",
BuildConfig: "",
RunConfig: "Mac,arm",
Statistics: &cabe_stats.BerfWilcoxonSignedRankedTestResult{
Estimate: -16.73062483206894,
LowerCi: -21.120670031839595,
UpperCi: -13.138801973339953,
PValue: 1.3489114306741e-07,
XMedian: 2.8,
YMedian: 3.2,
},
},
{
Benchmark: fakeBenchmarkName,
WorkLoad: "Graphics.Smoothness.Jank.AllSequences",
BuildConfig: "",
RunConfig: "Mac,arm",
Statistics: &cabe_stats.BerfWilcoxonSignedRankedTestResult{
Estimate: -16.73062483206894,
LowerCi: -21.120670031839595,
UpperCi: -13.138801973339953,
PValue: 1.3489114306741e-07,
XMedian: 2.8,
YMedian: 3.2,
},
},
{
Benchmark: fakeBenchmarkName,
WorkLoad: "Graphics.Smoothness.PercentDroppedFrames3.AllAnimations",
BuildConfig: "",
RunConfig: "Mac,arm",
Statistics: &cabe_stats.BerfWilcoxonSignedRankedTestResult{
Estimate: -4.621028211793865,
LowerCi: -10.557585442069328,
UpperCi: 1.7101263441554604,
PValue: 0.12098409484052819,
XMedian: 16.6,
YMedian: 18.2,
},
},
{
Benchmark: fakeBenchmarkName,
WorkLoad: "Graphics.Smoothness.PercentDroppedFrames3.AllSequences",
BuildConfig: "",
RunConfig: "Mac,arm",
Statistics: &cabe_stats.BerfWilcoxonSignedRankedTestResult{
Estimate: -4.621028211793865,
LowerCi: -10.557585442069328,
UpperCi: 1.7101263441554604,
PValue: 0.12098409484052819,
XMedian: 16.6,
YMedian: 18.2,
},
},
{
Benchmark: fakeBenchmarkName,
WorkLoad: "Memory.GPU.PeakMemoryUsage2.PageLoad",
BuildConfig: "",
RunConfig: "Mac,arm",
Statistics: &cabe_stats.BerfWilcoxonSignedRankedTestResult{
Estimate: -4.247016655834912,
LowerCi: -5.278978221402397,
UpperCi: -3.2108781224263527,
PValue: 1.8427925750551541e-09,
XMedian: 72.66666666666667,
YMedian: 75.33333333333333,
},
},
{
Benchmark: fakeBenchmarkName,
WorkLoad: "metrics_duration",
BuildConfig: "",
RunConfig: "Mac,arm",
Statistics: &cabe_stats.BerfWilcoxonSignedRankedTestResult{
Estimate: 0.8482862740345709,
LowerCi: -0.2859781113841775,
UpperCi: 1.858087165306177,
PValue: 0.1592140742909307,
XMedian: 6786.875,
YMedian: 6709.8125,
},
},
{
Benchmark: fakeBenchmarkName,
WorkLoad: "motionmark",
BuildConfig: "",
RunConfig: "Mac,arm",
Statistics: &cabe_stats.BerfWilcoxonSignedRankedTestResult{
Estimate: 32.379285235910714,
LowerCi: 8.806785244533177,
UpperCi: 54.97965702347043,
PValue: 0.008840583696913873,
XMedian: 420.8447767851758,
YMedian: 393.5,
},
},
{
Benchmark: fakeBenchmarkName,
WorkLoad: "motionmarkLower",
BuildConfig: "",
RunConfig: "Mac,arm",
Statistics: &cabe_stats.BerfWilcoxonSignedRankedTestResult{
Estimate: 51.31135620023197,
LowerCi: 24.235675882547667,
UpperCi: 80.72348755186569,
PValue: 7.632395510914769e-05,
XMedian: 397.89662355293524,
YMedian: 318,
},
},
{
Benchmark: fakeBenchmarkName,
WorkLoad: "motionmarkUpper",
BuildConfig: "",
RunConfig: "Mac,arm",
Statistics: &cabe_stats.BerfWilcoxonSignedRankedTestResult{
Estimate: 13.704720839623374,
LowerCi: -6.729178442198935,
UpperCi: 31.114821028841778,
PValue: 0.18215234689722948,
XMedian: 443.39272609936535,
YMedian: 497,
},
},
{
Benchmark: fakeBenchmarkName,
WorkLoad: "renderingMetric_duration",
BuildConfig: "",
RunConfig: "Mac,arm",
Statistics: &cabe_stats.BerfWilcoxonSignedRankedTestResult{
Estimate: 0.68934637669682,
LowerCi: -0.2584134232097246,
UpperCi: 1.6487635502799636,
PValue: 0.12043215769345683,
XMedian: 454,
YMedian: 449,
},
},
{
Benchmark: fakeBenchmarkName,
WorkLoad: "trace_import_duration",
BuildConfig: "",
RunConfig: "Mac,arm",
Statistics: &cabe_stats.BerfWilcoxonSignedRankedTestResult{
Estimate: 0.8448450266459018,
LowerCi: -0.36873794758962575,
UpperCi: 1.9245630078938092,
PValue: 0.1612044338739682,
XMedian: 6316.666499999999,
YMedian: 6247.375,
},
},
{
Benchmark: fakeBenchmarkName,
WorkLoad: "umaMetric_duration",
BuildConfig: "",
RunConfig: "Mac,arm",
Statistics: &cabe_stats.BerfWilcoxonSignedRankedTestResult{
Estimate: 0.0022244196845155884,
LowerCi: -0.0018183524108428273,
UpperCi: 15.464824031447932,
PValue: 0.3329511135593646,
XMedian: 6,
YMedian: 6,
},
},
}
commonArmSpec = &cpb.ArmSpec{
BuildSpec: []*cpb.BuildSpec{
{
GitilesCommit: &cpb.GitilesCommit{
Project: "chromium",
Id: "b692c01",
},
},
},
RunSpec: []*cpb.RunSpec{
{
Os: "Mac",
SyntheticProductName: "Macmini9,1_arm64-64-Apple_M1_apple m1_16384_1_5693005.2",
},
},
}
analysisResults = []*cpb.AnalysisResult{
{
ExperimentSpec: &cpb.ExperimentSpec{
Common: cabeSpec.Common,
Control: cabeSpec.Control,
Treatment: cabeSpec.Treatment,
Analysis: &cpb.AnalysisSpec{
Benchmark: []*cpb.Benchmark{
{
Name: fakeBenchmarkName,
Workload: []string{cabeResults[0].WorkLoad},
},
},
},
},
Statistic: &cpb.Statistic{
Upper: cabeResults[0].Statistics.UpperCi,
Lower: cabeResults[0].Statistics.LowerCi,
PValue: cabeResults[0].Statistics.PValue,
ControlMedian: cabeResults[0].Statistics.YMedian,
TreatmentMedian: cabeResults[0].Statistics.XMedian,
},
},
}
)
func TestRun_withReplayBackends(t *testing.T) {
ctx := context.Background()
path := filepath.Join(
bazel.RunfilesDir(),
"external/cabe_replay_data",
// https://pinpoint-dot-chromeperf.appspot.com/job/16f46f1c260000
"pinpoint_16f46f1c260000.zip")
replayer := replaybackends.FromZipFile(
path,
fakeBenchmarkName,
)
a := New(
"16f46f1c260000",
WithCASResultReader(replayer.CASResultReader),
WithSwarmingTaskReader(replayer.SwarmingTaskReader),
)
res, err := a.Run(ctx)
assert.NoError(t, err)
assert.Equal(t, len(res), 13)
// Check that the analyzer correctly inferred the ExperimentSpec from the
// swarming task metadata and PerfResults json from RBE-CAS.
gotExpSpec := a.ExperimentSpec()
expectedExpSpec := cabeSpec
diff := cmp.Diff(expectedExpSpec, gotExpSpec,
cmpopts.EquateEmpty(),
cmpopts.EquateApprox(0, 0.03),
protocmp.Transform())
assert.Equal(t, "", diff)
// check CABE statistical results
byWorkload := func(a, b Results) bool {
return a.WorkLoad < b.WorkLoad
}
diff = cmp.Diff(cabeResults, res,
cmpopts.SortSlices(byWorkload),
cmpopts.EquateEmpty(),
cmpopts.EquateApprox(0, 0.03),
protocmp.Transform())
assert.Equal(t, "", diff)
gotAnalysisResults := a.AnalysisResults()
assert.Equal(t, len(res), len(gotAnalysisResults), "Analyzer should generate the same number of Result structs as it does AnalysisResult protos")
// Just check the first *cpb.AnalysisResult proto to make sure
// it contains the same data as the first Result struct.
diff = cmp.Diff(analysisResults[:1], gotAnalysisResults[:1],
cmpopts.EquateEmpty(),
cmpopts.EquateApprox(0, 0.03),
protocmp.Transform())
assert.Equal(t, "", diff)
}