blob: 80be75db720448c1ddab7e9379d66f319ab653a6 [file] [log] [blame]
// Copyright 2023 syzkaller project authors. All rights reserved.
// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
package vcs
import (
"testing"
"github.com/google/syzkaller/pkg/debugtracer"
"github.com/google/syzkaller/pkg/kconfig"
"github.com/google/syzkaller/pkg/report/crash"
"github.com/stretchr/testify/assert"
)
func TestDropLinuxSanitizerConfigs(t *testing.T) {
tests := []struct {
name string
types []crash.Type
test func(*testing.T, *kconfig.ConfigFile)
}{
{
name: "warning",
types: []crash.Type{crash.Warning},
test: func(t *testing.T, cf *kconfig.ConfigFile) {
assertConfigs(t, cf, "BUG")
assert.Equal(t,
`"param1=a param2=b rcupdate.rcu_cpu_stall_suppress=1"`,
cf.Value("CMDLINE"),
)
},
},
{
name: "kasan bug",
types: []crash.Type{crash.KASAN},
test: func(t *testing.T, cf *kconfig.ConfigFile) {
assertConfigs(t, cf, "KASAN")
},
},
{
name: "warning & kasan bug",
types: []crash.Type{crash.Warning, crash.KASAN},
test: func(t *testing.T, cf *kconfig.ConfigFile) {
assertConfigs(t, cf, "KASAN", "BUG")
},
},
{
name: "lockdep",
types: []crash.Type{crash.LockdepBug},
test: func(t *testing.T, cf *kconfig.ConfigFile) {
assertConfigs(t, cf, "LOCKDEP", "PROVE_LOCKING")
},
},
{
name: "rcu stall",
types: []crash.Type{crash.Hang},
test: func(t *testing.T, cf *kconfig.ConfigFile) {
assertConfigs(t, cf, "RCU_STALL_COMMON")
assert.Equal(t, `"param1=a param2=b"`, cf.Value("CMDLINE"))
},
},
}
const base = `
CONFIG_CMDLINE="param1=a param2=b"
CONFIG_BUG=y
CONFIG_KASAN=y
CONFIG_LOCKDEP=y
CONFIG_RCU_STALL_COMMON=y
CONFIG_UBSAN=y
CONFIG_DEBUG_ATOMIC_SLEEP=y
CONFIG_PROVE_LOCKING=y
`
for _, test := range tests {
test := test
t.Run(test.name, func(t *testing.T) {
conf, err := kconfig.ParseConfigData([]byte(base), "base")
if err != nil {
t.Fatal(err)
}
setLinuxSanitizerConfigs(conf, test.types, &debugtracer.NullTracer{})
test.test(t, conf)
})
}
}
// Ensure we don't add "rcupdate.rcu_cpu_stall_suppress=1" twice.
func TestNoDoubleRcuSuppress(t *testing.T) {
const base = `
CONFIG_CMDLINE="param1=a rcupdate.rcu_cpu_stall_suppress=1 param2=b"
CONFIG_BUG=y
CONFIG_KASAN=y
`
conf, err := kconfig.ParseConfigData([]byte(base), "base")
if err != nil {
t.Fatal(err)
}
setLinuxSanitizerConfigs(conf, []crash.Type{crash.Warning}, &debugtracer.NullTracer{})
assert.Equal(t,
`"param1=a rcupdate.rcu_cpu_stall_suppress=1 param2=b"`,
conf.Value("CMDLINE"),
)
}
func assertConfigs(t *testing.T, cf *kconfig.ConfigFile, names ...string) {
var setConfigs []string
for _, name := range names {
if cf.Value(name) == kconfig.Yes {
setConfigs = append(setConfigs, name)
}
}
assert.ElementsMatch(t, setConfigs, names)
}