Repository navigation
Expand file tree
/
Copy pathurl_test.go
More file actions
140 lines (125 loc) · 3.68 KB
/
Copy pathurl_test.go
File metadata and controls
140 lines (125 loc) · 3.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package lcw
import (
"fmt"
"net/url"
"strconv"
"testing"
"time"
"github.com/redis/go-redis/v9"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestUrl_optionsFromQuery(t *testing.T) {
tbl := []struct {
url string
num int
fail bool
}{
{"mem://lru?ttl=26s&max_keys=100&max_val_size=1024&max_key_size=64&max_cache_size=111", 5, false},
{"mem://lru?ttl=26s&max_keys=100&foo=bar", 2, false},
{"mem://lru?ttl=xx26s&max_keys=100&foo=bar", 0, true},
{"mem://lru?foo=bar", 0, false},
{"mem://lru?foo=bar&max_keys=abcd", 0, true},
{"mem://lru?foo=bar&max_val_size=abcd", 0, true},
{"mem://lru?foo=bar&max_cache_size=abcd", 0, true},
{"mem://lru?foo=bar&max_key_size=abcd", 0, true},
}
for i, tt := range tbl {
tt := tt
t.Run(strconv.Itoa(i), func(t *testing.T) {
u, err := url.Parse(tt.url)
require.NoError(t, err)
r, err := optionsFromQuery(u.Query())
if tt.fail {
require.Error(t, err)
return
}
assert.Equal(t, tt.num, len(r))
})
}
}
func TestUrl_redisOptionsFromURL(t *testing.T) {
tbl := []struct {
url string
fail bool
opts redis.Options
}{
{"redis://127.0.0.1:12345?db=xa19", true, redis.Options{}},
{"redis://127.0.0.1:12345?foo=bar&max_keys=abcd&db=19", false, redis.Options{Addr: "127.0.0.1:12345", DB: 19}},
{
"redis://127.0.0.1:12345?db=19&password=xyz&network=tcp4&dial_timeout=1s&read_timeout=2s&write_timeout=3m",
false, redis.Options{Addr: "127.0.0.1:12345", DB: 19, Password: "xyz", Network: "tcp4",
DialTimeout: 1 * time.Second, ReadTimeout: 2 * time.Second, WriteTimeout: 3 * time.Minute},
},
}
for i, tt := range tbl {
tt := tt
t.Run(strconv.Itoa(i), func(t *testing.T) {
u, err := url.Parse(tt.url)
require.NoError(t, err)
r, err := redisOptionsFromURL(u)
if tt.fail {
require.Error(t, err)
return
}
require.NoError(t, err)
assert.Equal(t, tt.opts, *r)
})
}
}
func TestUrl_NewLru(t *testing.T) {
u := "mem://lru?max_keys=10"
res, err := New(u)
require.NoError(t, err)
r, ok := res.(*LruCache)
require.True(t, ok)
assert.Equal(t, 10, r.maxKeys)
}
func TestUrl_NewExpirable(t *testing.T) {
u := "mem://expirable?max_keys=10&ttl=30m"
res, err := New(u)
require.NoError(t, err)
defer res.Close()
r, ok := res.(*ExpirableCache)
require.True(t, ok)
assert.Equal(t, 10, r.maxKeys)
assert.Equal(t, 30*time.Minute, r.ttl)
}
func TestUrl_NewNop(t *testing.T) {
u := "nop://"
res, err := New(u)
require.NoError(t, err)
_, ok := res.(*Nop)
require.True(t, ok)
}
func TestUrl_NewRedis(t *testing.T) {
srv := newTestRedisServer()
defer srv.Close()
u := fmt.Sprintf("redis://%s?db=1&ttl=10s", srv.Addr())
res, err := New(u)
require.NoError(t, err)
defer res.Close()
r, ok := res.(*RedisCache)
require.True(t, ok)
assert.Equal(t, 10*time.Second, r.ttl)
u = fmt.Sprintf("redis://%s?db=1&ttl=zz10s", srv.Addr())
_, err = New(u)
require.Error(t, err)
assert.Contains(t, err.Error(), "ttl query param zz10s: time: invalid duration")
_, err = New("redis://localhost:xxx?db=1")
require.Error(t, err)
assert.Contains(t, err.Error(), "parse cache uri redis://localhost:xxx?db=1: parse")
assert.Contains(t, err.Error(), "redis://localhost:xxx?db=1")
assert.Contains(t, err.Error(), "invalid port \":xxx\" after host")
}
func TestUrl_NewFailed(t *testing.T) {
u := "blah://ip?foo=bar"
_, err := New(u)
require.EqualError(t, err, "unsupported cache type blah")
u = "mem://blah?foo=bar"
_, err = New(u)
require.EqualError(t, err, "unsupported mem cache type blah")
u = "mem://lru?max_keys=xyz"
_, err = New(u)
require.EqualError(t, err, "parse uri options mem://lru?max_keys=xyz: max_keys query param xyz: strconv.Atoi: parsing \"xyz\": invalid syntax")
}