lnd/tools/linters/ll_test.go
Elle Mouton bd55b2795b
tools/linters: ignore log lines
This commit adds a feature to our custom lll linter which will ignore
log lines (both single and multi-lined log lines) for the lll linter.
2024-12-02 09:14:21 +02:00

155 lines
4.5 KiB
Go

package linters
import (
"os"
"regexp"
"strings"
"testing"
"github.com/stretchr/testify/require"
)
// TestGetLLLIssuesForFile tests the line-too-long linter.
//
//nolint:ll
func TestGetLLLIssuesForFile(t *testing.T) {
// Test data
testCases := []struct {
name string
content string
logRegex string
expectedIssue []string
}{
{
name: "Single long line",
content: `
fmt.Println("This is a very long line that exceeds the maximum length and should be flagged by the linter.")`,
logRegex: defaultLogRegex,
expectedIssue: []string{
"the line is 140 characters long, which " +
"exceeds the maximum of 80 characters.",
},
},
{
name: "Multiple long lines",
content: `
fmt.Println("This is a very long line that exceeds the maximum length and should be flagged by the linter.")
fmt.Println("This is a another very long line that exceeds the maximum length and should be flagged by the linter.")`,
logRegex: defaultLogRegex,
expectedIssue: []string{
"the line is 140 characters long, which " +
"exceeds the maximum of 80 characters.",
"the line is 148 characters long, which " +
"exceeds the maximum of 80 characters.",
},
},
{
name: "Short lines",
logRegex: defaultLogRegex,
content: `
fmt.Println("Short line")`,
},
{
name: "Directive ignored",
logRegex: defaultLogRegex,
content: `//go:generate something very very very very very very very very very long and complex here wowowow`,
},
{
name: "Long single line import",
logRegex: defaultLogRegex,
content: `import "github.com/lightningnetwork/lnd/lnrpc/walletrpc/more/more/more/more/more/more/ok/that/is/enough"`,
},
{
name: "Multi-line import",
logRegex: defaultLogRegex,
content: `
import (
"os"
"fmt"
"github.com/lightningnetwork/lnd/lnrpc/walletrpc/more/ok/that/is/enough"
)`,
},
{
name: "Long single line log",
logRegex: defaultLogRegex,
content: `
log.Infof("This is a very long log line but since it is a log line, it should be skipped by the linter."),
rpcLog.Info("Another long log line with a slightly different name and should still be skipped")`,
},
{
name: "Long single line log followed by a non-log line",
logRegex: defaultLogRegex,
content: `
log.Infof("This is a very long log line but since it is a log line, it should be skipped by the linter.")
fmt.Println("This is a very long line that exceeds the maximum length and should be flagged by the linter.")`,
expectedIssue: []string{
"the line is 140 characters long, which " +
"exceeds the maximum of 80 characters.",
},
},
{
name: "Multi-line log",
logRegex: defaultLogRegex,
content: `
log.Infof("This is a very long log line but
since it is a log line, it
should be skipped by the linter.")`,
},
{
name: "Multi-line log followed by a non-log line",
logRegex: defaultLogRegex,
content: `
log.Infof("This is a very long log line but
since it is a log line, it
should be skipped by the linter.")
fmt.Println("This is a very long line that
exceeds the maximum length and
should be flagged by the linter.")`,
expectedIssue: []string{
"the line is 82 characters long, which " +
"exceeds the maximum of 80 characters.",
},
},
{
name: "Only skip 'S' logs",
logRegex: `^\s*.*(L|l)og\.(Info|Debug|Trace|Warn|Error|Critical)S\(`,
content: `
log.Infof("A long log line but it is not an S log and so should be caught")
log.InfoS("This is a very long log line but
since it is an 'S' log line, it
should be skipped by the linter.")
log.TraceS("Another S log that should be skipped by the linter")`,
expectedIssue: []string{
"the line is 107 characters long, which " +
"exceeds the maximum of 80 characters.",
},
},
}
tabSpaces := strings.Repeat(" ", defaultTabWidthInSpaces)
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
logRegex := regexp.MustCompile(tc.logRegex)
// Write content to a temporary file.
tmpFile := t.TempDir() + "/test.go"
err := os.WriteFile(tmpFile, []byte(tc.content), 0644)
require.NoError(t, err)
// Run the linter on the file.
issues, err := getLLLIssuesForFile(
tmpFile, defaultMaxLineLen, tabSpaces, logRegex,
)
require.NoError(t, err)
require.Len(t, issues, len(tc.expectedIssue))
for i, issue := range issues {
require.Equal(
t, tc.expectedIssue[i], issue.text,
)
}
})
}
}