mirror of
				https://github.com/gofiber/storage.git
				synced 2025-10-25 09:20:26 +08:00 
			
		
		
		
	Compare commits
	
		
			90 Commits
		
	
	
		
			valkey/v0.
			...
			add-config
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 9951538c9e | ||
|   | 50d99b709c | ||
|   | 02a5e617ae | ||
|   | 2fdcd6aba5 | ||
|   | c285284184 | ||
|   | 75a86506f7 | ||
|   | 1782bd5841 | ||
|   | 5652ca01b7 | ||
|   | 92da8e1d90 | ||
|   | 9b205cb931 | ||
|   | 18fc7b7ebc | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | daebddb092 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | cf399f5e6d | ||
|   | 96beb94912 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 63d6a2446c | ||
|   | 0d843b85a9 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 81dfdfad5c | ||
|   | 8328697ec5 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | b33da752c7 | ||
|   | eae298a626 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 541ecbe05d | ||
|   | d392bcb538 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | c605bfd7e0 | ||
|   | d64f128d63 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 82760055b3 | ||
|   | cb2a17745d | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 75770a8f2c | ||
|   | 3b8bc71930 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | e6042ff073 | ||
|   | 3732138a82 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | d47d7e0ec3 | ||
|   | e87763b2c7 | ||
|   | 7db1e7d9ec | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 9dca1fd1d0 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 04545031c8 | ||
|   | 5ac9913455 | ||
|   | 170ea64699 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | aa35467f7d | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 1af95eef4c | ||
|   | b88571c98d | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 168b438a56 | ||
|   | 7c6c81bb8b | ||
|   | bbd28b9798 | ||
|   | f7ca2c42da | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 3489e4d89b | ||
|   | 3f5fdcf3f2 | ||
|   | 066ad04bad | ||
|   | afae727a12 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 84e0aa0462 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | a75f32732b | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | d776e5dc31 | ||
|   | 1266b34016 | ||
|   | f01e70b8a1 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | d932271eb9 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 834ba31150 | ||
|   | 14c55e3a18 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | cdaa6dc64f | ||
|   | 89a6655885 | ||
|   | 09bb0b2b56 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 3eff9a8ba4 | ||
|   | b1d8ce533f | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 18be16f517 | ||
|   | d70a4fde7d | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | d9b85794b1 | ||
|   | 591a294c63 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 23d34a1f0f | ||
|   | fec4e227be | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 91889600b3 | ||
|   | bcbca83253 | ||
|   | 4a59bdfb53 | ||
|   | ed9f92b19b | ||
|   | 0d2fbb1f6c | ||
|   | d86256335a | ||
|   | 2cc1a6e702 | ||
|   | 3ee2df9c26 | ||
|   | c46612ada5 | ||
|   | 3797ba9813 | ||
|   | 813ed1549d | ||
|   | 80a7e05a13 | ||
|   | ecc8188b78 | ||
|   | aba91259ed | ||
|   | 2acb80b53a | ||
|   | 511351b66f | ||
|   | 253aa04087 | ||
|   | 23fd56bd10 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 207ddb451c | ||
|   | 71fc8de907 | ||
|   | b3b63a72b8 | ||
|   | 512460cf63 | ||
|   | bbd56aef4d | 
| @@ -3,7 +3,7 @@ module github.com/gofiber/storage/arangodb/v2 | ||||
| go 1.23.0 | ||||
|  | ||||
| require ( | ||||
| 	github.com/arangodb/go-driver v1.6.6 | ||||
| 	github.com/arangodb/go-driver v1.6.7 | ||||
| 	github.com/gofiber/utils/v2 v2.0.0-rc.1 | ||||
| 	github.com/stretchr/testify v1.10.0 | ||||
| 	github.com/testcontainers/testcontainers-go v0.38.0 | ||||
| @@ -61,7 +61,7 @@ require ( | ||||
| 	go.opentelemetry.io/otel/metric v1.35.0 // indirect | ||||
| 	go.opentelemetry.io/otel/trace v1.35.0 // indirect | ||||
| 	golang.org/x/crypto v0.37.0 // indirect | ||||
| 	golang.org/x/sys v0.32.0 // indirect | ||||
| 	golang.org/x/sys v0.35.0 // indirect | ||||
| 	google.golang.org/grpc v1.70.0 // indirect | ||||
| 	gopkg.in/yaml.v3 v3.0.1 // indirect | ||||
| ) | ||||
|   | ||||
| @@ -6,8 +6,8 @@ github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOEl | ||||
| github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= | ||||
| github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= | ||||
| github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= | ||||
| github.com/arangodb/go-driver v1.6.6 h1:yL1ybRCKqY+eREnVuJ/GYNYowoyy/g0fiUvL3fKNtJM= | ||||
| github.com/arangodb/go-driver v1.6.6/go.mod h1:ZWyW3T8YPA1weGxohGtW4lFjJmpr9aHNTTbaiD5bBhI= | ||||
| github.com/arangodb/go-driver v1.6.7 h1:9FBUsH60cKu7DjFGozTsaqWMy+3UeEplplqUn4yEcg4= | ||||
| github.com/arangodb/go-driver v1.6.7/go.mod h1:H6uhiKUD/ki7fS9dNDK6xzMX/D5ibj5kGN1bGKd37Ho= | ||||
| github.com/arangodb/go-driver/v2 v2.1.3 h1:PpLSe8E2RalFuqTGi2yfHDe3ltOomfFCIToB66p1lr8= | ||||
| github.com/arangodb/go-driver/v2 v2.1.3/go.mod h1:aoDzrsO7PQEFat3Q9pp4zfv6W+WotA7GcCeJQJfX+tc= | ||||
| github.com/arangodb/go-velocypack v0.0.0-20200318135517-5af53c29c67e h1:Xg+hGrY2LcQBbxd0ZFdbGSyRKTYMZCfBbw/pMJFOk1g= | ||||
| @@ -169,8 +169,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn | ||||
| golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= | ||||
| golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= | ||||
| golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= | ||||
| golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= | ||||
| golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= | ||||
| golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| @@ -183,14 +183,14 @@ golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBc | ||||
| golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= | ||||
| golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= | ||||
| golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= | ||||
| golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= | ||||
| golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= | ||||
| golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= | ||||
| 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.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= | ||||
| golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= | ||||
| golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= | ||||
| golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= | ||||
| golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44= | ||||
| golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||
| golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
|   | ||||
| @@ -1,10 +1,10 @@ | ||||
| module github.com/gofiber/storage/clickhouse | ||||
|  | ||||
| go 1.23.0 | ||||
| go 1.24.0 | ||||
|  | ||||
| require ( | ||||
| 	github.com/ClickHouse/clickhouse-go/v2 v2.40.1 | ||||
| 	github.com/stretchr/testify v1.10.0 | ||||
| 	github.com/ClickHouse/clickhouse-go/v2 v2.40.3 | ||||
| 	github.com/stretchr/testify v1.11.1 | ||||
| 	github.com/testcontainers/testcontainers-go v0.38.0 | ||||
| 	github.com/testcontainers/testcontainers-go/modules/clickhouse v0.38.0 | ||||
| ) | ||||
| @@ -12,7 +12,7 @@ require ( | ||||
| require ( | ||||
| 	dario.cat/mergo v1.0.1 // indirect | ||||
| 	github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect | ||||
| 	github.com/ClickHouse/ch-go v0.67.0 // indirect | ||||
| 	github.com/ClickHouse/ch-go v0.68.0 // indirect | ||||
| 	github.com/Microsoft/go-winio v0.6.2 // indirect | ||||
| 	github.com/andybalholm/brotli v1.2.0 // indirect | ||||
| 	github.com/cenkalti/backoff/v4 v4.3.0 // indirect | ||||
| @@ -23,7 +23,7 @@ require ( | ||||
| 	github.com/cpuguy83/dockercfg v0.3.2 // indirect | ||||
| 	github.com/davecgh/go-spew v1.1.1 // indirect | ||||
| 	github.com/distribution/reference v0.6.0 // indirect | ||||
| 	github.com/docker/docker v28.3.3+incompatible // indirect | ||||
| 	github.com/docker/docker v28.4.0+incompatible // indirect | ||||
| 	github.com/docker/go-connections v0.5.0 // indirect | ||||
| 	github.com/docker/go-units v0.5.0 // indirect | ||||
| 	github.com/ebitengine/purego v0.8.4 // indirect | ||||
| @@ -33,7 +33,6 @@ require ( | ||||
| 	github.com/go-logr/logr v1.4.3 // indirect | ||||
| 	github.com/go-logr/stdr v1.2.2 // indirect | ||||
| 	github.com/go-ole/go-ole v1.3.0 // indirect | ||||
| 	github.com/gogo/protobuf v1.3.2 // indirect | ||||
| 	github.com/google/uuid v1.6.0 // indirect | ||||
| 	github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect | ||||
| 	github.com/klauspost/compress v1.18.0 // indirect | ||||
| @@ -63,10 +62,11 @@ require ( | ||||
| 	github.com/yusufpapurcu/wmi v1.2.4 // indirect | ||||
| 	go.opentelemetry.io/auto/sdk v1.1.0 // indirect | ||||
| 	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect | ||||
| 	go.opentelemetry.io/otel v1.37.0 // indirect | ||||
| 	go.opentelemetry.io/otel/metric v1.37.0 // indirect | ||||
| 	go.opentelemetry.io/otel/trace v1.37.0 // indirect | ||||
| 	golang.org/x/crypto v0.40.0 // indirect | ||||
| 	golang.org/x/sys v0.34.0 // indirect | ||||
| 	go.opentelemetry.io/otel v1.38.0 // indirect | ||||
| 	go.opentelemetry.io/otel/metric v1.38.0 // indirect | ||||
| 	go.opentelemetry.io/otel/trace v1.38.0 // indirect | ||||
| 	go.yaml.in/yaml/v3 v3.0.4 // indirect | ||||
| 	golang.org/x/crypto v0.42.0 // indirect | ||||
| 	golang.org/x/sys v0.36.0 // indirect | ||||
| 	gopkg.in/yaml.v3 v3.0.1 // indirect | ||||
| ) | ||||
|   | ||||
| @@ -4,10 +4,10 @@ github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 h1:He8af | ||||
| github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= | ||||
| github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg= | ||||
| github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= | ||||
| github.com/ClickHouse/ch-go v0.67.0 h1:18MQF6vZHj+4/hTRaK7JbS/TIzn4I55wC+QzO24uiqc= | ||||
| github.com/ClickHouse/ch-go v0.67.0/go.mod h1:2MSAeyVmgt+9a2k2SQPPG1b4qbTPzdGDpf1+bcHh+18= | ||||
| github.com/ClickHouse/clickhouse-go/v2 v2.40.1 h1:PbwsHBgqXRydU7jKULD1C8CHmifczffvQqmFvltM2W4= | ||||
| github.com/ClickHouse/clickhouse-go/v2 v2.40.1/go.mod h1:GDzSBLVhladVm8V01aEB36IoBOVLLICfyeuiIp/8Ezc= | ||||
| github.com/ClickHouse/ch-go v0.68.0 h1:zd2VD8l2aVYnXFRyhTyKCrxvhSz1AaY4wBUXu/f0GiU= | ||||
| github.com/ClickHouse/ch-go v0.68.0/go.mod h1:C89Fsm7oyck9hr6rRo5gqqiVtaIY6AjdD0WFMyNRQ5s= | ||||
| github.com/ClickHouse/clickhouse-go/v2 v2.40.3 h1:46jB4kKwVDUOnECpStKMVXxvR0Cg9zeV9vdbPjtn6po= | ||||
| github.com/ClickHouse/clickhouse-go/v2 v2.40.3/go.mod h1:qO0HwvjCnTB4BPL/k6EE3l4d9f/uF+aoimAhJX70eKA= | ||||
| github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= | ||||
| github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= | ||||
| github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= | ||||
| @@ -31,8 +31,8 @@ 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/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= | ||||
| github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= | ||||
| github.com/docker/docker v28.3.3+incompatible h1:Dypm25kh4rmk49v1eiVbsAtpAsYURjYkaKubwuBdxEI= | ||||
| github.com/docker/docker v28.3.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= | ||||
| github.com/docker/docker v28.4.0+incompatible h1:KVC7bz5zJY/4AZe/78BIvCnPsLaC9T/zh72xnlrTTOk= | ||||
| github.com/docker/docker v28.4.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= | ||||
| github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= | ||||
| github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= | ||||
| github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= | ||||
| @@ -53,7 +53,6 @@ github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre | ||||
| github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= | ||||
| github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= | ||||
| github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= | ||||
| github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= | ||||
| github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= | ||||
| github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= | ||||
| github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= | ||||
| @@ -130,8 +129,8 @@ 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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | ||||
| github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | ||||
| github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= | ||||
| github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= | ||||
| 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/testcontainers/testcontainers-go v0.38.0 h1:d7uEapLcv2P8AvH8ahLqDMMxda2W9gQN1nRbHS28HBw= | ||||
| github.com/testcontainers/testcontainers-go v0.38.0/go.mod h1:C52c9MoHpWO+C4aqmgSU+hxlR5jlEayWtgYrb8Pzz1w= | ||||
| github.com/testcontainers/testcontainers-go/modules/clickhouse v0.38.0 h1:T+2MT0BvN3FAohAtOwm9HYH5gcjKv2mccaDKaMqW8jo= | ||||
| @@ -156,28 +155,30 @@ go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJyS | ||||
| go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= | ||||
| go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU= | ||||
| go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ= | ||||
| go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= | ||||
| go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= | ||||
| go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= | ||||
| go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 h1:IeMeyr1aBvBiPVYihXIaeIZba6b8E1bYp7lbdxK8CQg= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU= | ||||
| go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= | ||||
| go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= | ||||
| go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= | ||||
| go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= | ||||
| go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= | ||||
| go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= | ||||
| go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o= | ||||
| go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w= | ||||
| go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= | ||||
| go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= | ||||
| go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= | ||||
| go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= | ||||
| go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= | ||||
| go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= | ||||
| 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/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||
| golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= | ||||
| golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= | ||||
| golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= | ||||
| golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI= | ||||
| golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8= | ||||
| golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||||
| golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||||
| golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | ||||
| @@ -185,8 +186,8 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL | ||||
| golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= | ||||
| golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= | ||||
| golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= | ||||
| golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= | ||||
| golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I= | ||||
| golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= | ||||
| golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| @@ -202,17 +203,17 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc | ||||
| golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= | ||||
| golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= | ||||
| golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= | ||||
| golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= | ||||
| golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= | ||||
| golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg= | ||||
| golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0= | ||||
| golang.org/x/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ= | ||||
| golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA= | ||||
| 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.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | ||||
| golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= | ||||
| golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= | ||||
| golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= | ||||
| golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= | ||||
| golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= | ||||
| golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44= | ||||
| golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||
| golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
|   | ||||
| @@ -3,7 +3,7 @@ module github.com/gofiber/storage/cloudflarekv | ||||
| go 1.23.0 | ||||
|  | ||||
| require ( | ||||
| 	github.com/cloudflare/cloudflare-go v0.115.0 | ||||
| 	github.com/cloudflare/cloudflare-go v0.116.0 | ||||
| 	github.com/stretchr/testify v1.10.0 | ||||
| ) | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| github.com/cloudflare/cloudflare-go v0.115.0 h1:84/dxeeXweCc0PN5Cto44iTA8AkG1fyT11yPO5ZB7sM= | ||||
| github.com/cloudflare/cloudflare-go v0.115.0/go.mod h1:Ds6urDwn/TF2uIU24mu7H91xkKP8gSAHxQ44DSZgVmU= | ||||
| github.com/cloudflare/cloudflare-go v0.116.0 h1:iRPMnTtnswRpELO65NTwMX4+RTdxZl+Xf/zi+HPE95s= | ||||
| github.com/cloudflare/cloudflare-go v0.116.0/go.mod h1:Ds6urDwn/TF2uIU24mu7H91xkKP8gSAHxQ44DSZgVmU= | ||||
| github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= | ||||
| 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= | ||||
|   | ||||
| @@ -3,7 +3,7 @@ module github.com/gofiber/storage/couchbase/v2 | ||||
| go 1.23.12 | ||||
|  | ||||
| require ( | ||||
| 	github.com/couchbase/gocb/v2 v2.11.0 | ||||
| 	github.com/couchbase/gocb/v2 v2.11.1 | ||||
| 	github.com/stretchr/testify v1.10.0 | ||||
| 	github.com/testcontainers/testcontainers-go v0.38.0 | ||||
| 	github.com/testcontainers/testcontainers-go/modules/couchbase v0.38.0 | ||||
| @@ -18,10 +18,10 @@ require ( | ||||
| 	github.com/containerd/errdefs/pkg v0.3.0 // indirect | ||||
| 	github.com/containerd/log v0.1.0 // indirect | ||||
| 	github.com/containerd/platforms v0.2.1 // indirect | ||||
| 	github.com/couchbase/gocbcore/v10 v10.8.0 // indirect | ||||
| 	github.com/couchbase/gocbcoreps v0.1.3 // indirect | ||||
| 	github.com/couchbase/gocbcore/v10 v10.8.1 // indirect | ||||
| 	github.com/couchbase/gocbcoreps v0.1.4 // indirect | ||||
| 	github.com/couchbase/goprotostellar v1.0.2 // indirect | ||||
| 	github.com/couchbaselabs/gocbconnstr/v2 v2.0.0-20240607131231-fb385523de28 // indirect | ||||
| 	github.com/couchbaselabs/gocbconnstr/v2 v2.0.0 // indirect | ||||
| 	github.com/cpuguy83/dockercfg v0.3.2 // indirect | ||||
| 	github.com/davecgh/go-spew v1.1.1 // indirect | ||||
| 	github.com/distribution/reference v0.6.0 // indirect | ||||
|   | ||||
| @@ -22,18 +22,18 @@ github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= | ||||
| github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= | ||||
| github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= | ||||
| github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= | ||||
| github.com/couchbase/gocb/v2 v2.11.0 h1:OVB+KlVeXlKVtziKx/LWZT7DClLsoQHQFrI4wan5Ijc= | ||||
| github.com/couchbase/gocb/v2 v2.11.0/go.mod h1:Y+lODSgyVzDSaf0Sy8sIzIa0RTAw3vlZUsjY6+FUq9Y= | ||||
| github.com/couchbase/gocbcore/v10 v10.8.0 h1:zDcJyYqOirFyC8T/aVvNL4N9oj6GI4qtaBuTGGWCDb4= | ||||
| github.com/couchbase/gocbcore/v10 v10.8.0/go.mod h1:OWKfU9R5Nm5V3QZBtfdZl5qCfgxtxTqOgXiNr4pn9/c= | ||||
| github.com/couchbase/gocbcoreps v0.1.3 h1:fILaKGCjxFIeCgAUG8FGmRDSpdrRggohOMKEgO9CUpg= | ||||
| github.com/couchbase/gocbcoreps v0.1.3/go.mod h1:hBFpDNPnRno6HH5cRXExhqXYRmTsFJlFHQx7vztcXPk= | ||||
| github.com/couchbase/gocb/v2 v2.11.1 h1:xWDco7Qk/XSvGUjbUWRaXi0V35nsMijJnm4vHXN/rqY= | ||||
| github.com/couchbase/gocb/v2 v2.11.1/go.mod h1:aSh1Cmd1sPRpYyiBD5iWPehPWaTVF/oYhrtOAITWb/4= | ||||
| github.com/couchbase/gocbcore/v10 v10.8.1 h1:i4SnH0DH9APGC4GS2vS2m+3u08V7oJwviamOXdgAZOQ= | ||||
| github.com/couchbase/gocbcore/v10 v10.8.1/go.mod h1:OWKfU9R5Nm5V3QZBtfdZl5qCfgxtxTqOgXiNr4pn9/c= | ||||
| github.com/couchbase/gocbcoreps v0.1.4 h1:/iZVHMpuEw3lyNz9mIahMQffJOurl/opXyOGads/JbI= | ||||
| github.com/couchbase/gocbcoreps v0.1.4/go.mod h1:hBFpDNPnRno6HH5cRXExhqXYRmTsFJlFHQx7vztcXPk= | ||||
| github.com/couchbase/goprotostellar v1.0.2 h1:yoPbAL9sCtcyZ5e/DcU5PRMOEFaJrF9awXYu3VPfGls= | ||||
| github.com/couchbase/goprotostellar v1.0.2/go.mod h1:5/yqVnZlW2/NSbAWu1hPJCFBEwjxgpe0PFFOlRixnp4= | ||||
| github.com/couchbaselabs/gocaves/client v0.0.0-20250107114554-f96479220ae8 h1:MQfvw4BiLTuyR69FuA5Kex+tXUeLkH+/ucJfVL1/hkM= | ||||
| github.com/couchbaselabs/gocaves/client v0.0.0-20250107114554-f96479220ae8/go.mod h1:AVekAZwIY2stsJOMWLAS/0uA/+qdp7pjO8EHnl61QkY= | ||||
| github.com/couchbaselabs/gocbconnstr/v2 v2.0.0-20240607131231-fb385523de28 h1:lhGOw8rNG6RAadmmaJAF3PJ7MNt7rFuWG7BHCYMgnGE= | ||||
| github.com/couchbaselabs/gocbconnstr/v2 v2.0.0-20240607131231-fb385523de28/go.mod h1:o7T431UOfFVHDNvMBUmUxpHnhivwv7BziUao/nMl81E= | ||||
| github.com/couchbaselabs/gocbconnstr/v2 v2.0.0 h1:HU9DlAYYWR69jQnLN6cpg0fh0hxW/8d5hnglCXXjW78= | ||||
| github.com/couchbaselabs/gocbconnstr/v2 v2.0.0/go.mod h1:o7T431UOfFVHDNvMBUmUxpHnhivwv7BziUao/nMl81E= | ||||
| github.com/cpuguy83/dockercfg v0.3.2 h1:DlJTyZGBDlXqUZ2Dk2Q3xHs/FtnooJJVaad2S9GKorA= | ||||
| github.com/cpuguy83/dockercfg v0.3.2/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= | ||||
| github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= | ||||
|   | ||||
| @@ -3,11 +3,11 @@ module github.com/gofiber/storage/dynamodb/v2 | ||||
| go 1.23.0 | ||||
|  | ||||
| require ( | ||||
| 	github.com/aws/aws-sdk-go-v2 v1.38.2 | ||||
| 	github.com/aws/aws-sdk-go-v2/config v1.31.4 | ||||
| 	github.com/aws/aws-sdk-go-v2/credentials v1.18.8 | ||||
| 	github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.20.7 | ||||
| 	github.com/aws/aws-sdk-go-v2/service/dynamodb v1.49.2 | ||||
| 	github.com/aws/aws-sdk-go-v2 v1.39.2 | ||||
| 	github.com/aws/aws-sdk-go-v2/config v1.31.12 | ||||
| 	github.com/aws/aws-sdk-go-v2/credentials v1.18.16 | ||||
| 	github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.20.14 | ||||
| 	github.com/aws/aws-sdk-go-v2/service/dynamodb v1.51.0 | ||||
| 	github.com/stretchr/testify v1.10.0 | ||||
| 	github.com/testcontainers/testcontainers-go v0.38.0 | ||||
| 	github.com/testcontainers/testcontainers-go/modules/dynamodb v0.38.0 | ||||
| @@ -17,17 +17,17 @@ require ( | ||||
| 	dario.cat/mergo v1.0.1 // indirect | ||||
| 	github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect | ||||
| 	github.com/Microsoft/go-winio v0.6.2 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.5 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.5 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.5 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.9 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.9 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.9 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.30.1 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.31.0 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.1 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.11.5 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.5 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/service/sso v1.28.3 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/service/ssooidc v1.34.1 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/service/sts v1.38.1 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.11.9 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.9 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/service/sso v1.29.6 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.1 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/service/sts v1.38.6 // indirect | ||||
| 	github.com/aws/smithy-go v1.23.0 // indirect | ||||
| 	github.com/cenkalti/backoff/v4 v4.2.1 // indirect | ||||
| 	github.com/containerd/errdefs v1.0.0 // indirect | ||||
|   | ||||
| @@ -6,38 +6,38 @@ github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOEl | ||||
| github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= | ||||
| github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= | ||||
| github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= | ||||
| github.com/aws/aws-sdk-go-v2 v1.38.2 h1:QUkLO1aTW0yqW95pVzZS0LGFanL71hJ0a49w4TJLMyM= | ||||
| github.com/aws/aws-sdk-go-v2 v1.38.2/go.mod h1:sDioUELIUO9Znk23YVmIk86/9DOpkbyyVb1i/gUNFXY= | ||||
| github.com/aws/aws-sdk-go-v2/config v1.31.4 h1:aY2IstXOfjdLtr1lDvxFBk5DpBnHgS5GS3jgR/0BmPw= | ||||
| github.com/aws/aws-sdk-go-v2/config v1.31.4/go.mod h1:1IAykiegrTp6n+CbZoCpW6kks1I74fEDgl2BPQSkLSU= | ||||
| github.com/aws/aws-sdk-go-v2/credentials v1.18.8 h1:0FfdP0I9gs/f1rwtEdkcEdsclTEkPB8o6zWUG2Z8+IM= | ||||
| github.com/aws/aws-sdk-go-v2/credentials v1.18.8/go.mod h1:9UReQ1UmGooX93JKzHyr7PRF3F+p3r+PmRwR7+qHJYA= | ||||
| github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.20.7 h1:AwK83R+/PXdvLX1aLxSct7emv/tlK3oxwB1CGaMzFvo= | ||||
| github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.20.7/go.mod h1:qcE7Ewp2emyA7yHW3PkCJ5CMhzaNeGadYp65yNgIjmU= | ||||
| github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.5 h1:ul7hICbZ5Z/Pp9VnLVGUVe7rqYLXCyIiPU7hQ0sRkow= | ||||
| github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.5/go.mod h1:5cIWJ0N6Gjj+72Q6l46DeaNtcxXHV42w/Uq3fIfeUl4= | ||||
| github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.5 h1:d45S2DqHZOkHu0uLUW92VdBoT5v0hh3EyR+DzMEh3ag= | ||||
| github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.5/go.mod h1:G6e/dR2c2huh6JmIo9SXysjuLuDDGWMeYGibfW2ZrXg= | ||||
| github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.5 h1:ENhnQOV3SxWHplOqNN1f+uuCNf9n4Y/PKpl6b1WRP0Q= | ||||
| github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.5/go.mod h1:csQLMI+odbC0/J+UecSTztG70Dc4aTCOu4GyPNDNpVo= | ||||
| github.com/aws/aws-sdk-go-v2 v1.39.2 h1:EJLg8IdbzgeD7xgvZ+I8M1e0fL0ptn/M47lianzth0I= | ||||
| github.com/aws/aws-sdk-go-v2 v1.39.2/go.mod h1:sDioUELIUO9Znk23YVmIk86/9DOpkbyyVb1i/gUNFXY= | ||||
| github.com/aws/aws-sdk-go-v2/config v1.31.12 h1:pYM1Qgy0dKZLHX2cXslNacbcEFMkDMl+Bcj5ROuS6p8= | ||||
| github.com/aws/aws-sdk-go-v2/config v1.31.12/go.mod h1:/MM0dyD7KSDPR+39p9ZNVKaHDLb9qnfDurvVS2KAhN8= | ||||
| github.com/aws/aws-sdk-go-v2/credentials v1.18.16 h1:4JHirI4zp958zC026Sm+V4pSDwW4pwLefKrc0bF2lwI= | ||||
| github.com/aws/aws-sdk-go-v2/credentials v1.18.16/go.mod h1:qQMtGx9OSw7ty1yLclzLxXCRbrkjWAM7JnObZjmCB7I= | ||||
| github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.20.14 h1:lc9ebFtCMu1/s6B9rEnj+cKXEHTpbXL1vxVlVhWNPRg= | ||||
| github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.20.14/go.mod h1:mmGocq6fWRDQ4v8eUj2iPJF6aX77e8xkvOoBiyFbsQk= | ||||
| github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.9 h1:Mv4Bc0mWmv6oDuSWTKnk+wgeqPL5DRFu5bQL9BGPQ8Y= | ||||
| github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.9/go.mod h1:IKlKfRppK2a1y0gy1yH6zD+yX5uplJ6UuPlgd48dJiQ= | ||||
| github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.9 h1:se2vOWGD3dWQUtfn4wEjRQJb1HK1XsNIt825gskZ970= | ||||
| github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.9/go.mod h1:hijCGH2VfbZQxqCDN7bwz/4dzxV+hkyhjawAtdPWKZA= | ||||
| github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.9 h1:6RBnKZLkJM4hQ+kN6E7yWFveOTg8NLPHAkqrs4ZPlTU= | ||||
| github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.9/go.mod h1:V9rQKRmK7AWuEsOMnHzKj8WyrIir1yUJbZxDuZLFvXI= | ||||
| github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= | ||||
| github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= | ||||
| github.com/aws/aws-sdk-go-v2/service/dynamodb v1.49.2 h1:HcrPUVElslX0M45ICJ2aEl0UMsJj/Y6RQNGcNJOgu2E= | ||||
| github.com/aws/aws-sdk-go-v2/service/dynamodb v1.49.2/go.mod h1:c1yue4JwtH4uvgSduKUyVUvcHRkD09h6IOkvWBaqDno= | ||||
| github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.30.1 h1:ecXpl7WJHxbYGClaG6Icxrt+Zg20OS26IYBMPCKqqeM= | ||||
| github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.30.1/go.mod h1:Ugxnw5GB6lkLwY1L850LDZJfRjMVDBN7lUkCaoUNI9A= | ||||
| github.com/aws/aws-sdk-go-v2/service/dynamodb v1.51.0 h1:TfglMkeRNYNGkyJ+XOTQJJ/RQb+MBlkiMn2H7DYuZok= | ||||
| github.com/aws/aws-sdk-go-v2/service/dynamodb v1.51.0/go.mod h1:AdM9p8Ytg90UaNYrZIsOivYeC5cDvTPC2Mqw4/2f2aM= | ||||
| github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.31.0 h1:cRXQpYLaXCMHtOZ3+f4Yrb1ct3CH3exV+l6UuDPJWY0= | ||||
| github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.31.0/go.mod h1:lWutbbPuMCVYZAJOC75eWPUzyE71nTC9hTSIAmiJhrg= | ||||
| github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.1 h1:oegbebPEMA/1Jny7kvwejowCaHz1FWZAQ94WXFNCyTM= | ||||
| github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.1/go.mod h1:kemo5Myr9ac0U9JfSjMo9yHLtw+pECEHsFtJ9tqCEI8= | ||||
| github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.11.5 h1:KOp7jJ7FNi/0wDm1aeZ2xHfn7ycBvQsbhPQRNRf79lQ= | ||||
| github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.11.5/go.mod h1:AJDn8kwIXofqAM069WTCGUB62PxJNlgla0CNb9NRhto= | ||||
| github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.5 h1:Cx1M/UUgYu9UCQnIMKaOhkVaFvLy1HneD6T4sS/DlKg= | ||||
| github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.5/go.mod h1:fTRNLgrTvPpEzGqc9QkeO4hu/3ng+mdtUbL8shUwXz4= | ||||
| github.com/aws/aws-sdk-go-v2/service/sso v1.28.3 h1:z6lajFT/qGlLRB/I8V5CCklqSuWZKUkdwRAn9leIkiQ= | ||||
| github.com/aws/aws-sdk-go-v2/service/sso v1.28.3/go.mod h1:BnyjuIX0l+KXJVl2o9Ki3Zf0M4pA2hQYopFCRUj9ADU= | ||||
| github.com/aws/aws-sdk-go-v2/service/ssooidc v1.34.1 h1:8yI3jK5JZ310S8RpgdZdzwvlvBu3QbG8DP7Be/xJ6yo= | ||||
| github.com/aws/aws-sdk-go-v2/service/ssooidc v1.34.1/go.mod h1:HPzXfFgrLd02lYpcFYdDz5xZs94LOb+lWlvbAGaeMsk= | ||||
| github.com/aws/aws-sdk-go-v2/service/sts v1.38.1 h1:3kWmIg5iiWPMBJyq/I55Fki5fyfoMtrn/SkUIpxPwHQ= | ||||
| github.com/aws/aws-sdk-go-v2/service/sts v1.38.1/go.mod h1:yi0b3Qez6YamRVJ+Rbi19IgvjfjPODgVRhkWA6RTMUM= | ||||
| github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.11.9 h1:7ILIzhRlYbHmZDdkF15B+RGEO8sGbdSe0RelD0RcV6M= | ||||
| github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.11.9/go.mod h1:6LLPgzztobazqK65Q5qYsFnxwsN0v6cktuIvLC5M7DM= | ||||
| github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.9 h1:5r34CgVOD4WZudeEKZ9/iKpiT6cM1JyEROpXjOcdWv8= | ||||
| github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.9/go.mod h1:dB12CEbNWPbzO2uC6QSWHteqOg4JfBVJOojbAoAUb5I= | ||||
| github.com/aws/aws-sdk-go-v2/service/sso v1.29.6 h1:A1oRkiSQOWstGh61y4Wc/yQ04sqrQZr1Si/oAXj20/s= | ||||
| github.com/aws/aws-sdk-go-v2/service/sso v1.29.6/go.mod h1:5PfYspyCU5Vw1wNPsxi15LZovOnULudOQuVxphSflQA= | ||||
| github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.1 h1:5fm5RTONng73/QA73LhCNR7UT9RpFH3hR6HWL6bIgVY= | ||||
| github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.1/go.mod h1:xBEjWD13h+6nq+z4AkqSfSvqRKFgDIQeaMguAJndOWo= | ||||
| github.com/aws/aws-sdk-go-v2/service/sts v1.38.6 h1:p3jIvqYwUZgu/XYeI48bJxOhvm47hZb5HUQ0tn6Q9kA= | ||||
| github.com/aws/aws-sdk-go-v2/service/sts v1.38.6/go.mod h1:WtKK+ppze5yKPkZ0XwqIVWD4beCwv056ZbPQNoeHqM8= | ||||
| github.com/aws/smithy-go v1.23.0 h1:8n6I3gXzWJB2DxBDnfxgBaSX6oe0d/t10qGz7OKqMCE= | ||||
| github.com/aws/smithy-go v1.23.0/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= | ||||
| github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= | ||||
|   | ||||
| @@ -1,10 +1,10 @@ | ||||
| module github.com/gofiber/storage/etcd/v2 | ||||
|  | ||||
| go 1.23.0 | ||||
| go 1.24 | ||||
|  | ||||
| require ( | ||||
| 	github.com/stretchr/testify v1.10.0 | ||||
| 	go.etcd.io/etcd/client/v3 v3.6.4 | ||||
| 	go.etcd.io/etcd/client/v3 v3.6.5 | ||||
| ) | ||||
|  | ||||
| require ( | ||||
| @@ -15,8 +15,8 @@ require ( | ||||
| 	github.com/golang/protobuf v1.5.4 // indirect | ||||
| 	github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 // indirect | ||||
| 	github.com/pmezard/go-difflib v1.0.0 // indirect | ||||
| 	go.etcd.io/etcd/api/v3 v3.6.4 // indirect | ||||
| 	go.etcd.io/etcd/client/pkg/v3 v3.6.4 // indirect | ||||
| 	go.etcd.io/etcd/api/v3 v3.6.5 // indirect | ||||
| 	go.etcd.io/etcd/client/pkg/v3 v3.6.5 // indirect | ||||
| 	go.uber.org/multierr v1.11.0 // indirect | ||||
| 	go.uber.org/zap v1.27.0 // indirect | ||||
| 	golang.org/x/net v0.38.0 // indirect | ||||
|   | ||||
							
								
								
									
										16
									
								
								etcd/go.sum
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								etcd/go.sum
									
									
									
									
									
								
							| @@ -27,18 +27,18 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= | ||||
| github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= | ||||
| 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/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= | ||||
| github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= | ||||
| github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= | ||||
| github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= | ||||
| github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= | ||||
| github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= | ||||
| github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||
| github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||
| go.etcd.io/etcd/api/v3 v3.6.4 h1:7F6N7toCKcV72QmoUKa23yYLiiljMrT4xCeBL9BmXdo= | ||||
| go.etcd.io/etcd/api/v3 v3.6.4/go.mod h1:eFhhvfR8Px1P6SEuLT600v+vrhdDTdcfMzmnxVXXSbk= | ||||
| go.etcd.io/etcd/client/pkg/v3 v3.6.4 h1:9HBYrjppeOfFjBjaMTRxT3R7xT0GLK8EJMVC4xg6ok0= | ||||
| go.etcd.io/etcd/client/pkg/v3 v3.6.4/go.mod h1:sbdzr2cl3HzVmxNw//PH7aLGVtY4QySjQFuaCgcRFAI= | ||||
| go.etcd.io/etcd/client/v3 v3.6.4 h1:YOMrCfMhRzY8NgtzUsHl8hC2EBSnuqbR3dh84Uryl7A= | ||||
| go.etcd.io/etcd/client/v3 v3.6.4/go.mod h1:jaNNHCyg2FdALyKWnd7hxZXZxZANb0+KGY+YQaEMISo= | ||||
| go.etcd.io/etcd/api/v3 v3.6.5 h1:pMMc42276sgR1j1raO/Qv3QI9Af/AuyQUW6CBAWuntA= | ||||
| go.etcd.io/etcd/api/v3 v3.6.5/go.mod h1:ob0/oWA/UQQlT1BmaEkWQzI0sJ1M0Et0mMpaABxguOQ= | ||||
| go.etcd.io/etcd/client/pkg/v3 v3.6.5 h1:Duz9fAzIZFhYWgRjp/FgNq2gO1jId9Yae/rLn3RrBP8= | ||||
| go.etcd.io/etcd/client/pkg/v3 v3.6.5/go.mod h1:8Wx3eGRPiy0qOFMZT/hfvdos+DjEaPxdIDiCDUv/FQk= | ||||
| go.etcd.io/etcd/client/v3 v3.6.5 h1:yRwZNFBx/35VKHTcLDeO7XVLbCBFbPi+XV4OC3QJf2U= | ||||
| go.etcd.io/etcd/client/v3 v3.6.5/go.mod h1:ZqwG/7TAFZ0BJ0jXRPoJjKQJtbFo/9NIY8uoFFKcCyo= | ||||
| go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= | ||||
| go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= | ||||
| go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= | ||||
|   | ||||
| @@ -73,6 +73,11 @@ type Config struct { | ||||
| 	// | ||||
| 	// Optional. Default is false | ||||
| 	Reset bool | ||||
|  | ||||
| 	// DisableStartupCheck skips the initial connection validation during New. | ||||
| 	// | ||||
| 	// Optional. Default is false | ||||
| 	DisableStartupCheck bool | ||||
| } | ||||
| ``` | ||||
|  | ||||
| @@ -80,5 +85,6 @@ type Config struct { | ||||
| ```go | ||||
| var ConfigDefault = Config{ | ||||
| 	Servers:      "127.0.0.1:11211", | ||||
| 	DisableStartupCheck: false, | ||||
| } | ||||
| ``` | ||||
|   | ||||
| @@ -15,6 +15,11 @@ type Config struct { | ||||
| 	// Optional. Default is false | ||||
| 	Reset bool | ||||
|  | ||||
| 	// DisableStartupCheck skips the initial connection validation during New. | ||||
| 	// | ||||
| 	// Optional. Default is false | ||||
| 	DisableStartupCheck bool | ||||
|  | ||||
| 	// The socket read/write timeout. | ||||
| 	// | ||||
| 	// Optional. Default is 100 * time.Millisecond | ||||
| @@ -31,9 +36,10 @@ type Config struct { | ||||
|  | ||||
| // ConfigDefault is the default config | ||||
| var ConfigDefault = Config{ | ||||
| 	Servers:      "127.0.0.1:11211", | ||||
| 	timeout:      100 * time.Millisecond, | ||||
| 	maxIdleConns: 2, | ||||
| 	Servers:             "127.0.0.1:11211", | ||||
| 	timeout:             100 * time.Millisecond, | ||||
| 	maxIdleConns:        2, | ||||
| 	DisableStartupCheck: false, | ||||
| } | ||||
|  | ||||
| // Helper function to set default values | ||||
|   | ||||
| @@ -30,15 +30,17 @@ func New(config ...Config) *Storage { | ||||
| 	db.Timeout = cfg.timeout | ||||
| 	db.MaxIdleConns = cfg.maxIdleConns | ||||
|  | ||||
| 	// Ping database to ensure a connection has been made | ||||
| 	if err := db.Ping(); err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
|  | ||||
| 	if cfg.Reset { | ||||
| 		if err := db.DeleteAll(); err != nil { | ||||
| 	if !cfg.DisableStartupCheck { | ||||
| 		// Ping database to ensure a connection has been made | ||||
| 		if err := db.Ping(); err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
|  | ||||
| 		if cfg.Reset { | ||||
| 			if err := db.DeleteAll(); err != nil { | ||||
| 				panic(err) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Create storage | ||||
|   | ||||
| @@ -178,6 +178,16 @@ func Test_Memcache_Reset(t *testing.T) { | ||||
| 	require.Zero(t, len(result)) | ||||
| } | ||||
|  | ||||
| func Test_Memcache_New_DisableStartupCheck(t *testing.T) { | ||||
| 	require.NotPanics(t, func() { | ||||
| 		store := New(Config{ | ||||
| 			Servers:             "127.0.0.1:11210", | ||||
| 			DisableStartupCheck: true, | ||||
| 		}) | ||||
| 		require.NotNil(t, store) | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func Test_Memcache_Close(t *testing.T) { | ||||
| 	testStore := newTestStore(t) | ||||
| 	require.Nil(t, testStore.Close()) | ||||
|   | ||||
| @@ -2,8 +2,14 @@ module github.com/gofiber/storage/mysql/v2 | ||||
|  | ||||
| go 1.23.0 | ||||
|  | ||||
| replace ( | ||||
| 	github.com/gofiber/storage => ../ | ||||
| 	github.com/gofiber/storage/testhelpers/tck => ../testhelpers/tck | ||||
| ) | ||||
|  | ||||
| require ( | ||||
| 	github.com/go-sql-driver/mysql v1.9.3 | ||||
| 	github.com/gofiber/storage/testhelpers/tck v1.0.0 | ||||
| 	github.com/stretchr/testify v1.10.0 | ||||
| 	github.com/testcontainers/testcontainers-go v0.38.0 | ||||
| 	github.com/testcontainers/testcontainers-go/modules/mysql v0.38.0 | ||||
| @@ -30,6 +36,7 @@ require ( | ||||
| 	github.com/go-logr/logr v1.4.2 // indirect | ||||
| 	github.com/go-logr/stdr v1.2.2 // indirect | ||||
| 	github.com/go-ole/go-ole v1.2.6 // indirect | ||||
| 	github.com/gofiber/storage v1.3.3 // indirect | ||||
| 	github.com/gogo/protobuf v1.3.2 // indirect | ||||
| 	github.com/google/uuid v1.6.0 // indirect | ||||
| 	github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect | ||||
|   | ||||
| @@ -7,7 +7,9 @@ import ( | ||||
| 	"testing" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/gofiber/storage/testhelpers/tck" | ||||
| 	"github.com/stretchr/testify/require" | ||||
| 	"github.com/stretchr/testify/suite" | ||||
| 	"github.com/testcontainers/testcontainers-go" | ||||
| 	"github.com/testcontainers/testcontainers-go/modules/mysql" | ||||
| 	"github.com/testcontainers/testcontainers-go/wait" | ||||
| @@ -22,20 +24,49 @@ const ( | ||||
| 	mysqlDatabase    string = "fiber" | ||||
| ) | ||||
|  | ||||
| // MySQLStorageTCK is the test suite for the MySQL storage. | ||||
| type MySQLStorageTCK struct{} | ||||
|  | ||||
| // NewStore is a function that returns a new MySQL storage. | ||||
| // It implements the [tck.TCKSuite] interface, allowing the TCK to create a new MySQL storage | ||||
| // from the container created by the TCK. | ||||
| func (s *MySQLStorageTCK) NewStore() func(ctx context.Context, tb testing.TB, ctr *mysql.MySQLContainer) (*Storage, error) { | ||||
| 	return func(ctx context.Context, tb testing.TB, ctr *mysql.MySQLContainer) (*Storage, error) { | ||||
| 		conn, err := ctr.ConnectionString(ctx) | ||||
| 		require.NoError(tb, err) | ||||
|  | ||||
| 		store := New(Config{ | ||||
| 			ConnectionURI: conn, | ||||
| 			Reset:         true, | ||||
| 		}) | ||||
|  | ||||
| 		return store, nil | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // NewContainer is a function that returns a new MySQL container. | ||||
| // It implements the [tck.TCKSuite] interface, allowing the TCK to create a new MySQL container | ||||
| // for the MySQL storage. | ||||
| func (s *MySQLStorageTCK) NewContainer() func(ctx context.Context, tb testing.TB) (*mysql.MySQLContainer, error) { | ||||
| 	return func(ctx context.Context, tb testing.TB) (*mysql.MySQLContainer, error) { | ||||
| 		return mustStartMySQL(tb), nil | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func newTestStore(t testing.TB) *Storage { | ||||
| 	t.Helper() | ||||
|  | ||||
| 	ctx := context.Background() | ||||
|  | ||||
| 	c := mustStartMySQL(t) | ||||
| 	suite := MySQLStorageTCK{} | ||||
|  | ||||
| 	conn, err := c.ConnectionString(ctx) | ||||
| 	ctr, err := suite.NewContainer()(ctx, t) | ||||
| 	require.NoError(t, err) | ||||
|  | ||||
| 	return New(Config{ | ||||
| 		ConnectionURI: conn, | ||||
| 		Reset:         true, | ||||
| 	}) | ||||
| 	store, err := suite.NewStore()(ctx, t, ctr) | ||||
| 	require.NoError(t, err) | ||||
|  | ||||
| 	return store | ||||
| } | ||||
|  | ||||
| func mustStartMySQL(t testing.TB) *mysql.MySQLContainer { | ||||
| @@ -77,222 +108,6 @@ func Test_MYSQL_New(t *testing.T) { | ||||
| 	defer newConfigStore.Close() | ||||
| } | ||||
|  | ||||
| func Test_MYSQL_Set(t *testing.T) { | ||||
| 	var ( | ||||
| 		key = "john" | ||||
| 		val = []byte("doe") | ||||
| 	) | ||||
|  | ||||
| 	testStore := newTestStore(t) | ||||
| 	defer testStore.Close() | ||||
|  | ||||
| 	err := testStore.Set(key, val, 0) | ||||
| 	require.NoError(t, err) | ||||
| } | ||||
|  | ||||
| func Test_MYSQL_SetWithContext(t *testing.T) { | ||||
| 	var ( | ||||
| 		key = "john" | ||||
| 		val = []byte("doe") | ||||
| 	) | ||||
|  | ||||
| 	ctx, cancel := context.WithCancel(context.Background()) | ||||
| 	cancel() | ||||
|  | ||||
| 	testStore := newTestStore(t) | ||||
| 	defer testStore.Close() | ||||
|  | ||||
| 	err := testStore.SetWithContext(ctx, key, val, 0) | ||||
| 	require.ErrorIs(t, err, context.Canceled) | ||||
| } | ||||
|  | ||||
| func Test_MYSQL_Set_Override(t *testing.T) { | ||||
| 	var ( | ||||
| 		key = "john" | ||||
| 		val = []byte("doe") | ||||
| 	) | ||||
|  | ||||
| 	testStore := newTestStore(t) | ||||
| 	defer testStore.Close() | ||||
|  | ||||
| 	err := testStore.Set(key, val, 0) | ||||
| 	require.NoError(t, err) | ||||
|  | ||||
| 	err = testStore.Set(key, val, 0) | ||||
| 	require.NoError(t, err) | ||||
| } | ||||
|  | ||||
| func Test_MYSQL_Get(t *testing.T) { | ||||
| 	var ( | ||||
| 		key = "john" | ||||
| 		val = []byte("doe") | ||||
| 	) | ||||
|  | ||||
| 	testStore := newTestStore(t) | ||||
| 	defer testStore.Close() | ||||
|  | ||||
| 	err := testStore.Set(key, val, 0) | ||||
| 	require.NoError(t, err) | ||||
|  | ||||
| 	result, err := testStore.Get(key) | ||||
| 	require.NoError(t, err) | ||||
| 	require.Equal(t, val, result) | ||||
| } | ||||
|  | ||||
| func Test_MYSQL_GetWithContext(t *testing.T) { | ||||
| 	var ( | ||||
| 		key = "john" | ||||
| 		val = []byte("doe") | ||||
| 	) | ||||
|  | ||||
| 	testStore := newTestStore(t) | ||||
| 	defer testStore.Close() | ||||
|  | ||||
| 	err := testStore.Set(key, val, 0) | ||||
| 	require.NoError(t, err) | ||||
|  | ||||
| 	ctx, cancel := context.WithCancel(context.Background()) | ||||
| 	cancel() | ||||
|  | ||||
| 	result, err := testStore.GetWithContext(ctx, key) | ||||
| 	require.ErrorIs(t, err, context.Canceled) | ||||
| 	require.Zero(t, len(result)) | ||||
| } | ||||
|  | ||||
| func Test_MYSQL_Set_Expiration(t *testing.T) { | ||||
| 	var ( | ||||
| 		key = "john" | ||||
| 		val = []byte("doe") | ||||
| 		exp = 1 * time.Second | ||||
| 	) | ||||
|  | ||||
| 	testStore := newTestStore(t) | ||||
| 	defer testStore.Close() | ||||
|  | ||||
| 	err := testStore.Set(key, val, exp) | ||||
| 	require.NoError(t, err) | ||||
|  | ||||
| 	time.Sleep(1100 * time.Millisecond) | ||||
|  | ||||
| 	result, err := testStore.Get(key) | ||||
| 	require.NoError(t, err) | ||||
| 	require.Zero(t, len(result), "Key should have expired") | ||||
| } | ||||
|  | ||||
| func Test_MYSQL_Get_Expired(t *testing.T) { | ||||
| 	key := "john" | ||||
|  | ||||
| 	testStore := newTestStore(t) | ||||
| 	defer testStore.Close() | ||||
|  | ||||
| 	result, err := testStore.Get(key) | ||||
| 	require.NoError(t, err) | ||||
| 	require.Zero(t, len(result)) | ||||
| } | ||||
|  | ||||
| func Test_MYSQL_Get_NotExist(t *testing.T) { | ||||
| 	testStore := newTestStore(t) | ||||
| 	defer testStore.Close() | ||||
|  | ||||
| 	result, err := testStore.Get("notexist") | ||||
| 	require.NoError(t, err) | ||||
| 	require.Zero(t, len(result)) | ||||
| } | ||||
|  | ||||
| func Test_MYSQL_Delete(t *testing.T) { | ||||
| 	var ( | ||||
| 		key = "john" | ||||
| 		val = []byte("doe") | ||||
| 	) | ||||
|  | ||||
| 	testStore := newTestStore(t) | ||||
| 	defer testStore.Close() | ||||
|  | ||||
| 	err := testStore.Set(key, val, 0) | ||||
| 	require.NoError(t, err) | ||||
|  | ||||
| 	err = testStore.Delete(key) | ||||
| 	require.NoError(t, err) | ||||
|  | ||||
| 	result, err := testStore.Get(key) | ||||
| 	require.NoError(t, err) | ||||
| 	require.Zero(t, len(result)) | ||||
| } | ||||
|  | ||||
| func Test_MYSQL_DeleteWithContext(t *testing.T) { | ||||
| 	var ( | ||||
| 		key = "john" | ||||
| 		val = []byte("doe") | ||||
| 	) | ||||
|  | ||||
| 	testStore := newTestStore(t) | ||||
| 	defer testStore.Close() | ||||
|  | ||||
| 	err := testStore.Set(key, val, 0) | ||||
| 	require.NoError(t, err) | ||||
|  | ||||
| 	ctx, cancel := context.WithCancel(context.Background()) | ||||
| 	cancel() | ||||
|  | ||||
| 	err = testStore.DeleteWithContext(ctx, key) | ||||
| 	require.ErrorIs(t, err, context.Canceled) | ||||
|  | ||||
| 	result, err := testStore.Get(key) | ||||
| 	require.NoError(t, err) | ||||
| 	require.Equal(t, val, result) | ||||
| } | ||||
|  | ||||
| func Test_MYSQL_Reset(t *testing.T) { | ||||
| 	val := []byte("doe") | ||||
|  | ||||
| 	testStore := newTestStore(t) | ||||
| 	defer testStore.Close() | ||||
|  | ||||
| 	err := testStore.Set("john1", val, 0) | ||||
| 	require.NoError(t, err) | ||||
|  | ||||
| 	err = testStore.Set("john2", val, 0) | ||||
| 	require.NoError(t, err) | ||||
|  | ||||
| 	err = testStore.Reset() | ||||
| 	require.NoError(t, err) | ||||
|  | ||||
| 	result, err := testStore.Get("john1") | ||||
| 	require.NoError(t, err) | ||||
| 	require.Zero(t, len(result)) | ||||
|  | ||||
| 	result, err = testStore.Get("john2") | ||||
| 	require.NoError(t, err) | ||||
| 	require.Zero(t, len(result)) | ||||
| } | ||||
|  | ||||
| func Test_MYSQL_ResetWithContext(t *testing.T) { | ||||
| 	val := []byte("doe") | ||||
|  | ||||
| 	testStore := newTestStore(t) | ||||
| 	defer testStore.Close() | ||||
|  | ||||
| 	err := testStore.Set("john1", val, 0) | ||||
| 	require.NoError(t, err) | ||||
|  | ||||
| 	err = testStore.Set("john2", val, 0) | ||||
| 	require.NoError(t, err) | ||||
|  | ||||
| 	ctx, cancel := context.WithCancel(context.Background()) | ||||
| 	cancel() | ||||
|  | ||||
| 	err = testStore.ResetWithContext(ctx) | ||||
| 	require.ErrorIs(t, err, context.Canceled) | ||||
|  | ||||
| 	result, err := testStore.Get("john1") | ||||
| 	require.NoError(t, err) | ||||
| 	require.Equal(t, val, result) | ||||
|  | ||||
| 	result, err = testStore.Get("john2") | ||||
| 	require.NoError(t, err) | ||||
| 	require.Equal(t, val, result) | ||||
| } | ||||
|  | ||||
| func Test_MYSQL_GC(t *testing.T) { | ||||
| 	testVal := []byte("doe") | ||||
|  | ||||
| @@ -332,16 +147,12 @@ func Test_MYSQL_Non_UTF8(t *testing.T) { | ||||
| 	require.Equal(t, val, result) | ||||
| } | ||||
|  | ||||
| func Test_MYSQL_Close(t *testing.T) { | ||||
| 	testStore := newTestStore(t) | ||||
| 	require.NoError(t, testStore.Close()) | ||||
| } | ||||
| func TestMySQLStorageTCK(t *testing.T) { | ||||
| 	// The TCK needs the concrete type of the storage and the driver type returned by the Conn method. | ||||
| 	s, err := tck.New[*Storage, *sql.DB](context.Background(), t, &MySQLStorageTCK{}, tck.PerTest()) | ||||
| 	require.NoError(t, err) | ||||
|  | ||||
| func Test_MYSQL_Conn(t *testing.T) { | ||||
| 	testStore := newTestStore(t) | ||||
| 	defer testStore.Close() | ||||
|  | ||||
| 	require.True(t, testStore.Conn() != nil) | ||||
| 	suite.Run(t, s) | ||||
| } | ||||
|  | ||||
| func Benchmark_MYSQL_Set(b *testing.B) { | ||||
|   | ||||
| @@ -4,7 +4,7 @@ go 1.23.0 | ||||
|  | ||||
| require ( | ||||
| 	github.com/mdelapenya/tlscert v0.2.0 | ||||
| 	github.com/nats-io/nats.go v1.45.0 | ||||
| 	github.com/nats-io/nats.go v1.46.1 | ||||
| 	github.com/stretchr/testify v1.10.0 | ||||
| 	github.com/testcontainers/testcontainers-go v0.38.0 | ||||
| 	github.com/testcontainers/testcontainers-go/modules/nats v0.38.0 | ||||
|   | ||||
| @@ -83,8 +83,8 @@ github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= | ||||
| github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= | ||||
| github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= | ||||
| github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= | ||||
| github.com/nats-io/nats.go v1.45.0 h1:/wGPbnYXDM0pLKFjZTX+2JOw9TQPoIgTFrUaH97giwA= | ||||
| github.com/nats-io/nats.go v1.45.0/go.mod h1:iRWIPokVIFbVijxuMQq4y9ttaBTMe0SFdlZfMDd+33g= | ||||
| github.com/nats-io/nats.go v1.46.1 h1:bqQ2ZcxVd2lpYI97xYASeRTY3I5boe/IVmuUDPitHfo= | ||||
| github.com/nats-io/nats.go v1.46.1/go.mod h1:iRWIPokVIFbVijxuMQq4y9ttaBTMe0SFdlZfMDd+33g= | ||||
| github.com/nats-io/nkeys v0.4.11 h1:q44qGV008kYd9W1b1nEBkNzvnWxtRSQ7A8BoqRrcfa0= | ||||
| github.com/nats-io/nkeys v0.4.11/go.mod h1:szDimtgmfOi9n25JpfIdGw12tZFYXqhGxjhVxsatHVE= | ||||
| github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= | ||||
|   | ||||
| @@ -3,7 +3,7 @@ module github.com/gofiber/storage/neo4j | ||||
| go 1.23.0 | ||||
|  | ||||
| require ( | ||||
| 	github.com/neo4j/neo4j-go-driver/v5 v5.28.2 | ||||
| 	github.com/neo4j/neo4j-go-driver/v5 v5.28.4 | ||||
| 	github.com/stretchr/testify v1.10.0 | ||||
| 	github.com/testcontainers/testcontainers-go v0.38.0 | ||||
| 	github.com/testcontainers/testcontainers-go/modules/neo4j v0.38.0 | ||||
|   | ||||
| @@ -81,8 +81,8 @@ github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= | ||||
| github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= | ||||
| github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= | ||||
| github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= | ||||
| github.com/neo4j/neo4j-go-driver/v5 v5.28.2 h1:uG7nMK0zS/a/iSWMZgCIY40SfYzWBc6uSrMONhiIS0U= | ||||
| github.com/neo4j/neo4j-go-driver/v5 v5.28.2/go.mod h1:Vff8OwT7QpLm7L2yYr85XNWe9Rbqlbeb9asNXJTHO4k= | ||||
| github.com/neo4j/neo4j-go-driver/v5 v5.28.4 h1:7toxehVcYkZbyxV4W3Ib9VcnyRBQPucF+VwNNmtSXi4= | ||||
| github.com/neo4j/neo4j-go-driver/v5 v5.28.4/go.mod h1:Vff8OwT7QpLm7L2yYr85XNWe9Rbqlbeb9asNXJTHO4k= | ||||
| github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= | ||||
| github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= | ||||
| github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= | ||||
|   | ||||
| @@ -56,10 +56,10 @@ store := postgres.New() | ||||
|  | ||||
| // Initialize custom config | ||||
| store := postgres.New(postgres.Config{ | ||||
| 	DB:              dbPool, | ||||
| 	Table:           "fiber_storage", | ||||
| 	Reset:           false, | ||||
| 	GCInterval:      10 * time.Second, | ||||
|     DB:              dbPool, | ||||
|     Table:           "fiber_storage", | ||||
|     Reset:           false, | ||||
|     GCInterval:      10 * time.Second, | ||||
| }) | ||||
| ``` | ||||
|  | ||||
| @@ -67,60 +67,65 @@ store := postgres.New(postgres.Config{ | ||||
| ```go | ||||
| // Config defines the config for storage. | ||||
| type Config struct { | ||||
| 	// DB pgxpool.Pool object will override connection uri and other connection fields | ||||
| 	// | ||||
| 	// Optional. Default is nil | ||||
| 	DB *pgxpool.Pool | ||||
|     // DB pgxpool.Pool object will override connection uri and other connection fields | ||||
|     // | ||||
|     // Optional. Default is nil | ||||
|     DB *pgxpool.Pool | ||||
|  | ||||
| 	// Connection string to use for DB. Will override all other authentication values if used | ||||
| 	// | ||||
| 	// Optional. Default is "" | ||||
| 	ConnectionURI string | ||||
|     // Connection string to use for DB. Will override all other authentication values if used | ||||
|     // | ||||
|     // Optional. Default is "" | ||||
|     ConnectionURI string | ||||
|  | ||||
| 	// Host name where the DB is hosted | ||||
| 	// | ||||
| 	// Optional. Default is "127.0.0.1" | ||||
| 	Host string | ||||
|     // Host name where the DB is hosted | ||||
|     // | ||||
|     // Optional. Default is "127.0.0.1" | ||||
|     Host string | ||||
|  | ||||
| 	// Port where the DB is listening on | ||||
| 	// | ||||
| 	// Optional. Default is 5432 | ||||
| 	Port int | ||||
|     // Port where the DB is listening on | ||||
|     // | ||||
|     // Optional. Default is 5432 | ||||
|     Port int | ||||
|  | ||||
| 	// Server username | ||||
| 	// | ||||
| 	// Optional. Default is "" | ||||
| 	Username string | ||||
|     // Server username | ||||
|     // | ||||
|     // Optional. Default is "" | ||||
|     Username string | ||||
|  | ||||
| 	// Server password | ||||
| 	// | ||||
| 	// Optional. Default is "" | ||||
| 	Password string | ||||
|     // Server password | ||||
|     // | ||||
|     // Optional. Default is "" | ||||
|     Password string | ||||
|  | ||||
| 	// Database name | ||||
| 	// | ||||
| 	// Optional. Default is "fiber" | ||||
| 	Database string | ||||
|     // Database name | ||||
|     // | ||||
|     // Optional. Default is "fiber" | ||||
|     Database string | ||||
|  | ||||
| 	// Table name | ||||
| 	// | ||||
| 	// Optional. Default is "fiber_storage" | ||||
| 	Table string | ||||
|     // Table name | ||||
|     // | ||||
|     // Optional. Default is "fiber_storage" | ||||
|     Table string | ||||
|  | ||||
| 	// The SSL mode for the connection | ||||
| 	// | ||||
| 	// Optional. Default is "disable" | ||||
| 	SSLMode string | ||||
|     // The SSL mode for the connection | ||||
|     // | ||||
|     // Optional. Default is "disable" | ||||
|     SSLMode string | ||||
|  | ||||
| 	// Reset clears any existing keys in existing Table | ||||
| 	// | ||||
| 	// Optional. Default is false | ||||
| 	Reset bool | ||||
|     // Reset clears any existing keys in existing Table | ||||
|     // | ||||
|     // Optional. Default is false | ||||
|     Reset bool | ||||
|  | ||||
| 	// Time before deleting expired keys | ||||
| 	// | ||||
| 	// Optional. Default is 10 * time.Second | ||||
| 	GCInterval time.Duration | ||||
|     // DisableStartupCheck skips the initial connection validation during New. | ||||
|     // | ||||
|     // Optional. Default is false | ||||
|     DisableStartupCheck bool | ||||
|  | ||||
|     // Time before deleting expired keys | ||||
|     // | ||||
|     // Optional. Default is 10 * time.Second | ||||
|     GCInterval time.Duration | ||||
| } | ||||
| ``` | ||||
|  | ||||
| @@ -128,13 +133,14 @@ type Config struct { | ||||
| ```go | ||||
| // ConfigDefault is the default config | ||||
| var ConfigDefault = Config{ | ||||
| 	ConnectionURI: "", | ||||
| 	Host:          "127.0.0.1", | ||||
| 	Port:          5432, | ||||
| 	Database:      "fiber", | ||||
| 	Table:         "fiber_storage", | ||||
| 	SSLMode:       "disable", | ||||
| 	Reset:         false, | ||||
| 	GCInterval:    10 * time.Second, | ||||
|     ConnectionURI: "", | ||||
|     Host:          "127.0.0.1", | ||||
|     Port:          5432, | ||||
|     Database:      "fiber", | ||||
|     Table:         "fiber_storage", | ||||
|     SSLMode:       "disable", | ||||
|     Reset:         false, | ||||
|     DisableStartupCheck: false, | ||||
|     GCInterval:    10 * time.Second, | ||||
| } | ||||
| ``` | ||||
|   | ||||
| @@ -61,6 +61,11 @@ type Config struct { | ||||
| 	// Optional. Default is false | ||||
| 	Reset bool | ||||
|  | ||||
| 	// DisableStartupCheck skips the initial connection validation during New. | ||||
| 	// | ||||
| 	// Optional. Default is false | ||||
| 	DisableStartupCheck bool | ||||
|  | ||||
| 	// Time before deleting expired keys | ||||
| 	// | ||||
| 	// Optional. Default is 10 * time.Second | ||||
| @@ -69,14 +74,15 @@ type Config struct { | ||||
|  | ||||
| // ConfigDefault is the default config | ||||
| var ConfigDefault = Config{ | ||||
| 	ConnectionURI: "", | ||||
| 	Host:          "127.0.0.1", | ||||
| 	Port:          5432, | ||||
| 	Database:      "fiber", | ||||
| 	Table:         "fiber_storage", | ||||
| 	SSLMode:       "disable", | ||||
| 	Reset:         false, | ||||
| 	GCInterval:    10 * time.Second, | ||||
| 	ConnectionURI:       "", | ||||
| 	Host:                "127.0.0.1", | ||||
| 	Port:                5432, | ||||
| 	Database:            "fiber", | ||||
| 	Table:               "fiber_storage", | ||||
| 	SSLMode:             "disable", | ||||
| 	Reset:               false, | ||||
| 	DisableStartupCheck: false, | ||||
| 	GCInterval:          10 * time.Second, | ||||
| } | ||||
|  | ||||
| func (c *Config) getDSN() string { | ||||
|   | ||||
| @@ -3,7 +3,7 @@ module github.com/gofiber/storage/postgres/v3 | ||||
| go 1.23.0 | ||||
|  | ||||
| require ( | ||||
| 	github.com/jackc/pgx/v5 v5.7.5 | ||||
| 	github.com/jackc/pgx/v5 v5.7.6 | ||||
| 	github.com/stretchr/testify v1.10.0 | ||||
| 	github.com/testcontainers/testcontainers-go v0.38.0 | ||||
| 	github.com/testcontainers/testcontainers-go/modules/postgres v0.38.0 | ||||
|   | ||||
| @@ -55,8 +55,8 @@ github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsI | ||||
| github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= | ||||
| github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= | ||||
| github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= | ||||
| github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= | ||||
| github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= | ||||
| github.com/jackc/pgx/v5 v5.7.6 h1:rWQc5FwZSPX58r1OQmkuaNicxdmExaEz5A2DO2hUuTk= | ||||
| github.com/jackc/pgx/v5 v5.7.6/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= | ||||
| github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= | ||||
| github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= | ||||
| github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= | ||||
|   | ||||
| @@ -68,43 +68,45 @@ func New(config ...Config) *Storage { | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Ping database | ||||
| 	if err := db.Ping(context.Background()); err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	if !cfg.DisableStartupCheck { | ||||
| 		// Ping database | ||||
| 		if err := db.Ping(context.Background()); err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
|  | ||||
| 	// Parse out schema in config, if provided | ||||
| 	schema := "public" | ||||
| 	tableName := cfg.Table | ||||
| 	if strings.Contains(cfg.Table, ".") { | ||||
| 		schema = strings.Split(cfg.Table, ".")[0] | ||||
| 		tableName = strings.Split(cfg.Table, ".")[1] | ||||
| 	} | ||||
| 		// Parse out schema in config, if provided | ||||
| 		schema := "public" | ||||
| 		tableName := cfg.Table | ||||
| 		if strings.Contains(cfg.Table, ".") { | ||||
| 			schema = strings.Split(cfg.Table, ".")[0] | ||||
| 			tableName = strings.Split(cfg.Table, ".")[1] | ||||
| 		} | ||||
|  | ||||
| 	// Drop table if set to true | ||||
| 	if cfg.Reset { | ||||
| 		if _, err := db.Exec(context.Background(), fmt.Sprintf(dropQuery, cfg.Table)); err != nil { | ||||
| 		// Drop table if set to true | ||||
| 		if cfg.Reset { | ||||
| 			if _, err := db.Exec(context.Background(), fmt.Sprintf(dropQuery, cfg.Table)); err != nil { | ||||
| 				db.Close() | ||||
| 				panic(err) | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// Determine if table exists | ||||
| 		tableExists := false | ||||
| 		row := db.QueryRow(context.Background(), fmt.Sprintf(checkTableExistsQuery, schema, tableName)) | ||||
| 		var count int | ||||
| 		if err := row.Scan(&count); err != nil { | ||||
| 			db.Close() | ||||
| 			panic(err) | ||||
| 		} | ||||
| 	} | ||||
| 		tableExists = count > 0 | ||||
|  | ||||
| 	// Determine if table exists | ||||
| 	tableExists := false | ||||
| 	row := db.QueryRow(context.Background(), fmt.Sprintf(checkTableExistsQuery, schema, tableName)) | ||||
| 	var count int | ||||
| 	if err := row.Scan(&count); err != nil { | ||||
| 		db.Close() | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	tableExists = count > 0 | ||||
|  | ||||
| 	// Init database queries | ||||
| 	if !tableExists { | ||||
| 		for _, query := range initQuery { | ||||
| 			if _, err := db.Exec(context.Background(), fmt.Sprintf(query, cfg.Table)); err != nil { | ||||
| 				db.Close() | ||||
| 				panic(err) | ||||
| 		// Init database queries | ||||
| 		if !tableExists { | ||||
| 			for _, query := range initQuery { | ||||
| 				if _, err := db.Exec(context.Background(), fmt.Sprintf(query, cfg.Table)); err != nil { | ||||
| 					db.Close() | ||||
| 					panic(err) | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| @@ -121,7 +123,9 @@ func New(config ...Config) *Storage { | ||||
| 		sqlGC:      fmt.Sprintf("DELETE FROM %s WHERE e <= $1 AND e != 0", cfg.Table), | ||||
| 	} | ||||
|  | ||||
| 	store.checkSchema(cfg.Table) | ||||
| 	if !cfg.DisableStartupCheck { | ||||
| 		store.checkSchema(cfg.Table) | ||||
| 	} | ||||
|  | ||||
| 	// Start garbage collector | ||||
| 	go store.gcTicker() | ||||
|   | ||||
| @@ -202,6 +202,18 @@ func TestNoCreateUser(t *testing.T) { | ||||
| 	}) | ||||
|  | ||||
| } | ||||
|  | ||||
| func Test_Postgres_New_DisableStartupCheck(t *testing.T) { | ||||
| 	require.NotPanics(t, func() { | ||||
| 		store := New(Config{ | ||||
| 			Host:                "127.0.0.1", | ||||
| 			Port:                65432, | ||||
| 			DisableStartupCheck: true, | ||||
| 		}) | ||||
| 		require.NotNil(t, store) | ||||
| 		defer store.Close() | ||||
| 	}) | ||||
| } | ||||
| func Test_Should_Panic_On_Wrong_Schema(t *testing.T) { | ||||
| 	testStore := newTestStore(t) | ||||
| 	defer testStore.Close() | ||||
|   | ||||
| @@ -180,6 +180,11 @@ type Config struct { | ||||
| 	// Optional. Default is false | ||||
| 	Reset bool | ||||
|  | ||||
| 	// DisableStartupCheck skips the initial connection validation during New. | ||||
| 	// | ||||
| 	// Optional. Default is false | ||||
| 	DisableStartupCheck bool | ||||
|  | ||||
| 	// TLS Config to use. When set TLS will be negotiated. | ||||
| 	// | ||||
| 	// Optional. Default is nil | ||||
| @@ -208,6 +213,7 @@ var ConfigDefault = Config{ | ||||
| 	URL:                   "", | ||||
| 	Database:              0, | ||||
| 	Reset:                 false, | ||||
| 	DisableStartupCheck:   false, | ||||
| 	TLSConfig:             nil, | ||||
| 	PoolSize:              10 * runtime.GOMAXPROCS(0), | ||||
| 	Addrs:                 []string{}, | ||||
|   | ||||
| @@ -68,6 +68,11 @@ type Config struct { | ||||
| 	// Optional. Default is false | ||||
| 	Reset bool | ||||
|  | ||||
| 	// DisableStartupCheck skips the initial connection validation during New. | ||||
| 	// | ||||
| 	// Optional. Default is false | ||||
| 	DisableStartupCheck bool | ||||
|  | ||||
| 	// TLS Config to use. When set TLS will be negotiated. | ||||
| 	// | ||||
| 	// Optional. Default is nil | ||||
| @@ -87,21 +92,22 @@ type Config struct { | ||||
|  | ||||
| // ConfigDefault is the default config | ||||
| var ConfigDefault = Config{ | ||||
| 	Host:             "127.0.0.1", | ||||
| 	Port:             6379, | ||||
| 	Username:         "", | ||||
| 	Password:         "", | ||||
| 	URL:              "", | ||||
| 	Database:         0, | ||||
| 	Reset:            false, | ||||
| 	TLSConfig:        nil, | ||||
| 	PoolSize:         10 * runtime.GOMAXPROCS(0), | ||||
| 	Addrs:            []string{}, | ||||
| 	MasterName:       "", | ||||
| 	ClientName:       "", | ||||
| 	SentinelUsername: "", | ||||
| 	SentinelPassword: "", | ||||
| 	IsClusterMode:    false, | ||||
| 	Host:                "127.0.0.1", | ||||
| 	Port:                6379, | ||||
| 	Username:            "", | ||||
| 	Password:            "", | ||||
| 	URL:                 "", | ||||
| 	Database:            0, | ||||
| 	Reset:               false, | ||||
| 	DisableStartupCheck: false, | ||||
| 	TLSConfig:           nil, | ||||
| 	PoolSize:            10 * runtime.GOMAXPROCS(0), | ||||
| 	Addrs:               []string{}, | ||||
| 	MasterName:          "", | ||||
| 	ClientName:          "", | ||||
| 	SentinelUsername:    "", | ||||
| 	SentinelPassword:    "", | ||||
| 	IsClusterMode:       false, | ||||
| } | ||||
|  | ||||
| // Helper function to set default values | ||||
|   | ||||
| @@ -4,7 +4,7 @@ go 1.23.0 | ||||
|  | ||||
| require ( | ||||
| 	github.com/gofiber/storage/testhelpers/redis v0.0.0-20250822074218-ba2347199921 | ||||
| 	github.com/redis/go-redis/v9 v9.12.1 | ||||
| 	github.com/redis/go-redis/v9 v9.14.0 | ||||
| 	github.com/stretchr/testify v1.10.0 | ||||
| ) | ||||
|  | ||||
|   | ||||
| @@ -103,8 +103,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb | ||||
| github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | ||||
| github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= | ||||
| github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= | ||||
| github.com/redis/go-redis/v9 v9.12.1 h1:k5iquqv27aBtnTm2tIkROUDp8JBXhXZIVu1InSgvovg= | ||||
| github.com/redis/go-redis/v9 v9.12.1/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw= | ||||
| github.com/redis/go-redis/v9 v9.14.0 h1:u4tNCjXOyzfgeLN+vAZaW1xUooqWDqVEsZN0U01jfAE= | ||||
| github.com/redis/go-redis/v9 v9.14.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw= | ||||
| github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= | ||||
| github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= | ||||
| github.com/shirou/gopsutil/v4 v4.25.5 h1:rtd9piuSMGeU8g1RMXjZs9y9luK5BwtnG7dZaQUJAsc= | ||||
|   | ||||
| @@ -65,16 +65,18 @@ func New(config ...Config) *Storage { | ||||
| 		IsClusterMode:    cfg.IsClusterMode, | ||||
| 	}) | ||||
|  | ||||
| 	// Test connection | ||||
| 	if err := db.Ping(context.Background()).Err(); err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
|  | ||||
| 	// Empty collection if Clear is true | ||||
| 	if cfg.Reset { | ||||
| 		if err := db.FlushDB(context.Background()).Err(); err != nil { | ||||
| 	if !cfg.DisableStartupCheck { | ||||
| 		// Test connection | ||||
| 		if err := db.Ping(context.Background()).Err(); err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
|  | ||||
| 		// Empty collection if Clear is true | ||||
| 		if cfg.Reset { | ||||
| 			if err := db.FlushDB(context.Background()).Err(); err != nil { | ||||
| 				panic(err) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Create new store | ||||
|   | ||||
| @@ -198,6 +198,19 @@ func Test_Redis_Delete(t *testing.T) { | ||||
| 	require.Nil(t, keys) | ||||
| } | ||||
|  | ||||
| func Test_Redis_New_DisableStartupCheck(t *testing.T) { | ||||
| 	require.NotPanics(t, func() { | ||||
| 		store := New(Config{ | ||||
| 			Host:                "127.0.0.1", | ||||
| 			Port:                6390, | ||||
| 			Addrs:               []string{"127.0.0.1:6390"}, | ||||
| 			DisableStartupCheck: true, | ||||
| 		}) | ||||
| 		require.NotNil(t, store) | ||||
| 		_ = store.Close() | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func Test_Redis_DeleteWithContext(t *testing.T) { | ||||
| 	var ( | ||||
| 		key = "john" | ||||
|   | ||||
| @@ -184,6 +184,13 @@ type Config struct { | ||||
| 	// Optional. Default is false | ||||
| 	Reset bool | ||||
|  | ||||
| 	// DisableStartupCheck skips the initial connection validation during New. | ||||
| 	// When true and client creation fails, New returns a Storage whose | ||||
| 	// operations surface the initialization error instead of panicking. | ||||
| 	// | ||||
| 	// Optional. Default is false | ||||
| 	DisableStartupCheck bool | ||||
|  | ||||
| 	// CacheTTL TTL | ||||
| 	// | ||||
| 	// Optional. Default is time.Minute | ||||
| @@ -210,6 +217,7 @@ var ConfigDefault = Config{ | ||||
| 	DisableCache:        false, | ||||
| 	AlwaysPipelining:    true, | ||||
| 	Reset:               false, | ||||
| 	DisableStartupCheck: false, | ||||
| 	CacheTTL:            time.Minute, | ||||
| } | ||||
| ``` | ||||
|   | ||||
| @@ -95,6 +95,13 @@ type Config struct { | ||||
| 	// Optional. Default is false | ||||
| 	Reset bool | ||||
|  | ||||
| 	// DisableStartupCheck skips the initial connection validation during New. | ||||
| 	// When true and the client cannot be created, New returns a Storage whose | ||||
| 	// operations will report the initialization error instead of panicking. | ||||
| 	// | ||||
| 	// Optional. Default is false | ||||
| 	DisableStartupCheck bool | ||||
|  | ||||
| 	// CacheTTL TTL | ||||
| 	// | ||||
| 	// Optional. Default is time.Minute | ||||
| @@ -120,6 +127,7 @@ var ConfigDefault = Config{ | ||||
| 	DisableCache:        false, | ||||
| 	AlwaysPipelining:    true, | ||||
| 	Reset:               false, | ||||
| 	DisableStartupCheck: false, | ||||
| 	CacheTTL:            time.Minute, | ||||
| } | ||||
|  | ||||
| @@ -194,5 +202,9 @@ func configDefault(config ...Config) Config { | ||||
| 		cfg.Reset = true | ||||
| 	} | ||||
|  | ||||
| 	if userConfig.DisableStartupCheck { | ||||
| 		cfg.DisableStartupCheck = true | ||||
| 	} | ||||
|  | ||||
| 	return cfg | ||||
| } | ||||
|   | ||||
| @@ -4,7 +4,7 @@ go 1.23.0 | ||||
|  | ||||
| require ( | ||||
| 	github.com/gofiber/storage/testhelpers/redis v0.0.0-00010101000000-000000000000 | ||||
| 	github.com/redis/rueidis v1.0.64 | ||||
| 	github.com/redis/rueidis v1.0.67 | ||||
| 	github.com/stretchr/testify v1.10.0 | ||||
| ) | ||||
|  | ||||
|   | ||||
| @@ -99,10 +99,10 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb | ||||
| github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | ||||
| github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= | ||||
| github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= | ||||
| github.com/redis/go-redis/v9 v9.11.0 h1:E3S08Gl/nJNn5vkxd2i78wZxWAPNZgUNTp8WIJUAiIs= | ||||
| github.com/redis/go-redis/v9 v9.11.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw= | ||||
| github.com/redis/rueidis v1.0.64 h1:XqgbueDuNV3qFdVdQwAHJl1uNt90zUuAJuzqjH4cw6Y= | ||||
| github.com/redis/rueidis v1.0.64/go.mod h1:Lkhr2QTgcoYBhxARU7kJRO8SyVlgUuEkcJO1Y8MCluA= | ||||
| github.com/redis/go-redis/v9 v9.14.0 h1:u4tNCjXOyzfgeLN+vAZaW1xUooqWDqVEsZN0U01jfAE= | ||||
| github.com/redis/go-redis/v9 v9.14.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw= | ||||
| github.com/redis/rueidis v1.0.67 h1:v2BIArP50KkRsEkhPWyVg4pcwI3rPVehl6EYyWlPHrM= | ||||
| github.com/redis/rueidis v1.0.67/go.mod h1:Lkhr2QTgcoYBhxARU7kJRO8SyVlgUuEkcJO1Y8MCluA= | ||||
| github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= | ||||
| github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= | ||||
| github.com/shirou/gopsutil/v4 v4.25.5 h1:rtd9piuSMGeU8g1RMXjZs9y9luK5BwtnG7dZaQUJAsc= | ||||
|   | ||||
| @@ -11,7 +11,8 @@ var cacheTTL = time.Second | ||||
|  | ||||
| // Storage interface that is implemented by storage providers | ||||
| type Storage struct { | ||||
| 	db rueidis.Client | ||||
| 	db      rueidis.Client | ||||
| 	initErr error | ||||
| } | ||||
|  | ||||
| // New creates a new rueidis storage | ||||
| @@ -45,7 +46,6 @@ func New(config ...Config) *Storage { | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Update config values accordingly and start new Client | ||||
| 	db, err := rueidis.NewClient(rueidis.ClientOption{ | ||||
| 		Username:            cfg.Username, | ||||
| 		Password:            cfg.Password, | ||||
| @@ -64,19 +64,25 @@ func New(config ...Config) *Storage { | ||||
| 		AlwaysPipelining:    cfg.AlwaysPipelining, | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		if cfg.DisableStartupCheck { | ||||
| 			return &Storage{initErr: err} | ||||
| 		} | ||||
|  | ||||
| 		panic(err) | ||||
| 	} | ||||
|  | ||||
| 	// Test connection | ||||
| 	if err := db.Do(context.Background(), db.B().Ping().Build()).Error(); err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
|  | ||||
| 	// Empty collection if Clear is true | ||||
| 	if cfg.Reset { | ||||
| 		if err := db.Do(context.Background(), db.B().Flushdb().Build()).Error(); err != nil { | ||||
| 	if !cfg.DisableStartupCheck { | ||||
| 		// Test connection | ||||
| 		if err := db.Do(context.Background(), db.B().Ping().Build()).Error(); err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
|  | ||||
| 		// Empty collection if Clear is true | ||||
| 		if cfg.Reset { | ||||
| 			if err := db.Do(context.Background(), db.B().Flushdb().Build()).Error(); err != nil { | ||||
| 				panic(err) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Create new store | ||||
| @@ -87,6 +93,9 @@ func New(config ...Config) *Storage { | ||||
|  | ||||
| // GetWithContext gets value by key with context | ||||
| func (s *Storage) GetWithContext(ctx context.Context, key string) ([]byte, error) { | ||||
| 	if s.db == nil { | ||||
| 		return nil, s.initErr | ||||
| 	} | ||||
| 	if len(key) <= 0 { | ||||
| 		return nil, nil | ||||
| 	} | ||||
| @@ -104,6 +113,9 @@ func (s *Storage) Get(key string) ([]byte, error) { | ||||
|  | ||||
| // SetWithContext sets key with value with context | ||||
| func (s *Storage) SetWithContext(ctx context.Context, key string, val []byte, exp time.Duration) error { | ||||
| 	if s.db == nil { | ||||
| 		return s.initErr | ||||
| 	} | ||||
| 	if len(key) <= 0 || len(val) <= 0 { | ||||
| 		return nil | ||||
| 	} | ||||
| @@ -121,6 +133,9 @@ func (s *Storage) Set(key string, val []byte, exp time.Duration) error { | ||||
|  | ||||
| // DeleteWithContext deletes key by key with context | ||||
| func (s *Storage) DeleteWithContext(ctx context.Context, key string) error { | ||||
| 	if s.db == nil { | ||||
| 		return s.initErr | ||||
| 	} | ||||
| 	if len(key) <= 0 { | ||||
| 		return nil | ||||
| 	} | ||||
| @@ -134,6 +149,9 @@ func (s *Storage) Delete(key string) error { | ||||
|  | ||||
| // ResetWithContext resets all keys with context | ||||
| func (s *Storage) ResetWithContext(ctx context.Context) error { | ||||
| 	if s.db == nil { | ||||
| 		return s.initErr | ||||
| 	} | ||||
| 	return s.db.Do(ctx, s.db.B().Flushdb().Build()).Error() | ||||
| } | ||||
|  | ||||
| @@ -144,6 +162,10 @@ func (s *Storage) Reset() error { | ||||
|  | ||||
| // Close the database | ||||
| func (s *Storage) Close() error { | ||||
| 	if s.db == nil { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	s.db.Close() | ||||
| 	return nil | ||||
| } | ||||
|   | ||||
| @@ -49,6 +49,17 @@ func newTestStore(t testing.TB, opts ...testredis.Option) *Storage { | ||||
| 	return New(newConfigFromContainer(t, opts...)) | ||||
| } | ||||
|  | ||||
| func Test_Rueidis_New_DisableStartupCheck(t *testing.T) { | ||||
| 	require.NotPanics(t, func() { | ||||
| 		store := New(Config{ | ||||
| 			InitAddress:         []string{"127.0.0.1:6390"}, | ||||
| 			DisableStartupCheck: true, | ||||
| 		}) | ||||
| 		require.NotNil(t, store) | ||||
| 		require.NoError(t, store.Close()) | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func Test_Rueidis_Set(t *testing.T) { | ||||
| 	var ( | ||||
| 		key = "john" | ||||
|   | ||||
							
								
								
									
										30
									
								
								s3/go.mod
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								s3/go.mod
									
									
									
									
									
								
							| @@ -3,11 +3,11 @@ module github.com/gofiber/storage/s3/v2 | ||||
| go 1.23.0 | ||||
|  | ||||
| require ( | ||||
| 	github.com/aws/aws-sdk-go-v2 v1.38.2 | ||||
| 	github.com/aws/aws-sdk-go-v2/config v1.31.4 | ||||
| 	github.com/aws/aws-sdk-go-v2/credentials v1.18.8 | ||||
| 	github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.19.2 | ||||
| 	github.com/aws/aws-sdk-go-v2/service/s3 v1.87.2 | ||||
| 	github.com/aws/aws-sdk-go-v2 v1.39.2 | ||||
| 	github.com/aws/aws-sdk-go-v2/config v1.31.12 | ||||
| 	github.com/aws/aws-sdk-go-v2/credentials v1.18.16 | ||||
| 	github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.19.12 | ||||
| 	github.com/aws/aws-sdk-go-v2/service/s3 v1.88.4 | ||||
| 	github.com/aws/smithy-go v1.23.0 | ||||
| 	github.com/stretchr/testify v1.10.0 | ||||
| 	github.com/testcontainers/testcontainers-go v0.38.0 | ||||
| @@ -19,18 +19,18 @@ require ( | ||||
| 	github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect | ||||
| 	github.com/Microsoft/go-winio v0.6.2 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.1 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.5 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.5 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.5 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.9 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.9 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.9 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.5 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.9 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.1 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.5 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.5 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.5 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/service/sso v1.28.3 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/service/ssooidc v1.34.1 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/service/sts v1.38.1 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.0 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.9 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.9 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/service/sso v1.29.6 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.1 // indirect | ||||
| 	github.com/aws/aws-sdk-go-v2/service/sts v1.38.6 // indirect | ||||
| 	github.com/cenkalti/backoff/v4 v4.2.1 // indirect | ||||
| 	github.com/containerd/errdefs v1.0.0 // indirect | ||||
| 	github.com/containerd/errdefs/pkg v0.3.0 // indirect | ||||
|   | ||||
							
								
								
									
										60
									
								
								s3/go.sum
									
									
									
									
									
								
							
							
						
						
									
										60
									
								
								s3/go.sum
									
									
									
									
									
								
							| @@ -6,42 +6,42 @@ github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOEl | ||||
| github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= | ||||
| github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= | ||||
| github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= | ||||
| github.com/aws/aws-sdk-go-v2 v1.38.2 h1:QUkLO1aTW0yqW95pVzZS0LGFanL71hJ0a49w4TJLMyM= | ||||
| github.com/aws/aws-sdk-go-v2 v1.38.2/go.mod h1:sDioUELIUO9Znk23YVmIk86/9DOpkbyyVb1i/gUNFXY= | ||||
| github.com/aws/aws-sdk-go-v2 v1.39.2 h1:EJLg8IdbzgeD7xgvZ+I8M1e0fL0ptn/M47lianzth0I= | ||||
| github.com/aws/aws-sdk-go-v2 v1.39.2/go.mod h1:sDioUELIUO9Znk23YVmIk86/9DOpkbyyVb1i/gUNFXY= | ||||
| github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.1 h1:i8p8P4diljCr60PpJp6qZXNlgX4m2yQFpYk+9ZT+J4E= | ||||
| github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.1/go.mod h1:ddqbooRZYNoJ2dsTwOty16rM+/Aqmk/GOXrK8cg7V00= | ||||
| github.com/aws/aws-sdk-go-v2/config v1.31.4 h1:aY2IstXOfjdLtr1lDvxFBk5DpBnHgS5GS3jgR/0BmPw= | ||||
| github.com/aws/aws-sdk-go-v2/config v1.31.4/go.mod h1:1IAykiegrTp6n+CbZoCpW6kks1I74fEDgl2BPQSkLSU= | ||||
| github.com/aws/aws-sdk-go-v2/credentials v1.18.8 h1:0FfdP0I9gs/f1rwtEdkcEdsclTEkPB8o6zWUG2Z8+IM= | ||||
| github.com/aws/aws-sdk-go-v2/credentials v1.18.8/go.mod h1:9UReQ1UmGooX93JKzHyr7PRF3F+p3r+PmRwR7+qHJYA= | ||||
| github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.5 h1:ul7hICbZ5Z/Pp9VnLVGUVe7rqYLXCyIiPU7hQ0sRkow= | ||||
| github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.5/go.mod h1:5cIWJ0N6Gjj+72Q6l46DeaNtcxXHV42w/Uq3fIfeUl4= | ||||
| github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.19.2 h1:eZAl6tdv3HrIHAxbpnDQByEOD84bmxyhLmgvUYJ8ggo= | ||||
| github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.19.2/go.mod h1:vV+YS0SWfpwbIGOUWbB5NWklaYKscfYrQRb9ggHptxs= | ||||
| github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.5 h1:d45S2DqHZOkHu0uLUW92VdBoT5v0hh3EyR+DzMEh3ag= | ||||
| github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.5/go.mod h1:G6e/dR2c2huh6JmIo9SXysjuLuDDGWMeYGibfW2ZrXg= | ||||
| github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.5 h1:ENhnQOV3SxWHplOqNN1f+uuCNf9n4Y/PKpl6b1WRP0Q= | ||||
| github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.5/go.mod h1:csQLMI+odbC0/J+UecSTztG70Dc4aTCOu4GyPNDNpVo= | ||||
| github.com/aws/aws-sdk-go-v2/config v1.31.12 h1:pYM1Qgy0dKZLHX2cXslNacbcEFMkDMl+Bcj5ROuS6p8= | ||||
| github.com/aws/aws-sdk-go-v2/config v1.31.12/go.mod h1:/MM0dyD7KSDPR+39p9ZNVKaHDLb9qnfDurvVS2KAhN8= | ||||
| github.com/aws/aws-sdk-go-v2/credentials v1.18.16 h1:4JHirI4zp958zC026Sm+V4pSDwW4pwLefKrc0bF2lwI= | ||||
| github.com/aws/aws-sdk-go-v2/credentials v1.18.16/go.mod h1:qQMtGx9OSw7ty1yLclzLxXCRbrkjWAM7JnObZjmCB7I= | ||||
| github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.9 h1:Mv4Bc0mWmv6oDuSWTKnk+wgeqPL5DRFu5bQL9BGPQ8Y= | ||||
| github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.9/go.mod h1:IKlKfRppK2a1y0gy1yH6zD+yX5uplJ6UuPlgd48dJiQ= | ||||
| github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.19.12 h1:ofHawDLJTI6ytDIji+g4dXQ6u2idzTb04tDlN9AS614= | ||||
| github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.19.12/go.mod h1:f5pL4iLDfbcxj1SZcdRdIokBB5eHbuYPS/Fs9DwUPRQ= | ||||
| github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.9 h1:se2vOWGD3dWQUtfn4wEjRQJb1HK1XsNIt825gskZ970= | ||||
| github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.9/go.mod h1:hijCGH2VfbZQxqCDN7bwz/4dzxV+hkyhjawAtdPWKZA= | ||||
| github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.9 h1:6RBnKZLkJM4hQ+kN6E7yWFveOTg8NLPHAkqrs4ZPlTU= | ||||
| github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.9/go.mod h1:V9rQKRmK7AWuEsOMnHzKj8WyrIir1yUJbZxDuZLFvXI= | ||||
| github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= | ||||
| github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= | ||||
| github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.5 h1:ovHE1XM53pMGOwINf8Mas4FMl5XRRMAihNokV1YViZ8= | ||||
| github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.5/go.mod h1:Cmu/DOSYwcr0xYTFk7sA9NJ5HF3ND0EqNUBdoK16nPI= | ||||
| github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.9 h1:w9LnHqTq8MEdlnyhV4Bwfizd65lfNCNgdlNC6mM5paE= | ||||
| github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.9/go.mod h1:LGEP6EK4nj+bwWNdrvX/FnDTFowdBNwcSPuZu/ouFys= | ||||
| github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.1 h1:oegbebPEMA/1Jny7kvwejowCaHz1FWZAQ94WXFNCyTM= | ||||
| github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.1/go.mod h1:kemo5Myr9ac0U9JfSjMo9yHLtw+pECEHsFtJ9tqCEI8= | ||||
| github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.5 h1:gC3YW8AojITDXfI5avcKZst5iOg6v5aQEU4HIcxwAss= | ||||
| github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.5/go.mod h1:z5OdVolKifM0NpEel6wLkM/TQ0eodWB2dmDFoj3WCbw= | ||||
| github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.5 h1:Cx1M/UUgYu9UCQnIMKaOhkVaFvLy1HneD6T4sS/DlKg= | ||||
| github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.5/go.mod h1:fTRNLgrTvPpEzGqc9QkeO4hu/3ng+mdtUbL8shUwXz4= | ||||
| github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.5 h1:IM2yO5Dd9bzCmYEvLU6Di5kduRKh4O93TjrZ47hxLhQ= | ||||
| github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.5/go.mod h1:0nXagJIQFWms6GJ1jvPJLwr8r3hN6f+kTwt17Q2NrPQ= | ||||
| github.com/aws/aws-sdk-go-v2/service/s3 v1.87.2 h1:HNAbIp6VXmtKR+JuDmywGcRc3kYoIGT9y4a2Zg9bSTQ= | ||||
| github.com/aws/aws-sdk-go-v2/service/s3 v1.87.2/go.mod h1:6VSEglrPCTx7gi7Z7l/CtqSgbnFr1N6UJ6+Ik+vjuEo= | ||||
| github.com/aws/aws-sdk-go-v2/service/sso v1.28.3 h1:z6lajFT/qGlLRB/I8V5CCklqSuWZKUkdwRAn9leIkiQ= | ||||
| github.com/aws/aws-sdk-go-v2/service/sso v1.28.3/go.mod h1:BnyjuIX0l+KXJVl2o9Ki3Zf0M4pA2hQYopFCRUj9ADU= | ||||
| github.com/aws/aws-sdk-go-v2/service/ssooidc v1.34.1 h1:8yI3jK5JZ310S8RpgdZdzwvlvBu3QbG8DP7Be/xJ6yo= | ||||
| github.com/aws/aws-sdk-go-v2/service/ssooidc v1.34.1/go.mod h1:HPzXfFgrLd02lYpcFYdDz5xZs94LOb+lWlvbAGaeMsk= | ||||
| github.com/aws/aws-sdk-go-v2/service/sts v1.38.1 h1:3kWmIg5iiWPMBJyq/I55Fki5fyfoMtrn/SkUIpxPwHQ= | ||||
| github.com/aws/aws-sdk-go-v2/service/sts v1.38.1/go.mod h1:yi0b3Qez6YamRVJ+Rbi19IgvjfjPODgVRhkWA6RTMUM= | ||||
| github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.0 h1:X0FveUndcZ3lKbSpIC6rMYGRiQTcUVRNH6X4yYtIrlU= | ||||
| github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.0/go.mod h1:IWjQYlqw4EX9jw2g3qnEPPWvCE6bS8fKzhMed1OK7c8= | ||||
| github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.9 h1:5r34CgVOD4WZudeEKZ9/iKpiT6cM1JyEROpXjOcdWv8= | ||||
| github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.9/go.mod h1:dB12CEbNWPbzO2uC6QSWHteqOg4JfBVJOojbAoAUb5I= | ||||
| github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.9 h1:wuZ5uW2uhJR63zwNlqWH2W4aL4ZjeJP3o92/W+odDY4= | ||||
| github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.9/go.mod h1:/G58M2fGszCrOzvJUkDdY8O9kycodunH4VdT5oBAqls= | ||||
| github.com/aws/aws-sdk-go-v2/service/s3 v1.88.4 h1:mUI3b885qJgfqKDUSj6RgbRqLdX0wGmg8ruM03zNfQA= | ||||
| github.com/aws/aws-sdk-go-v2/service/s3 v1.88.4/go.mod h1:6v8ukAxc7z4x4oBjGUsLnH7KGLY9Uhcgij19UJNkiMg= | ||||
| github.com/aws/aws-sdk-go-v2/service/sso v1.29.6 h1:A1oRkiSQOWstGh61y4Wc/yQ04sqrQZr1Si/oAXj20/s= | ||||
| github.com/aws/aws-sdk-go-v2/service/sso v1.29.6/go.mod h1:5PfYspyCU5Vw1wNPsxi15LZovOnULudOQuVxphSflQA= | ||||
| github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.1 h1:5fm5RTONng73/QA73LhCNR7UT9RpFH3hR6HWL6bIgVY= | ||||
| github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.1/go.mod h1:xBEjWD13h+6nq+z4AkqSfSvqRKFgDIQeaMguAJndOWo= | ||||
| github.com/aws/aws-sdk-go-v2/service/sts v1.38.6 h1:p3jIvqYwUZgu/XYeI48bJxOhvm47hZb5HUQ0tn6Q9kA= | ||||
| github.com/aws/aws-sdk-go-v2/service/sts v1.38.6/go.mod h1:WtKK+ppze5yKPkZ0XwqIVWD4beCwv056ZbPQNoeHqM8= | ||||
| github.com/aws/smithy-go v1.23.0 h1:8n6I3gXzWJB2DxBDnfxgBaSX6oe0d/t10qGz7OKqMCE= | ||||
| github.com/aws/smithy-go v1.23.0/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= | ||||
| github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= | ||||
|   | ||||
| @@ -5,6 +5,13 @@ import ( | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| type StorageWithConn[T any] interface { | ||||
| 	// Conn returns a connection to the storage. | ||||
| 	// Implementations should return a connection to the storage, | ||||
| 	// using the proper driver for the storage. | ||||
| 	Conn() T | ||||
| } | ||||
|  | ||||
| // Storage interface for communicating with different database/key-value | ||||
| // providers. Visit https://github.com/gofiber/storage for more info. | ||||
| type Storage interface { | ||||
|   | ||||
| @@ -3,7 +3,7 @@ module github.com/gofiber/storage/testhelpers/redis | ||||
| go 1.23.0 | ||||
|  | ||||
| require ( | ||||
| 	github.com/redis/go-redis/v9 v9.12.1 | ||||
| 	github.com/redis/go-redis/v9 v9.14.0 | ||||
| 	github.com/stretchr/testify v1.10.0 | ||||
| 	github.com/testcontainers/testcontainers-go v0.38.0 | ||||
| 	github.com/testcontainers/testcontainers-go/modules/redis v0.38.0 | ||||
|   | ||||
| @@ -101,8 +101,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb | ||||
| github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | ||||
| github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= | ||||
| github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= | ||||
| github.com/redis/go-redis/v9 v9.12.1 h1:k5iquqv27aBtnTm2tIkROUDp8JBXhXZIVu1InSgvovg= | ||||
| github.com/redis/go-redis/v9 v9.12.1/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw= | ||||
| github.com/redis/go-redis/v9 v9.14.0 h1:u4tNCjXOyzfgeLN+vAZaW1xUooqWDqVEsZN0U01jfAE= | ||||
| github.com/redis/go-redis/v9 v9.14.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw= | ||||
| github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= | ||||
| github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= | ||||
| github.com/shirou/gopsutil/v4 v4.25.5 h1:rtd9piuSMGeU8g1RMXjZs9y9luK5BwtnG7dZaQUJAsc= | ||||
|   | ||||
							
								
								
									
										306
									
								
								testhelpers/tck/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										306
									
								
								testhelpers/tck/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,306 @@ | ||||
| # Test Compatibility Kit (TCK) for Storage Implementations | ||||
|  | ||||
| The Test Compatibility Kit (TCK) is a standardized test suite for validating storage implementations in the Fiber Storage repository. It provides a comprehensive set of tests that ensure all storage backends behave consistently and correctly implement the `storage.Storage` interface. | ||||
|  | ||||
| ## Overview | ||||
|  | ||||
| The TCK leverages [testify/suite](https://github.com/stretchr/testify#suite-package) to provide a structured testing approach with setup/teardown hooks and consistent test execution. It automatically tests all core storage operations including: | ||||
|  | ||||
| - Basic CRUD operations (Set, Get, Delete) | ||||
| - Context-aware operations (SetWithContext, GetWithContext, etc.) | ||||
| - TTL (Time-To-Live) functionality | ||||
| - Storage reset and cleanup | ||||
| - Connection handling for stores that implement `StorageWithConn` | ||||
|  | ||||
| ## Why Use the TCK? | ||||
|  | ||||
| - **Consistency**: Ensures all storage implementations behave identically | ||||
| - **Completeness**: Tests all required storage interface methods | ||||
| - **Maintenance**: Reduces test code duplication across storage implementations | ||||
| - **Quality**: Provides comprehensive edge case and error condition testing | ||||
| - **Integration**: Works seamlessly with testcontainers for isolated testing | ||||
|  | ||||
| ## Core Concepts | ||||
|  | ||||
| ### TCKSuite Interface | ||||
|  | ||||
| To use the TCK, you must implement the `TCKSuite` interface: | ||||
|  | ||||
| ```go | ||||
| // TCKSuite is the interface that must be implemented by the test suite. | ||||
| // It defines how to create a new store with a container. | ||||
| // The generic parameters are the storage type, the driver type returned by the Conn method, | ||||
| // and the container type used to back the storage. | ||||
| // | ||||
| // IMPORTANT: The container type must exist as a Testcontainers module. | ||||
| // Please refer to the [testcontainers] package for more information. | ||||
| type TCKSuite[T storage.Storage, D any, C testcontainers.Container] interface { | ||||
| 	// NewStore is a function that returns a new store. | ||||
| 	// It is called by the [New] function to create a new store. | ||||
| 	NewStore() func(ctx context.Context, tb testing.TB, ctr C) (T, error) | ||||
|  | ||||
| 	// NewContainer is a function that returns a new container. | ||||
| 	// It is called by the [New] function to create a new container. | ||||
| 	NewContainer() func(ctx context.Context, tb testing.TB) (C, error) | ||||
| } | ||||
| ``` | ||||
|  | ||||
| **Generic Parameters:** | ||||
| - `T`: Your concrete storage type (e.g., `*mysql.Storage`) | ||||
| - `D`: The driver type returned by `Conn()` method (e.g., `*sql.DB`) | ||||
| - `C`: The testcontainer type (e.g., `*mysql.MySQLContainer`) | ||||
|  | ||||
| Please verify that a suitable Testcontainers module exists for your container type. See the [Testcontainers modules catalog](https://testcontainers.com/modules/?language=go) for details. | ||||
|  | ||||
| ### Test Execution Modes | ||||
|  | ||||
| The TCK supports two execution modes: | ||||
|  | ||||
| - **PerTest** (default): Creates a new container and storage instance for each test | ||||
| - **PerSuite**: Creates one container and storage instance for the entire test suite | ||||
|  | ||||
| ## Implementation Guide: Example | ||||
|  | ||||
| Here's how to implement TCK tests for a new storage backend: | ||||
|  | ||||
| ### Step 1: Define Your TCK Implementation | ||||
|  | ||||
| ```go | ||||
| // ExampleStorageTCK is the test suite for the Example storage. | ||||
| type ExampleStorageTCK struct{} | ||||
|  | ||||
| // NewStore is a function that returns a new Example storage. | ||||
| // It implements the [tck.TCKSuite] interface, allowing the TCK to create a new Example storage | ||||
| // from the container created by the TCK. | ||||
| func (s *ExampleStorageTCK) NewStore() func(ctx context.Context, tb testing.TB, ctr *ExampleContainer) (*Storage, error) { | ||||
|     return func(ctx context.Context, tb testing.TB, ctr *example.Container) (*Storage, error) { | ||||
|         // Use container APIs to get connection details | ||||
|         conn, err := ctr.ConnectionString(ctx) | ||||
|         require.NoError(tb, err) | ||||
|  | ||||
|         store := New(Config{ | ||||
|             // Apply the storage-specific configuration | ||||
|             ConnectionURI: conn, | ||||
|             Reset:         true, | ||||
|         }) | ||||
|  | ||||
|         return store, nil | ||||
|     } | ||||
| } | ||||
|  | ||||
| // NewContainer is a function that returns a new Example container. | ||||
| // It implements the [tck.TCKSuite] interface, allowing the TCK to create a new Example container | ||||
| // for the Example storage. | ||||
| func (s *ExampleStorageTCK) NewContainer() func(ctx context.Context, tb testing.TB) (*example.Container, error) { | ||||
|     return func(ctx context.Context, tb testing.TB) (*example.Container, error) { | ||||
|         return mustStartExample(tb), nil | ||||
|     } | ||||
| } | ||||
| ``` | ||||
|  | ||||
| ### Step 2: Implement Container Creation | ||||
|  | ||||
| Create a helper function to start your storage backend's container: | ||||
|  | ||||
| ```go | ||||
| func mustStartExample(t testing.TB) *example.Container { | ||||
|     img := exampleImage | ||||
|     if imgFromEnv := os.Getenv(exampleImageEnvVar); imgFromEnv != "" { | ||||
|         img = imgFromEnv | ||||
|     } | ||||
|  | ||||
|     ctx := context.Background() | ||||
|  | ||||
|     c, err := example.Run(ctx, img, | ||||
|         example.WithOptionA("valueA"), | ||||
|         example.WithOptionB("valueB"), | ||||
|         testcontainers.WithWaitStrategy( | ||||
|             wait.ForListeningPort("examplePort/tcp"), | ||||
|         ), | ||||
|     ) | ||||
|     testcontainers.CleanupContainer(t, c) | ||||
|     require.NoError(t, err) | ||||
|  | ||||
|     return c | ||||
| } | ||||
| ``` | ||||
|  | ||||
| ### Step 3: Create and Run the TCK Test | ||||
|  | ||||
| ```go | ||||
| func TestExampleStorageTCK(t *testing.T) { | ||||
|     // Create the TCK suite with proper generic type parameters | ||||
|     s, err := tck.New[*ExampleStorage, *ExampleDriver, *ExampleContainer]( | ||||
|         context.Background(),  | ||||
|         t,  | ||||
|         &ExampleStorageTCK{},  | ||||
|         tck.PerTest(), // or tck.PerSuite() for suite-level containers | ||||
|     ) | ||||
|     require.NoError(t, err) | ||||
|  | ||||
|     // Run all TCK tests | ||||
|     suite.Run(t, s) | ||||
| } | ||||
| ``` | ||||
|  | ||||
| ## Key Implementation Guidelines | ||||
|  | ||||
| ### 1. Generic Type Parameters | ||||
|  | ||||
| When calling `tck.New`, specify the correct type parameters: | ||||
| - `T`: Your storage pointer type (e.g., `*Storage`) | ||||
| - `D`: The driver type returned by `Conn()` (or `any` if not applicable) | ||||
| - `C`: The container type returned by `NewContainer()` | ||||
|  | ||||
| ### 2. Error Handling | ||||
|  | ||||
| Always use `require.NoError(tb, err)` in your factory functions to ensure test failures are properly reported. | ||||
|  | ||||
| ### 3. Container Cleanup | ||||
|  | ||||
| The TCK handles container cleanup, but ensure your `mustStart*` helpers call `testcontainers.CleanupContainer(t, container)`. For ad‑hoc tests outside the TCK, call `CleanupContainer` to avoid leaving containers running until the test process exits. Although Ryuk will prune them, it’s better to clean up immediately. | ||||
|  | ||||
| ### 4. Configuration | ||||
|  | ||||
| Configure your storage with appropriate test settings: | ||||
| - Enable `Reset: true` if your storage supports it | ||||
| - Use test-specific database/namespace names | ||||
| - Configure appropriate timeouts and connection limits | ||||
|  | ||||
| ### 5. Context Handling | ||||
|  | ||||
| Always respect the provided `context.Context` in your factory functions, especially for container startup and storage initialization. | ||||
|  | ||||
| ## Testing Different Scenarios | ||||
|  | ||||
| ### PerTest Mode (Recommended) | ||||
| Use when you need complete isolation between tests: | ||||
|  | ||||
| ```go | ||||
| s, err := tck.New[*Storage, *sql.DB](ctx, t, &ExampleStorageTCK{}, tck.PerTest()) | ||||
| ``` | ||||
|  | ||||
| **Pros:** | ||||
| - Complete test isolation | ||||
| - No cross-test contamination | ||||
| - Easier debugging of individual test failures | ||||
|  | ||||
| **Cons:** | ||||
| - Slower execution due to container startup overhead | ||||
| - Higher resource usage, although mitigated by Testcontainers' cleanup mechanism | ||||
|  | ||||
| ### PerSuite Mode | ||||
| Use when container startup is expensive and tests can share state: | ||||
|  | ||||
| ```go | ||||
| s, err := tck.New[*Storage, *sql.DB](ctx, t, &ExampleStorageTCK{}, tck.PerSuite()) | ||||
| ``` | ||||
|  | ||||
| **Pros:** | ||||
| - Faster execution | ||||
| - Lower resource usage | ||||
|  | ||||
| **Cons:** | ||||
| - Tests may affect each other | ||||
| - Requires careful state management | ||||
|  | ||||
| ## Troubleshooting | ||||
|  | ||||
| ### Common Issues | ||||
|  | ||||
| 1. **Wrong Generic Types**: Ensure type parameters match your actual storage and driver types | ||||
| 2. **Container Startup Failures**: Check wait strategies and ensure proper service readiness | ||||
| 3. **Connection Issues**: Verify connection strings and authentication in your `NewStore()` implementation | ||||
| 4. **Test Isolation**: If tests interfere with each other, consider switching from `PerSuite` to `PerTest` | ||||
|  | ||||
| ### Best Practices | ||||
|  | ||||
| - Use environment variables for container image versions | ||||
| - Implement proper wait strategies for container readiness | ||||
| - Include cleanup calls even though TCK handles them automatically | ||||
| - Test your TCK implementation with both `PerTest` and `PerSuite` modes | ||||
| - Use meaningful test data that won't conflict across parallel test runs | ||||
|  | ||||
| ## Complete Example Template | ||||
|  | ||||
| Here's a complete template for implementing TCK tests for a new storage backend: | ||||
|  | ||||
| ```go | ||||
| package newstorage | ||||
|  | ||||
| import ( | ||||
|     "context" | ||||
|     "os" | ||||
|     "testing" | ||||
|      | ||||
|     "github.com/gofiber/storage/testhelpers/tck" | ||||
|     "github.com/stretchr/testify/require" | ||||
|     "github.com/stretchr/testify/suite" | ||||
|     "github.com/testcontainers/testcontainers-go" | ||||
|     // Import your specific testcontainer module | ||||
| ) | ||||
|  | ||||
| const ( | ||||
|     defaultImage = "your-storage-image:latest" | ||||
|     imageEnvVar  = "TEST_YOUR_STORAGE_IMAGE" | ||||
| ) | ||||
|  | ||||
| type YourStorageTCK struct{} | ||||
|  | ||||
| func (s *YourStorageTCK) NewStore() func(ctx context.Context, tb testing.TB, ctr *YourContainer) (*Storage, error) { | ||||
|     return func(ctx context.Context, tb testing.TB, ctr *YourContainer) (*Storage, error) { | ||||
|         // Get connection details from container | ||||
|         conn, err := ctr.ConnectionString(ctx) | ||||
|         require.NoError(tb, err) | ||||
|  | ||||
|         // Create and configure your storage | ||||
|         store := New(Config{ | ||||
|             ConnectionURI: conn, | ||||
|             Reset:         true, | ||||
|             // Add other test-specific configuration | ||||
|         }) | ||||
|  | ||||
|         return store, nil | ||||
|     } | ||||
| } | ||||
|  | ||||
| func (s *YourStorageTCK) NewContainer() func(ctx context.Context, tb testing.TB) (*YourContainer, error) { | ||||
|     return func(ctx context.Context, tb testing.TB) (*YourContainer, error) { | ||||
|         return mustStartYourStorage(tb), nil | ||||
|     } | ||||
| } | ||||
|  | ||||
| func mustStartYourStorage(t testing.TB) *YourContainer { | ||||
|     img := defaultImage | ||||
|     if imgFromEnv := os.Getenv(imageEnvVar); imgFromEnv != "" { | ||||
|         img = imgFromEnv | ||||
|     } | ||||
|  | ||||
|     ctx := context.Background() | ||||
|  | ||||
|     c, err := yourstorage.Run(ctx, img, | ||||
|         // Add your storage-specific configuration | ||||
|         testcontainers.WithWaitStrategy( | ||||
|             // Add appropriate wait strategies | ||||
|         ), | ||||
|     ) | ||||
|     testcontainers.CleanupContainer(t, c) | ||||
|     require.NoError(t, err) | ||||
|  | ||||
|     return c | ||||
| } | ||||
|  | ||||
| func TestYourStorageTCK(t *testing.T) { | ||||
|     s, err := tck.New[*Storage, YourDriverType, *YourContainer]( | ||||
|         context.Background(), | ||||
|         t, | ||||
|         &YourStorageTCK{}, | ||||
|         tck.PerTest(), | ||||
|     ) | ||||
|     require.NoError(t, err) | ||||
|  | ||||
|     suite.Run(t, s) | ||||
| } | ||||
| ``` | ||||
|  | ||||
| This template provides a solid foundation for implementing TCK tests for any new storage backend in the Fiber Storage repository. | ||||
							
								
								
									
										67
									
								
								testhelpers/tck/go.mod
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								testhelpers/tck/go.mod
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,67 @@ | ||||
| module github.com/gofiber/storage/testhelpers/tck | ||||
|  | ||||
| go 1.23.0 | ||||
|  | ||||
| replace github.com/gofiber/storage => ../.. | ||||
|  | ||||
| require ( | ||||
| 	github.com/gofiber/storage v1.3.3 | ||||
| 	github.com/stretchr/testify v1.10.0 | ||||
| 	github.com/testcontainers/testcontainers-go v0.38.0 | ||||
| ) | ||||
|  | ||||
| require ( | ||||
| 	dario.cat/mergo v1.0.1 // indirect | ||||
| 	github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect | ||||
| 	github.com/Microsoft/go-winio v0.6.2 // indirect | ||||
| 	github.com/cenkalti/backoff/v4 v4.2.1 // indirect | ||||
| 	github.com/containerd/errdefs v1.0.0 // indirect | ||||
| 	github.com/containerd/errdefs/pkg v0.3.0 // indirect | ||||
| 	github.com/containerd/log v0.1.0 // indirect | ||||
| 	github.com/containerd/platforms v0.2.1 // indirect | ||||
| 	github.com/cpuguy83/dockercfg v0.3.2 // indirect | ||||
| 	github.com/davecgh/go-spew v1.1.1 // indirect | ||||
| 	github.com/distribution/reference v0.6.0 // indirect | ||||
| 	github.com/docker/docker v28.2.2+incompatible // indirect | ||||
| 	github.com/docker/go-connections v0.5.0 // indirect | ||||
| 	github.com/docker/go-units v0.5.0 // indirect | ||||
| 	github.com/ebitengine/purego v0.8.4 // indirect | ||||
| 	github.com/felixge/httpsnoop v1.0.4 // indirect | ||||
| 	github.com/go-logr/logr v1.4.2 // indirect | ||||
| 	github.com/go-logr/stdr v1.2.2 // indirect | ||||
| 	github.com/go-ole/go-ole v1.2.6 // indirect | ||||
| 	github.com/gogo/protobuf v1.3.2 // indirect | ||||
| 	github.com/google/uuid v1.6.0 // indirect | ||||
| 	github.com/klauspost/compress v1.18.0 // indirect | ||||
| 	github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect | ||||
| 	github.com/magiconair/properties v1.8.10 // indirect | ||||
| 	github.com/moby/docker-image-spec v1.3.1 // indirect | ||||
| 	github.com/moby/go-archive v0.1.0 // indirect | ||||
| 	github.com/moby/patternmatcher v0.6.0 // indirect | ||||
| 	github.com/moby/sys/sequential v0.6.0 // indirect | ||||
| 	github.com/moby/sys/user v0.4.0 // indirect | ||||
| 	github.com/moby/sys/userns v0.1.0 // indirect | ||||
| 	github.com/moby/term v0.5.0 // indirect | ||||
| 	github.com/morikuni/aec v1.0.0 // indirect | ||||
| 	github.com/opencontainers/go-digest v1.0.0 // indirect | ||||
| 	github.com/opencontainers/image-spec v1.1.1 // indirect | ||||
| 	github.com/pkg/errors v0.9.1 // indirect | ||||
| 	github.com/pmezard/go-difflib v1.0.0 // indirect | ||||
| 	github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect | ||||
| 	github.com/shirou/gopsutil/v4 v4.25.5 // indirect | ||||
| 	github.com/sirupsen/logrus v1.9.3 // indirect | ||||
| 	github.com/tklauser/go-sysconf v0.3.12 // indirect | ||||
| 	github.com/tklauser/numcpus v0.6.1 // indirect | ||||
| 	github.com/yusufpapurcu/wmi v1.2.4 // indirect | ||||
| 	go.opentelemetry.io/auto/sdk v1.1.0 // indirect | ||||
| 	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect | ||||
| 	go.opentelemetry.io/otel v1.35.0 // indirect | ||||
| 	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 // indirect | ||||
| 	go.opentelemetry.io/otel/metric v1.35.0 // indirect | ||||
| 	go.opentelemetry.io/otel/trace v1.35.0 // indirect | ||||
| 	go.opentelemetry.io/proto/otlp v1.0.0 // indirect | ||||
| 	golang.org/x/crypto v0.37.0 // indirect | ||||
| 	golang.org/x/net v0.38.0 // indirect | ||||
| 	golang.org/x/sys v0.32.0 // indirect | ||||
| 	gopkg.in/yaml.v3 v3.0.1 // indirect | ||||
| ) | ||||
							
								
								
									
										192
									
								
								testhelpers/tck/go.sum
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										192
									
								
								testhelpers/tck/go.sum
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,192 @@ | ||||
| dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= | ||||
| dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= | ||||
| github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 h1:He8afgbRMd7mFxO99hRNu+6tazq8nFF9lIwo9JFroBk= | ||||
| github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= | ||||
| github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= | ||||
| github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= | ||||
| github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= | ||||
| github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= | ||||
| github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= | ||||
| github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= | ||||
| github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= | ||||
| github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= | ||||
| github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE= | ||||
| github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk= | ||||
| github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= | ||||
| github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= | ||||
| github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= | ||||
| github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= | ||||
| github.com/cpuguy83/dockercfg v0.3.2 h1:DlJTyZGBDlXqUZ2Dk2Q3xHs/FtnooJJVaad2S9GKorA= | ||||
| github.com/cpuguy83/dockercfg v0.3.2/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= | ||||
| github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= | ||||
| github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= | ||||
| 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/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= | ||||
| github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= | ||||
| github.com/docker/docker v28.2.2+incompatible h1:CjwRSksz8Yo4+RmQ339Dp/D2tGO5JxwYeqtMOEe0LDw= | ||||
| github.com/docker/docker v28.2.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= | ||||
| github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= | ||||
| github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= | ||||
| github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= | ||||
| github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= | ||||
| github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= | ||||
| github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= | ||||
| github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= | ||||
| github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= | ||||
| github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= | ||||
| github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= | ||||
| github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= | ||||
| github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= | ||||
| github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= | ||||
| github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= | ||||
| github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= | ||||
| github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= | ||||
| github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= | ||||
| github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= | ||||
| github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= | ||||
| github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= | ||||
| github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||
| github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= | ||||
| github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= | ||||
| github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= | ||||
| github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= | ||||
| github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= | ||||
| github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= | ||||
| github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= | ||||
| github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= | ||||
| github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= | ||||
| github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= | ||||
| github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= | ||||
| github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= | ||||
| github.com/magiconair/properties v1.8.10 h1:s31yESBquKXCV9a/ScB3ESkOjUYYv+X0rg8SYxI99mE= | ||||
| github.com/magiconair/properties v1.8.10/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= | ||||
| github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= | ||||
| github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= | ||||
| github.com/moby/go-archive v0.1.0 h1:Kk/5rdW/g+H8NHdJW2gsXyZ7UnzvJNOy6VKJqueWdcQ= | ||||
| github.com/moby/go-archive v0.1.0/go.mod h1:G9B+YoujNohJmrIYFBpSd54GTUB4lt9S+xVQvsJyFuo= | ||||
| github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= | ||||
| github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= | ||||
| github.com/moby/sys/atomicwriter v0.1.0 h1:kw5D/EqkBwsBFi0ss9v1VG3wIkVhzGvLklJ+w3A14Sw= | ||||
| github.com/moby/sys/atomicwriter v0.1.0/go.mod h1:Ul8oqv2ZMNHOceF643P6FKPXeCmYtlQMvpizfsSoaWs= | ||||
| github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU= | ||||
| github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko= | ||||
| github.com/moby/sys/user v0.4.0 h1:jhcMKit7SA80hivmFJcbB1vqmw//wU61Zdui2eQXuMs= | ||||
| github.com/moby/sys/user v0.4.0/go.mod h1:bG+tYYYJgaMtRKgEmuueC0hJEAZWwtIbZTB+85uoHjs= | ||||
| github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= | ||||
| github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= | ||||
| github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= | ||||
| github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= | ||||
| github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= | ||||
| github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= | ||||
| github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= | ||||
| github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= | ||||
| github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= | ||||
| github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= | ||||
| github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= | ||||
| github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | ||||
| 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/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= | ||||
| github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= | ||||
| github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= | ||||
| github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= | ||||
| github.com/shirou/gopsutil/v4 v4.25.5 h1:rtd9piuSMGeU8g1RMXjZs9y9luK5BwtnG7dZaQUJAsc= | ||||
| github.com/shirou/gopsutil/v4 v4.25.5/go.mod h1:PfybzyydfZcN+JMMjkF6Zb8Mq1A/VcogFFg7hj50W9c= | ||||
| github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= | ||||
| github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= | ||||
| github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||
| 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.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | ||||
| github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= | ||||
| github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= | ||||
| github.com/testcontainers/testcontainers-go v0.38.0 h1:d7uEapLcv2P8AvH8ahLqDMMxda2W9gQN1nRbHS28HBw= | ||||
| github.com/testcontainers/testcontainers-go v0.38.0/go.mod h1:C52c9MoHpWO+C4aqmgSU+hxlR5jlEayWtgYrb8Pzz1w= | ||||
| github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= | ||||
| github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= | ||||
| github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= | ||||
| github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= | ||||
| github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||
| github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||
| github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= | ||||
| github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= | ||||
| go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= | ||||
| go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= | ||||
| go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= | ||||
| go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= | ||||
| go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= | ||||
| go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 h1:IeMeyr1aBvBiPVYihXIaeIZba6b8E1bYp7lbdxK8CQg= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU= | ||||
| go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= | ||||
| go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE= | ||||
| go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= | ||||
| go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= | ||||
| go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= | ||||
| go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= | ||||
| go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= | ||||
| go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= | ||||
| 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/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||
| golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= | ||||
| golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= | ||||
| golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||||
| golang.org/x/mod v0.3.0/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-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= | ||||
| golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= | ||||
| golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= | ||||
| golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/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-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= | ||||
| golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= | ||||
| golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= | ||||
| golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= | ||||
| 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.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= | ||||
| golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= | ||||
| golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44= | ||||
| golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/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.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= | ||||
| golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= | ||||
| 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-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 h1:wKguEg1hsxI2/L3hUYrpo1RVi48K+uTyzKqprwLXsb8= | ||||
| google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142/go.mod h1:d6be+8HhtEtucleCbxpPW9PA9XwISACu8nvpPqF0BVo= | ||||
| google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= | ||||
| google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= | ||||
| google.golang.org/grpc v1.67.0 h1:IdH9y6PF5MPSdAntIcpjQ+tXO41pcQsfZV2RxtQgVcw= | ||||
| google.golang.org/grpc v1.67.0/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= | ||||
| google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= | ||||
| google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= | ||||
| gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
| gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= | ||||
| gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= | ||||
| 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= | ||||
| gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= | ||||
| gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= | ||||
							
								
								
									
										417
									
								
								testhelpers/tck/suite.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										417
									
								
								testhelpers/tck/suite.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,417 @@ | ||||
| package tck | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
| 	"sync" | ||||
| 	"testing" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/stretchr/testify/suite" | ||||
| 	testcontainers "github.com/testcontainers/testcontainers-go" | ||||
|  | ||||
| 	"github.com/gofiber/storage" | ||||
| ) | ||||
|  | ||||
| // suiteHook defines when the store should be created. | ||||
| // Please see [PerSuite] and [PerTest] for more details. | ||||
| type suiteHook int | ||||
|  | ||||
| const ( | ||||
| 	// perTest defines that the store should be created per test. | ||||
| 	perTest suiteHook = iota | ||||
|  | ||||
| 	// perSuite defines that the store should be created per suite. | ||||
| 	perSuite | ||||
| ) | ||||
|  | ||||
| // suiteUpdater is the interface that must be implemented by the test suite. | ||||
| // It defines how the [suiteOption]s update the suite. | ||||
| type suiteUpdater interface { | ||||
| 	updateHook(hook suiteHook) error | ||||
| } | ||||
|  | ||||
| // suiteOption is the interface that must be implemented by the [suiteOption]s. | ||||
| // It defines how the [suiteOption]s update the suite. | ||||
| type suiteOption interface { | ||||
| 	apply(s suiteUpdater) error | ||||
| } | ||||
|  | ||||
| // suiteUpdateOption is the default implementation of the [suiteOption] interface. | ||||
| // It is used to update the suite hook. | ||||
| type suiteUpdateOption struct { | ||||
| 	fn func(s suiteUpdater) error | ||||
| } | ||||
|  | ||||
| // apply is the method that is called by the [suiteOption]s to update the suite. | ||||
| func (o *suiteUpdateOption) apply(s suiteUpdater) error { | ||||
| 	return o.fn(s) | ||||
| } | ||||
|  | ||||
| // PerTest is a [suiteOption] that updates the suite hook to [perTest]. | ||||
| func PerTest() suiteOption { | ||||
| 	return &suiteUpdateOption{ | ||||
| 		fn: func(s suiteUpdater) error { | ||||
| 			return s.updateHook(perTest) | ||||
| 		}, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // PerSuite is a [suiteOption] that updates the suite hook to [perSuite]. | ||||
| func PerSuite() suiteOption { | ||||
| 	return &suiteUpdateOption{ | ||||
| 		fn: func(s suiteUpdater) error { | ||||
| 			return s.updateHook(perSuite) | ||||
| 		}, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // TCKSuite is the interface that must be implemented by the test suite. | ||||
| // It defines how to create a new store with a container. | ||||
| // The generic parameters are the storage type, the driver type returned by the Conn method, | ||||
| // and the container type used to back the storage. | ||||
| // | ||||
| // IMPORTANT: The container type must exist as a Testcontainers module. | ||||
| // Please refer to the [testcontainers] package for more information. | ||||
| type TCKSuite[T storage.Storage, D any, C testcontainers.Container] interface { | ||||
| 	// NewStore is a function that returns a new store. | ||||
| 	// It is called by the [New] function to create a new store. | ||||
| 	NewStore() func(ctx context.Context, tb testing.TB, ctr C) (T, error) | ||||
|  | ||||
| 	// NewContainer is a function that returns a new container. | ||||
| 	// It is called by the [New] function to create a new container. | ||||
| 	NewContainer() func(ctx context.Context, tb testing.TB) (C, error) | ||||
| } | ||||
|  | ||||
| // New creates a new [StorageTestSuite] with the given [TCKSuite]. | ||||
| func New[T storage.Storage, D any, C testcontainers.Container](ctx context.Context, t *testing.T, tckSuite TCKSuite[T, D, C], opts ...suiteOption) (*StorageTestSuite[T, D, C], error) { | ||||
| 	if tckSuite == nil { | ||||
| 		return nil, fmt.Errorf("test suite is nil") | ||||
| 	} | ||||
|  | ||||
| 	s := StorageTestSuite[T, D, C]{ | ||||
| 		ctx:               ctx, | ||||
| 		hook:              perTest, // defaults to perTest | ||||
| 		createStoreFn:     tckSuite.NewStore(), | ||||
| 		createContainerFn: tckSuite.NewContainer(), | ||||
| 	} | ||||
|  | ||||
| 	for _, opt := range opts { | ||||
| 		if err := opt.apply(&s); err != nil { | ||||
| 			return nil, fmt.Errorf("apply option: %w", err) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	s.SetT(t) | ||||
|  | ||||
| 	return &s, nil | ||||
| } | ||||
|  | ||||
| // StorageTestSuite is the test suite for the storage. | ||||
| // It implements the [suite.Suite] interface and provides the necessary methods to test the storage. | ||||
| // The generic parameters are the storage type, the driver type returned by the Conn method, | ||||
| // and the container type used to back the storage. | ||||
| type StorageTestSuite[T storage.Storage, D any, C testcontainers.Container] struct { | ||||
| 	// embed the suite.Suite to provide the necessary methods to define the lifecycle of the test suite. | ||||
| 	suite.Suite | ||||
|  | ||||
| 	// stats is the statistics of the test suite. | ||||
| 	// It is used to store the statistics for later use. | ||||
| 	stats *suite.SuiteInformation | ||||
|  | ||||
| 	// ctx is the context of the test suite. | ||||
| 	// It is used to store the context for later use. | ||||
| 	ctx context.Context | ||||
|  | ||||
| 	// hook is the hook for creating the store and container. | ||||
| 	hook suiteHook | ||||
|  | ||||
| 	// createStoreFn is the function to create the store. | ||||
| 	// It's called by the [SetupSuite] and [SetupTest] hooks, depending on the suite hook value. | ||||
| 	createStoreFn func(ctx context.Context, tb testing.TB, ctr C) (T, error) | ||||
|  | ||||
| 	// createContainerFn is the function to create the container. | ||||
| 	// It's called by the [SetupSuite] and [SetupTest] hooks, depending on the suite hook value. | ||||
| 	createContainerFn func(ctx context.Context, tb testing.TB) (C, error) | ||||
|  | ||||
| 	// store is the store under test. | ||||
| 	store storage.Storage | ||||
|  | ||||
| 	// closedStore is a flag to check if the store is closed. | ||||
| 	closedStore bool | ||||
|  | ||||
| 	// closedStoreMu is the mutex for the closedStore flag. | ||||
| 	closedStoreMu sync.Mutex | ||||
|  | ||||
| 	// ctr is the container backing the store under test. | ||||
| 	ctr C | ||||
| } | ||||
|  | ||||
| // updateHook is a helper function to update the hook for creating the store and container. | ||||
| func (s *StorageTestSuite[T, D, C]) updateHook(hook suiteHook) error { | ||||
| 	s.closedStoreMu.Lock() | ||||
| 	defer s.closedStoreMu.Unlock() | ||||
|  | ||||
| 	s.hook = hook | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // cleanup is a helper function to cleanup the store and container. | ||||
| // To avoid double closing the store, it checks if the store is already closed. | ||||
| func (s *StorageTestSuite[T, D, C]) cleanup() error { | ||||
| 	t := s.T() | ||||
| 	t.Log("🧹 Cleaning up store and container") | ||||
|  | ||||
| 	var err error | ||||
|  | ||||
| 	if s.store != nil { | ||||
| 		s.closedStoreMu.Lock() | ||||
| 		defer s.closedStoreMu.Unlock() | ||||
|  | ||||
| 		if !s.closedStore { | ||||
| 			err = s.store.Close() | ||||
| 			s.closedStore = true | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// cleanup container already handle nil checks | ||||
| 	testcontainers.CleanupContainer(t, s.ctr) | ||||
|  | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // ---------------------------------------------------------------------------- | ||||
| // Hooks | ||||
| // ---------------------------------------------------------------------------- | ||||
|  | ||||
| // HandleStats is a hook that is called when the suite statistics are updated. | ||||
| // It is used to store the statistics for later use. | ||||
| func (s *StorageTestSuite[T, D, C]) HandleStats(_ string, stats *suite.SuiteInformation) { | ||||
| 	s.stats = stats | ||||
| } | ||||
|  | ||||
| // SetupSuite is a hook that is called when the suite is setup. | ||||
| // It is used to create the store and container, only if the creation hook is [PerSuite]. | ||||
| func (s *StorageTestSuite[T, D, C]) SetupSuite() { | ||||
| 	if s.hook == perSuite { | ||||
| 		t := s.T() | ||||
|  | ||||
| 		ctr, err := s.createContainerFn(s.ctx, t) | ||||
| 		s.Require().NoError(err) | ||||
| 		s.ctr = ctr | ||||
|  | ||||
| 		store, err := s.createStoreFn(s.ctx, t, ctr) | ||||
| 		s.Require().NoError(err) | ||||
| 		s.store = store | ||||
| 		s.closedStore = false | ||||
|  | ||||
| 		err = s.store.Reset() | ||||
| 		s.Require().NoError(err) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // TearDownSuite is a hook that is called when the suite is torn down. | ||||
| // It is used to cleanup the store and container, only if the creation hook is [PerSuite]. | ||||
| func (s *StorageTestSuite[T, D, C]) TearDownSuite() { | ||||
| 	if s.hook == perSuite { | ||||
| 		s.Require().NoError(s.cleanup()) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // SetupTest is a hook that is called when the test is setup. | ||||
| // It is used to create the store and container, only if the creation hook is [PerTest]. | ||||
| func (s *StorageTestSuite[T, D, C]) SetupTest() { | ||||
| 	t := s.T() | ||||
|  | ||||
| 	switch s.hook { | ||||
| 	case perTest: | ||||
| 		ctr, err := s.createContainerFn(s.ctx, t) | ||||
| 		s.Require().NoError(err) | ||||
| 		s.ctr = ctr | ||||
| 	case perSuite: | ||||
| 		// do nothing | ||||
| 	default: | ||||
| 		s.T().Fatalf("invalid hook: %d", s.hook) | ||||
| 	} | ||||
|  | ||||
| 	// update the store with the container from the suite | ||||
| 	// This prevents the error caused by closing the store | ||||
| 	// in a test and using it in a different test of the | ||||
| 	// same suite when the hook is [PerSuite]. | ||||
| 	store, err := s.createStoreFn(s.ctx, t, s.ctr) | ||||
| 	s.Require().NoError(err) | ||||
|  | ||||
| 	s.store = store | ||||
| 	s.closedStore = false | ||||
|  | ||||
| 	// Reset the store to ensure it's in a clean state | ||||
| 	err = s.store.Reset() | ||||
| 	s.Require().NoError(err) | ||||
| } | ||||
|  | ||||
| // TearDownTest is a hook that is called when the test is torn down. | ||||
| // It is used to cleanup the store and container, only if the creation hook is [PerTest]. | ||||
| func (s *StorageTestSuite[T, D, C]) TearDownTest() { | ||||
| 	if s.hook == perTest { | ||||
| 		s.Require().NoError(s.cleanup()) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ---------------------------------------------------------------------------- | ||||
| // Tests | ||||
| // ---------------------------------------------------------------------------- | ||||
|  | ||||
| func (s *StorageTestSuite[T, D, C]) TestConn() { | ||||
| 	storeWithConn, ok := s.store.(storage.StorageWithConn[D]) | ||||
| 	if !ok { | ||||
| 		s.T().Skip("Storage does not implement StorageWithConn") | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	conn := storeWithConn.Conn() | ||||
| 	s.Require().NotNil(conn, "Conn should not be nil") | ||||
| } | ||||
|  | ||||
| func (s *StorageTestSuite[T, D, C]) TestSet() { | ||||
| 	s.setValue("test_key", []byte("test_value")) | ||||
| } | ||||
|  | ||||
| func (s *StorageTestSuite[T, D, C]) TestSetWithContext() { | ||||
| 	ctx, cancel := context.WithCancel(context.Background()) | ||||
| 	cancel() | ||||
|  | ||||
| 	err := s.store.SetWithContext(ctx, "test_key", []byte("test_value"), 0) | ||||
| 	s.Require().ErrorIs(err, context.Canceled) | ||||
| } | ||||
|  | ||||
| func (s *StorageTestSuite[T, D, C]) TestSetAndOverride() { | ||||
| 	s.setValue("test_key", []byte("test_value")) | ||||
| 	s.setValue("test_key", []byte("test_value_2")) | ||||
|  | ||||
| 	s.requireKeyHasValue("test_key", []byte("test_value_2")) | ||||
| } | ||||
|  | ||||
| func (s *StorageTestSuite[T, D, C]) TestSetAndGet() { | ||||
| 	s.setValue("test_key", []byte("test_value")) | ||||
| 	s.requireKeyHasValue("test_key", []byte("test_value")) | ||||
| } | ||||
|  | ||||
| func (s *StorageTestSuite[T, D, C]) TestGetWithContext() { | ||||
| 	s.setValue("test_key", []byte("test_value")) | ||||
|  | ||||
| 	ctx, cancel := context.WithCancel(context.Background()) | ||||
| 	cancel() | ||||
|  | ||||
| 	result, err := s.store.GetWithContext(ctx, "test_key") | ||||
| 	s.Require().ErrorIs(err, context.Canceled) | ||||
| 	s.Require().Zero(len(result)) | ||||
| } | ||||
|  | ||||
| func (s *StorageTestSuite[T, D, C]) TestGetMissing() { | ||||
| 	val, err := s.store.Get("non-existent-key") | ||||
| 	s.Require().NoError(err) | ||||
| 	s.Require().Zero(len(val)) | ||||
| } | ||||
|  | ||||
| func (s *StorageTestSuite[T, D, C]) TestGetExpired() { | ||||
| 	s.setValueWithTTL("temp_key", []byte("temp_value"), 500*time.Millisecond) | ||||
|  | ||||
| 	s.Eventually(func() bool { | ||||
| 		s.requireKeyNotExists("temp_key") | ||||
| 		return true | ||||
| 	}, 2*time.Second, 1*time.Second, "Key should expire") | ||||
| } | ||||
|  | ||||
| func (s *StorageTestSuite[T, D, C]) TestDelete() { | ||||
| 	s.setValue("delete_me", []byte("delete_value")) | ||||
|  | ||||
| 	err := s.store.Delete("delete_me") | ||||
| 	s.Require().NoError(err) | ||||
|  | ||||
| 	s.requireKeyNotExists("delete_me") | ||||
| } | ||||
|  | ||||
| func (s *StorageTestSuite[T, D, C]) TestDeleteWithContext() { | ||||
| 	s.setValue("delete_me", []byte("delete_value")) | ||||
|  | ||||
| 	ctx, cancel := context.WithCancel(context.Background()) | ||||
| 	cancel() | ||||
|  | ||||
| 	err := s.store.DeleteWithContext(ctx, "delete_me") | ||||
| 	s.Require().ErrorIs(err, context.Canceled) | ||||
|  | ||||
| 	result, err := s.store.Get("delete_me") | ||||
| 	s.Require().NoError(err) | ||||
| 	s.Require().Equal([]byte("delete_value"), result) | ||||
| } | ||||
|  | ||||
| func (s *StorageTestSuite[T, D, C]) TestReset() { | ||||
| 	s.setValue("key1", []byte("value1")) | ||||
| 	s.setValue("key2", []byte("value2")) | ||||
|  | ||||
| 	s.requireKeyHasValue("key1", []byte("value1")) | ||||
| 	s.requireKeyHasValue("key2", []byte("value2")) | ||||
|  | ||||
| 	err := s.store.Reset() | ||||
| 	s.Require().NoError(err) | ||||
|  | ||||
| 	s.requireKeyNotExists("key1") | ||||
| 	s.requireKeyNotExists("key2") | ||||
| } | ||||
|  | ||||
| func (s *StorageTestSuite[T, D, C]) TestResetWithContext() { | ||||
| 	s.setValue("key1", []byte("value1")) | ||||
| 	s.setValue("key2", []byte("value2")) | ||||
|  | ||||
| 	s.requireKeyHasValue("key1", []byte("value1")) | ||||
| 	s.requireKeyHasValue("key2", []byte("value2")) | ||||
|  | ||||
| 	ctx, cancel := context.WithCancel(context.Background()) | ||||
| 	cancel() | ||||
|  | ||||
| 	err := s.store.ResetWithContext(ctx) | ||||
| 	s.Require().ErrorIs(err, context.Canceled) | ||||
|  | ||||
| 	s.requireKeyHasValue("key1", []byte("value1")) | ||||
| 	s.requireKeyHasValue("key2", []byte("value2")) | ||||
| } | ||||
|  | ||||
| func (s *StorageTestSuite[T, D, C]) TestClose() { | ||||
| 	err := s.store.Close() | ||||
| 	s.Require().NoError(err) | ||||
|  | ||||
| 	s.closedStoreMu.Lock() | ||||
| 	defer s.closedStoreMu.Unlock() | ||||
|  | ||||
| 	s.closedStore = true | ||||
| } | ||||
|  | ||||
| // ---------------------------------------------------------------------------- | ||||
| // Helpers | ||||
| // ---------------------------------------------------------------------------- | ||||
|  | ||||
| func (s *StorageTestSuite[T, D, C]) setValue(key string, value []byte) { | ||||
| 	s.setValueWithTTL(key, value, 0) | ||||
| } | ||||
|  | ||||
| func (s *StorageTestSuite[T, D, C]) setValueWithTTL(key string, value []byte, ttl time.Duration) { | ||||
| 	err := s.store.Set(key, value, ttl) | ||||
| 	s.Require().NoError(err) | ||||
| } | ||||
|  | ||||
| func (s *StorageTestSuite[T, D, C]) getValue(key string) []byte { | ||||
| 	val, err := s.store.Get(key) | ||||
| 	s.Require().NoError(err) | ||||
| 	return val | ||||
| } | ||||
|  | ||||
| func (s *StorageTestSuite[T, D, C]) requireKeyHasValue(key string, expectedValue []byte) { | ||||
| 	val := s.getValue(key) | ||||
| 	s.Require().Equal(expectedValue, val) | ||||
| } | ||||
|  | ||||
| func (s *StorageTestSuite[T, D, C]) requireKeyNotExists(key string) { | ||||
| 	val := s.getValue(key) | ||||
| 	s.Require().Nil(val) | ||||
| } | ||||
							
								
								
									
										167
									
								
								testhelpers/tck/suite_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										167
									
								
								testhelpers/tck/suite_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,167 @@ | ||||
| package tck | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"sync" | ||||
| 	"testing" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/stretchr/testify/require" | ||||
| 	"github.com/stretchr/testify/suite" | ||||
| 	testcontainers "github.com/testcontainers/testcontainers-go" | ||||
| ) | ||||
|  | ||||
| type mockErrorSuite struct{} | ||||
|  | ||||
| func (s *mockErrorSuite) NewStore() func(ctx context.Context, tb testing.TB, ctr testcontainers.Container) (*mockStorage, error) { | ||||
| 	return func(ctx context.Context, tb testing.TB, ctr testcontainers.Container) (*mockStorage, error) { | ||||
| 		storage := &mockStorage{ | ||||
| 			Map: &sync.Map{}, | ||||
| 		} | ||||
|  | ||||
| 		return storage, nil | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (s *mockErrorSuite) NewContainer() func(ctx context.Context, tb testing.TB) (testcontainers.Container, error) { | ||||
| 	return func(ctx context.Context, tb testing.TB) (testcontainers.Container, error) { | ||||
| 		return nil, nil | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestNew(t *testing.T) { | ||||
| 	t.Run("per-test/setup-suite", func(t *testing.T) { | ||||
| 		s, err := New[*mockStorage, any](context.Background(), t, &mockErrorSuite{}, PerTest()) | ||||
| 		require.NoError(t, err) | ||||
|  | ||||
| 		s.SetupSuite() | ||||
|  | ||||
| 		s.Require().Nil(s.store) | ||||
| 	}) | ||||
|  | ||||
| 	t.Run("per-suite/setup-test", func(t *testing.T) { | ||||
| 		s, err := New[*mockStorage, any](context.Background(), t, &mockErrorSuite{}, PerSuite()) | ||||
| 		require.NoError(t, err) | ||||
|  | ||||
| 		s.SetupTest() | ||||
|  | ||||
| 		s.Require().NotNil(s.store) | ||||
| 	}) | ||||
|  | ||||
| 	t.Run("cleanup/non-closed-store", func(t *testing.T) { | ||||
| 		s, err := New[*mockStorage, any](context.Background(), t, &mockErrorSuite{}, PerTest()) | ||||
| 		require.NoError(t, err) | ||||
|  | ||||
| 		s.SetupSuite() | ||||
| 		s.SetupTest() | ||||
|  | ||||
| 		s.closedStore = false | ||||
|  | ||||
| 		s.Require().NoError(s.cleanup()) | ||||
|  | ||||
| 		mockStorage := s.store.(*mockStorage) | ||||
| 		s.Require().Nil(mockStorage.Map) | ||||
| 	}) | ||||
|  | ||||
| 	t.Run("tck-is-nil", func(t *testing.T) { | ||||
| 		s, err := New[*mockStorage, any, testcontainers.Container](context.Background(), t, nil, PerTest()) | ||||
| 		require.Error(t, err) | ||||
| 		require.Nil(t, s) | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| type mockStorage struct { | ||||
| 	*sync.Map | ||||
| } | ||||
|  | ||||
| // implement the storage interface | ||||
| func (s *mockStorage) Set(key string, value []byte, ttl time.Duration) error { | ||||
| 	s.Store(key, string(value)) | ||||
|  | ||||
| 	// in a goroutine, remove the key after ttl | ||||
| 	if ttl > 0 { | ||||
| 		go func() { | ||||
| 			time.Sleep(ttl) | ||||
| 			//nolint:errcheck | ||||
| 			_ = s.Delete(key) | ||||
| 		}() | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (s *mockStorage) Get(key string) ([]byte, error) { | ||||
| 	val, ok := s.Load(key) | ||||
|  | ||||
| 	if !ok { | ||||
| 		// key expired or does not exist | ||||
| 		return nil, nil | ||||
| 	} | ||||
|  | ||||
| 	return []byte(val.(string)), nil | ||||
| } | ||||
|  | ||||
| func (s *mockStorage) Delete(key string) error { | ||||
| 	s.Map.Delete(key) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (s *mockStorage) Reset() error { | ||||
| 	s.Map = &sync.Map{} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (s *mockStorage) Close() error { | ||||
| 	s.Map = nil | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (s *mockStorage) Conn() any { | ||||
| 	return "mock conn" | ||||
| } | ||||
|  | ||||
| func (s *mockStorage) SetWithContext(ctx context.Context, key string, value []byte, ttl time.Duration) error { | ||||
| 	if ctx.Err() != nil { | ||||
| 		return ctx.Err() | ||||
| 	} | ||||
|  | ||||
| 	return s.Set(key, value, ttl) | ||||
| } | ||||
|  | ||||
| func (s *mockStorage) GetWithContext(ctx context.Context, key string) ([]byte, error) { | ||||
| 	if ctx.Err() != nil { | ||||
| 		return nil, ctx.Err() | ||||
| 	} | ||||
|  | ||||
| 	return s.Get(key) | ||||
| } | ||||
|  | ||||
| func (s *mockStorage) DeleteWithContext(ctx context.Context, key string) error { | ||||
| 	if ctx.Err() != nil { | ||||
| 		return ctx.Err() | ||||
| 	} | ||||
|  | ||||
| 	return s.Delete(key) | ||||
| } | ||||
|  | ||||
| func (s *mockStorage) ResetWithContext(ctx context.Context) error { | ||||
| 	if ctx.Err() != nil { | ||||
| 		return ctx.Err() | ||||
| 	} | ||||
|  | ||||
| 	return s.Reset() | ||||
| } | ||||
|  | ||||
| func TestRunPerTest(t *testing.T) { | ||||
| 	s, err := New[*mockStorage, any](context.Background(), t, &mockErrorSuite{}, PerTest()) | ||||
| 	require.NoError(t, err) | ||||
|  | ||||
| 	suite.Run(t, s) | ||||
| } | ||||
|  | ||||
| func TestRunPerSuite(t *testing.T) { | ||||
| 	s, err := New[*mockStorage, any](context.Background(), t, &mockErrorSuite{}, PerSuite()) | ||||
| 	require.NoError(t, err) | ||||
|  | ||||
| 	suite.Run(t, s) | ||||
| } | ||||
| @@ -5,7 +5,7 @@ go 1.23.0 | ||||
| require ( | ||||
| 	github.com/gofiber/storage/testhelpers/redis v0.0.0-20250822074218-ba2347199921 | ||||
| 	github.com/stretchr/testify v1.10.0 | ||||
| 	github.com/valkey-io/valkey-go v1.0.64 | ||||
| 	github.com/valkey-io/valkey-go v1.0.67 | ||||
| ) | ||||
|  | ||||
| require ( | ||||
|   | ||||
| @@ -123,8 +123,8 @@ github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFA | ||||
| github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= | ||||
| github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= | ||||
| github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= | ||||
| github.com/valkey-io/valkey-go v1.0.64 h1:3u4+b6D6zs9JQs254TLy4LqitCMHHr9XorP9GGk7XY4= | ||||
| github.com/valkey-io/valkey-go v1.0.64/go.mod h1:bHmwjIEOrGq/ubOJfh5uMRs7Xj6mV3mQ/ZXUbmqpjqY= | ||||
| github.com/valkey-io/valkey-go v1.0.67 h1:QPaRcuBmazhyoWTxk7I2XcSALhoL7UhAReR5o/rh1Po= | ||||
| github.com/valkey-io/valkey-go v1.0.67/go.mod h1:bHmwjIEOrGq/ubOJfh5uMRs7Xj6mV3mQ/ZXUbmqpjqY= | ||||
| github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||
| github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||
| github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= | ||||
|   | ||||
		Reference in New Issue
	
	Block a user