47 Commits

Author SHA1 Message Date
e75926bcc6 docs: show CI/CD status badge and mascot in README
SonarQube Scan / SonarQube Trigger (push) Successful in 3m27s
SonarQube Scan / SonarQube Trigger (pull_request) Successful in 3m59s
2026-01-27 16:16:32 +07:00
b9ec59efb6 test(interaction): add unit tests for interaction behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 3m53s
2026-01-27 15:39:45 +07:00
02d869fa11 refactor(dockerfile): split long ldflags line
SonarQube Scan / SonarQube Trigger (push) Successful in 3m33s
2026-01-27 14:22:17 +07:00
d167508a55 refactor(interaction): reduce cognitive complexity and centralize color constants
SonarQube Scan / SonarQube Trigger (push) Successful in 3m49s
2026-01-27 13:43:31 +07:00
7f4f448b47 fix: ensure proper buffer reuse with pointer handling in sync.Pool
SonarQube Scan / SonarQube Trigger (push) Successful in 2m26s
2026-01-26 19:50:34 +07:00
a9d98213ce test: check and handle error for testing
SonarQube Scan / SonarQube Trigger (push) Successful in 3m35s
2026-01-26 19:45:27 +07:00
48b680110a ci: add project source and test path for sonarqube
SonarQube Scan / SonarQube Trigger (push) Successful in 3m42s
2026-01-26 18:13:03 +07:00
bb32f25954 test(forwarder): add unit tests for forwarder behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 2m20s
2026-01-26 11:58:56 +07:00
4410c9b993 chore(tests): migrate to Testify for mocking and assertions
SonarQube Scan / SonarQube Trigger (push) Successful in 2m36s
2026-01-26 11:56:58 +07:00
f1d20905d0 refactor(forwarder): remove CreateForwardedTCPIPPayload method
SonarQube Scan / SonarQube Trigger (push) Successful in 2m32s
- OpenForwardedChannel now privately calls CreateForwardedTCPIPPayload
- Removed an unused function
2026-01-25 20:49:12 +07:00
21b551a66d feat(http): add http header size limit for initial request
SonarQube Scan / SonarQube Trigger (push) Successful in 2m18s
2026-01-25 18:47:54 +07:00
05bf9d6045 refactor(header): NewRequest to accept only []byte
SonarQube Scan / SonarQube Trigger (push) Failing after 54s
2026-01-25 18:45:08 +07:00
5cd3c201f2 test(config): add test for keyloc and header size
SonarQube Scan / SonarQube Trigger (push) Failing after 56s
2026-01-25 18:17:37 +07:00
9cdce24030 test(stream): migrate mocking to testify
SonarQube Scan / SonarQube Trigger (push) Successful in 2m21s
2026-01-25 18:14:29 +07:00
8b44e4db4e refactor: remove duplicate channel management helpers from HTTP handler
SonarQube Scan / SonarQube Trigger (push) Successful in 2m12s
2026-01-25 13:47:57 +07:00
2b488a5ab5 refactor: remove custom parsing functions and use ssh.Marshal/ssh.Unmarshal for serialization
SonarQube Scan / SonarQube Trigger (push) Successful in 2m14s
2026-01-25 12:21:25 +07:00
e59fea6604 test(server): add unit test for handleConnection
SonarQube Scan / SonarQube Trigger (push) Successful in 2m18s
2026-01-24 23:47:51 +07:00
d5f7ebf597 test(lifecycle): add unit tests for lifecycle behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 2m15s
2026-01-24 20:28:30 +07:00
0f5d00f79a test(slug): add unit tests for slug behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 2m10s
2026-01-24 19:16:31 +07:00
f0ab62a753 fix: properly initialize tlsStoragePath in config load
SonarQube Scan / SonarQube Trigger (push) Successful in 2m31s
2026-01-24 17:59:11 +07:00
752bacfe98 fix: correct buffer pool usage to avoid type assertion error
SonarQube Scan / SonarQube Trigger (push) Successful in 2m28s
2026-01-24 17:50:22 +07:00
9c857f6148 refactor(transport): reduce cognitive complexity and clean up public API
SonarQube Scan / SonarQube Trigger (push) Successful in 2m29s
2026-01-24 17:41:41 +07:00
42c428c83d test(bootstrap): add unit tests for initial bootstrap behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 2m30s
2026-01-24 16:15:30 +07:00
1171b18340 refactor: decouple application startup logic from main
SonarQube Scan / SonarQube Trigger (push) Successful in 2m18s
2026-01-24 00:21:40 +07:00
3d43396f3e fix: corrected defer usage to pass buffer pointer
SonarQube Scan / SonarQube Trigger (push) Successful in 2m24s
2026-01-23 20:31:27 +07:00
90423d675c fix: remove unnecessary use of fmt.Sprintf
SonarQube Scan / SonarQube Trigger (push) Successful in 2m34s
2026-01-23 20:28:11 +07:00
b7d6f2bae2 fix: handle error return values for privateKeyFile.Close and pubKeyFile.Close
SonarQube Scan / SonarQube Trigger (push) Has been cancelled
2026-01-23 20:27:20 +07:00
8e8d9eaf39 chore: remove unused headerBuf variable
SonarQube Scan / SonarQube Trigger (push) Successful in 2m13s
2026-01-23 20:05:40 +07:00
636f17cabf ci: sonarqube add linting
SonarQube Scan / SonarQube Trigger (push) Successful in 2m14s
2026-01-23 19:58:09 +07:00
761ee3f099 test(session): add unit tests for session behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 1m51s
2026-01-23 19:03:01 +07:00
169bc2358c refactor(session): reduce function parameters
SonarQube Scan / SonarQube Trigger (push) Successful in 1m55s
2026-01-23 15:58:50 +07:00
e522ffa44f test(version): add unit tests for version behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 1m45s
2026-01-23 15:41:00 +07:00
6e6b251a7b test(client): add unit tests for grpc client behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 1m54s
2026-01-23 15:27:20 +07:00
24ea464c7a fix(client): reduce cognitive complexity and fix typo (go:S3776)
SonarQube Scan / SonarQube Trigger (push) Successful in 1m51s
2026-01-23 14:57:06 +07:00
4334dfe9b4 test(key): add unit tests for key behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 2m1s
2026-01-23 14:17:18 +07:00
dbaf5f4e60 ci: update SonarQube action configuration
SonarQube Scan / SonarQube Trigger (push) Successful in 1m41s
2026-01-23 13:38:50 +07:00
5bed32bda3 test(server): add unit tests for server startup behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 1m49s
2026-01-22 21:58:25 +07:00
6d57dfa34c test(config): add unit tests for config behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 1m35s
2026-01-22 21:24:58 +07:00
7159300fa2 test(stream): add unit tests for stream behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 1m39s
- Fix duplicating EOF error when closing SSH connection
- Add new SessionStatusCLOSED type
2026-01-22 21:04:05 +07:00
d7e1f3fa63 test(header): add unit tests for header behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 1m39s
2026-01-22 19:47:31 +07:00
8d5e1b970a update: exclude local test coverage
SonarQube Scan / SonarQube Trigger (push) Has been cancelled
2026-01-22 19:46:47 +07:00
b0249c45ae test(transport): add unit tests for transport behavior using Testify
SonarQube Scan / SonarQube Trigger (push) Successful in 1m51s
2026-01-22 19:22:35 +07:00
9d03f5507f test(random): add unit tests for random behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 1m37s
- Added unit tests to cover random string generation and error handling.
- Introduced Random interface and random struct for better abstraction.
- Updated server, session, and interaction packages to require Random interface for dependency injection.
2026-01-22 13:28:10 +07:00
ae31e573b5 test(port): add unit tests for port behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 1m35s
2026-01-22 12:39:46 +07:00
a350692e81 test(middleware): add unit tests for middleware behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 1m30s
- remove redundant check on registry.Update and check if slug exist before locking the mutex
- Update SonarQube action to not use Go cache when setting up Go
2026-01-22 12:34:24 +07:00
5a7aa1ecb7 ci: automate Go tests and Sonar coverage reporting
SonarQube Scan / SonarQube Trigger (push) Successful in 10m48s
2026-01-22 01:29:29 +07:00
ed11a0b801 test(registry): add unit tests for registry behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 47s
2026-01-22 00:47:53 +07:00
5 changed files with 100 additions and 90 deletions
+80 -40
View File
@@ -2,38 +2,24 @@ name: Docker Build and Push
on: on:
push: push:
branches:
- main
- staging
tags: tags:
- 'v*' - 'v*'
paths:
- '**.go'
- 'go.mod'
- 'go.sum'
- 'Dockerfile'
- 'Dockerfile.*'
- '.dockerignore'
- '.gitea/workflows/build.yml'
jobs: jobs:
test: build-and-push-branches:
name: Run Tests
runs-on: ubuntu-latest runs-on: ubuntu-latest
if: github.ref_type == 'branch'
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version: 'stable'
cache: false
- name: Install dependencies
run: go mod download
- name: Run go vet
run: go vet ./...
- name: Run tests
run: go test -v -p 4 ./...
build-and-push:
name: Build and Push Docker Image
runs-on: ubuntu-latest
needs: test
steps: steps:
- name: Checkout repository - name: Checkout repository
@@ -42,7 +28,64 @@ jobs:
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3 uses: docker/setup-buildx-action@v3
- name: Log in to Docker Registry - name: Log in to Docker Hub
uses: docker/login-action@v3
with:
registry: git.fossy.my.id
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Set version variables
id: vars
run: |
if [ "${{ github.ref }}" == "refs/heads/main" ]; then
echo "VERSION=dev-main" >> $GITHUB_OUTPUT
else
echo "VERSION=dev-staging" >> $GITHUB_OUTPUT
fi
echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT
echo "COMMIT=${{ github.sha }}" >> $GITHUB_OUTPUT
- name: Build and push Docker image for main
uses: docker/build-push-action@v6
with:
context: .
push: true
tags: |
git.fossy.my.id/${{ secrets.DOCKER_USERNAME }}/tunnel-please:latest
platforms: linux/amd64,linux/arm64
build-args: |
VERSION=${{ steps.vars.outputs.VERSION }}
BUILD_DATE=${{ steps.vars.outputs.BUILD_DATE }}
COMMIT=${{ steps.vars.outputs.COMMIT }}
if: github.ref == 'refs/heads/main'
- name: Build and push Docker image for staging
uses: docker/build-push-action@v6
with:
context: .
push: true
tags: |
git.fossy.my.id/${{ secrets.DOCKER_USERNAME }}/tunnel-please:staging
platforms: linux/amd64,linux/arm64
build-args: |
VERSION=${{ steps.vars.outputs.VERSION }}
BUILD_DATE=${{ steps.vars.outputs.BUILD_DATE }}
COMMIT=${{ steps.vars.outputs.COMMIT }}
if: github.ref == 'refs/heads/staging'
build-and-push-tags:
runs-on: ubuntu-latest
if: github.ref_type == 'tag' && startsWith(github.ref, 'refs/tags/v')
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to Docker Hub
uses: docker/login-action@v3 uses: docker/login-action@v3
with: with:
registry: git.fossy.my.id registry: git.fossy.my.id
@@ -60,35 +103,32 @@ jobs:
if echo "$VERSION" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9.]+)?$'; then if echo "$VERSION" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9.]+)?$'; then
MAJOR=$(echo "$VERSION" | cut -d. -f1) MAJOR=$(echo "$VERSION" | cut -d. -f1)
MINOR=$(echo "$VERSION" | cut -d. -f2) MINOR=$(echo "$VERSION" | cut -d. -f2)
PATCH=$(echo "$VERSION" | cut -d. -f3 | cut -d- -f1)
echo "MAJOR=$MAJOR" >> $GITHUB_OUTPUT echo "MAJOR=$MAJOR" >> $GITHUB_OUTPUT
echo "MINOR=$MINOR" >> $GITHUB_OUTPUT echo "MINOR=$MINOR" >> $GITHUB_OUTPUT
echo "PATCH=$PATCH" >> $GITHUB_OUTPUT
if echo "$VERSION" | grep -q '-'; then if echo "$VERSION" | grep -q '-'; then
PRERELEASE_TAG=$(echo "$VERSION" | cut -d- -f2 | cut -d. -f1)
echo "IS_PRERELEASE=true" >> $GITHUB_OUTPUT echo "IS_PRERELEASE=true" >> $GITHUB_OUTPUT
echo "PRERELEASE_TAG=$PRERELEASE_TAG" >> $GITHUB_OUTPUT echo "ADDITIONAL_TAG=staging" >> $GITHUB_OUTPUT
else else
echo "IS_PRERELEASE=false" >> $GITHUB_OUTPUT echo "IS_PRERELEASE=false" >> $GITHUB_OUTPUT
echo "ADDITIONAL_TAG=latest" >> $GITHUB_OUTPUT
fi fi
else else
echo "Invalid version format: $VERSION" echo "Invalid version format: $VERSION"
exit 1 exit 1
fi fi
- name: Build and push Docker image (release) - name: Build and push Docker image for release
uses: docker/build-push-action@v6 uses: docker/build-push-action@v6
with: with:
context: . context: .
push: true push: true
tags: | tags: |
git.fossy.my.id/${{ secrets.DOCKER_USERNAME }}/tunnel-please:v${{ steps.version.outputs.VERSION }} git.fossy.my.id/${{ secrets.DOCKER_USERNAME }}/tunnel-please:v${{ steps.version.outputs.VERSION }}
git.fossy.my.id/${{ secrets.DOCKER_USERNAME }}/tunnel-please:release
git.fossy.my.id/${{ secrets.DOCKER_USERNAME }}/tunnel-please:v${{ steps.version.outputs.MAJOR }}.${{ steps.version.outputs.MINOR }} git.fossy.my.id/${{ secrets.DOCKER_USERNAME }}/tunnel-please:v${{ steps.version.outputs.MAJOR }}.${{ steps.version.outputs.MINOR }}
git.fossy.my.id/${{ secrets.DOCKER_USERNAME }}/tunnel-please:v${{ steps.version.outputs.MAJOR }} git.fossy.my.id/${{ secrets.DOCKER_USERNAME }}/tunnel-please:v${{ steps.version.outputs.MAJOR }}
git.fossy.my.id/${{ secrets.DOCKER_USERNAME }}/tunnel-please:latest git.fossy.my.id/${{ secrets.DOCKER_USERNAME }}/tunnel-please:${{ steps.version.outputs.ADDITIONAL_TAG }}
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64
build-args: | build-args: |
VERSION=${{ steps.version.outputs.VERSION }} VERSION=${{ steps.version.outputs.VERSION }}
@@ -96,17 +136,17 @@ jobs:
COMMIT=${{ steps.version.outputs.COMMIT }} COMMIT=${{ steps.version.outputs.COMMIT }}
if: steps.version.outputs.IS_PRERELEASE == 'false' if: steps.version.outputs.IS_PRERELEASE == 'false'
- name: Build and push Docker image (pre-release) - name: Build and push Docker image for pre-release
uses: docker/build-push-action@v6 uses: docker/build-push-action@v6
with: with:
context: . context: .
push: true push: true
tags: | tags: |
git.fossy.my.id/${{ secrets.DOCKER_USERNAME }}/tunnel-please:v${{ steps.version.outputs.VERSION }} git.fossy.my.id/${{ secrets.DOCKER_USERNAME }}/tunnel-please:v${{ steps.version.outputs.VERSION }}
git.fossy.my.id/${{ secrets.DOCKER_USERNAME }}/tunnel-please:staging git.fossy.my.id/${{ secrets.DOCKER_USERNAME }}/tunnel-please:${{ steps.version.outputs.ADDITIONAL_TAG }}
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64
build-args: | build-args: |
VERSION=${{ steps.version.outputs.VERSION }} VERSION=${{ steps.version.outputs.VERSION }}
BUILD_DATE=${{ steps.version.outputs.BUILD_DATE }} BUILD_DATE=${{ steps.version.outputs.BUILD_DATE }}
COMMIT=${{ steps.version.outputs.COMMIT }} COMMIT=${{ steps.version.outputs.COMMIT }}
if: steps.version.outputs.IS_PRERELEASE == 'true' if: steps.version.outputs.IS_PRERELEASE == 'true'
+18 -8
View File
@@ -1,9 +1,7 @@
on: on:
push: push:
branches: pull_request:
- main types: [opened, synchronize, reopened]
- staging
- 'feat/**'
name: SonarQube Scan name: SonarQube Scan
jobs: jobs:
@@ -12,14 +10,14 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checking out - name: Checking out
uses: actions/checkout@v6 uses: actions/checkout@v4
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Set up Go - name: Set up Go
uses: actions/setup-go@v6 uses: actions/setup-go@v6
with: with:
go-version: 'stable' go-version: '1.25.5'
cache: false cache: false
- name: Install dependencies - name: Install dependencies
@@ -30,7 +28,7 @@ jobs:
- name: Run tests with coverage - name: Run tests with coverage
run: | run: |
go test ./... -v -p 4 -coverprofile=coverage go test ./... -v -coverprofile=coverage
- name: Run GolangCI-Lint Analysis - name: Run GolangCI-Lint Analysis
uses: golangci/golangci-lint-action@v9 uses: golangci/golangci-lint-action@v9
@@ -42,6 +40,18 @@ jobs:
--output.text.path=stdout --output.text.path=stdout
--output.checkstyle.path=golangci-lint-report.xml --output.checkstyle.path=golangci-lint-report.xml
- name: Set SonarQube project key
run: |
BRANCH_NAME=${GITHUB_REF#refs/heads/}
if [ "$BRANCH_NAME" = "main" ]; then
SONAR_PROJECT_KEY="tunnel-please"
else
BRANCH_KEY=${BRANCH_NAME//\//-}
SONAR_PROJECT_KEY="tunnel-please-$BRANCH_KEY"
fi
echo "SONAR_PROJECT_KEY=tunnel-please-$BRANCH_KEY" >> $GITHUB_ENV
echo "Using SonarQube Project Key: $SONAR_PROJECT_KEY"
- name: SonarQube Scan - name: SonarQube Scan
uses: SonarSource/sonarqube-scan-action@v7.0.0 uses: SonarSource/sonarqube-scan-action@v7.0.0
env: env:
@@ -49,7 +59,7 @@ jobs:
SONAR_TOKEN: ${{ secrets.SONARQUBE_TOKEN }} SONAR_TOKEN: ${{ secrets.SONARQUBE_TOKEN }}
with: with:
args: > args: >
-Dsonar.projectKey=tunnel-please -Dsonar.projectKey=${{ env.SONAR_PROJECT_KEY }}
-Dsonar.go.coverage.reportPaths=coverage -Dsonar.go.coverage.reportPaths=coverage
-Dsonar.test.inclusions=**/*_test.go -Dsonar.test.inclusions=**/*_test.go
-Dsonar.test.exclusions=**/vendor/** -Dsonar.test.exclusions=**/vendor/**
-36
View File
@@ -1,36 +0,0 @@
name: Tests
on:
pull_request:
types: [opened, synchronize, reopened]
issue_comment:
types: [created]
jobs:
test:
name: Run Tests
runs-on: ubuntu-latest
if: |
github.event_name == 'pull_request' ||
(github.event_name == 'issue_comment' &&
github.event.issue.pull_request != null &&
contains(github.event.comment.body, '/retest'))
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version: 'stable'
cache: false
- name: Install dependencies
run: go mod download
- name: Run go vet
run: go vet ./...
- name: Run tests
run: go test -v -p 4 ./...
+2 -2
View File
@@ -11,7 +11,7 @@ require (
github.com/joho/godotenv v1.5.1 github.com/joho/godotenv v1.5.1
github.com/libdns/cloudflare v0.2.2 github.com/libdns/cloudflare v0.2.2
github.com/muesli/termenv v0.16.0 github.com/muesli/termenv v0.16.0
github.com/stretchr/testify v1.11.1 github.com/stretchr/testify v1.8.1
golang.org/x/crypto v0.47.0 golang.org/x/crypto v0.47.0
google.golang.org/grpc v1.78.0 google.golang.org/grpc v1.78.0
google.golang.org/protobuf v1.36.11 google.golang.org/protobuf v1.36.11
@@ -43,7 +43,7 @@ require (
github.com/pmezard/go-difflib v1.0.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/rivo/uniseg v0.4.7 // indirect github.com/rivo/uniseg v0.4.7 // indirect
github.com/sahilm/fuzzy v0.1.1 // indirect github.com/sahilm/fuzzy v0.1.1 // indirect
github.com/stretchr/objx v0.5.2 // indirect github.com/stretchr/objx v0.5.0 // indirect
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
github.com/zeebo/blake3 v0.2.4 // indirect github.com/zeebo/blake3 v0.2.4 // indirect
go.uber.org/multierr v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect
-4
View File
@@ -85,14 +85,10 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.7.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/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
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/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
github.com/zeebo/assert v1.1.0 h1:hU1L1vLTHsnO8x8c9KAR5GmM5QscxHg5RNU5z5qbUWY= github.com/zeebo/assert v1.1.0 h1:hU1L1vLTHsnO8x8c9KAR5GmM5QscxHg5RNU5z5qbUWY=