Skip to content

Commit 78d4555

Browse files
feat: Coverage-Based Deduplication Support via runtime/coverage Package (#202)
* feat: coverage initial set up Signed-off-by: Asish Kumar <officialasishkumar@gmail.com> * feat: update comments Signed-off-by: Asish Kumar <officialasishkumar@gmail.com> * feat: update dedupData.yaml with correct values Signed-off-by: Asish Kumar <officialasishkumar@gmail.com> * refactor: remove the old vendor Signed-off-by: Asish Kumar <officialasishkumar@gmail.com> * feat: add vendor Signed-off-by: Asish Kumar <officialasishkumar@gmail.com> * fix: update comments Signed-off-by: Asish Kumar <officialasishkumar@gmail.com> * feat: add clear counters after every test case run Signed-off-by: Asish Kumar <officialasishkumar@gmail.com> * feat: update comments Signed-off-by: Asish Kumar <officialasishkumar@gmail.com> * refactor: better comments Signed-off-by: Asish Kumar <officialasishkumar@gmail.com> * feat: update go mod file Signed-off-by: Asish Kumar <officialasishkumar@gmail.com> * feat: skip reporting in case of mismatched test id Signed-off-by: Asish Kumar <officialasishkumar@gmail.com> * fix: bump go version Signed-off-by: Asish Kumar <officialasishkumar@gmail.com> * fix: bump go version Signed-off-by: Asish Kumar <officialasishkumar@gmail.com> * fix: bump go version Signed-off-by: Asish Kumar <officialasishkumar@gmail.com> * fix: add install command in workflow Signed-off-by: Asish Kumar <officialasishkumar@gmail.com> * fix: bump go version Signed-off-by: Asish Kumar <officialasishkumar@gmail.com> * fix: bump go version in workflow Signed-off-by: Asish Kumar <officialasishkumar@gmail.com> * feat: add an ack in end command Signed-off-by: Asish Kumar <officialasishkumar@gmail.com> * fix: block.count continue Signed-off-by: Asish Kumar <officialasishkumar@gmail.com> * feat: bump sdk version Signed-off-by: Asish Kumar <officialasishkumar@gmail.com> * refactor: better file name for sock Signed-off-by: Asish Kumar <officialasishkumar@gmail.com> * fix: early return and new coverage folder name Signed-off-by: Asish Kumar <officialasishkumar@gmail.com> * feat: change socket name Signed-off-by: Asish Kumar <officialasishkumar@gmail.com> * fix: dir creation error Signed-off-by: Asish Kumar <officialasishkumar@gmail.com> * feat: add more instruction for coverage Signed-off-by: Asish <officialasishkumar@gmail.com> * feat: add golang ci lint Signed-off-by: Asish <officialasishkumar@gmail.com> * feat: add golang ci lint Signed-off-by: Asish <officialasishkumar@gmail.com> * feat: add golang ci lint Signed-off-by: Asish <officialasishkumar@gmail.com> * feat: add golang ci lint Signed-off-by: Asish <officialasishkumar@gmail.com> --------- Signed-off-by: Asish Kumar <officialasishkumar@gmail.com> Signed-off-by: Asish <officialasishkumar@gmail.com>
1 parent 5c55a7e commit 78d4555

106 files changed

Lines changed: 362 additions & 11471 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/build-workflow.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@ jobs:
1616
- name: Set up Go
1717
uses: actions/setup-go@v3
1818
with:
19-
go-version: 1.16
19+
go-version: 1.24
20+
21+
- name: Install dependencies
22+
run: go mod tidy
2023

2124
- name: Build
2225
run: go build -v ./...
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
name: golangci-lint
2+
3+
on:
4+
push:
5+
branches: ["main"]
6+
pull_request:
7+
branches: ["main"]
8+
9+
permissions:
10+
contents: read
11+
# Optional: allow read access to pull request. Use with `only-new-issues` option.
12+
pull-requests: read
13+
14+
# Cancel the in-progress workflow when PR is refreshed.
15+
concurrency:
16+
group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.sha }}
17+
cancel-in-progress: true
18+
19+
jobs:
20+
golangci:
21+
name: lint
22+
runs-on: ubuntu-latest
23+
env:
24+
CGO_ENABLED: "1"
25+
permissions:
26+
contents: read
27+
packages: write
28+
id-token: write
29+
30+
steps:
31+
- uses: actions/checkout@v4
32+
33+
- uses: actions/setup-go@v4
34+
with:
35+
go-version: "1.24"
36+
cache: false
37+
- name: Installing build Essentials and gcc
38+
run: |
39+
sudo apt -y update
40+
sudo apt -y install build-essential gcc libc-dev \
41+
pkg-config \
42+
libgl1-mesa-dev \
43+
libxi-dev libxcursor-dev \
44+
libxrandr-dev libxinerama-dev \
45+
libxxf86vm-dev libx11-dev libx11-xcb-dev
46+
47+
- name: golangci-lint
48+
uses: golangci/golangci-lint-action@v7
49+
with:
50+
only-new-issues: true
51+
args: --timeout=7m

README.md

Lines changed: 21 additions & 182 deletions
Original file line numberDiff line numberDiff line change
@@ -1,203 +1,42 @@
1-
# Keploy Go-SDK
1+
# Keploy Go Coverage Agent
22

3-
This is the client SDK for the [Keploy](https://github.com/keploy/keploy) testing platform. You can use this to generate realistic mock/stub files for your applications.
3+
This package enables native Go coverage reporting for tests generated by Keploy enterprise. It works by listening for commands from the Keploy binary to start and stop coverage collection for each test case.
44

5-
## Contents
5+
## How to Use
66

7-
1. [Installation](#installation)
8-
2. [Usage](#usage)
9-
3. [Mocking/Stubbing for unit tests](#mockingstubbing-for-unit-tests)
10-
4. [Code coverage by the API tests](#code-coverage-by-the-api-tests)
7+
To integrate the coverage agent into your Go application, follow these two steps:
118

12-
## Installation
9+
### 1. Activate the Agent
1310

14-
```bash
15-
go get -u github.com/keploy/go-sdk/v2
16-
```
17-
18-
## Usage
19-
20-
### Get coverage for keploy automated tests
21-
The code coverage for the keploy API tests using the `go-test` integration.
22-
Keploy can be integrated in your CI pipeline which can add the coverage of your keploy test.
23-
24-
### Create mocks/stubs for your unit-test
25-
26-
These mocks/stubs are realistic and frees you up from writing them manually. Keploy creates `readable/editable` mocks/stubs yaml files which can be referenced in any of your unit-tests tests. An example is mentioned in [Mocking/Stubbing for unit tests](#mockingstubbing-for-unit-tests) section
27-
28-
1. Install [keploy](https://github.com/keploy/keploy#quick-installation) binary
29-
2. **Record**: To record you can import the keploy mocking library and set the mode to record mode and run you databases. This should generate a file containing the mocks/stubs.
11+
Add a blank import for the package in your application's main entry point (e.g., in your `main.go` file). This import's side effects will automatically initialize and run the coverage agent in the background.
3012

3113
```go
32-
import(
33-
"github.com/keploy/go-sdk/v2/keploy"
14+
import (
15+
// ... other imports
16+
_ "github.com/keploy/go-sdk/v3/keploy"
3417
)
35-
36-
// Inside your unit test
37-
...
38-
err := keploy.New(keploy.Config{
39-
Mode: keploy.MODE_RECORD, // It can be MODE_TEST or MODE_OFF. Default is MODE_TEST. Default MODE_TEST
40-
Name: "<stub_name/mock_name>" // TestSuite name to record the mock or test the mocks
41-
Path: "<local_path_for_saving_mock>", // optional. It can be relative(./internals) or absolute(/users/xyz/...)
42-
MuteKeployLogs: false, // optional. It can be true or false. If it is true keploy logs will be not shown in the unit test terminal. Default: false
43-
delay: 10, // by default it is 5 . This delay is for running keploy
44-
})
45-
...
4618
```
4719

48-
At the end of the test case you can add the following function which will terminate keploy if not keploy will be running even after unit test is run
20+
### 2. Build with Coverage Flags
4921

50-
```go
51-
keploy.KillProcessOnPort()
52-
```
22+
Compile your application using the `-cover` and `-covermode=atomic` flags. These are required for the agent to access and clear coverage data for each test run according to https://pkg.go.dev/runtime/coverage@go1.25rc2#ClearCounters
5323

54-
3. **Mock**: To mock dependency as per the content of the generated file (during testing) - just set the `Mode` config to `keploy.MODE_TEST` eg:
55-
56-
```go
57-
err := keploy.New(keploy.Config{
58-
Mode: keploy.MODE_TEST,
59-
Name: "<stub_name/mock_name>"
60-
Path: "<local_path_for_saving_mock>",
61-
MubeKeployLogs: false,
62-
delay: 10,
63-
})
24+
```bash
25+
go build -cover -covermode=atomic -o your-app .
6426
```
6527

66-
## Mocking/Stubbing for unit tests
67-
68-
Mocks/Stubs can be generated for external dependency calls of go unit tests as `readable/editable` yaml files using Keploy.
69-
70-
### Example
71-
72-
```go
73-
package main
74-
75-
import (
76-
"bytes"
77-
"encoding/json"
78-
"fmt"
79-
"net/http"
80-
"net/http/httptest"
81-
"testing"
82-
83-
"github.com/gin-gonic/gin"
84-
"github.com/keploy/go-sdk/v2/keploy"
85-
)
86-
87-
func setup(t *testing.T) {
88-
err := keploy.New(keploy.Config{
89-
Name: "TestPutURL",
90-
Mode: keploy.MODE_RECORD, // change to MODE_TEST when you run in test mode
91-
Path: "/home/ubuntu/dont_touch/samples-go/gin-mongo",
92-
MuteKeployLogs: false,
93-
Delay: 15,
94-
})
95-
if err != nil {
96-
t.Fatalf("error while running keploy: %v", err)
97-
}
98-
dbName, collection := "keploy", "url-shortener"
99-
client, err := New("localhost:27017", dbName)
100-
if err != nil {
101-
panic("Failed to initialize MongoDB: " + err.Error())
102-
}
103-
db := client.Database(dbName)
104-
col = db.Collection(collection)
105-
}
106-
107-
func TestPutURL(t *testing.T) {
108-
109-
defer keploy.KillProcessOnPort()
110-
setup(t)
111-
112-
r := gin.Default()
113-
r.GET("/:param", getURL)
114-
r.POST("/url", putURL)
115-
116-
data := map[string]string{
117-
"url": "https://www.example.com",
118-
}
119-
payload, err := json.Marshal(data)
120-
if err != nil {
121-
t.Fatalf("rfe: %v\n", err)
122-
}
28+
### 3. Run tests with Keploy enterprise version
12329

124-
req, err := http.NewRequest(http.MethodPost, "/url", bytes.NewBuffer(payload))
125-
if err != nil {
126-
t.Fatalf("Couldn't create request: %v\n", err)
127-
}
128-
req.Header.Set("Content-Type", "application/json")
129-
130-
w := httptest.NewRecorder()
131-
r.ServeHTTP(w, req)
132-
133-
// Checking if the URL was successfully shortened and stored
134-
if w.Code != http.StatusOK {
135-
t.Fatalf("Expected HTTP 200 OK, but got %v", w.Code)
136-
}
137-
138-
var response map[string]interface{}
139-
err = json.Unmarshal(w.Body.Bytes(), &response)
140-
if err != nil {
141-
t.Fatalf("Failed to unmarshal response: %v\n", err)
142-
}
143-
fmt.Println("response-url" + response["url"].(string))
144-
145-
if response["url"] == nil || response["ts"] == nil {
146-
t.Fatalf("Response did not contain expected fields")
147-
}
148-
}
30+
```bash
31+
sudo -E keploy-enterprise test -c "./your-app" --dedup
14932
```
15033

151-
## Code coverage by the API tests
34+
Now you will see `dedupData.yaml` getting created.
15235

153-
The percentage of code covered by the recorded tests is logged if the test cmd is ran with the go binary and `withCoverage` flag. The conditions for the coverage is:
154-
1. The go binary should be built with `-cover` flag.
155-
2. The application should have a graceful shutdown to stop the API server on `SIGTERM` or `SIGINT` signals. Or if not call the **GracefulShutdown** from the main function of your go program. Ex:
156-
```go
157-
func main() {
36+
Run `sudo -E keploy-enterprise dedup` to get the tests which are duplicate in `duplicates.yaml` file
15837

159-
port := "8080"
38+
In order to remove the duplicate tests, run the following command:
16039

161-
r := gin.Default()
162-
163-
r.GET("/:param", getURL)
164-
r.POST("/url", putURL)
165-
// should be called before starting the API server from main()
166-
keploy.GracefulShutdown()
167-
168-
r.Run()
169-
}
170-
```
171-
The keploy test cmd will look like:
172-
```sh
173-
keploy test -c "PATH_TO_GO_COVER_BIANRY" --withCoverage
174-
```
175-
The coverage files will be stored in the directory.
176-
```
177-
keploy
178-
├── coverage-reports
179-
│ ├── covcounters.befc2fe88a620bbd45d85aa09517b5e7.305756.1701767439933176870
180-
│ ├── covmeta.befc2fe88a620bbd45d85aa09517b5e7
181-
│ └── total-coverage.txt
182-
├── test-set-0
183-
│ ├── mocks.yaml
184-
│ └── tests
185-
│ ├── test-1.yaml
186-
│ ├── test-2.yaml
187-
│ ├── test-3.yaml
188-
│ └── test-4.yaml
189-
```
190-
Coverage percentage log in the cmd will be:
191-
```sh
192-
🐰 Keploy: 2023-12-07T08:53:14Z INFO test/test.go:261
193-
test-app-url-shortener coverage: 78.4% of statements
40+
```bash
41+
sudo -E keploy-enterprise dedup --rm
19442
```
195-
196-
Also the go-test coverage can be merged along the recorded tests coverage by following the steps:
197-
```sh
198-
go test -cover ./... -args -test.gocoverdir="PATH_TO_UNIT_COVERAGE_FILES"
199-
200-
go tool covdata textfmt -i="PATH_TO_UNIT_COVERAGE_FILES","./keploy/coverage-reports" -o coverage-profile
201-
202-
go tool cover -func coverage-profile
203-
```

go.mod

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,7 @@
1-
module github.com/keploy/go-sdk/v2
1+
module github.com/keploy/go-sdk/v3
22

3-
go 1.16
3+
go 1.24
44

55
//replace go.keploy.io/server => ../keploy
66

7-
require go.uber.org/zap v1.22.0
8-
9-
require (
10-
github.com/pkg/errors v0.9.1 // indirect
11-
github.com/stretchr/testify v1.7.1 // indirect
12-
go.uber.org/atomic v1.9.0 // indirect
13-
go.uber.org/multierr v1.7.0 // indirect
14-
)
7+
require golang.org/x/tools v0.1.5

go.sum

Lines changed: 1 addition & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,2 @@
1-
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
2-
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
3-
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
4-
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
5-
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
6-
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
7-
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
8-
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
9-
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
10-
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
11-
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
12-
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
13-
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
14-
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
15-
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
16-
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
17-
github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=
18-
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
19-
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
20-
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
21-
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
22-
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
23-
go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
24-
go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
25-
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
26-
go.uber.org/multierr v1.7.0 h1:zaiO/rmgFjbmCXdSYJWQcdvOCsthmdaHfr3Gm2Kx4Ec=
27-
go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
28-
go.uber.org/zap v1.22.0 h1:Zcye5DUgBloQ9BaT4qc9BnjOFog5TvBSAGkJ3Nf70c0=
29-
go.uber.org/zap v1.22.0/go.mod h1:H4siCOZOrAolnUPJEkfaSjDqyP+BDS0DdDWzwcgt3+U=
30-
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
31-
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
32-
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
33-
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
34-
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
35-
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
36-
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
37-
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
38-
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
39-
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
40-
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
41-
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
42-
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
43-
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
44-
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
45-
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
46-
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
47-
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
48-
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
49-
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
50-
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
1+
golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA=
512
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
52-
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
53-
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
54-
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
55-
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
56-
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
57-
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
58-
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
59-
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
60-
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

0 commit comments

Comments
 (0)