diff --git a/.github/workflows/golang-ci.yml b/.github/workflows/golang-ci.yml index b1d5184..fa5b4da 100644 --- a/.github/workflows/golang-ci.yml +++ b/.github/workflows/golang-ci.yml @@ -19,24 +19,24 @@ jobs: runs-on: ubuntu-latest steps: - name: checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Set up Go - uses: actions/setup-go@v2 + uses: actions/setup-go@v4 with: - go-version: 1.19 + go-version: 1.22 - name: Test - run: go mod vendor && go test -v ./ + run: go mod vendor && go test -v ./... lint: runs-on: ubuntu-latest container: - image: golangci/golangci-lint:v1.48.0 + image: golangci/golangci-lint:v1.61 steps: - name: checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Set up Go - uses: actions/setup-go@v2 + uses: actions/setup-go@v4 with: - go-version: 1.19 + go-version: 1.22 - name: golangci-lint - run: rm -rf example && golangci-lint run --modules-download-mode=mod + run: golangci-lint run --modules-download-mode=mod diff --git a/.golangci.yml b/.golangci.yml index 17be260..2ccd2cb 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,22 +1,22 @@ linters: disable-all: true # 关闭其他linter enable: # 下面是开启的linter列表,之后的英文注释介绍了相应linter的功能 - - deadcode # Finds unused code - errcheck # Errcheck is a program for checking for unchecked errors in go programs. These unchecked errors can be critical bugs in some cases - gosimple # Linter for Go source code that specializes in simplifying a code - govet # Vet examines Go source code and reports suspicious constructs, such as Printf calls whose arguments do not align with the format string - ineffassign # Detects when assignments to existing variables are not used - staticcheck # Staticcheck is a go vet on steroids, applying a ton of static analysis checks - - structcheck # Finds unused struct fields - - typecheck # Like the front-end of a Go compiler, parses and type-checks Go code +# - typecheck # Like the front-end of a Go compiler, parses and type-checks Go code - unused # Checks Go code for unused constants, variables, functions and types - - varcheck # Finds unused global variables and constants - - exportloopref # checks for pointers to enclosing loop variables -# - golint # Carry out the stylistic conventions put forth in Effective Go and CodeReviewComments + - copyloopvar linters-settings: govet: # 对于linter govet,我们手动开启了它的某些扫描规则 enable-all: true - check-shadowing: true disable: - fieldalignment +issues: + exclude-dirs: + - scripts + - test + - example diff --git a/go.sum b/go.sum index 8709397..aef2b90 100644 --- a/go.sum +++ b/go.sum @@ -10,8 +10,6 @@ github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cu github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/go-redis/redismock/v9 v9.2.0 h1:ZrMYQeKPECZPjOj5u9eyOjg8Nnb0BS9lkVIZ6IpsKLw= github.com/go-redis/redismock/v9 v9.2.0/go.mod h1:18KHfGDK4Y6c2R0H38EUGWAdc7ZQS9gfYxc94k7rWT0= -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/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= @@ -27,40 +25,15 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/vearne/simplelog v0.0.1 h1:N/nQ1cLpJIVIRfWn4Ccv2nhETxq1lMC1u79yy714dUg= -github.com/vearne/simplelog v0.0.1/go.mod h1:W7Ip7PHWs8c0X+7b8hSj9zH7WxKB3oQ1pkr3tAtxqSo= github.com/vearne/simplelog v0.0.2 h1:SOd9ksyniEABwiqkLDpoGvxDcE0TSjW+3ExO4BpxONk= github.com/vearne/simplelog v0.0.2/go.mod h1:W7Ip7PHWs8c0X+7b8hSj9zH7WxKB3oQ1pkr3tAtxqSo= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -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/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/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.5.0 h1:GyT4nK/YDHSqa1c4753ouYCDajOYKTja9Xb/OHtgvSw= -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/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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-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.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -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/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -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.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= 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/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= diff --git a/ratelimit_test.go b/ratelimit_test.go deleted file mode 100644 index 614f71f..0000000 --- a/ratelimit_test.go +++ /dev/null @@ -1,127 +0,0 @@ -package ratelimit - -import ( - "context" - "fmt" - "github.com/go-redis/redismock/v9" - "github.com/stretchr/testify/assert" - "github.com/vearne/ratelimit/counter" - "github.com/vearne/ratelimit/leakybucket" - "github.com/vearne/ratelimit/tokenbucket" - "log" - "os" - "testing" - "time" -) - -func MyMatch(expected, actual []interface{}) error { - expectedStr := fmt.Sprintf("%v", expected) - actualStr := fmt.Sprintf("%v", actual) - if expectedStr == actualStr { - return nil - } - log.Printf("expectedStr:%v, actualStr:%v", expectedStr, actualStr) - os.Stdout.Write([]byte(fmt.Sprintf("expectedStr:%v, actualStr:%v", expectedStr, actualStr))) - return fmt.Errorf("not equal, expectedStr:%s, actualStr:%s", expectedStr, actualStr) -} - -func TestCantGetToken1(t *testing.T) { - key := "key:token" - - db, mock := redismock.NewClientMock() - - mock = mock.CustomMatch(MyMatch) - mock.ExpectPing().SetVal("PONG") - - hashVal := "1fc288109bccebf36ff083517ed03c4901c80be1" - mock.ExpectScriptExists(hashVal).SetVal([]bool{true}) - //mock.ExpectScriptLoad(TokenBucketScript).SetErr(nil) - mock.ExpectEvalSha(hashVal, []string{key}, 3, 2, 1).SetVal(int64(0)) - - limiter, err := tokenbucket.NewTokenBucketRateLimiter(context.Background(), db, key, - time.Second, - 3, - 1, - 2) - if err != nil { - t.Errorf("unexpected error, %v", err) - return - } - - cantGetToken(t, limiter) -} - -func TestCantGetToken2(t *testing.T) { - key := "key:leaky" - - db, mock := redismock.NewClientMock() - - //mock = mock.CustomMatch(MyMatch) - mock.ExpectPing().SetVal("PONG") - - mock.Regexp().ExpectScriptExists(`^[a-z0-9]+$`).SetVal([]bool{true}) - //mock.ExpectScriptLoad(TokenBucketScript).SetErr(nil) - mock.Regexp().ExpectEvalSha(`^[a-z0-9]+$`, []string{key}, 333333).SetVal(int64(0)) - - limiter, err := leakybucket.NewLeakyBucketLimiter(context.Background(), - db, key, time.Second, 3) - if err != nil { - t.Errorf("unexpected error, %v", err) - return - } - - cantGetToken(t, limiter) -} - -func TestCantGetToken3(t *testing.T) { - key := "key:count" - - db, mock := redismock.NewClientMock() - - mock = mock.CustomMatch(MyMatch) - mock.ExpectPing().SetVal("PONG") - - hashVal := "bdbede5669d5e48d6e6c2967aeed2f72f03868ac" - mock.ExpectScriptExists(hashVal).SetVal([]bool{true}) - mock.ExpectEvalSha("aa", []string{key}).SetVal(int64(1)) - - limiter, err := counter.NewCounterRateLimiter(context.Background(), db, key, - time.Minute, 3, 2) - if err != nil { - t.Errorf("unexpected error, %v", err) - return - } - - cantGetToken(t, limiter) -} - -func cantGetToken(t *testing.T, limiter Limiter) { - ok, err := limiter.Take(context.Background()) - if err != nil { - t.Errorf("unexpected error, %v", err) - return - } - if !ok { - assert.Equal(t, ok, false) - } -} - -//func TestContextTimeOut(t *testing.T) { -// ctx := context.Background() -// sha1 := "sha1" -// -// db, mock := redismock.NewClientMock() -// mock.ExpectPing().SetVal("PONG") -// -// mock.ExpectEvalSha(sha1, []string{key}, "xxx").SetVal(int64(0)) -// mock.ExpectScriptExists(sha1).SetVal([]bool{true, true}) -// -// limiter, _ := NewTokenBucketRateLimiter(ctx, db, key, -// time.Second, -// 20, -// 1, -// 2) -// -// err := limiter.Wait(ctx) -// assert.Contains(t, err.Error(), "timeout") -//}