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: