Skip to content

Commit f267bb2

Browse files
committed
test: add v3 serializer related test case
1 parent 42c7168 commit f267bb2

File tree

4 files changed

+146
-6
lines changed

4 files changed

+146
-6
lines changed

api_v2.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ Method
3535
append this prefix path string to key operation url `'/v2/keys'`.
3636
- `timeout`: int
3737
request timeout seconds.
38-
- `serializer`: string - serializer type, default `json`, also support `raw` to keep origin string value.
38+
- `serializer`: string - serializer type, default `json`, also support `raw` to keep origin string value.
3939
- `ssl_verify`: boolean - whether to verify the etcd certificate when originating TLS connection with etcd (if you want to communicate to etcd with TLS connection, use `https` scheme in your `http_host`), default is `true`.
4040

4141
The client methods returns either a `HTTP Response Entity` or an `error string`.

api_v3.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ Method
4040
- `api_prefix`: string
4141
to suit [etcd v3 api gateway](https://github.com/etcd-io/etcd/blob/master/Documentation/dev-guide/api_grpc_gateway.md#notes).
4242
it will autofill by fetching etcd version if this option empty.
43-
- `ssl_verify`: boolean - whether to verify the etcd certificate when originating TLS connection with etcd (if you want to communicate to etcd with TLS connection, use `https` scheme in your `http_host`), default is `true.
43+
- `ssl_verify`: boolean - whether to verify the etcd certificate when originating TLS connection with etcd (if you want to communicate to etcd with TLS connection, use `https` scheme in your `http_host`), default is `true`.
44+
- `serializer`: string - serializer type, default `json`, also support `raw` to keep origin string value.
4445

4546
The client method returns either a `etcd` object or an `error string`.
4647

lib/resty/etcd/v3.lua

+5-4
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,7 @@ local function get(self, key, attr)
439439
if res.body.kvs and tab_nkeys(res.body.kvs) > 0 then
440440
for _, kv in ipairs(res.body.kvs) do
441441
kv.key = decode_base64(kv.key)
442-
kv.value = decode_base64(kv.value)
442+
kv.value = decode_base64(kv.value or "")
443443
kv.value = self.serializer.deserialize(kv.value)
444444
end
445445
end
@@ -596,12 +596,12 @@ local function request_chunk(self, method, scheme, host, port, path, opts, timeo
596596
if body.result.events then
597597
for _, event in ipairs(body.result.events) do
598598
if event.kv.value then -- DELETE not have value
599-
event.kv.value = decode_base64(event.kv.value)
599+
event.kv.value = decode_base64(event.kv.value or "")
600600
event.kv.value = self.serializer.deserialize(event.kv.value)
601601
end
602602
event.kv.key = decode_base64(event.kv.key)
603603
if event.prev_kv then
604-
event.prev_kv.value = decode_base64(event.prev_kv.value)
604+
event.prev_kv.value = decode_base64(event.prev_kv.value or "")
605605
event.prev_kv.value = self.serializer.deserialize(event.prev_kv.value)
606606
event.prev_kv.key = decode_base64(event.prev_kv.key)
607607
end
@@ -898,7 +898,8 @@ function _M.txn(self, compare, success, failure, opts)
898898
if rule.requestPut then
899899
local requestPut = tab_clone(rule.requestPut)
900900
requestPut.key = encode_base64(utils.get_real_key(self.key_prefix, requestPut.key))
901-
requestPut.value, err = serialize_and_encode_base64(self.serializer.serialize, requestPut.value)
901+
requestPut.value, err = serialize_and_encode_base64(self.serializer.serialize,
902+
requestPut.value)
902903
if not requestPut.value then
903904
return nil, "failed to encode value: " .. err
904905
end

t/v3/serializer.t

+138
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
use Test::Nginx::Socket::Lua 'no_plan';
2+
3+
log_level('warn');
4+
no_long_string();
5+
repeat_each(2);
6+
7+
our $HttpConfig = <<'_EOC_';
8+
lua_socket_log_errors off;
9+
lua_package_path 'lib/?.lua;/usr/local/share/lua/5.3/?.lua;/usr/share/lua/5.1/?.lua;;';
10+
init_by_lua_block {
11+
local cjson = require("cjson.safe")
12+
13+
function check_res(data, err, val, status)
14+
if err then
15+
ngx.say("err: ", err)
16+
end
17+
18+
if val then
19+
if data and data.body.kvs==nil then
20+
ngx.exit(404)
21+
end
22+
if data and data.body.kvs and val ~= data.body.kvs[1].value then
23+
ngx.say("failed to check value")
24+
ngx.log(ngx.ERR, "failed to check value, got: ", data.body.kvs[1].value,
25+
", expect: ", val)
26+
else
27+
ngx.say("checked val as expect: ", val)
28+
end
29+
end
30+
31+
if status and status ~= data.status then
32+
ngx.exit(data.status)
33+
end
34+
end
35+
}
36+
_EOC_
37+
38+
run_tests();
39+
40+
__DATA__
41+
42+
=== TEST 1: raw string serializer
43+
--- http_config eval: $::HttpConfig
44+
--- config
45+
location /t {
46+
content_by_lua_block {
47+
local cjson = require("cjson.safe")
48+
49+
local etcd, err = require("resty.etcd").new({
50+
protocol = "v3",
51+
serializer = "raw"
52+
})
53+
check_res(etcd, err)
54+
55+
local res
56+
res, err = etcd:set("/dir/v3/a", 111)
57+
check_res(res, err)
58+
59+
res, err = etcd:set("/dir/v3/b", '"foo"')
60+
check_res(res, err)
61+
62+
res, err = etcd:get("/dir/v3/b")
63+
check_res(res, err, '"foo"')
64+
65+
local s = cjson.encode({a = 1})
66+
res, err = etcd:setx("/dir/v3/c", s)
67+
check_res(res, err, nil, 200)
68+
69+
res, err = etcd:get("/dir/v3/c")
70+
check_res(res, err, s, 200)
71+
72+
res, err = etcd:setnx("/dir/v3/d", "")
73+
check_res(res, err, nil, 200)
74+
75+
res, err = etcd:get("/dir/v3/d")
76+
check_res(res, err, "", 200)
77+
}
78+
}
79+
--- request
80+
GET /t
81+
--- no_error_log
82+
[error]
83+
--- response_body
84+
err: unsupported type for number
85+
checked val as expect: "foo"
86+
checked val as expect: {"a":1}
87+
checked val as expect:
88+
89+
90+
=== TEST 2: json serializer
91+
--- http_config eval: $::HttpConfig
92+
--- config
93+
location /t {
94+
content_by_lua_block {
95+
local cjson = require("cjson.safe")
96+
97+
local etcd, err = require("resty.etcd").new({
98+
protocol = "v3",
99+
serializer = "json"
100+
})
101+
check_res(etcd, err)
102+
103+
local res
104+
res, err = etcd:set("/dir/v3/a", 111)
105+
check_res(res, err)
106+
107+
res, err = etcd:get("/dir/v3/a")
108+
check_res(res, err, 111)
109+
110+
res, err = etcd:set("/dir/v3/b", '"foo"')
111+
check_res(res, err)
112+
113+
res, err = etcd:get("/dir/v3/b")
114+
check_res(res, err, '"foo"')
115+
116+
local s = cjson.encode({a = 1})
117+
res, err = etcd:setx("/dir/v3/c", s)
118+
check_res(res, err, nil, 200)
119+
120+
res, err = etcd:get("/dir/v3/c")
121+
check_res(res, err, s, 200)
122+
123+
res, err = etcd:setnx("/dir/v3/d", "")
124+
check_res(res, err, nil, 200)
125+
126+
res, err = etcd:get("/dir/v3/d")
127+
check_res(res, err, "", 200)
128+
}
129+
}
130+
--- request
131+
GET /t
132+
--- error_log
133+
failed to check value, got: nil, expect:
134+
--- response_body
135+
checked val as expect: 111
136+
checked val as expect: "foo"
137+
checked val as expect: {"a":1}
138+
failed to check value

0 commit comments

Comments
 (0)