From 181880dd11acd3b7fca59857fa42eff5b64b5050 Mon Sep 17 00:00:00 2001
From: v-byte-cpu <65545655+v-byte-cpu@users.noreply.github.com>
Date: Wed, 10 Jun 2026 21:40:48 +0400
Subject: [PATCH] build(go): upgrade toolchain and refresh dependencies
Bump the project to Go 1.25 and align CI, linting, and Docker tooling
with the new toolchain.
Refresh Go module dependencies and make the small code/test adjustments
needed for newer APIs and tooling behavior.
---
.github/renovate.json | 56 ++++++++++++++
.github/workflows/ci.yml | 15 ++--
.github/workflows/release.yml | 6 +-
.golangci.yml | 74 +++++++++++++------
.revive.toml | 44 -----------
Dockerfile | 4 +-
README.md | 4 +-
command/arp.go | 2 +-
command/arp_test.go | 4 +-
command/config_test.go | 55 +++++++++++---
command/icmp_test.go | 4 +-
command/log/logger_test.go | 8 +-
command/log/unique_logger_test.go | 6 +-
command/root.go | 2 -
command/socks_test.go | 4 +-
command/tcp_test.go | 8 +-
command/udp_test.go | 4 +-
go.mod | 43 ++++++-----
go.sum | 113 +++++++++++++----------------
main_test.go | 2 +
pkg/ip/ip_test.go | 4 +-
pkg/packet/mock_receiver_test.go | 14 +++-
pkg/packet/mock_sender_test.go | 17 +++--
pkg/packet/receiver.go | 2 +-
pkg/packet/receiver_test.go | 19 ++---
pkg/packet/sender.go | 2 +-
pkg/packet/sender_test.go | 28 +++----
pkg/scan/arp/arp.go | 2 +-
pkg/scan/arp/arp_test.go | 14 ++--
pkg/scan/arp/bpf_test.go | 4 +-
pkg/scan/arp/cache_test.go | 17 +++--
pkg/scan/arp/mock_request_test.go | 16 ++--
pkg/scan/arp/result_easyjson.go | 24 +++---
pkg/scan/engine.go | 2 +-
pkg/scan/engine_test.go | 44 +++++------
pkg/scan/generator.go | 2 +-
pkg/scan/generator_test.go | 50 ++++++-------
pkg/scan/icmp/bpf_test.go | 4 +-
pkg/scan/icmp/icmp.go | 16 ++--
pkg/scan/icmp/icmp_test.go | 34 ++++++---
pkg/scan/icmp/result_easyjson.go | 41 +++++++----
pkg/scan/mock_engine_test.go | 25 ++++---
pkg/scan/mock_generator_test.go | 19 +++--
pkg/scan/mock_request_test.go | 43 ++++++-----
pkg/scan/mock_sendreceiver_test.go | 27 ++++---
pkg/scan/range_test.go | 23 +++---
pkg/scan/request.go | 4 +-
pkg/scan/request_easyjson.go | 18 +++--
pkg/scan/request_test.go | 99 ++++++++++++++++---------
pkg/scan/result_test.go | 2 +-
pkg/scan/socks5/message_test.go | 6 ++
pkg/scan/socks5/socks5.go | 2 +-
pkg/scan/tcp/bpf.go | 2 +-
pkg/scan/tcp/bpf_test.go | 8 +-
pkg/scan/tcp/result_easyjson.go | 30 +++++---
pkg/scan/tcp/tcp.go | 2 +-
pkg/scan/tcp/tcp_test.go | 36 ++++++---
pkg/scan/udp/udp_test.go | 30 +++++---
58 files changed, 725 insertions(+), 465 deletions(-)
delete mode 100644 .revive.toml
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 @@
[](https://github.com/v-byte-cpu/sx/blob/master/LICENSE)
-[](https://cloud.drone.io/v-byte-cpu/sx)
+[](https://github.com/v-byte-cpu/sx/actions/workflows/ci.yml)
[](https://goreportcard.com/report/github.com/v-byte-cpu/sx)

@@ -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: