blob: ad5b1d81d44d799dc28ef909020ff281d04ca837 [file] [log] [blame]
package commit_msg
import (
"context"
"testing"
"github.com/stretchr/testify/require"
"go.skia.org/infra/autoroll/go/config"
"go.skia.org/infra/autoroll/go/config_vars"
"go.skia.org/infra/go/chrome_branch"
"go.skia.org/infra/go/chrome_branch/mocks"
"go.skia.org/infra/go/deepequal/assertdeep"
"go.skia.org/infra/go/testutils"
"go.skia.org/infra/go/testutils/unittest"
)
const (
fakeChildBugLink = "https://file-a-child-bug.com"
fakeParentBugLink = "https://file-a-parent-bug.com"
fakeParentName = "fake/parent"
)
// fakeCommitMsgConfig returns a valid CommitMsgConfig instance.
func fakeCommitMsgConfig(t *testing.T) *config.CommitMsgConfig {
c := &config.CommitMsgConfig{
BugProject: fakeBugProject,
ChildLogUrlTmpl: "https://fake-child-log/{{.RollingFrom}}..{{.RollingTo}}",
CqExtraTrybots: []string{"some-trybot-on-m{{.Branches.Chromium.Beta.Milestone}}"},
CqDoNotCancelTrybots: true,
ExtraFooters: []string{"My-Footer: BlahBlah", "My-Other-Footer: Blah"},
IncludeLog: true,
IncludeRevisionCount: true,
IncludeTbrLine: true,
IncludeTests: true,
Template: &config.CommitMsgConfig_BuiltIn_{
BuiltIn: config.CommitMsgConfig_DEFAULT,
},
}
// Sanity check.
require.NoError(t, c.Validate())
return c
}
// fakeRegistry returns a config_vars.Registry instance.
func fakeRegistry(t *testing.T) *config_vars.Registry {
cbc := &mocks.Client{}
mockBranches := []*chrome_branch.Branch{
{
Milestone: 93,
Number: 4577,
Ref: "refs/branch-heads/4577",
V8Branch: "9.3",
},
{
Milestone: 92,
Number: 4515,
Ref: "refs/branch-heads/4515",
V8Branch: "9.2",
},
{
Milestone: 91,
Number: 4472,
Ref: "refs/branch-heads/4472",
V8Branch: "9.1",
},
}
cbc.On("Get", testutils.AnyContext).Return(&chrome_branch.Branches{
Main: mockBranches[0],
Beta: mockBranches[1],
Stable: mockBranches[2],
}, mockBranches, nil)
reg, err := config_vars.NewRegistry(context.Background(), cbc)
require.NoError(t, err)
return reg
}
// fakeBuilder returns a Builder instance.
func fakeBuilder(t *testing.T) *Builder {
reg := fakeRegistry(t)
b, err := NewBuilder(fakeCommitMsgConfig(t), reg, fakeChildName, fakeParentName, fakeServerURL, "", "", fakeTransitiveDeps)
require.NoError(t, err)
return b
}
func TestMakeVars(t *testing.T) {
unittest.SmallTest(t)
reg := fakeRegistry(t)
check := func(fn func(*Builder)) {
c := fakeCommitMsgConfig(t)
b, err := NewBuilder(c, reg, fakeChildName, fakeParentName, fakeServerURL, fakeChildBugLink, fakeParentBugLink, fakeTransitiveDeps)
require.NoError(t, err)
fn(b)
from, to, revs, reviewers, _ := FakeCommitMsgInputs()
vars, err := makeVars(c, reg.Vars(), b.childName, b.parentName, b.serverURL, fakeChildBugLink, fakeParentBugLink, b.transitiveDeps, from, to, revs, reviewers)
require.NoError(t, err)
// Bugs.
var expectBugs int
if c.BugProject == "" {
expectBugs = 0
} else if c.BugProject != fakeBugProject {
expectBugs = 0
} else {
expectBugs = 2 // From fakeCommitMsgInputs.
}
require.Len(t, vars.Bugs, expectBugs)
// CqExtratrybots.
require.Len(t, vars.CqExtraTrybots, 1)
require.Equal(t, "some-trybot-on-m92", vars.CqExtraTrybots[0])
// Log URL.
if c.ChildLogUrlTmpl == "" {
require.Equal(t, vars.ChildLogURL, "")
} else {
require.Equal(t, vars.ChildLogURL, "https://fake-child-log/aaaaaaaaaaaa..cccccccccccc")
}
// RollingFrom and RollingTo.
require.Equal(t, fixupRevision(from), vars.RollingFrom)
require.Equal(t, fixupRevision(to), vars.RollingTo)
// Tests.
if c.IncludeTests {
require.Len(t, vars.Tests, 1)
} else {
require.Len(t, vars.Tests, 0)
}
// TransitiveDeps.
if len(b.transitiveDeps) == 0 {
require.Len(t, vars.TransitiveDeps, 0)
} else {
// Only two of the transitive deps differ.
require.Len(t, vars.TransitiveDeps, 2)
assertdeep.Equal(t, &transitiveDepUpdate{
Dep: "parent/dep1",
RollingFrom: "dddddddddddddddddddddddddddddddddddddddd",
RollingTo: "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
}, vars.TransitiveDeps[0])
assertdeep.Equal(t, &transitiveDepUpdate{
Dep: "parent/dep3",
RollingFrom: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
RollingTo: "cccccccccccccccccccccccccccccccccccccccc",
}, vars.TransitiveDeps[1])
}
}
// Default config includes everything.
check(func(b *Builder) {})
// No bugs.
check(func(b *Builder) {
b.cfg.BugProject = ""
})
check(func(b *Builder) {
b.cfg.BugProject = "bogus project; doesn't match anything"
})
// No log URL template.
check(func(b *Builder) {
b.cfg.ChildLogUrlTmpl = ""
})
// No revisions.
check(func(b *Builder) {
b.cfg.IncludeLog = false
})
// No tests.
check(func(b *Builder) {
b.cfg.IncludeTests = false
})
// No transitive deps.
check(func(b *Builder) {
b.transitiveDeps = nil
})
}
func TestNamedTemplatesValid(t *testing.T) {
unittest.SmallTest(t)
cfg := fakeCommitMsgConfig(t)
for tmpl := range namedCommitMsgTemplates {
cfg.Template = &config.CommitMsgConfig_BuiltIn_{
BuiltIn: tmpl,
}
require.NoError(t, cfg.Validate())
}
}
func TestQuotedLines(t *testing.T) {
unittest.SmallTest(t)
c := fakeCommitMsgConfig(t)
c.Template = &config.CommitMsgConfig_Custom{
Custom: `{{- define "revisions" -}}
{{ range .Revisions }}{{ .Timestamp.Format "2006-01-02" }} {{ .Author }} {{ .Description }}
{{ quotedLines .Details }}
{{ end }}
{{ end -}}
`,
}
reg := fakeRegistry(t)
b, err := NewBuilder(c, reg, fakeChildName, fakeParentName, fakeServerURL, "", "", fakeTransitiveDeps)
require.NoError(t, err)
from, to, revs, reviewers, _ := FakeCommitMsgInputs()
for _, rev := range revs {
rev.Details += `
Change-Id: If3fd7d9b2ec5aaf7f048df1029b732b28378999d
`
}
msg, err := b.Build(from, to, revs, reviewers, false)
require.NoError(t, err)
require.Equal(t, `Roll fake/child/src from aaaaaaaaaaaa to cccccccccccc (2 revisions)
2020-04-17 c@google.com Commit C
> blah blah
>
> ccccccc
>
> blah
>
> Change-Id: If3fd7d9b2ec5aaf7f048df1029b732b28378999d
>
2020-04-16 b@google.com Commit B
> blah blah
>
> bbbbbbb
>
> blah
>
> Change-Id: If3fd7d9b2ec5aaf7f048df1029b732b28378999d
>
If this roll has caused a breakage, revert this CL and stop the roller
using the controls here:
https://fake.server.com/r/fake-autoroll
Please CC reviewer@google.com on the revert to ensure that a human
is aware of the problem.
To report a problem with the AutoRoller itself, please file a bug:
https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug
Documentation for the AutoRoller is here:
https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
Cq-Include-Trybots: some-trybot-on-m92
Cq-Do-Not-Cancel-Tryjobs: true
Bug: fakebugproject:1234,fakebugproject:5678
Tbr: reviewer@google.com
Test: some-test
My-Footer: BlahBlah
My-Other-Footer: Blah
`, msg)
}