Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ jobs:
build-test:
strategy:
matrix:
go-version: [ 1.23, 1.24 ]
go-version: [ 1.26 ]
os: [ ubuntu-latest ]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
- uses: actions/checkout@v7
- uses: actions/setup-go@v7
with:
go-version: ${{ matrix.go-version }}

Expand All @@ -21,8 +21,8 @@ jobs:
- name: Test
run: go test -v ./... -coverprofile=coverage.txt -covermode=count
- name: Coverage Report
uses: codecov/codecov-action@v4
uses: codecov/codecov-action@v7
with:
files: ./coverage.txt
- name: lint
uses: golangci/golangci-lint-action@v7
uses: golangci/golangci-lint-action@v9
88 changes: 45 additions & 43 deletions .golangci.yaml
Original file line number Diff line number Diff line change
@@ -1,60 +1,58 @@
version: "2"
run:
go: "1.23"
tests: false
go: "1.26"
linters:
default: all
disable:
- depguard
- dupl
- exhaustruct
- funlen
- gochecknoglobals
- gocognit
- intrange
- gomodguard
- ireturn
- wsl # in favor of wsl_v5
- lll
- mnd
- tagalign
- tagliatelle
- testpackage
- varnamelen
- wsl
settings:
mnd:
ignored-numbers:
- "2"
cyclop:
max-complexity: 18
varnamelen:
max-distance: 10
ignore-type-assert-ok: true
ignore-map-index-ok: true
ignore-decls:
- ok bool
- i int
- n int
- e error
- h http.Handler
- t time.Time
- v reflect.Value
- w io.Writer
- w http.ResponseWriter
- rw http.ResponseWriter
- r *http.Request
- wg sync.WaitGroup
- c chan
- op string
- l zerolog.Logger
- r io.Reader
- l zerolog.Context
- s string
- l string
wsl_v5:
disable:
- decl
max-complexity: 15
goconst:
ignore-string-values:
- 'Host'
paralleltest:
ignore-missing: true
exclusions:
generated: lax
presets:
- comments
- common-false-positives
- legacy
- std-error-handling
paths:
- .*_gen.go$
- temp
rules:
- path: (.+)_test.go
linters:
- canonicalheader
- containedctx
- err113
- errcheck
- errchkjson
- forbidigo
- goconst
- godot
- gosec
- govet
- maintidx
- nilnil
- nlreturn
- noctx
- nonamedreturns
- perfsprint
- revive
- staticcheck
- testifylint
- wrapcheck
- wsl_v5
formatters:
enable:
- goimports
Expand All @@ -69,3 +67,7 @@ formatters:
custom-order: true
exclusions:
generated: disable

output:
sort-order:
- file
37 changes: 24 additions & 13 deletions cache/basic_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"math/rand"
"sort"
"sync"
"sync/atomic"
"testing"

"github.com/stretchr/testify/assert"
Expand Down Expand Up @@ -38,6 +39,7 @@ func ExampleBasic() {

func randString(length int) string {
randBytes := make([]byte, length)

_, err := crand.Read(randBytes)
if err != nil {
panic(err)
Expand All @@ -53,48 +55,48 @@ func TestCache(t *testing.T) {
c := cache.NewBasic[string, int]()
// Empty
v, ok := c.Get("a")
assert.Equal(t, 0, v)
assert.Equal(t, false, ok)
assert.Zero(t, v)
assert.False(t, ok)

kk := c.Keys()
assert.Equal(t, 0, len(kk))
assert.Empty(t, kk)

// New Value
c.Set("a", 1)
v, ok = c.Get("a")
assert.Equal(t, 1, v)
assert.Equal(t, true, ok)
assert.True(t, ok)

kk = c.Keys()
assert.Equal(t, 1, len(kk))
assert.Len(t, kk, 1)
assert.Equal(t, []string{"a"}, kk)

// Override
c.Set("a", 2)
v, ok = c.Get("a")
assert.Equal(t, 2, v)
assert.Equal(t, true, ok)
assert.True(t, ok)

// New Value
v, ok = c.Get("b")
assert.Equal(t, 0, v)
assert.Equal(t, false, ok)
assert.Zero(t, v)
assert.False(t, ok)

c.Set("b", 2)
v, ok = c.Get("b")
assert.Equal(t, 2, v)
assert.Equal(t, true, ok)
assert.True(t, ok)

kk = c.Keys()
sort.Strings(kk)
assert.Equal(t, 2, len(kk))
assert.Len(t, kk, 2)
assert.Equal(t, []string{"a", "b"}, kk)

// Delete
c.Delete("a")

kk = c.Keys()
assert.Equal(t, 1, len(kk))
assert.Len(t, kk, 1)
assert.Equal(t, []string{"b"}, kk)
}

Expand All @@ -103,23 +105,32 @@ type foo struct {
}

func TestMultiThread(t *testing.T) {
const workers = int64(1000)
const iterations = 1000
f := foo{}
count := atomic.Int64{}
f.c = cache.NewBasic[int, string]()
var wg sync.WaitGroup
for i := int64(0); i < 1000; i++ {
for i := range workers {
wg.Add(1)
go func(i int64) {
defer wg.Done()
f.c.Clear()
m := rand.New(rand.NewSource(i))
for n := 0; n < 1000; n++ {
for range iterations {
key := m.Intn(100)
value := randString(10)
f.c.Set(key, value)
f.c.Get(key)
count.Add(1)
}
}(i)
}

wg.Wait()

expected := workers * iterations
if count.Load() != expected {
t.Errorf("Expected %d, got %d", expected, count.Load())
}
}
4 changes: 2 additions & 2 deletions cache/noop.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ func (c *NoOp[K, V]) Set(_ K, _ V) {
}

// Get always returns !ok.
func (c *NoOp[K, V]) Get(_ K) (out V, ok bool) { //nolint: ireturn,nonamedreturns
return
func (c *NoOp[K, V]) Get(_ K) (V, bool) {
return *new(V), false
}

// Keys always returns nil array.
Expand Down
31 changes: 14 additions & 17 deletions cache/noop_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,45 +15,42 @@ func TestNoOpCache(t *testing.T) {
c := cache.NewNoOp[string, int]()
// Empty
v, ok := c.Get("a")
assert.Equal(t, 0, v)
assert.Equal(t, false, ok)

assert.Zero(t, v)
assert.False(t, ok)
kk := c.Keys()
assert.Equal(t, 0, len(kk))
assert.Empty(t, kk)

// New Value
c.Set("a", 1)
v, ok = c.Get("a")
assert.Equal(t, 0, v)
assert.Equal(t, false, ok)

assert.Zero(t, v)
assert.False(t, ok)
kk = c.Keys()
assert.Equal(t, 0, len(kk))
assert.Empty(t, kk)

// Override
c.Set("a", 2)
v, ok = c.Get("a")
assert.Equal(t, 0, v)
assert.Equal(t, false, ok)
assert.Zero(t, v)
assert.False(t, ok)

// New Value
v, ok = c.Get("b")
assert.Equal(t, 0, v)
assert.Equal(t, false, ok)
assert.Zero(t, v)
assert.False(t, ok)

c.Set("b", 2)
v, ok = c.Get("b")
assert.Equal(t, 0, v)
assert.Equal(t, false, ok)

assert.Zero(t, v)
assert.False(t, ok)
kk = c.Keys()
assert.Equal(t, 0, len(kk))
assert.Empty(t, kk)

// Delete
c.Delete("a")

kk = c.Keys()
assert.Equal(t, 0, len(kk))
assert.Empty(t, kk)

c.Clear()
}
6 changes: 5 additions & 1 deletion chain/chain_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,11 @@ import (
func prefixLetter(letter string) chain.Constructor {
return func(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(letter))
_, err := w.Write([]byte(letter))
if err != nil {
panic(err)
}

h.ServeHTTP(w, r)
})
}
Expand Down
4 changes: 2 additions & 2 deletions config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ func parseTag(tag string) error {
// object must be a pointer to a struct. See ExampleLoad for simple example.
func Load(cfg any) error {
v := reflect.ValueOf(cfg)
if v.Kind() != reflect.Ptr || v.IsZero() {
if v.Kind() != reflect.Pointer || v.IsZero() {
return ErrInvalidConfigObject
}

Expand All @@ -117,7 +117,7 @@ func Load(cfg any) error {

v = reflect.Indirect(v)

for i := 0; i < v.NumField(); i++ {
for i := range v.NumField() {
f := v.Type().Field(i)

tag := f.Tag.Get(TagName)
Expand Down
Loading