diff --git a/.github/renovate.json b/.github/renovate.json index f214c99..547256f 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -5,6 +5,62 @@ "postUpdateOptions": [ "gomodTidy" ], + "packageRules": [ + { + "matchManagers": [ + "github-actions" + ], + "matchUpdateTypes": [ + "patch", + "minor" + ], + "groupName": "github-actions", + "groupSlug": "github-actions" + }, + { + "matchManagers": [ + "gomod" + ], + "matchUpdateTypes": [ + "patch", + "minor" + ], + "matchPackageNames": [ + "github.com/google/**", + "github.com/spf13/**", + "github.com/vishvananda/**", + "github.com/yl2chen/**", + "go.uber.org/atomic", + "go.uber.org/multierr", + "go.uber.org/ratelimit", + "go.uber.org/zap", + "golang.org/x/**", + "gopkg.in/yaml.v3" + ], + "groupName": "go runtime dependencies", + "groupSlug": "go-runtime" + }, + { + "matchManagers": [ + "gomod" + ], + "matchUpdateTypes": [ + "patch", + "minor" + ], + "matchPackageNames": [ + "github.com/benbjohnson/**", + "github.com/davecgh/**", + "github.com/inconshreveable/**", + "github.com/josharian/**", + "github.com/pmezard/**", + "github.com/stretchr/**", + "go.uber.org/mock" + ], + "groupName": "go dev dependencies", + "groupSlug": "go-dev" + } + ], "ignoreDeps": [ "golang.org/x/net" ] diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d9e76a1..40b32e3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ permissions: jobs: go: runs-on: ubuntu-latest - container: golang:1.19-alpine + container: golang:1.25-alpine env: CGO_ENABLED: 1 GOFLAGS: -buildvcs=false @@ -44,24 +44,19 @@ jobs: path: | /go/pkg/mod /root/.cache/go-build - key: ${{ runner.os }}-go-1.19-${{ hashFiles('**/go.sum') }} + key: ${{ runner.os }}-go-1.25-${{ hashFiles('**/go.sum') }} restore-keys: | - ${{ runner.os }}-go-1.19- + ${{ runner.os }}-go-1.25- - name: Check Go formatting run: test -z "$(gofmt -l .)" - name: Run golangci-lint - uses: golangci/golangci-lint-action@v6 + uses: golangci/golangci-lint-action@v9 with: - version: v1.49.0 + version: v2.12 args: --verbose - - name: Run revive - run: | - go install github.com/mgechev/revive@v1.2.3 - "$(go env GOPATH)/bin/revive" -config .revive.toml -formatter friendly ./... - - name: Run Go tests run: go test ./... -v -cover diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4f96bff..c828933 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -22,7 +22,7 @@ concurrency: jobs: release: runs-on: ubuntu-latest - container: golang:1.19-alpine + container: golang:1.25-alpine env: RELEASE_KIND: ${{ inputs.release_kind }} CGO_ENABLED: 1 @@ -52,9 +52,9 @@ jobs: path: | /go/pkg/mod /root/.cache/go-build - key: ${{ runner.os }}-go-1.19-${{ hashFiles('**/go.sum') }} + key: ${{ runner.os }}-go-1.25-${{ hashFiles('**/go.sum') }} restore-keys: | - ${{ runner.os }}-go-1.19- + ${{ runner.os }}-go-1.25- - name: Install git-cliff uses: taiki-e/install-action@git-cliff diff --git a/.golangci.yml b/.golangci.yml index 265a2c2..166d0f1 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,41 +1,69 @@ +version: "2" + linters: + disable: + - errcheck enable: - dogsled - - exportloopref + - gochecknoinits - funlen - gocognit - goconst - gocritic - gocyclo - - gofmt - - goimports + - nolintlint + - paralleltest + - testifylint - staticcheck - gosec - - govet - misspell - nestif - prealloc + - revive - unconvert - unparam + exclusions: + paths: + - ".*_easyjson\\.go$" + rules: + - linters: + - gosec + text: "G404" # math/rand; used to generate pseudo-random source ports + - linters: + - gosec + text: "G115" # integer conversion + - linters: + - funlen + - goconst + path: _test\.go + settings: + revive: + severity: warning + confidence: 0.8 + rules: + - name: blank-imports + - name: context-as-argument + - name: context-keys-type + - name: dot-imports + - name: error-return + - name: error-strings + - name: empty-block + - name: superfluous-else + - name: unhandled-error + - name: unused-receiver + - name: unreachable-code + - name: range-val-in-closure + - name: range-val-address + - name: waitgroup-by-value + - name: atomic + - name: early-return + - name: unconditional-recursion + - name: identical-branches + +formatters: + enable: + - gofmt + - goimports run: timeout: 3m - skip-files: - - ".*_easyjson\\.go$" - -issues: - exclude-rules: - - linters: - - gosec - text: "G404" # math/rand; used to generate pseudo-random source ports - - path: pkg/scan/elastic - linters: - - gosec - text: "G402" # TLS insecure; used in Elasticsearch scan to ignore TLS cert - - path: pkg/scan/docker - linters: - - gosec - text: "G402" # TLS insecure; used in Docker scan to ignore TLS cert - - linters: - - funlen - path: _test\.go diff --git a/.revive.toml b/.revive.toml deleted file mode 100644 index fdf5ea4..0000000 --- a/.revive.toml +++ /dev/null @@ -1,44 +0,0 @@ -ignoreGeneratedHeader = false -severity = "warning" -confidence = 0.8 -errorCode = 1 -warningCode = 1 - -#Recommended rules -[rule.blank-imports] -[rule.context-as-argument] -[rule.context-keys-type] -[rule.dot-imports] -[rule.error-return] -[rule.error-strings] -[rule.error-naming] -[rule.if-return] -[rule.increment-decrement] -[rule.var-naming] -[rule.var-declaration] -[rule.range] -[rule.receiver-naming] -[rule.time-naming] -[rule.unexported-return] -[rule.indent-error-flow] -[rule.errorf] -[rule.empty-block] -[rule.superfluous-else] -[rule.unused-parameter] -[rule.unreachable-code] -[rule.redefines-builtin-id] - -#Custom rules -[rule.modifies-parameter] -[rule.unnecessary-stmt] -[rule.confusing-naming] -[rule.modifies-value-receiver] -[rule.range-val-in-closure] -[rule.range-val-address] -[rule.waitgroup-by-value] -[rule.atomic] -[rule.unused-receiver] -[rule.early-return] -[rule.unconditional-recursion] -[rule.identical-branches] -[rule.defer] \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index e2ea98d..b6da59a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,11 @@ -FROM golang:1.19-alpine as builder +FROM golang:1.25-alpine AS builder RUN apk add --no-cache libpcap-dev libc-dev gcc linux-headers ADD . /app WORKDIR /app RUN go build -ldflags "-w -s -linkmode external -extldflags '-static'" -o /sx -FROM alpine:3.16 +FROM alpine:3.24 COPY --from=builder /sx /sx ENTRYPOINT ["/sx"] diff --git a/README.md b/README.md index 08b7b50..64f55c4 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@
[![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/v-byte-cpu/sx/blob/master/LICENSE) -[![Build Status](https://cloud.drone.io/api/badges/v-byte-cpu/sx/status.svg)](https://cloud.drone.io/v-byte-cpu/sx) +[![Build Status](https://github.com/v-byte-cpu/sx/actions/workflows/ci.yml/badge.svg)](https://github.com/v-byte-cpu/sx/actions/workflows/ci.yml) [![GoReportCard Status](https://goreportcard.com/badge/github.com/v-byte-cpu/sx)](https://goreportcard.com/report/github.com/v-byte-cpu/sx) ![Platform](https://img.shields.io/badge/platform-linux%2Fdocker-blue) @@ -51,7 +51,7 @@ The simplest way is to download from [GitHub Releases](https://github.com/v-byte Requirements: - * [Go 1.15 or newer](https://golang.org/dl/) + * [Go 1.25 or newer](https://golang.org/dl/) * [libpcap](https://www.tcpdump.org/) (already installed if you use **wireshark**) From the root of the source tree, run: diff --git a/command/arp.go b/command/arp.go index b5bd6bd..9fdfa72 100644 --- a/command/arp.go +++ b/command/arp.go @@ -98,7 +98,7 @@ func (o *arpCmdOpts) getLogger() (logger log.Logger, err error) { } func (o *arpCmdOpts) newARPScanMethod(ctx context.Context) *arp.ScanMethod { - var reqgen scan.RequestGenerator = scan.NewIPRequestGenerator(scan.NewIPGenerator()) + reqgen := scan.NewIPRequestGenerator(scan.NewIPGenerator()) if o.excludeIPs != nil { reqgen = scan.NewFilterIPRequestGenerator(reqgen, o.excludeIPs) } diff --git a/command/arp_test.go b/command/arp_test.go index 82d7924..20908c6 100644 --- a/command/arp_test.go +++ b/command/arp_test.go @@ -26,7 +26,9 @@ func TestArpCmdDstSubnetError(t *testing.T) { }, } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() cmd := newARPCmd().cmd err := cmd.RunE(cmd, tt.args) require.Error(t, err) @@ -47,7 +49,7 @@ func TestARPCmdOptsInitCliFlags(t *testing.T) { }, " "), " ")) require.NoError(t, err) - require.Equal(t, true, opts.json) + require.True(t, opts.json) require.Equal(t, "eth0", opts.rawInterface) require.Equal(t, net.IPv4(192, 168, 0, 1), opts.srcIP) require.Equal(t, "00:11:22:33:44:55", opts.rawSrcMAC) diff --git a/command/config_test.go b/command/config_test.go index 353984f..5aad87c 100644 --- a/command/config_test.go +++ b/command/config_test.go @@ -10,6 +10,7 @@ import ( "github.com/google/gopacket/layers" "github.com/spf13/cobra" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/v-byte-cpu/sx/pkg/scan" ) @@ -24,7 +25,7 @@ func TestPacketScanCmdOptsInitCliFlags(t *testing.T) { "--json -i eth0 --srcip 192.168.0.1 --srcmac 00:11:22:33:44:55 -r 500/7s --exit-delay 10s --exclude ips.txt", " ")) require.NoError(t, err) - require.Equal(t, true, opts.json) + require.True(t, opts.json) require.Equal(t, "eth0", opts.rawInterface) require.Equal(t, net.IPv4(192, 168, 0, 1), opts.srcIP) require.Equal(t, "00:11:22:33:44:55", opts.rawSrcMAC) @@ -61,7 +62,7 @@ func TestIPScanCmdOptsInitCliFlags(t *testing.T) { }, " "), " ")) require.NoError(t, err) - require.Equal(t, true, opts.json) + require.True(t, opts.json) require.Equal(t, "eth0", opts.rawInterface) require.Equal(t, net.IPv4(192, 168, 0, 1), opts.srcIP) require.Equal(t, "00:11:22:33:44:55", opts.rawSrcMAC) @@ -108,7 +109,7 @@ func TestIPPortScanCmdOptsInitCliFlags(t *testing.T) { }, " "), " ")) require.NoError(t, err) - require.Equal(t, true, opts.json) + require.True(t, opts.json) require.Equal(t, "eth0", opts.rawInterface) require.Equal(t, net.IPv4(192, 168, 0, 1), opts.srcIP) require.Equal(t, "00:11:22:33:44:55", opts.rawSrcMAC) @@ -160,7 +161,7 @@ func TestGenericScanCmdOptsInitCliFlags(t *testing.T) { "--json -p 23-57,71-2733 -f ip_file.jsonl -w 300 -r 500/7s --exit-delay 10s --exclude ips.txt --ports-file ports.txt", " ")) require.NoError(t, err) - require.Equal(t, true, opts.json) + require.True(t, opts.json) require.Equal(t, "23-57,71-2733", opts.rawPortRanges) require.Equal(t, "ports.txt", opts.portFile) require.Equal(t, "ip_file.jsonl", opts.ipFile) @@ -212,7 +213,9 @@ func TestIPScanCmdOptsIsARPCacheFromStdin(t *testing.T) { }, } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() require.Equal(t, tt.expected, tt.opts.isARPCacheFromStdin()) }) } @@ -265,7 +268,9 @@ func TestIPScanCmdOptsValidateARPStdin(t *testing.T) { }, } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() err := tt.opts.validateARPStdin() if tt.shouldErr { require.Error(t, err) @@ -311,7 +316,9 @@ func TestIPScanCmdOptsParseDstSubnet(t *testing.T) { }, } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() result, err := tt.opts.parseDstSubnet(tt.args) if tt.shouldErr { require.Error(t, err) @@ -358,7 +365,9 @@ func TestGenericScanCmdOptsParseDstSubnet(t *testing.T) { }, } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() result, err := tt.opts.parseDstSubnet(tt.args) if tt.shouldErr { require.Error(t, err) @@ -413,7 +422,9 @@ func TestGenericScanCmdOptsParseScanRange(t *testing.T) { }, } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() result, err := tt.opts.parseScanRange(tt.args) if tt.shouldErr { require.Error(t, err) @@ -451,7 +462,9 @@ func TestParsePortRangeError(t *testing.T) { } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() _, err := parsePortRange(tt.portsRange) require.Error(t, err) }) @@ -485,7 +498,9 @@ func TestParsePortRange(t *testing.T) { } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() ports, err := parsePortRange(tt.portsRange) require.NoError(t, err) require.Equal(t, tt.expected, ports) @@ -552,7 +567,9 @@ func TestParsePortRanges(t *testing.T) { } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() ports, err := parsePortRanges(tt.portsRange) require.NoError(t, err) require.Equal(t, tt.expected, ports) @@ -594,7 +611,9 @@ func TestParseRateLimitError(t *testing.T) { } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() _, _, err := parseRateLimit(tt.rateLimit) require.Error(t, err) }) @@ -643,7 +662,9 @@ func TestParseRateLimit(t *testing.T) { } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() rate, rateWindow, err := parseRateLimit(tt.rateLimit) require.NoError(t, err) require.Equal(t, tt.expectedRateCount, rate) @@ -683,7 +704,9 @@ func TestParsePacketPayload(t *testing.T) { } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() result, err := parsePacketPayload(tt.input) require.NoError(t, err) require.Equal(t, tt.expected, result) @@ -717,7 +740,9 @@ func TestParseIPFlagsError(t *testing.T) { } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() _, err := parseIPFlags(tt.flags) require.Error(t, err) }) @@ -800,7 +825,9 @@ func TestParseIPFlags(t *testing.T) { } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() result, err := parseIPFlags(tt.flags) require.NoError(t, err) require.Equal(t, tt.expected, result) @@ -914,14 +941,18 @@ func TestParseExcludeFile(t *testing.T) { return io.NopCloser(strings.NewReader(tt.input)), nil }) if tt.err { - require.Error(t, err) + assert.Error(t, err) + return + } + if !assert.NoError(t, err) { return } - require.NoError(t, err) for _, ip := range tt.contains { ok, err := ips.Contains(ip) - require.NoError(t, err) - require.True(t, ok, "ip set does not contain ip %s", ip) + if !assert.NoError(t, err) { + return + } + assert.True(t, ok, "ip set does not contain ip %s", ip) } }() waitDone(t, done) @@ -1043,11 +1074,13 @@ func TestParsePortsFile(t *testing.T) { return io.NopCloser(strings.NewReader(tt.input)), nil }) if tt.err { - require.Error(t, err) + assert.Error(t, err) return } - require.NoError(t, err) - require.Equal(t, tt.expected, ports) + if !assert.NoError(t, err) { + return + } + assert.Equal(t, tt.expected, ports) }() waitDone(t, done) }) diff --git a/command/icmp_test.go b/command/icmp_test.go index 2a77743..cb8ba74 100644 --- a/command/icmp_test.go +++ b/command/icmp_test.go @@ -27,7 +27,9 @@ func TestICMPCmdDstSubnetError(t *testing.T) { }, } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() cmd := newICMPCmd().cmd err := cmd.RunE(cmd, tt.args) require.Error(t, err) @@ -49,7 +51,7 @@ func TestICMPCmdOptsInitCliFlags(t *testing.T) { }, " "), " ")) require.NoError(t, err) - require.Equal(t, true, opts.json) + require.True(t, opts.json) require.Equal(t, "eth0", opts.rawInterface) require.Equal(t, net.IPv4(192, 168, 0, 1), opts.srcIP) require.Equal(t, "00:11:22:33:44:55", opts.rawSrcMAC) diff --git a/command/log/logger_test.go b/command/log/logger_test.go index 4c7a7f1..6972988 100644 --- a/command/log/logger_test.go +++ b/command/log/logger_test.go @@ -55,7 +55,9 @@ func TestJSONLoggerResults(t *testing.T) { } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() var buf bytes.Buffer logger, err := NewLogger(&buf, "arp", JSON()) @@ -115,7 +117,9 @@ func TestPlainLoggerResults(t *testing.T) { } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() var buf bytes.Buffer logger, err := NewLogger(&buf, "arp", Plain()) @@ -145,7 +149,9 @@ func TestLoggerContextExit(t *testing.T) { var buf bytes.Buffer logger, err := NewLogger(&buf, "arp", Plain()) - require.NoError(t, err) + if !assert.NoError(t, err) { + return + } logger.LogResults(ctx, nil) }() diff --git a/command/log/unique_logger_test.go b/command/log/unique_logger_test.go index d9b4f7f..282d5f9 100644 --- a/command/log/unique_logger_test.go +++ b/command/log/unique_logger_test.go @@ -67,7 +67,9 @@ func TestUniqueLoggerResults(t *testing.T) { } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() var buf bytes.Buffer plainLogger, err := NewLogger(&buf, "arp") @@ -98,7 +100,9 @@ func TestUniqueLoggerContextExit(t *testing.T) { var buf bytes.Buffer logger, err := NewLogger(&buf, "arp", Plain()) - require.NoError(t, err) + if !assert.NoError(t, err) { + return + } uniqLogger := NewUniqueLogger(logger) <-uniqLogger.uniqResults(ctx, nil) diff --git a/command/root.go b/command/root.go index 7f94c5d..2ae3fb6 100644 --- a/command/root.go +++ b/command/root.go @@ -3,7 +3,6 @@ package command import ( "context" "fmt" - "math/rand" "os" "sync" "time" @@ -17,7 +16,6 @@ import ( ) func Main(version string) { - rand.Seed(time.Now().Unix()) if err := newRootCmd(version).Execute(); err != nil { os.Exit(1) } diff --git a/command/socks_test.go b/command/socks_test.go index d6e8d96..5ba6fd6 100644 --- a/command/socks_test.go +++ b/command/socks_test.go @@ -25,7 +25,9 @@ func TestSocksCmdDstSubnetError(t *testing.T) { }, } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() cmd := newSocksCmd().cmd err := cmd.RunE(cmd, tt.args) require.Error(t, err) @@ -43,7 +45,7 @@ func TestSocksCmdOptsInitCliFlags(t *testing.T) { "--json -p 23-57,71-2733 -f ip_file.jsonl -w 300 --exit-delay 10s --timeout 2s", " ")) require.NoError(t, err) - require.Equal(t, true, opts.json) + require.True(t, opts.json) require.Equal(t, "23-57,71-2733", opts.rawPortRanges) require.Equal(t, "ip_file.jsonl", opts.ipFile) require.Equal(t, 300, opts.workers) diff --git a/command/tcp_test.go b/command/tcp_test.go index ef7c5b4..1c4d100 100644 --- a/command/tcp_test.go +++ b/command/tcp_test.go @@ -27,7 +27,9 @@ func TestTCPCmdDstSubnetError(t *testing.T) { }, } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() f := func(cmd *cobra.Command) { err := cmd.RunE(cmd, tt.args) require.Error(t, err) @@ -56,7 +58,7 @@ func TestTCPCmdOptsInitCliFlags(t *testing.T) { }, " "), " ")) require.NoError(t, err) - require.Equal(t, true, opts.json) + require.True(t, opts.json) require.Equal(t, "eth0", opts.rawInterface) require.Equal(t, net.IPv4(192, 168, 0, 1), opts.srcIP) require.Equal(t, "00:11:22:33:44:55", opts.rawSrcMAC) @@ -191,7 +193,9 @@ func TestParseTCPFlags(t *testing.T) { } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() result, err := parseTCPFlags(tt.input) require.NoError(t, err) require.Equal(t, tt.expected, result) @@ -221,7 +225,9 @@ func TestParseTCPFlagsError(t *testing.T) { } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() _, err := parseTCPFlags(tt.input) require.Error(t, err) }) diff --git a/command/udp_test.go b/command/udp_test.go index 402df47..f5d423b 100644 --- a/command/udp_test.go +++ b/command/udp_test.go @@ -28,7 +28,9 @@ func TestUDPCmdDstSubnetError(t *testing.T) { }, } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() cmd := newUDPCmd().cmd err := cmd.RunE(cmd, tt.args) require.Error(t, err) @@ -51,7 +53,7 @@ func TestUDPCmdOptsInitCliFlags(t *testing.T) { }, " "), " ")) require.NoError(t, err) - require.Equal(t, true, opts.json) + require.True(t, opts.json) require.Equal(t, "eth0", opts.rawInterface) require.Equal(t, net.IPv4(192, 168, 0, 1), opts.srcIP) require.Equal(t, "00:11:22:33:44:55", opts.rawSrcMAC) diff --git a/go.mod b/go.mod index 9efc3cc..8b8744c 100644 --- a/go.mod +++ b/go.mod @@ -1,31 +1,38 @@ module github.com/v-byte-cpu/sx -go 1.19 +go 1.25.0 require ( - github.com/golang/mock v1.6.0 - github.com/google/gopacket v1.1.20-0.20210304165259-20562ffb40f8 - github.com/mailru/easyjson v0.7.7 - github.com/spf13/cobra v1.5.0 - github.com/stretchr/testify v1.8.0 - github.com/vishvananda/netlink v1.1.0 + github.com/google/gopacket v1.1.20-0.20250319234736-b7d9dbd15ae4 + github.com/mailru/easyjson v0.9.2 + github.com/spf13/cobra v1.10.2 + github.com/stretchr/testify v1.11.1 + github.com/vishvananda/netlink v1.3.1 github.com/yl2chen/cidranger v1.0.2 - go.uber.org/ratelimit v0.2.0 - go.uber.org/zap v1.23.0 - golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d + go.uber.org/mock v0.6.0 + go.uber.org/ratelimit v0.3.1 + go.uber.org/zap v1.28.0 + golang.org/x/net v0.56.0 ) require ( - github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129 // indirect + github.com/benbjohnson/clock v1.3.5 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/josharian/intern v1.0.0 // indirect - github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - golang.org/x/sys v0.0.0-20211205182925-97ca703d548d // indirect + github.com/spf13/pflag v1.0.10 // indirect + github.com/vishvananda/netns v0.0.5 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/mod v0.27.0 // indirect + golang.org/x/sync v0.16.0 // indirect + golang.org/x/sys v0.46.0 // indirect + golang.org/x/tools v0.36.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) + +tool ( + github.com/mailru/easyjson/easyjson + go.uber.org/mock/mockgen +) diff --git a/go.sum b/go.sum index a8fafd9..7ea1a2c 100644 --- a/go.sum +++ b/go.sum @@ -1,87 +1,74 @@ -github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129 h1:MzBOUgng9orim59UnfUTLRjMpd09C5uEVQ6RPGeCaVI= -github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129/go.mod h1:rFgpPQZYZ8vdbc+48xibu8ALc3yeyd64IhHS+PU6Yyg= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= +github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/google/gopacket v1.1.20-0.20210304165259-20562ffb40f8 h1:FU2/d0krhJFVXjbGP3S9dJJFLOfSG0drhIZuTdyvzqE= -github.com/google/gopacket v1.1.20-0.20210304165259-20562ffb40f8/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gopacket v1.1.20-0.20250319234736-b7d9dbd15ae4 h1:iRhvvcuUeT5yDyWSnZewU+tJvKapX5VjBxqG+gU89FM= +github.com/google/gopacket v1.1.20-0.20250319234736-b7d9dbd15ae4/go.mod h1:E8yiKNM3ZzChWoaXdHg08eM+bqgp6nkbaoKwsqVK5Y8= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/mailru/easyjson v0.9.2 h1:dX8U45hQsZpxd80nLvDGihsQ/OxlvTkVUXH2r/8cb2M= +github.com/mailru/easyjson v0.9.2/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= +github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/vishvananda/netlink v1.1.0 h1:1iyaYNBLmP6L0220aDnYQpo1QEV4t4hJ+xEEhhJH8j0= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df h1:OviZH7qLw/7ZovXvuNyL3XQl8UFofeikI1NW1Gypu7k= +github.com/vishvananda/netlink v1.3.1 h1:3AEMt62VKqz90r0tmNhog0r/PpWKmrEShJU0wJW6bV0= +github.com/vishvananda/netlink v1.3.1/go.mod h1:ARtKouGSTGchR8aMwmkzC0qiNPrrWO5JS/XMVl45+b4= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vishvananda/netns v0.0.5 h1:DfiHV+j8bA32MFM7bfEunvT8IAqQ/NzSJHtcmW5zdEY= +github.com/vishvananda/netns v0.0.5/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= github.com/yl2chen/cidranger v1.0.2 h1:lbOWZVCG1tCRX4u24kuM1Tb4nHqWkDxwLdoS+SevawU= github.com/yl2chen/cidranger v1.0.2/go.mod h1:9U1yz7WPYDwf0vpNWFaeRh0bjwz5RVgRy/9UEQfHl0g= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/ratelimit v0.2.0 h1:UQE2Bgi7p2B85uP5dC2bbRtig0C+OeNRnNEafLjsLPA= -go.uber.org/ratelimit v0.2.0/go.mod h1:YYBV4e4naJvhpitQrWJu1vCpgB7CboMe0qhltKt6mUg= -go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY= -go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= +go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/ratelimit v0.3.1 h1:K4qVE+byfv/B3tC+4nYWP7v/6SimcO7HzHekoMNBma0= +go.uber.org/ratelimit v0.3.1/go.mod h1:6euWsTB6U/Nb3X++xEUXA8ciPJvr19Q/0h1+oDcJhRk= +go.uber.org/zap v1.28.0 h1:IZzaP1Fv73/T/pBMLk4VutPl36uNC+OSUh3JLG3FIjo= +go.uber.org/zap v1.28.0/go.mod h1:rDLpOi171uODNm/mxFcuYWxDsqWSAVkFdX4XojSKg/Q= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ= +golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d h1:LO7XpTYMwTqxjLcGWPijK3vRXg1aWdlNOVOHRq45d7c= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o= +golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec= +golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211205182925-97ca703d548d h1:FjkYO/PPp4Wi0EAUOVLxePm7qVW4r4ctbWpURyuOD0E= -golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw= +golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= +golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/main_test.go b/main_test.go index 95f2fc8..f33d42a 100644 --- a/main_test.go +++ b/main_test.go @@ -28,7 +28,9 @@ func TestBuildVersion(t *testing.T) { }, } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() result := buildVersion(tt.version, tt.commit) require.Equal(t, tt.expected, result) }) diff --git a/pkg/ip/ip_test.go b/pkg/ip/ip_test.go index 66bf3d8..cba834f 100644 --- a/pkg/ip/ip_test.go +++ b/pkg/ip/ip_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestParseIPNetWithError(t *testing.T) { @@ -40,8 +41,9 @@ func TestParseIPNet(t *testing.T) { for _, vtt := range tests { tt := vtt t.Run(tt.name, func(t *testing.T) { + t.Parallel() result, err := ParseIPNet(tt.in) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, tt.expected, result) }) diff --git a/pkg/packet/mock_receiver_test.go b/pkg/packet/mock_receiver_test.go index a818ecd..1abf3c0 100644 --- a/pkg/packet/mock_receiver_test.go +++ b/pkg/packet/mock_receiver_test.go @@ -1,5 +1,10 @@ // Code generated by MockGen. DO NOT EDIT. // Source: receiver.go +// +// Generated by this command: +// +// mockgen -destination=mock_receiver_test.go -package=packet -source receiver.go +// // Package packet is a generated GoMock package. package packet @@ -8,14 +13,15 @@ import ( context "context" reflect "reflect" - gomock "github.com/golang/mock/gomock" gopacket "github.com/google/gopacket" + gomock "go.uber.org/mock/gomock" ) // MockProcessor is a mock of Processor interface. type MockProcessor struct { ctrl *gomock.Controller recorder *MockProcessorMockRecorder + isgomock struct{} } // MockProcessorMockRecorder is the mock recorder for MockProcessor. @@ -44,7 +50,7 @@ func (m *MockProcessor) ProcessPacketData(data []byte, ci *gopacket.CaptureInfo) } // ProcessPacketData indicates an expected call of ProcessPacketData. -func (mr *MockProcessorMockRecorder) ProcessPacketData(data, ci interface{}) *gomock.Call { +func (mr *MockProcessorMockRecorder) ProcessPacketData(data, ci any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ProcessPacketData", reflect.TypeOf((*MockProcessor)(nil).ProcessPacketData), data, ci) } @@ -53,6 +59,7 @@ func (mr *MockProcessorMockRecorder) ProcessPacketData(data, ci interface{}) *go type MockReader struct { ctrl *gomock.Controller recorder *MockReaderMockRecorder + isgomock struct{} } // MockReaderMockRecorder is the mock recorder for MockReader. @@ -92,6 +99,7 @@ func (mr *MockReaderMockRecorder) ReadPacketData() *gomock.Call { type MockReceiver struct { ctrl *gomock.Controller recorder *MockReceiverMockRecorder + isgomock struct{} } // MockReceiverMockRecorder is the mock recorder for MockReceiver. @@ -120,7 +128,7 @@ func (m *MockReceiver) ReceivePackets(ctx context.Context) <-chan error { } // ReceivePackets indicates an expected call of ReceivePackets. -func (mr *MockReceiverMockRecorder) ReceivePackets(ctx interface{}) *gomock.Call { +func (mr *MockReceiverMockRecorder) ReceivePackets(ctx any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReceivePackets", reflect.TypeOf((*MockReceiver)(nil).ReceivePackets), ctx) } diff --git a/pkg/packet/mock_sender_test.go b/pkg/packet/mock_sender_test.go index 146a968..227c2d0 100644 --- a/pkg/packet/mock_sender_test.go +++ b/pkg/packet/mock_sender_test.go @@ -1,5 +1,10 @@ // Code generated by MockGen. DO NOT EDIT. // Source: sender.go +// +// Generated by this command: +// +// mockgen -destination=mock_sender_test.go -package=packet -source sender.go +// // Package packet is a generated GoMock package. package packet @@ -8,13 +13,14 @@ import ( context "context" reflect "reflect" - gomock "github.com/golang/mock/gomock" + gomock "go.uber.org/mock/gomock" ) // MockSender is a mock of Sender interface. type MockSender struct { ctrl *gomock.Controller recorder *MockSenderMockRecorder + isgomock struct{} } // MockSenderMockRecorder is the mock recorder for MockSender. @@ -35,16 +41,16 @@ func (m *MockSender) EXPECT() *MockSenderMockRecorder { } // SendPackets mocks base method. -func (m *MockSender) SendPackets(ctx context.Context, in <-chan *BufferData) (<-chan interface{}, <-chan error) { +func (m *MockSender) SendPackets(ctx context.Context, in <-chan *BufferData) (<-chan any, <-chan error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SendPackets", ctx, in) - ret0, _ := ret[0].(<-chan interface{}) + ret0, _ := ret[0].(<-chan any) ret1, _ := ret[1].(<-chan error) return ret0, ret1 } // SendPackets indicates an expected call of SendPackets. -func (mr *MockSenderMockRecorder) SendPackets(ctx, in interface{}) *gomock.Call { +func (mr *MockSenderMockRecorder) SendPackets(ctx, in any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendPackets", reflect.TypeOf((*MockSender)(nil).SendPackets), ctx, in) } @@ -53,6 +59,7 @@ func (mr *MockSenderMockRecorder) SendPackets(ctx, in interface{}) *gomock.Call type MockWriter struct { ctrl *gomock.Controller recorder *MockWriterMockRecorder + isgomock struct{} } // MockWriterMockRecorder is the mock recorder for MockWriter. @@ -81,7 +88,7 @@ func (m *MockWriter) WritePacketData(pkt []byte) error { } // WritePacketData indicates an expected call of WritePacketData. -func (mr *MockWriterMockRecorder) WritePacketData(pkt interface{}) *gomock.Call { +func (mr *MockWriterMockRecorder) WritePacketData(pkt any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WritePacketData", reflect.TypeOf((*MockWriter)(nil).WritePacketData), pkt) } diff --git a/pkg/packet/receiver.go b/pkg/packet/receiver.go index abea6af..241ddfc 100644 --- a/pkg/packet/receiver.go +++ b/pkg/packet/receiver.go @@ -1,4 +1,4 @@ -//go:generate mockgen -destination=mock_receiver_test.go -package=packet -source receiver.go +//go:generate go tool mockgen -destination=mock_receiver_test.go -package=packet -source receiver.go package packet diff --git a/pkg/packet/receiver_test.go b/pkg/packet/receiver_test.go index 0c15a2d..c77ad8b 100644 --- a/pkg/packet/receiver_test.go +++ b/pkg/packet/receiver_test.go @@ -8,9 +8,10 @@ import ( "syscall" "testing" - "github.com/golang/mock/gomock" "github.com/google/gopacket" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.uber.org/mock/gomock" ) func newCaptureInfo() *gopacket.CaptureInfo { @@ -65,7 +66,7 @@ func TestReceivePacketsWithUnrecoverableError(t *testing.T) { out := r.ReceivePackets(context.Background()) result := chanToSlice(t, chanErrToGeneric(out), 0) - assert.Equal(t, 0, len(result), "error slice is not empty") + assert.Empty(t, result, "error slice is not empty") }) } } @@ -91,7 +92,7 @@ func TestReceivePacketsOnePacket(t *testing.T) { out := r.ReceivePackets(context.Background()) result := chanToSlice(t, chanErrToGeneric(out), 0) - assert.Equal(t, 0, len(result), "error slice is not empty") + assert.Empty(t, result, "error slice is not empty") } func TestReceivePacketsOnePacketWithProcessError(t *testing.T) { @@ -114,8 +115,8 @@ func TestReceivePacketsOnePacketWithProcessError(t *testing.T) { out := r.ReceivePackets(context.Background()) result := chanToSlice(t, chanErrToGeneric(out), 1) - assert.Equal(t, 1, len(result), "error slice is invalid") - assert.Error(t, result[0].(error)) + assert.Len(t, result, 1, "error slice is invalid") + require.Error(t, result[0].(error)) } func TestReceivePacketsOnePacketWithRetryError(t *testing.T) { @@ -158,7 +159,7 @@ func TestReceivePacketsOnePacketWithRetryError(t *testing.T) { out := r.ReceivePackets(context.Background()) result := chanToSlice(t, chanErrToGeneric(out), 0) - assert.Equal(t, 0, len(result), "error slice is not empty") + assert.Empty(t, result, "error slice is not empty") }) } } @@ -185,8 +186,8 @@ func TestReceivePacketsOnePacketWithUnknownError(t *testing.T) { out := r.ReceivePackets(context.Background()) result := chanToSlice(t, chanErrToGeneric(out), 1) - assert.Equal(t, 1, len(result), "error slice length is invalid") - assert.Error(t, result[0].(error)) + assert.Len(t, result, 1, "error slice length is invalid") + require.Error(t, result[0].(error)) } func TestReceivePacketsOnePacketWithContextCancel(t *testing.T) { @@ -212,5 +213,5 @@ func TestReceivePacketsOnePacketWithContextCancel(t *testing.T) { out := r.ReceivePackets(ctx) result := chanToSlice(t, chanErrToGeneric(out), 0) - assert.Equal(t, 0, len(result), "error slice is not empty") + assert.Empty(t, result, "error slice is not empty") } diff --git a/pkg/packet/sender.go b/pkg/packet/sender.go index 9928ffe..2db79a2 100644 --- a/pkg/packet/sender.go +++ b/pkg/packet/sender.go @@ -1,4 +1,4 @@ -//go:generate mockgen -destination=mock_sender_test.go -package=packet -source sender.go +//go:generate go tool mockgen -destination=mock_sender_test.go -package=packet -source sender.go package packet diff --git a/pkg/packet/sender_test.go b/pkg/packet/sender_test.go index 2a95b0b..9c8e663 100644 --- a/pkg/packet/sender_test.go +++ b/pkg/packet/sender_test.go @@ -6,10 +6,10 @@ import ( "testing" "time" - "github.com/golang/mock/gomock" "github.com/google/gopacket" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "go.uber.org/mock/gomock" ) func TestSenderWithEmptyChannel(t *testing.T) { @@ -24,9 +24,9 @@ func TestSenderWithEmptyChannel(t *testing.T) { done, errc := s.SendPackets(context.Background(), in) result := chanToSlice(t, chanErrToGeneric(errc), 0) - assert.Equal(t, 0, len(result), "error slice is not empty") + assert.Empty(t, result, "error slice is not empty") result = chanToSlice(t, done, 0) - assert.Equal(t, 0, len(result), "error slice is not empty") + assert.Empty(t, result, "error slice is not empty") } func TestSenderWithOnePacket(t *testing.T) { @@ -50,9 +50,9 @@ func TestSenderWithOnePacket(t *testing.T) { done, errc := s.SendPackets(context.Background(), in) result := chanToSlice(t, chanErrToGeneric(errc), 0) - assert.Equal(t, 0, len(result), "error slice is not empty") + assert.Empty(t, result, "error slice is not empty") result = chanToSlice(t, done, 0) - assert.Equal(t, 0, len(result), "error slice is not empty") + assert.Empty(t, result, "error slice is not empty") } func TestSenderWithTwoPackets(t *testing.T) { @@ -89,9 +89,9 @@ func TestSenderWithTwoPackets(t *testing.T) { done, errc := s.SendPackets(context.Background(), in) result := chanToSlice(t, chanErrToGeneric(errc), 0) - assert.Equal(t, 0, len(result), "error slice is not empty") + assert.Empty(t, result, "error slice is not empty") result = chanToSlice(t, done, 0) - assert.Equal(t, 0, len(result), "error slice is not empty") + assert.Empty(t, result, "error slice is not empty") } func TestSenderWithInvalidPacketReturnsError(t *testing.T) { @@ -107,11 +107,11 @@ func TestSenderWithInvalidPacketReturnsError(t *testing.T) { done, errc := s.SendPackets(context.Background(), in) result := chanToSlice(t, chanErrToGeneric(errc), 1) - assert.Equal(t, 1, len(result), "error slice size is invalid") - assert.Error(t, result[0].(error)) + assert.Len(t, result, 1, "error slice size is invalid") + require.Error(t, result[0].(error)) result = chanToSlice(t, done, 0) - assert.Equal(t, 0, len(result), "error slice is not empty") + assert.Empty(t, result, "error slice is not empty") } func TestSenderWithWriteErrorReturnsError(t *testing.T) { @@ -133,11 +133,11 @@ func TestSenderWithWriteErrorReturnsError(t *testing.T) { done, errc := s.SendPackets(context.Background(), in) result := chanToSlice(t, chanErrToGeneric(errc), 1) - assert.Equal(t, 1, len(result), "error slice size is invalid") - assert.Error(t, result[0].(error)) + assert.Len(t, result, 1, "error slice size is invalid") + require.Error(t, result[0].(error)) result = chanToSlice(t, done, 0) - assert.Equal(t, 0, len(result), "error slice is not empty") + assert.Empty(t, result, "error slice is not empty") } func TestSenderWithTimeout(t *testing.T) { @@ -157,5 +157,5 @@ func TestSenderWithTimeout(t *testing.T) { require.FailNow(t, "exit timeout") } result := chanToSlice(t, done, 0) - assert.Equal(t, 0, len(result), "error slice is not empty") + assert.Empty(t, result, "error slice is not empty") } diff --git a/pkg/scan/arp/arp.go b/pkg/scan/arp/arp.go index 3db4677..4afc2c4 100644 --- a/pkg/scan/arp/arp.go +++ b/pkg/scan/arp/arp.go @@ -1,4 +1,4 @@ -//go:generate easyjson -output_filename result_easyjson.go arp.go +//go:generate go tool easyjson -output_filename result_easyjson.go arp.go package arp diff --git a/pkg/scan/arp/arp_test.go b/pkg/scan/arp/arp_test.go index 277f6fd..5ff6c76 100644 --- a/pkg/scan/arp/arp_test.go +++ b/pkg/scan/arp/arp_test.go @@ -9,7 +9,6 @@ import ( "github.com/google/gopacket" "github.com/google/gopacket/layers" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" "github.com/v-byte-cpu/sx/pkg/scan" ) @@ -47,14 +46,19 @@ func TestProcessPacketData(t *testing.T) { } var opt gopacket.SerializeOptions err := gopacket.SerializeLayers(packet, opt, eth, a) - require.NoError(t, err) + if !assert.NoError(t, err) { + return + } err = sm.ProcessPacketData(packet.Bytes(), &gopacket.CaptureInfo{}) - require.NoError(t, err) + if !assert.NoError(t, err) { + return + } result, ok := <-sm.Results() if !ok { - require.FailNow(t, "results chan is empty") + assert.Fail(t, "results chan is empty") + return } arpResult := result.(*ScanResult) assert.Equal(t, net.HardwareAddr{0x1, 0x2, 0x3, 0x4, 0x5, 0x6}.String(), arpResult.MAC) @@ -62,7 +66,7 @@ func TestProcessPacketData(t *testing.T) { cancel() _, ok = <-sm.Results() - require.False(t, ok, "results chan is not closed") + assert.False(t, ok, "results chan is not closed") }() select { case <-done: diff --git a/pkg/scan/arp/bpf_test.go b/pkg/scan/arp/bpf_test.go index 18b8f4d..286060e 100644 --- a/pkg/scan/arp/bpf_test.go +++ b/pkg/scan/arp/bpf_test.go @@ -34,10 +34,12 @@ func TestBPFFilter(t *testing.T) { } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() filter, maxPacketLength := BPFFilter(tt.scanRange) assert.Equal(t, tt.expectedFilter, filter) - assert.Equal(t, maxPacketLength, MaxPacketLength) + assert.Equal(t, MaxPacketLength, maxPacketLength) }) } } diff --git a/pkg/scan/arp/cache_test.go b/pkg/scan/arp/cache_test.go index 158d973..4fa203d 100644 --- a/pkg/scan/arp/cache_test.go +++ b/pkg/scan/arp/cache_test.go @@ -1,4 +1,4 @@ -//go:generate mockgen -package arp -destination=mock_request_test.go github.com/v-byte-cpu/sx/pkg/scan RequestGenerator +//go:generate go tool mockgen -package arp -destination=mock_request_test.go github.com/v-byte-cpu/sx/pkg/scan RequestGenerator package arp @@ -11,9 +11,10 @@ import ( "testing" "time" - "github.com/golang/mock/gomock" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/v-byte-cpu/sx/pkg/scan" + "go.uber.org/mock/gomock" ) func TestCachePut(t *testing.T) { @@ -21,7 +22,7 @@ func TestCachePut(t *testing.T) { cache := NewCache() cache.Put(net.IPv4(192, 168, 0, 2).To4(), net.HardwareAddr{0x1, 0x2, 0x3, 0x4, 0x5, 0x6}) mac := cache.Get(net.IPv4(192, 168, 0, 2).To4()) - require.Equal(t, mac, net.HardwareAddr{0x1, 0x2, 0x3, 0x4, 0x5, 0x6}) + require.Equal(t, net.HardwareAddr{0x1, 0x2, 0x3, 0x4, 0x5, 0x6}, mac) } func TestCacheDelete(t *testing.T) { @@ -86,7 +87,9 @@ func TestFillCache(t *testing.T) { } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() cache := NewCache() err := FillCache(cache, strings.NewReader(tt.input)) if tt.err { @@ -263,15 +266,17 @@ func TestCacheRequestGenerator(t *testing.T) { cachegen := NewCacheRequestGenerator(reqgen, tt.gatewayMAC, cache) results, err := cachegen.GenerateRequests(ctx, scanRange) - require.NoError(t, err) + if !assert.NoError(t, err) { + return + } for _, expectedResult := range tt.expectedRequests { result := <-results - require.Equal(t, expectedResult, result) + assert.Equal(t, expectedResult, result) } _, ok := <-results - require.False(t, ok, "results chan is not empty") + assert.False(t, ok, "results chan is not empty") }() select { diff --git a/pkg/scan/arp/mock_request_test.go b/pkg/scan/arp/mock_request_test.go index 6efcaf4..9913ca1 100644 --- a/pkg/scan/arp/mock_request_test.go +++ b/pkg/scan/arp/mock_request_test.go @@ -1,5 +1,10 @@ // Code generated by MockGen. DO NOT EDIT. // Source: github.com/v-byte-cpu/sx/pkg/scan (interfaces: RequestGenerator) +// +// Generated by this command: +// +// mockgen -package arp -destination=mock_request_test.go github.com/v-byte-cpu/sx/pkg/scan RequestGenerator +// // Package arp is a generated GoMock package. package arp @@ -8,14 +13,15 @@ import ( context "context" reflect "reflect" - gomock "github.com/golang/mock/gomock" scan "github.com/v-byte-cpu/sx/pkg/scan" + gomock "go.uber.org/mock/gomock" ) // MockRequestGenerator is a mock of RequestGenerator interface. type MockRequestGenerator struct { ctrl *gomock.Controller recorder *MockRequestGeneratorMockRecorder + isgomock struct{} } // MockRequestGeneratorMockRecorder is the mock recorder for MockRequestGenerator. @@ -36,16 +42,16 @@ func (m *MockRequestGenerator) EXPECT() *MockRequestGeneratorMockRecorder { } // GenerateRequests mocks base method. -func (m *MockRequestGenerator) GenerateRequests(arg0 context.Context, arg1 *scan.Range) (<-chan *scan.Request, error) { +func (m *MockRequestGenerator) GenerateRequests(ctx context.Context, r *scan.Range) (<-chan *scan.Request, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GenerateRequests", arg0, arg1) + ret := m.ctrl.Call(m, "GenerateRequests", ctx, r) ret0, _ := ret[0].(<-chan *scan.Request) ret1, _ := ret[1].(error) return ret0, ret1 } // GenerateRequests indicates an expected call of GenerateRequests. -func (mr *MockRequestGeneratorMockRecorder) GenerateRequests(arg0, arg1 interface{}) *gomock.Call { +func (mr *MockRequestGeneratorMockRecorder) GenerateRequests(ctx, r any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GenerateRequests", reflect.TypeOf((*MockRequestGenerator)(nil).GenerateRequests), arg0, arg1) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GenerateRequests", reflect.TypeOf((*MockRequestGenerator)(nil).GenerateRequests), ctx, r) } diff --git a/pkg/scan/arp/result_easyjson.go b/pkg/scan/arp/result_easyjson.go index 89d4652..da00fa0 100644 --- a/pkg/scan/arp/result_easyjson.go +++ b/pkg/scan/arp/result_easyjson.go @@ -4,7 +4,6 @@ package arp import ( json "encoding/json" - easyjson "github.com/mailru/easyjson" jlexer "github.com/mailru/easyjson/jlexer" jwriter "github.com/mailru/easyjson/jwriter" @@ -31,18 +30,25 @@ func easyjsonD3b49167DecodeGithubComVByteCpuSxPkgScanArp(in *jlexer.Lexer, out * for !in.IsDelim('}') { key := in.UnsafeFieldName(false) in.WantColon() - if in.IsNull() { - in.Skip() - in.WantComma() - continue - } switch key { case "ip": - out.IP = string(in.String()) + if in.IsNull() { + in.Skip() + } else { + out.IP = string(in.String()) + } case "mac": - out.MAC = string(in.String()) + if in.IsNull() { + in.Skip() + } else { + out.MAC = string(in.String()) + } case "vendor": - out.Vendor = string(in.String()) + if in.IsNull() { + in.Skip() + } else { + out.Vendor = string(in.String()) + } default: in.SkipRecursive() } diff --git a/pkg/scan/engine.go b/pkg/scan/engine.go index 057961d..20cdceb 100644 --- a/pkg/scan/engine.go +++ b/pkg/scan/engine.go @@ -1,4 +1,4 @@ -//go:generate mockgen -package scan -destination=mock_engine_test.go . PacketSource,Scanner +//go:generate go tool mockgen -package scan -destination=mock_engine_test.go . PacketSource,Scanner package scan diff --git a/pkg/scan/engine_test.go b/pkg/scan/engine_test.go index 4326219..665d60d 100644 --- a/pkg/scan/engine_test.go +++ b/pkg/scan/engine_test.go @@ -1,4 +1,4 @@ -//go:generate mockgen -package scan -destination=mock_sendreceiver_test.go github.com/v-byte-cpu/sx/pkg/packet Sender,Receiver +//go:generate go tool mockgen -package scan -destination=mock_sendreceiver_test.go github.com/v-byte-cpu/sx/pkg/packet Sender,Receiver package scan @@ -10,11 +10,11 @@ import ( "testing" "time" - "github.com/golang/mock/gomock" "github.com/google/gopacket" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/v-byte-cpu/sx/pkg/packet" + "go.uber.org/mock/gomock" "go.uber.org/ratelimit" ) @@ -28,7 +28,7 @@ func TestMergeErrChanEmptyChannels(t *testing.T) { out := mergeErrChan(context.Background(), c1, c2) result := chanToSlice(t, chanErrToGeneric(out), 0) - assert.Equal(t, 0, len(result), "error slice is not empty") + assert.Empty(t, result, "error slice is not empty") } func TestMergeErrChanOneElementAndEmptyChannel(t *testing.T) { @@ -42,8 +42,8 @@ func TestMergeErrChanOneElementAndEmptyChannel(t *testing.T) { out := mergeErrChan(context.Background(), c1, c2) result := chanToSlice(t, chanErrToGeneric(out), 1) - assert.Equal(t, 1, len(result), "error slice size is invalid") - assert.Error(t, result[0].(error)) + assert.Len(t, result, 1, "error slice size is invalid") + require.Error(t, result[0].(error)) } func TestMergeErrChanTwoElements(t *testing.T) { @@ -58,8 +58,8 @@ func TestMergeErrChanTwoElements(t *testing.T) { out := mergeErrChan(context.Background(), c1, c2) result := chanToSlice(t, chanErrToGeneric(out), 2) - assert.Equal(t, 2, len(result), "error slice size is invalid") - assert.Error(t, result[0].(error)) + assert.Len(t, result, 2, "error slice size is invalid") + require.Error(t, result[0].(error)) assert.Error(t, result[1].(error)) } @@ -76,7 +76,7 @@ func TestMergeErrChanContextExit(t *testing.T) { out := mergeErrChan(ctx, c1, c2) result := chanToSlice(t, chanErrToGeneric(out), 0) - assert.Equal(t, 0, len(result), "error slice is not empty") + assert.Empty(t, result, "error slice is not empty") } func TestPacketEngineStartCollectsAllErrors(t *testing.T) { @@ -116,8 +116,8 @@ func TestPacketEngineStartCollectsAllErrors(t *testing.T) { }) result := chanToSlice(t, chanErrToGeneric(out), 2) - assert.Equal(t, 2, len(result), "error slice is invalid") - assert.Error(t, result[0].(error)) + assert.Len(t, result, 2, "error slice is invalid") + require.Error(t, result[0].(error)) assert.Error(t, result[1].(error)) } @@ -150,7 +150,7 @@ func TestPacketSourceReturnsError(t *testing.T) { ps := NewPacketSource(reqgen, pktgen) out := ps.Packets(context.Background(), scanRange) result := <-out - require.Error(t, result.Err) + assert.Error(t, result.Err) }() waitDone(t, done) } @@ -191,8 +191,8 @@ func TestPacketSourceReturnsData(t *testing.T) { ps := NewPacketSource(reqgen, pktgen) out := ps.Packets(context.Background(), scanRange) result := <-out - require.NoError(t, result.Err) - require.Equal(t, data.Buf, result.Buf) + assert.NoError(t, result.Err) + assert.Equal(t, data.Buf, result.Buf) }() waitDone(t, done) } @@ -223,12 +223,12 @@ func TestRateLimitScanner(t *testing.T) { break loop default: result, err := rateScanner.Scan(context.Background(), req1) - require.NoError(t, err) - require.Equal(t, expectedResult, result) + assert.NoError(t, err) + assert.Equal(t, expectedResult, result) count++ } } - require.LessOrEqual(t, count, 2) + assert.LessOrEqual(t, count, 2) }() waitDone(t, done) } @@ -251,7 +251,7 @@ func TestScanEngineWithRequestGeneratorError(t *testing.T) { _, errc := engine.Start(ctx, &Range{}) err := <-errc - require.Error(t, err) + assert.Error(t, err) }() waitDone(t, done) } @@ -277,7 +277,7 @@ func TestScanEngineWithRequestError(t *testing.T) { _, errc := engine.Start(ctx, &Range{}) err := <-errc - require.Error(t, err) + assert.Error(t, err) }() waitDone(t, done) } @@ -305,7 +305,7 @@ func TestScanEngineWithScannerError(t *testing.T) { _, errc := engine.Start(ctx, &Range{}) err := <-errc - require.Error(t, err) + assert.Error(t, err) }() waitDone(t, done) } @@ -346,16 +346,16 @@ func TestScanEngineWithResults(t *testing.T) { results[0] = <-resultCh.Chan() results[1] = <-resultCh.Chan() cancel() - require.Zero(t, len(errc), "error channel is not empty") + assert.Empty(t, errc, "error channel is not empty") result, ok := <-resultCh.Chan() if ok { - require.Fail(t, "result channel contains more elements than expected: ", result) + assert.Fail(t, "result channel contains more elements than expected: ", result) } sort.Slice(results, func(i, j int) bool { return results[i].ID() < results[j].ID() }) - require.Equal(t, []Result{ + assert.Equal(t, []Result{ &mockScanResult{"id1"}, &mockScanResult{"id2"}, }, results) diff --git a/pkg/scan/generator.go b/pkg/scan/generator.go index 6596607..20ceffd 100644 --- a/pkg/scan/generator.go +++ b/pkg/scan/generator.go @@ -1,4 +1,4 @@ -//go:generate mockgen -package scan -destination=mock_generator_test.go -source generator.go +//go:generate go tool mockgen -package scan -destination=mock_generator_test.go -source generator.go package scan diff --git a/pkg/scan/generator_test.go b/pkg/scan/generator_test.go index 66228b1..37f9417 100644 --- a/pkg/scan/generator_test.go +++ b/pkg/scan/generator_test.go @@ -8,10 +8,10 @@ import ( "testing" "time" - "github.com/golang/mock/gomock" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/v-byte-cpu/sx/pkg/packet" + "go.uber.org/mock/gomock" ) func chanBufferDataToGeneric(in <-chan *packet.BufferData) <-chan interface{} { @@ -36,7 +36,7 @@ func TestGeneratorPacketsWithEmptyChannel(t *testing.T) { out := g.Packets(context.Background(), in) result := chanToSlice(t, chanBufferDataToGeneric(out), 0) - assert.Equal(t, 0, len(result), "result is not empty") + assert.Empty(t, result, "result is not empty") } func TestMultiGeneratorPacketsWithEmptyChannel(t *testing.T) { @@ -50,7 +50,7 @@ func TestMultiGeneratorPacketsWithEmptyChannel(t *testing.T) { out := g.Packets(context.Background(), in) result := chanToSlice(t, chanBufferDataToGeneric(out), 0) - assert.Equal(t, 0, len(result), "result is not empty") + assert.Empty(t, result, "result is not empty") } func TestGeneratorPacketsWithOnePair(t *testing.T) { @@ -72,9 +72,9 @@ func TestGeneratorPacketsWithOnePair(t *testing.T) { out := g.Packets(context.Background(), in) results := chanToSlice(t, chanBufferDataToGeneric(out), 1) - assert.Equal(t, 1, len(results), "result size is invalid") + assert.Len(t, results, 1, "result size is invalid") result := results[0].(*packet.BufferData) - assert.NoError(t, result.Err) + require.NoError(t, result.Err) assert.NotNil(t, result.Buf) } @@ -97,9 +97,9 @@ func TestMultiGeneratorPacketsWithOnePair(t *testing.T) { out := g.Packets(context.Background(), in) results := chanToSlice(t, chanBufferDataToGeneric(out), 1) - assert.Equal(t, 1, len(results), "result size is invalid") + assert.Len(t, results, 1, "result size is invalid") result := results[0].(*packet.BufferData) - assert.NoError(t, result.Err) + require.NoError(t, result.Err) assert.NotNil(t, result.Buf) } @@ -125,12 +125,12 @@ func TestGeneratorPacketsWithTwoPairs(t *testing.T) { out := g.Packets(context.Background(), in) results := chanToSlice(t, chanBufferDataToGeneric(out), 2) - assert.Equal(t, 2, len(results), "result size is invalid") + assert.Len(t, results, 2, "result size is invalid") result1 := results[0].(*packet.BufferData) result2 := results[1].(*packet.BufferData) - assert.NoError(t, result1.Err) + require.NoError(t, result1.Err) assert.NotNil(t, result1.Buf) - assert.NoError(t, result2.Err) + require.NoError(t, result2.Err) assert.NotNil(t, result2.Buf) } @@ -157,12 +157,12 @@ func TestMultiGeneratorPacketsWithTwoPairs(t *testing.T) { out := g.Packets(context.Background(), in) results := chanToSlice(t, chanBufferDataToGeneric(out), 2) - assert.Equal(t, 2, len(results), "result size is invalid") + assert.Len(t, results, 2, "result size is invalid") result1 := results[0].(*packet.BufferData) result2 := results[1].(*packet.BufferData) - assert.NoError(t, result1.Err) + require.NoError(t, result1.Err) assert.NotNil(t, result1.Buf) - assert.NoError(t, result2.Err) + require.NoError(t, result2.Err) assert.NotNil(t, result2.Buf) } @@ -180,9 +180,9 @@ func TestGeneratorPacketsReturnsRequestError(t *testing.T) { out := g.Packets(context.Background(), in) results := chanToSlice(t, chanBufferDataToGeneric(out), 1) - assert.Equal(t, 1, len(results), "result size is invalid") + assert.Len(t, results, 1, "result size is invalid") result := results[0].(*packet.BufferData) - assert.Error(t, result.Err) + require.Error(t, result.Err) assert.Nil(t, result.Buf) } @@ -205,9 +205,9 @@ func TestGeneratorPacketsReturnsFillError(t *testing.T) { out := g.Packets(context.Background(), in) results := chanToSlice(t, chanBufferDataToGeneric(out), 1) - assert.Equal(t, 1, len(results), "result size is invalid") + assert.Len(t, results, 1, "result size is invalid") result := results[0].(*packet.BufferData) - assert.Error(t, result.Err) + require.Error(t, result.Err) assert.Nil(t, result.Buf) } @@ -225,9 +225,9 @@ func TestMultiGeneratorPacketsReturnsRequestError(t *testing.T) { out := g.Packets(context.Background(), in) results := chanToSlice(t, chanBufferDataToGeneric(out), 1) - assert.Equal(t, 1, len(results), "result size is invalid") + assert.Len(t, results, 1, "result size is invalid") result := results[0].(*packet.BufferData) - assert.Error(t, result.Err) + require.Error(t, result.Err) assert.Nil(t, result.Buf) } @@ -251,9 +251,9 @@ func TestMultiGeneratorPacketsReturnsFillError(t *testing.T) { out := g.Packets(context.Background(), in) results := chanToSlice(t, chanBufferDataToGeneric(out), 1) - assert.Equal(t, 1, len(results), "result size is invalid") + assert.Len(t, results, 1, "result size is invalid") result := results[0].(*packet.BufferData) - assert.Error(t, result.Err) + require.Error(t, result.Err) assert.Nil(t, result.Buf) } @@ -300,7 +300,7 @@ func TestMergeBufferDataChanEmptyChannels(t *testing.T) { out := MergeBufferDataChan(context.Background(), c1, c2) result := chanToSlice(t, chanBufferDataToGeneric(out), 0) - assert.Equal(t, 0, len(result), "result slice is not empty") + assert.Empty(t, result, "result slice is not empty") } func TestMergeBufferDataChanOneElementAndEmptyChannel(t *testing.T) { @@ -313,7 +313,7 @@ func TestMergeBufferDataChanOneElementAndEmptyChannel(t *testing.T) { out := MergeBufferDataChan(context.Background(), c1, c2) result := chanToSlice(t, chanBufferDataToGeneric(out), 1) - assert.Equal(t, 1, len(result), "result slice size is invalid") + assert.Len(t, result, 1, "result slice size is invalid") assert.NotNil(t, result[0]) } @@ -328,7 +328,7 @@ func TestMergeBufferDataChanTwoElements(t *testing.T) { out := MergeBufferDataChan(context.Background(), c1, c2) result := chanToSlice(t, chanBufferDataToGeneric(out), 2) - assert.Equal(t, 2, len(result), "result slice size is invalid") + assert.Len(t, result, 2, "result slice size is invalid") assert.NotNil(t, result[0]) assert.NotNil(t, result[1]) } @@ -345,5 +345,5 @@ func TestMergeBufferDataChanContextExit(t *testing.T) { out := MergeBufferDataChan(ctx, c1, c2) result := chanToSlice(t, chanBufferDataToGeneric(out), 0) - assert.Equal(t, 0, len(result), "result slice is not empty") + assert.Empty(t, result, "result slice is not empty") } diff --git a/pkg/scan/icmp/bpf_test.go b/pkg/scan/icmp/bpf_test.go index c19e194..ecffa9b 100644 --- a/pkg/scan/icmp/bpf_test.go +++ b/pkg/scan/icmp/bpf_test.go @@ -34,10 +34,12 @@ func TestBPFFilter(t *testing.T) { } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() filter, maxPacketLength := BPFFilter(tt.scanRange) assert.Equal(t, tt.expectedFilter, filter) - assert.Equal(t, maxPacketLength, MaxPacketLength) + assert.Equal(t, MaxPacketLength, maxPacketLength) }) } } diff --git a/pkg/scan/icmp/icmp.go b/pkg/scan/icmp/icmp.go index b138069..406c482 100644 --- a/pkg/scan/icmp/icmp.go +++ b/pkg/scan/icmp/icmp.go @@ -1,10 +1,10 @@ -//go:generate easyjson -output_filename result_easyjson.go icmp.go +//go:generate go tool easyjson -output_filename result_easyjson.go icmp.go package icmp import ( "fmt" - "math/rand" + rand "math/rand/v2" "github.com/google/gopacket" "github.com/google/gopacket/layers" @@ -173,7 +173,7 @@ func WithVPNmode(vpnMode bool) PacketFillerOption { func NewPacketFiller(opts ...PacketFillerOption) *PacketFiller { payload := make([]byte, 48) - rand.Read(payload) + fillRandomPayload(payload) f := &PacketFiller{ // typical TTL value for Linux ttl: 64, @@ -189,6 +189,12 @@ func NewPacketFiller(opts ...PacketFillerOption) *PacketFiller { return f } +func fillRandomPayload(payload []byte) { + for i := range payload { + payload[i] = byte(rand.IntN(256)) + } +} + func (f *PacketFiller) Fill(packet gopacket.SerializeBuffer, r *scan.Request) (err error) { ip := &layers.IPv4{ @@ -196,7 +202,7 @@ func (f *PacketFiller) Fill(packet gopacket.SerializeBuffer, r *scan.Request) (e // actually Linux kernel uses more complicated algorithm for ip id generation, // see __ip_select_ident function in net/ipv4/route.c // but we don't care and just spoof it ;) - Id: uint16(1 + rand.Intn(65535)), + Id: uint16(1 + rand.IntN(65535)), Flags: f.flags, // Typical 20 bytes IP header length IHL: 5, @@ -208,7 +214,7 @@ func (f *PacketFiller) Fill(packet gopacket.SerializeBuffer, r *scan.Request) (e } icmp := &layers.ICMPv4{ - Id: uint16(1 + rand.Intn(65535)), + Id: uint16(1 + rand.IntN(65535)), Seq: 1, TypeCode: layers.CreateICMPv4TypeCode(f.typ, f.code), } diff --git a/pkg/scan/icmp/icmp_test.go b/pkg/scan/icmp/icmp_test.go index 6d0dd92..e4f323d 100644 --- a/pkg/scan/icmp/icmp_test.go +++ b/pkg/scan/icmp/icmp_test.go @@ -52,7 +52,7 @@ func TestPacketFillerEthernet(t *testing.T) { icmp := icmpLayer.(*layers.ICMPv4) require.Equal(t, uint8(layers.ICMPv4TypeTimestampRequest), icmp.TypeCode.Type()) require.Equal(t, uint8(1), icmp.TypeCode.Code()) - require.Equal(t, 48, len(icmp.Payload)) + require.Len(t, icmp.Payload, 48) } func TestPacketFillerIPv4(t *testing.T) { @@ -91,7 +91,7 @@ func TestPacketFillerIPv4(t *testing.T) { icmp := icmpLayer.(*layers.ICMPv4) require.Equal(t, uint8(layers.ICMPv4TypeTimestampRequest), icmp.TypeCode.Type()) require.Equal(t, uint8(1), icmp.TypeCode.Code()) - require.Equal(t, 48, len(icmp.Payload)) + require.Len(t, icmp.Payload, 48) } func TestPacketFillerPayload(t *testing.T) { @@ -253,26 +253,31 @@ func TestProcessPacketDataEthernet(t *testing.T) { ComputeChecksums: true, } err := gopacket.SerializeLayers(packet, opt, eth, ip, icmp) - require.NoError(t, err) + if !assert.NoError(t, err) { + return + } err = p.ProcessPacketData(packet.Bytes(), &gopacket.CaptureInfo{}) - require.NoError(t, err) + if !assert.NoError(t, err) { + return + } result, ok := <-p.Results() if !ok { - require.FailNow(t, "results chan is empty") + assert.Fail(t, "results chan is empty") + return } icmpResult := result.(*ScanResult) assert.Equal(t, ScanType, icmpResult.ScanType) assert.Equal(t, net.IPv4(192, 168, 0, 2).To4().String(), icmpResult.IP) assert.Equal(t, uint8(64), icmpResult.TTL) - require.NotNil(t, icmpResult.ICMP) + assert.NotNil(t, icmpResult.ICMP) assert.Equal(t, uint8(layers.ICMPv4TypeDestinationUnreachable), icmpResult.ICMP.Type) assert.Equal(t, uint8(layers.ICMPv4CodeHost), icmpResult.ICMP.Code) cancel() _, ok = <-p.Results() - require.False(t, ok, "results chan is not closed") + assert.False(t, ok, "results chan is not closed") }() select { case <-done: @@ -317,26 +322,31 @@ func TestProcessPacketDataIPv4(t *testing.T) { ComputeChecksums: true, } err := gopacket.SerializeLayers(packet, opt, ip, icmp) - require.NoError(t, err) + if !assert.NoError(t, err) { + return + } err = p.ProcessPacketData(packet.Bytes(), &gopacket.CaptureInfo{}) - require.NoError(t, err) + if !assert.NoError(t, err) { + return + } result, ok := <-p.Results() if !ok { - require.FailNow(t, "results chan is empty") + assert.Fail(t, "results chan is empty") + return } icmpResult := result.(*ScanResult) assert.Equal(t, ScanType, icmpResult.ScanType) assert.Equal(t, net.IPv4(192, 168, 0, 2).To4().String(), icmpResult.IP) assert.Equal(t, uint8(64), icmpResult.TTL) - require.NotNil(t, icmpResult.ICMP) + assert.NotNil(t, icmpResult.ICMP) assert.Equal(t, uint8(layers.ICMPv4TypeDestinationUnreachable), icmpResult.ICMP.Type) assert.Equal(t, uint8(layers.ICMPv4CodeHost), icmpResult.ICMP.Code) cancel() _, ok = <-p.Results() - require.False(t, ok, "results chan is not closed") + assert.False(t, ok, "results chan is not closed") }() select { case <-done: diff --git a/pkg/scan/icmp/result_easyjson.go b/pkg/scan/icmp/result_easyjson.go index 0e2fd82..38a1374 100644 --- a/pkg/scan/icmp/result_easyjson.go +++ b/pkg/scan/icmp/result_easyjson.go @@ -4,7 +4,6 @@ package icmp import ( json "encoding/json" - easyjson "github.com/mailru/easyjson" jlexer "github.com/mailru/easyjson/jlexer" jwriter "github.com/mailru/easyjson/jwriter" @@ -31,18 +30,25 @@ func easyjsonD3b49167DecodeGithubComVByteCpuSxPkgScanIcmp(in *jlexer.Lexer, out for !in.IsDelim('}') { key := in.UnsafeFieldName(false) in.WantColon() - if in.IsNull() { - in.Skip() - in.WantComma() - continue - } switch key { case "scan": - out.ScanType = string(in.String()) + if in.IsNull() { + in.Skip() + } else { + out.ScanType = string(in.String()) + } case "ip": - out.IP = string(in.String()) + if in.IsNull() { + in.Skip() + } else { + out.IP = string(in.String()) + } case "ttl": - out.TTL = uint8(in.Uint8()) + if in.IsNull() { + in.Skip() + } else { + out.TTL = uint8(in.Uint8()) + } case "icmp": if in.IsNull() { in.Skip() @@ -130,16 +136,19 @@ func easyjsonD3b49167DecodeGithubComVByteCpuSxPkgScanIcmp1(in *jlexer.Lexer, out for !in.IsDelim('}') { key := in.UnsafeFieldName(false) in.WantColon() - if in.IsNull() { - in.Skip() - in.WantComma() - continue - } switch key { case "type": - out.Type = uint8(in.Uint8()) + if in.IsNull() { + in.Skip() + } else { + out.Type = uint8(in.Uint8()) + } case "code": - out.Code = uint8(in.Uint8()) + if in.IsNull() { + in.Skip() + } else { + out.Code = uint8(in.Uint8()) + } default: in.SkipRecursive() } diff --git a/pkg/scan/mock_engine_test.go b/pkg/scan/mock_engine_test.go index 92c45ea..86a34c4 100644 --- a/pkg/scan/mock_engine_test.go +++ b/pkg/scan/mock_engine_test.go @@ -1,5 +1,10 @@ // Code generated by MockGen. DO NOT EDIT. // Source: github.com/v-byte-cpu/sx/pkg/scan (interfaces: PacketSource,Scanner) +// +// Generated by this command: +// +// mockgen -package scan -destination=mock_engine_test.go . PacketSource,Scanner +// // Package scan is a generated GoMock package. package scan @@ -8,14 +13,15 @@ import ( context "context" reflect "reflect" - gomock "github.com/golang/mock/gomock" packet "github.com/v-byte-cpu/sx/pkg/packet" + gomock "go.uber.org/mock/gomock" ) // MockPacketSource is a mock of PacketSource interface. type MockPacketSource struct { ctrl *gomock.Controller recorder *MockPacketSourceMockRecorder + isgomock struct{} } // MockPacketSourceMockRecorder is the mock recorder for MockPacketSource. @@ -36,23 +42,24 @@ func (m *MockPacketSource) EXPECT() *MockPacketSourceMockRecorder { } // Packets mocks base method. -func (m *MockPacketSource) Packets(arg0 context.Context, arg1 *Range) <-chan *packet.BufferData { +func (m *MockPacketSource) Packets(ctx context.Context, r *Range) <-chan *packet.BufferData { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Packets", arg0, arg1) + ret := m.ctrl.Call(m, "Packets", ctx, r) ret0, _ := ret[0].(<-chan *packet.BufferData) return ret0 } // Packets indicates an expected call of Packets. -func (mr *MockPacketSourceMockRecorder) Packets(arg0, arg1 interface{}) *gomock.Call { +func (mr *MockPacketSourceMockRecorder) Packets(ctx, r any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Packets", reflect.TypeOf((*MockPacketSource)(nil).Packets), arg0, arg1) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Packets", reflect.TypeOf((*MockPacketSource)(nil).Packets), ctx, r) } // MockScanner is a mock of Scanner interface. type MockScanner struct { ctrl *gomock.Controller recorder *MockScannerMockRecorder + isgomock struct{} } // MockScannerMockRecorder is the mock recorder for MockScanner. @@ -73,16 +80,16 @@ func (m *MockScanner) EXPECT() *MockScannerMockRecorder { } // Scan mocks base method. -func (m *MockScanner) Scan(arg0 context.Context, arg1 *Request) (Result, error) { +func (m *MockScanner) Scan(ctx context.Context, r *Request) (Result, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Scan", arg0, arg1) + ret := m.ctrl.Call(m, "Scan", ctx, r) ret0, _ := ret[0].(Result) ret1, _ := ret[1].(error) return ret0, ret1 } // Scan indicates an expected call of Scan. -func (mr *MockScannerMockRecorder) Scan(arg0, arg1 interface{}) *gomock.Call { +func (mr *MockScannerMockRecorder) Scan(ctx, r any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Scan", reflect.TypeOf((*MockScanner)(nil).Scan), arg0, arg1) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Scan", reflect.TypeOf((*MockScanner)(nil).Scan), ctx, r) } diff --git a/pkg/scan/mock_generator_test.go b/pkg/scan/mock_generator_test.go index 4092d14..5544460 100644 --- a/pkg/scan/mock_generator_test.go +++ b/pkg/scan/mock_generator_test.go @@ -1,5 +1,10 @@ // Code generated by MockGen. DO NOT EDIT. // Source: generator.go +// +// Generated by this command: +// +// mockgen -package scan -destination=mock_generator_test.go -source generator.go +// // Package scan is a generated GoMock package. package scan @@ -8,15 +13,16 @@ import ( context "context" reflect "reflect" - gomock "github.com/golang/mock/gomock" gopacket "github.com/google/gopacket" packet "github.com/v-byte-cpu/sx/pkg/packet" + gomock "go.uber.org/mock/gomock" ) // MockPacketFiller is a mock of PacketFiller interface. type MockPacketFiller struct { ctrl *gomock.Controller recorder *MockPacketFillerMockRecorder + isgomock struct{} } // MockPacketFillerMockRecorder is the mock recorder for MockPacketFiller. @@ -37,23 +43,24 @@ func (m *MockPacketFiller) EXPECT() *MockPacketFillerMockRecorder { } // Fill mocks base method. -func (m *MockPacketFiller) Fill(packet gopacket.SerializeBuffer, r *Request) error { +func (m *MockPacketFiller) Fill(arg0 gopacket.SerializeBuffer, r *Request) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Fill", packet, r) + ret := m.ctrl.Call(m, "Fill", arg0, r) ret0, _ := ret[0].(error) return ret0 } // Fill indicates an expected call of Fill. -func (mr *MockPacketFillerMockRecorder) Fill(packet, r interface{}) *gomock.Call { +func (mr *MockPacketFillerMockRecorder) Fill(arg0, r any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Fill", reflect.TypeOf((*MockPacketFiller)(nil).Fill), packet, r) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Fill", reflect.TypeOf((*MockPacketFiller)(nil).Fill), arg0, r) } // MockPacketGenerator is a mock of PacketGenerator interface. type MockPacketGenerator struct { ctrl *gomock.Controller recorder *MockPacketGeneratorMockRecorder + isgomock struct{} } // MockPacketGeneratorMockRecorder is the mock recorder for MockPacketGenerator. @@ -82,7 +89,7 @@ func (m *MockPacketGenerator) Packets(ctx context.Context, in <-chan *Request) < } // Packets indicates an expected call of Packets. -func (mr *MockPacketGeneratorMockRecorder) Packets(ctx, in interface{}) *gomock.Call { +func (mr *MockPacketGeneratorMockRecorder) Packets(ctx, in any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Packets", reflect.TypeOf((*MockPacketGenerator)(nil).Packets), ctx, in) } diff --git a/pkg/scan/mock_request_test.go b/pkg/scan/mock_request_test.go index a27922e..dbc013f 100644 --- a/pkg/scan/mock_request_test.go +++ b/pkg/scan/mock_request_test.go @@ -1,5 +1,10 @@ // Code generated by MockGen. DO NOT EDIT. // Source: github.com/v-byte-cpu/sx/pkg/scan (interfaces: PortGenerator,IPGenerator,RequestGenerator,IPContainer) +// +// Generated by this command: +// +// mockgen -package scan -destination=mock_request_test.go . PortGenerator,IPGenerator,RequestGenerator,IPContainer +// // Package scan is a generated GoMock package. package scan @@ -9,13 +14,14 @@ import ( net "net" reflect "reflect" - gomock "github.com/golang/mock/gomock" + gomock "go.uber.org/mock/gomock" ) // MockPortGenerator is a mock of PortGenerator interface. type MockPortGenerator struct { ctrl *gomock.Controller recorder *MockPortGeneratorMockRecorder + isgomock struct{} } // MockPortGeneratorMockRecorder is the mock recorder for MockPortGenerator. @@ -36,24 +42,25 @@ func (m *MockPortGenerator) EXPECT() *MockPortGeneratorMockRecorder { } // Ports mocks base method. -func (m *MockPortGenerator) Ports(arg0 context.Context, arg1 *Range) (<-chan PortGetter, error) { +func (m *MockPortGenerator) Ports(ctx context.Context, r *Range) (<-chan PortGetter, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Ports", arg0, arg1) + ret := m.ctrl.Call(m, "Ports", ctx, r) ret0, _ := ret[0].(<-chan PortGetter) ret1, _ := ret[1].(error) return ret0, ret1 } // Ports indicates an expected call of Ports. -func (mr *MockPortGeneratorMockRecorder) Ports(arg0, arg1 interface{}) *gomock.Call { +func (mr *MockPortGeneratorMockRecorder) Ports(ctx, r any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Ports", reflect.TypeOf((*MockPortGenerator)(nil).Ports), arg0, arg1) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Ports", reflect.TypeOf((*MockPortGenerator)(nil).Ports), ctx, r) } // MockIPGenerator is a mock of IPGenerator interface. type MockIPGenerator struct { ctrl *gomock.Controller recorder *MockIPGeneratorMockRecorder + isgomock struct{} } // MockIPGeneratorMockRecorder is the mock recorder for MockIPGenerator. @@ -74,24 +81,25 @@ func (m *MockIPGenerator) EXPECT() *MockIPGeneratorMockRecorder { } // IPs mocks base method. -func (m *MockIPGenerator) IPs(arg0 context.Context, arg1 *Range) (<-chan IPGetter, error) { +func (m *MockIPGenerator) IPs(ctx context.Context, r *Range) (<-chan IPGetter, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "IPs", arg0, arg1) + ret := m.ctrl.Call(m, "IPs", ctx, r) ret0, _ := ret[0].(<-chan IPGetter) ret1, _ := ret[1].(error) return ret0, ret1 } // IPs indicates an expected call of IPs. -func (mr *MockIPGeneratorMockRecorder) IPs(arg0, arg1 interface{}) *gomock.Call { +func (mr *MockIPGeneratorMockRecorder) IPs(ctx, r any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IPs", reflect.TypeOf((*MockIPGenerator)(nil).IPs), arg0, arg1) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IPs", reflect.TypeOf((*MockIPGenerator)(nil).IPs), ctx, r) } // MockRequestGenerator is a mock of RequestGenerator interface. type MockRequestGenerator struct { ctrl *gomock.Controller recorder *MockRequestGeneratorMockRecorder + isgomock struct{} } // MockRequestGeneratorMockRecorder is the mock recorder for MockRequestGenerator. @@ -112,24 +120,25 @@ func (m *MockRequestGenerator) EXPECT() *MockRequestGeneratorMockRecorder { } // GenerateRequests mocks base method. -func (m *MockRequestGenerator) GenerateRequests(arg0 context.Context, arg1 *Range) (<-chan *Request, error) { +func (m *MockRequestGenerator) GenerateRequests(ctx context.Context, r *Range) (<-chan *Request, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GenerateRequests", arg0, arg1) + ret := m.ctrl.Call(m, "GenerateRequests", ctx, r) ret0, _ := ret[0].(<-chan *Request) ret1, _ := ret[1].(error) return ret0, ret1 } // GenerateRequests indicates an expected call of GenerateRequests. -func (mr *MockRequestGeneratorMockRecorder) GenerateRequests(arg0, arg1 interface{}) *gomock.Call { +func (mr *MockRequestGeneratorMockRecorder) GenerateRequests(ctx, r any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GenerateRequests", reflect.TypeOf((*MockRequestGenerator)(nil).GenerateRequests), arg0, arg1) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GenerateRequests", reflect.TypeOf((*MockRequestGenerator)(nil).GenerateRequests), ctx, r) } // MockIPContainer is a mock of IPContainer interface. type MockIPContainer struct { ctrl *gomock.Controller recorder *MockIPContainerMockRecorder + isgomock struct{} } // MockIPContainerMockRecorder is the mock recorder for MockIPContainer. @@ -150,16 +159,16 @@ func (m *MockIPContainer) EXPECT() *MockIPContainerMockRecorder { } // Contains mocks base method. -func (m *MockIPContainer) Contains(arg0 net.IP) (bool, error) { +func (m *MockIPContainer) Contains(ip net.IP) (bool, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Contains", arg0) + ret := m.ctrl.Call(m, "Contains", ip) ret0, _ := ret[0].(bool) ret1, _ := ret[1].(error) return ret0, ret1 } // Contains indicates an expected call of Contains. -func (mr *MockIPContainerMockRecorder) Contains(arg0 interface{}) *gomock.Call { +func (mr *MockIPContainerMockRecorder) Contains(ip any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Contains", reflect.TypeOf((*MockIPContainer)(nil).Contains), arg0) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Contains", reflect.TypeOf((*MockIPContainer)(nil).Contains), ip) } diff --git a/pkg/scan/mock_sendreceiver_test.go b/pkg/scan/mock_sendreceiver_test.go index 8d0a877..0434634 100644 --- a/pkg/scan/mock_sendreceiver_test.go +++ b/pkg/scan/mock_sendreceiver_test.go @@ -1,5 +1,10 @@ // Code generated by MockGen. DO NOT EDIT. // Source: github.com/v-byte-cpu/sx/pkg/packet (interfaces: Sender,Receiver) +// +// Generated by this command: +// +// mockgen -package scan -destination=mock_sendreceiver_test.go github.com/v-byte-cpu/sx/pkg/packet Sender,Receiver +// // Package scan is a generated GoMock package. package scan @@ -8,14 +13,15 @@ import ( context "context" reflect "reflect" - gomock "github.com/golang/mock/gomock" packet "github.com/v-byte-cpu/sx/pkg/packet" + gomock "go.uber.org/mock/gomock" ) // MockSender is a mock of Sender interface. type MockSender struct { ctrl *gomock.Controller recorder *MockSenderMockRecorder + isgomock struct{} } // MockSenderMockRecorder is the mock recorder for MockSender. @@ -36,24 +42,25 @@ func (m *MockSender) EXPECT() *MockSenderMockRecorder { } // SendPackets mocks base method. -func (m *MockSender) SendPackets(arg0 context.Context, arg1 <-chan *packet.BufferData) (<-chan interface{}, <-chan error) { +func (m *MockSender) SendPackets(ctx context.Context, in <-chan *packet.BufferData) (<-chan any, <-chan error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SendPackets", arg0, arg1) - ret0, _ := ret[0].(<-chan interface{}) + ret := m.ctrl.Call(m, "SendPackets", ctx, in) + ret0, _ := ret[0].(<-chan any) ret1, _ := ret[1].(<-chan error) return ret0, ret1 } // SendPackets indicates an expected call of SendPackets. -func (mr *MockSenderMockRecorder) SendPackets(arg0, arg1 interface{}) *gomock.Call { +func (mr *MockSenderMockRecorder) SendPackets(ctx, in any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendPackets", reflect.TypeOf((*MockSender)(nil).SendPackets), arg0, arg1) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendPackets", reflect.TypeOf((*MockSender)(nil).SendPackets), ctx, in) } // MockReceiver is a mock of Receiver interface. type MockReceiver struct { ctrl *gomock.Controller recorder *MockReceiverMockRecorder + isgomock struct{} } // MockReceiverMockRecorder is the mock recorder for MockReceiver. @@ -74,15 +81,15 @@ func (m *MockReceiver) EXPECT() *MockReceiverMockRecorder { } // ReceivePackets mocks base method. -func (m *MockReceiver) ReceivePackets(arg0 context.Context) <-chan error { +func (m *MockReceiver) ReceivePackets(ctx context.Context) <-chan error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ReceivePackets", arg0) + ret := m.ctrl.Call(m, "ReceivePackets", ctx) ret0, _ := ret[0].(<-chan error) return ret0 } // ReceivePackets indicates an expected call of ReceivePackets. -func (mr *MockReceiverMockRecorder) ReceivePackets(arg0 interface{}) *gomock.Call { +func (mr *MockReceiverMockRecorder) ReceivePackets(ctx any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReceivePackets", reflect.TypeOf((*MockReceiver)(nil).ReceivePackets), arg0) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReceivePackets", reflect.TypeOf((*MockReceiver)(nil).ReceivePackets), ctx) } diff --git a/pkg/scan/range_test.go b/pkg/scan/range_test.go index 46bca5b..4cc2859 100644 --- a/pkg/scan/range_test.go +++ b/pkg/scan/range_test.go @@ -2,14 +2,14 @@ package scan import ( "math/big" - "math/rand" "testing" - "time" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestNewRangeIteratorError(t *testing.T) { + t.Parallel() tests := []int64{-1, 0, 1 << 33} for _, input := range tests { _, err := newRangeIterator(input) @@ -101,7 +101,6 @@ func TestNewRangeIterator(t *testing.T) { n: 1 << 16, }, } - rand.Seed(time.Now().Unix()) for _, vtt := range tests { tt := vtt @@ -113,14 +112,16 @@ func TestNewRangeIterator(t *testing.T) { defer close(done) it, err := newRangeIterator(int64(tt.n)) - require.NoError(t, err) + if !assert.NoError(t, err) { + return + } bitset := big.NewInt(0) cnt := 0 for { cnt++ i := int(it.Int().Int64()) if bitset.Bit(i) == 1 { - require.Fail(t, "number has already been visited", + assert.Fail(t, "number has already been visited", "number %d, P = %+v G = %+v startI = %+v", i, it.P, it.G, it.startI) } bitset.SetBit(bitset, i, 1) @@ -129,11 +130,11 @@ func TestNewRangeIterator(t *testing.T) { } } for i := 1; i <= tt.n; i++ { - require.Equal(t, uint(1), bitset.Bit(i), + assert.Equal(t, uint(1), bitset.Bit(i), "number %d is not visited, P = %+v G = %+v startI = %+v", i, it.P, it.G, it.startI) } - require.Equal(t, tt.n, cnt, "count is not valid") - require.False(t, it.Next()) + assert.Equal(t, tt.n, cnt, "count is not valid") + assert.False(t, it.Next()) }() waitDone(t, done) }) @@ -144,9 +145,7 @@ func BenchmarkRangeIterator(b *testing.B) { b.ReportAllocs() it, err := newRangeIterator(int64(b.N)) require.NoError(b, err) - for { - if !it.Next() { - break - } + for !it.Next() { + break } } diff --git a/pkg/scan/request.go b/pkg/scan/request.go index 5d4301c..0b695ac 100644 --- a/pkg/scan/request.go +++ b/pkg/scan/request.go @@ -1,5 +1,5 @@ -//go:generate mockgen -package scan -destination=mock_request_test.go . PortGenerator,IPGenerator,RequestGenerator,IPContainer -//go:generate easyjson -output_filename request_easyjson.go request.go +//go:generate go tool mockgen -package scan -destination=mock_request_test.go . PortGenerator,IPGenerator,RequestGenerator,IPContainer +//go:generate go tool easyjson -output_filename request_easyjson.go request.go package scan diff --git a/pkg/scan/request_easyjson.go b/pkg/scan/request_easyjson.go index 15b6197..036cd42 100644 --- a/pkg/scan/request_easyjson.go +++ b/pkg/scan/request_easyjson.go @@ -4,7 +4,6 @@ package scan import ( json "encoding/json" - easyjson "github.com/mailru/easyjson" jlexer "github.com/mailru/easyjson/jlexer" jwriter "github.com/mailru/easyjson/jwriter" @@ -31,16 +30,19 @@ func easyjson3c9d2b01DecodeGithubComVByteCpuSxPkgScan(in *jlexer.Lexer, out *IPP for !in.IsDelim('}') { key := in.UnsafeFieldName(false) in.WantColon() - if in.IsNull() { - in.Skip() - in.WantComma() - continue - } switch key { case "ip": - out.IP = string(in.String()) + if in.IsNull() { + in.Skip() + } else { + out.IP = string(in.String()) + } case "port": - out.Port = int(in.Int()) + if in.IsNull() { + in.Skip() + } else { + out.Port = int(in.Int()) + } default: in.SkipRecursive() } diff --git a/pkg/scan/request_test.go b/pkg/scan/request_test.go index b2a1bdc..d0312fe 100644 --- a/pkg/scan/request_test.go +++ b/pkg/scan/request_test.go @@ -12,8 +12,9 @@ import ( "testing" "time" - "github.com/golang/mock/gomock" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "go.uber.org/mock/gomock" ) func newScanRange(opts ...scanRangeOption) *Range { @@ -223,15 +224,17 @@ func TestPortGenerator(t *testing.T) { portgen := NewPortGenerator() ports, err := portgen.Ports(context.Background(), tt.scanRange) if tt.err { - require.Error(t, err) + assert.Error(t, err) return } - require.NoError(t, err) - result := chanToSlice(t, chanPortToGeneric(ports), len(tt.expected)) + if !assert.NoError(t, err) { + return + } + result := collectInterfaces(chanPortToGeneric(ports)) sort.Slice(result, func(i, j int) bool { return uint16(result[i].(WrapPort)) < uint16(result[j].(WrapPort)) }) - require.Equal(t, tt.expected, result) + assert.Equal(t, tt.expected, result) }() waitDone(t, done) }) @@ -250,25 +253,29 @@ func TestPortGeneratorFullRange(t *testing.T) { EndPort: 65535, }, }))) - require.NoError(t, err) + if !assert.NoError(t, err) { + return + } bitset := big.NewInt(0) cnt := 0 for p := range ports { cnt++ port, err := p.GetPort() - require.NoError(t, err) + if !assert.NoError(t, err) { + return + } i := int(port) if bitset.Bit(i) == 1 { - require.Fail(t, "number has already been visited", "number %d", i) + assert.Fail(t, "number has already been visited", "number %d", i) } bitset.SetBit(bitset, i, 1) } for i := 1; i <= 65535; i++ { - require.Equal(t, uint(1), bitset.Bit(i), + assert.Equal(t, uint(1), bitset.Bit(i), "number %d is not visited", i) } - require.Equal(t, 65535, cnt, "count is not valid") + assert.Equal(t, 65535, cnt, "count is not valid") }() waitDone(t, done) } @@ -342,15 +349,17 @@ func TestIPGenerator(t *testing.T) { ipgen := NewIPGenerator() ips, err := ipgen.IPs(context.Background(), tt.scanRange) if tt.err { - require.Error(t, err) + assert.Error(t, err) + return + } + if !assert.NoError(t, err) { return } - require.NoError(t, err) - result := chanToSlice(t, chanIPToGeneric(ips), len(tt.expected)) + result := collectInterfaces(chanIPToGeneric(ips)) sort.Slice(result, func(i, j int) bool { return bytes.Compare(result[i].(WrapIP), result[j].(WrapIP)) < 1 }) - require.Equal(t, tt.expected, result) + assert.Equal(t, tt.expected, result) }() waitDone(t, done) }) @@ -368,6 +377,14 @@ func chanPairToGeneric(in <-chan *Request) <-chan interface{} { return out } +func collectInterfaces(in <-chan interface{}) []interface{} { + var out []interface{} + for v := range in { + out = append(out, v) + } + return out +} + func TestIPPortGenerator(t *testing.T) { t.Parallel() @@ -491,9 +508,11 @@ func TestIPPortGenerator(t *testing.T) { reqgen := NewIPPortGenerator(ipgen, portgen) pairs, err := reqgen.GenerateRequests(ctx, scanRange) - require.NoError(t, err) - result := chanToSlice(t, chanPairToGeneric(pairs), len(tt.expected)) - require.Equal(t, tt.expected, result) + if !assert.NoError(t, err) { + return + } + result := collectInterfaces(chanPairToGeneric(pairs)) + assert.Equal(t, tt.expected, result) }() waitDone(t, done) }) @@ -539,7 +558,7 @@ func TestIPPortGeneratorError(t *testing.T) { reqgen := NewIPPortGenerator(ipgen, portgen) _, err := reqgen.GenerateRequests(ctx, scanRange) - require.Error(t, err) + assert.Error(t, err) }() waitDone(t, done) }) @@ -605,17 +624,19 @@ func TestIPRequestGenerator(t *testing.T) { reqgen := NewIPRequestGenerator(NewIPGenerator()) pairs, err := reqgen.GenerateRequests(context.Background(), tt.input) if tt.err { - require.Error(t, err) + assert.Error(t, err) + return + } + if !assert.NoError(t, err) { return } - require.NoError(t, err) - result := chanToSlice(t, chanPairToGeneric(pairs), len(tt.expected)) + result := collectInterfaces(chanPairToGeneric(pairs)) sort.Slice(result, func(i, j int) bool { return bytes.Compare( result[i].(*Request).DstIP, result[j].(*Request).DstIP) < 1 }) - require.Equal(t, tt.expected, result) + assert.Equal(t, tt.expected, result) }() waitDone(t, done) }) @@ -765,9 +786,11 @@ func TestFileIPPortGenerator(t *testing.T) { tt.scanRange = &Range{} } pairs, err := reqgen.GenerateRequests(context.Background(), tt.scanRange) - require.NoError(t, err) - result := chanToSlice(t, chanPairToGeneric(pairs), len(tt.expected)) - require.Equal(t, tt.expected, result) + if !assert.NoError(t, err) { + return + } + result := collectInterfaces(chanPairToGeneric(pairs)) + assert.Equal(t, tt.expected, result) }() waitDone(t, done) }) @@ -868,9 +891,11 @@ func TestFileIPGenerator(t *testing.T) { return io.NopCloser(strings.NewReader(tt.input)), nil }) ips, err := ipgen.IPs(context.Background(), &Range{}) - require.NoError(t, err) - result := chanToSlice(t, chanIPToGeneric(ips), len(tt.expected)) - require.Equal(t, tt.expected, result) + if !assert.NoError(t, err) { + return + } + result := collectInterfaces(chanIPToGeneric(ips)) + assert.Equal(t, tt.expected, result) }() waitDone(t, done) }) @@ -994,9 +1019,11 @@ func TestFilterIPRequestGenerator(t *testing.T) { reqgen := NewFilterIPRequestGenerator(delegate, excludeIPs) requests, err := reqgen.GenerateRequests(context.Background(), r) - require.NoError(t, err) - result := chanToSlice(t, chanPairToGeneric(requests), len(tt.expected)) - require.Equal(t, tt.expected, result) + if !assert.NoError(t, err) { + return + } + result := collectInterfaces(chanPairToGeneric(requests)) + assert.Equal(t, tt.expected, result) }() waitDone(t, done) }) @@ -1023,7 +1050,7 @@ func TestFilterIPRequestGeneratorWithGeneratorError(t *testing.T) { reqgen := NewFilterIPRequestGenerator(delegate, excludeIPs) _, err := reqgen.GenerateRequests(context.Background(), r) - require.Error(t, err) + assert.Error(t, err) }() waitDone(t, done) } @@ -1053,9 +1080,11 @@ func TestFilterIPRequestGeneratorWithIPContainerError(t *testing.T) { reqgen := NewFilterIPRequestGenerator(delegate, excludeIPs) requests, err := reqgen.GenerateRequests(context.Background(), r) - require.NoError(t, err) - result := chanToSlice(t, chanPairToGeneric(requests), 1) - require.Equal(t, []interface{}{ + if !assert.NoError(t, err) { + return + } + result := collectInterfaces(chanPairToGeneric(requests)) + assert.Equal(t, []interface{}{ newScanRequest( withDstIP(net.IPv4(10, 0, 1, 1).To4()), withError(errors.New("ip container error")))}, result) diff --git a/pkg/scan/result_test.go b/pkg/scan/result_test.go index 728de03..872ecf2 100644 --- a/pkg/scan/result_test.go +++ b/pkg/scan/result_test.go @@ -102,7 +102,7 @@ func TestResultChanReadAfterCloseContext(t *testing.T) { cancel() _, ok := <-results.Chan() - require.False(t, ok, "results chan is not closed") + assert.False(t, ok, "results chan is not closed") }() select { diff --git a/pkg/scan/socks5/message_test.go b/pkg/scan/socks5/message_test.go index d71be94..76cdc01 100644 --- a/pkg/scan/socks5/message_test.go +++ b/pkg/scan/socks5/message_test.go @@ -8,6 +8,7 @@ import ( ) func TestWriteMethodRequest(t *testing.T) { + t.Parallel() tests := []struct { name string request *MethodRequest @@ -26,7 +27,9 @@ func TestWriteMethodRequest(t *testing.T) { } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() var buf bytes.Buffer _, err := tt.request.WriteTo(&buf) require.NoError(t, err) @@ -36,6 +39,7 @@ func TestWriteMethodRequest(t *testing.T) { } func TestReadMethodReply(t *testing.T) { + t.Parallel() tests := []struct { name string reply []byte @@ -54,7 +58,9 @@ func TestReadMethodReply(t *testing.T) { } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() var buf bytes.Buffer _, err := buf.Write(tt.reply) require.NoError(t, err) diff --git a/pkg/scan/socks5/socks5.go b/pkg/scan/socks5/socks5.go index 8c3a863..170bdb1 100644 --- a/pkg/scan/socks5/socks5.go +++ b/pkg/scan/socks5/socks5.go @@ -99,7 +99,7 @@ func (s *Scanner) Scan(ctx context.Context, r *scan.Request) (result scan.Result select { // return on ctx.Done without waiting read/write timeout case <-ctx.Done(): - conn.Close() + _ = conn.Close() case <-done: } }() diff --git a/pkg/scan/tcp/bpf.go b/pkg/scan/tcp/bpf.go index 147d994..93a6653 100644 --- a/pkg/scan/tcp/bpf.go +++ b/pkg/scan/tcp/bpf.go @@ -20,7 +20,7 @@ func BPFFilter(r *scan.Range) (filter string, maxPacketLength int) { } if len(r.Ports) > 0 { sb.WriteString(" and (") - var ranges []string + ranges := make([]string, 0, len(r.Ports)) for _, pr := range r.Ports { ranges = append(ranges, fmt.Sprintf("src portrange %d-%d", pr.StartPort, pr.EndPort)) } diff --git a/pkg/scan/tcp/bpf_test.go b/pkg/scan/tcp/bpf_test.go index f7f777e..8732fef 100644 --- a/pkg/scan/tcp/bpf_test.go +++ b/pkg/scan/tcp/bpf_test.go @@ -74,10 +74,12 @@ func TestBPFFilter(t *testing.T) { } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() filter, maxPacketLength := BPFFilter(tt.scanRange) assert.Equal(t, tt.expectedFilter, filter) - assert.Equal(t, maxPacketLength, MaxPacketLength) + assert.Equal(t, MaxPacketLength, maxPacketLength) }) } } @@ -148,10 +150,12 @@ func TestSYNACKBPFFilter(t *testing.T) { } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() filter, maxPacketLength := SYNACKBPFFilter(tt.scanRange) assert.Equal(t, tt.expectedFilter, filter) - assert.Equal(t, maxPacketLength, MaxPacketLength) + assert.Equal(t, MaxPacketLength, maxPacketLength) }) } } diff --git a/pkg/scan/tcp/result_easyjson.go b/pkg/scan/tcp/result_easyjson.go index b5e704f..15cd2d1 100644 --- a/pkg/scan/tcp/result_easyjson.go +++ b/pkg/scan/tcp/result_easyjson.go @@ -4,7 +4,6 @@ package tcp import ( json "encoding/json" - easyjson "github.com/mailru/easyjson" jlexer "github.com/mailru/easyjson/jlexer" jwriter "github.com/mailru/easyjson/jwriter" @@ -31,20 +30,31 @@ func easyjsonD3b49167DecodeGithubComVByteCpuSxPkgScanTcp(in *jlexer.Lexer, out * for !in.IsDelim('}') { key := in.UnsafeFieldName(false) in.WantColon() - if in.IsNull() { - in.Skip() - in.WantComma() - continue - } switch key { case "scan": - out.ScanType = string(in.String()) + if in.IsNull() { + in.Skip() + } else { + out.ScanType = string(in.String()) + } case "ip": - out.IP = string(in.String()) + if in.IsNull() { + in.Skip() + } else { + out.IP = string(in.String()) + } case "port": - out.Port = uint16(in.Uint16()) + if in.IsNull() { + in.Skip() + } else { + out.Port = uint16(in.Uint16()) + } case "flags": - out.Flags = string(in.String()) + if in.IsNull() { + in.Skip() + } else { + out.Flags = string(in.String()) + } default: in.SkipRecursive() } diff --git a/pkg/scan/tcp/tcp.go b/pkg/scan/tcp/tcp.go index 00c1144..89e69c9 100644 --- a/pkg/scan/tcp/tcp.go +++ b/pkg/scan/tcp/tcp.go @@ -1,4 +1,4 @@ -//go:generate easyjson -output_filename result_easyjson.go tcp.go +//go:generate go tool easyjson -output_filename result_easyjson.go tcp.go package tcp diff --git a/pkg/scan/tcp/tcp_test.go b/pkg/scan/tcp/tcp_test.go index 2c5c90e..96e5b34 100644 --- a/pkg/scan/tcp/tcp_test.go +++ b/pkg/scan/tcp/tcp_test.go @@ -275,21 +275,28 @@ func TestProcessPacketDataEthernet(t *testing.T) { ACK: true, } err := tcp.SetNetworkLayerForChecksum(ip) - require.NoError(t, err) + if !assert.NoError(t, err) { + return + } opt := gopacket.SerializeOptions{ FixLengths: true, ComputeChecksums: true, } err = gopacket.SerializeLayers(packet, opt, eth, ip, tcp) - require.NoError(t, err) + if !assert.NoError(t, err) { + return + } err = sm.ProcessPacketData(packet.Bytes(), &gopacket.CaptureInfo{}) - require.NoError(t, err) + if !assert.NoError(t, err) { + return + } result, ok := <-sm.Results() if !ok { - require.FailNow(t, "results chan is empty") + assert.Fail(t, "results chan is empty") + return } tcpResult := result.(*ScanResult) assert.Equal(t, SYNScanType, tcpResult.ScanType) @@ -298,7 +305,7 @@ func TestProcessPacketDataEthernet(t *testing.T) { cancel() _, ok = <-sm.Results() - require.False(t, ok, "results chan is not closed") + assert.False(t, ok, "results chan is not closed") }() select { case <-done: @@ -341,21 +348,28 @@ func TestProcessPacketDataIPv4(t *testing.T) { ACK: true, } err := tcp.SetNetworkLayerForChecksum(ip) - require.NoError(t, err) + if !assert.NoError(t, err) { + return + } opt := gopacket.SerializeOptions{ FixLengths: true, ComputeChecksums: true, } err = gopacket.SerializeLayers(packet, opt, ip, tcp) - require.NoError(t, err) + if !assert.NoError(t, err) { + return + } err = sm.ProcessPacketData(packet.Bytes(), &gopacket.CaptureInfo{}) - require.NoError(t, err) + if !assert.NoError(t, err) { + return + } result, ok := <-sm.Results() if !ok { - require.FailNow(t, "results chan is empty") + assert.Fail(t, "results chan is empty") + return } tcpResult := result.(*ScanResult) assert.Equal(t, SYNScanType, tcpResult.ScanType) @@ -364,7 +378,7 @@ func TestProcessPacketDataIPv4(t *testing.T) { cancel() _, ok = <-sm.Results() - require.False(t, ok, "results chan is not closed") + assert.False(t, ok, "results chan is not closed") }() select { case <-done: @@ -456,7 +470,9 @@ func TestAllFlags(t *testing.T) { } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() flags := AllFlags(tt.packet) require.Equal(t, tt.expected, flags) }) diff --git a/pkg/scan/udp/udp_test.go b/pkg/scan/udp/udp_test.go index b4d158e..0c371e3 100644 --- a/pkg/scan/udp/udp_test.go +++ b/pkg/scan/udp/udp_test.go @@ -280,25 +280,30 @@ func TestProcessPacketDataEthernet(t *testing.T) { ComputeChecksums: true, } err := gopacket.SerializeLayers(packet, opt, eth, ip, icmpLayer) - require.NoError(t, err) + if !assert.NoError(t, err) { + return + } err = sm.ProcessPacketData(packet.Bytes(), &gopacket.CaptureInfo{}) - require.NoError(t, err) + if !assert.NoError(t, err) { + return + } result, ok := <-sm.Results() if !ok { - require.FailNow(t, "results chan is empty") + assert.Fail(t, "results chan is empty") + return } icmpResult := result.(*icmp.ScanResult) assert.Equal(t, ScanType, icmpResult.ScanType) assert.Equal(t, net.IPv4(192, 168, 0, 2).To4().String(), icmpResult.IP) - require.NotNil(t, icmpResult.ICMP) + assert.NotNil(t, icmpResult.ICMP) assert.Equal(t, uint8(layers.ICMPv4TypeDestinationUnreachable), icmpResult.ICMP.Type) assert.Equal(t, uint8(layers.ICMPv4CodePort), icmpResult.ICMP.Code) cancel() _, ok = <-sm.Results() - require.False(t, ok, "results chan is not closed") + assert.False(t, ok, "results chan is not closed") }() select { case <-done: @@ -343,25 +348,30 @@ func TestProcessPacketDataIPv4(t *testing.T) { ComputeChecksums: true, } err := gopacket.SerializeLayers(packet, opt, ip, icmpLayer) - require.NoError(t, err) + if !assert.NoError(t, err) { + return + } err = sm.ProcessPacketData(packet.Bytes(), &gopacket.CaptureInfo{}) - require.NoError(t, err) + if !assert.NoError(t, err) { + return + } result, ok := <-sm.Results() if !ok { - require.FailNow(t, "results chan is empty") + assert.Fail(t, "results chan is empty") + return } icmpResult := result.(*icmp.ScanResult) assert.Equal(t, ScanType, icmpResult.ScanType) assert.Equal(t, net.IPv4(192, 168, 0, 2).To4().String(), icmpResult.IP) - require.NotNil(t, icmpResult.ICMP) + assert.NotNil(t, icmpResult.ICMP) assert.Equal(t, uint8(layers.ICMPv4TypeDestinationUnreachable), icmpResult.ICMP.Type) assert.Equal(t, uint8(layers.ICMPv4CodePort), icmpResult.ICMP.Code) cancel() _, ok = <-sm.Results() - require.False(t, ok, "results chan is not closed") + assert.False(t, ok, "results chan is not closed") }() select { case <-done: