|
26 | 26 | #include <fluent-bit/flb_sds.h> |
27 | 27 | #include <fluent-bit/flb_sds_list.h> |
28 | 28 | #include <fluent-bit/flb_record_accessor.h> |
| 29 | +#include <fluent-bit/flb_ra_key.h> |
29 | 30 | #include <fluent-bit/record_accessor/flb_ra_parser.h> |
30 | 31 | #include <msgpack.h> |
31 | 32 |
|
@@ -2213,6 +2214,179 @@ void cb_nested_failure_recovery() |
2213 | 2214 | flb_free(out_buf); |
2214 | 2215 | } |
2215 | 2216 |
|
| 2217 | +/* --- binary/reference record accessor tests --- */ |
| 2218 | + |
| 2219 | +static const unsigned char BIN_DATA[4] = {0x01, 0x02, 0x03, 0x04}; |
| 2220 | + |
| 2221 | +static void build_ra_map(msgpack_sbuffer *sbuf, const char **bin_ptr) |
| 2222 | +{ |
| 2223 | + msgpack_packer pck; |
| 2224 | + |
| 2225 | + msgpack_sbuffer_init(sbuf); |
| 2226 | + msgpack_packer_init(&pck, sbuf, msgpack_sbuffer_write); |
| 2227 | + |
| 2228 | + /* map {"bin": <bin>, "str": "abc"} */ |
| 2229 | + msgpack_pack_map(&pck, 2); |
| 2230 | + |
| 2231 | + msgpack_pack_str(&pck, 3); |
| 2232 | + msgpack_pack_str_body(&pck, "bin", 3); |
| 2233 | + msgpack_pack_bin(&pck, sizeof(BIN_DATA)); |
| 2234 | + msgpack_pack_bin_body(&pck, BIN_DATA, sizeof(BIN_DATA)); |
| 2235 | + |
| 2236 | + msgpack_pack_str(&pck, 3); |
| 2237 | + msgpack_pack_str_body(&pck, "str", 3); |
| 2238 | + msgpack_pack_str(&pck, 3); |
| 2239 | + msgpack_pack_str_body(&pck, "abc", 3); |
| 2240 | + |
| 2241 | + if (bin_ptr) { |
| 2242 | + *bin_ptr = NULL; |
| 2243 | + for (size_t i = 0; i + sizeof(BIN_DATA) <= sbuf->size; i++) { |
| 2244 | + if (memcmp(sbuf->data + i, BIN_DATA, sizeof(BIN_DATA)) == 0) { |
| 2245 | + *bin_ptr = sbuf->data + i; |
| 2246 | + break; |
| 2247 | + } |
| 2248 | + } |
| 2249 | + } |
| 2250 | +} |
| 2251 | + |
| 2252 | +static void destroy_sbuf(msgpack_sbuffer *sbuf) |
| 2253 | +{ |
| 2254 | + msgpack_sbuffer_destroy(sbuf); |
| 2255 | +} |
| 2256 | + |
| 2257 | +static void cb_ra_binary_copy() |
| 2258 | +{ |
| 2259 | + msgpack_sbuffer sbuf; |
| 2260 | + const char *dummy; |
| 2261 | + msgpack_unpacked result; |
| 2262 | + msgpack_object map; |
| 2263 | + struct flb_record_accessor *ra; |
| 2264 | + struct flb_ra_value *val; |
| 2265 | + size_t off = 0, len; |
| 2266 | + const char *buf; |
| 2267 | + |
| 2268 | + build_ra_map(&sbuf, &dummy); |
| 2269 | + |
| 2270 | + msgpack_unpacked_init(&result); |
| 2271 | + TEST_CHECK(msgpack_unpack_next(&result, sbuf.data, sbuf.size, &off) == MSGPACK_UNPACK_SUCCESS); |
| 2272 | + map = result.data; |
| 2273 | + |
| 2274 | + ra = flb_ra_create("bin", FLB_TRUE); |
| 2275 | + TEST_CHECK(ra != NULL); |
| 2276 | + val = flb_ra_get_value_object(ra, map); |
| 2277 | + TEST_CHECK(val != NULL && val->type == FLB_RA_BINARY && val->storage == FLB_RA_COPY); |
| 2278 | + buf = flb_ra_value_buffer(val, &len); |
| 2279 | + TEST_CHECK(len == sizeof(BIN_DATA)); |
| 2280 | + TEST_CHECK(memcmp(buf, BIN_DATA, sizeof(BIN_DATA)) == 0); |
| 2281 | + |
| 2282 | + flb_ra_key_value_destroy(val); |
| 2283 | + flb_ra_destroy(ra); |
| 2284 | + msgpack_unpacked_destroy(&result); |
| 2285 | + destroy_sbuf(&sbuf); |
| 2286 | +} |
| 2287 | + |
| 2288 | +static void cb_ra_binary_ref() |
| 2289 | +{ |
| 2290 | + msgpack_sbuffer sbuf; |
| 2291 | + const char *bin_in_map; |
| 2292 | + msgpack_unpacked result; |
| 2293 | + msgpack_object map; |
| 2294 | + struct flb_record_accessor *ra; |
| 2295 | + struct flb_ra_value *val; |
| 2296 | + size_t off = 0, len; |
| 2297 | + const char *buf; |
| 2298 | + |
| 2299 | + build_ra_map(&sbuf, &bin_in_map); |
| 2300 | + |
| 2301 | + msgpack_unpacked_init(&result); |
| 2302 | + TEST_CHECK(msgpack_unpack_next(&result, sbuf.data, sbuf.size, &off) == MSGPACK_UNPACK_SUCCESS); |
| 2303 | + map = result.data; |
| 2304 | + |
| 2305 | + ra = flb_ra_create("bin", FLB_TRUE); |
| 2306 | + TEST_CHECK(ra != NULL); |
| 2307 | + val = flb_ra_get_value_object_ref(ra, map); |
| 2308 | + TEST_CHECK(val != NULL && val->type == FLB_RA_BINARY && val->storage == FLB_RA_REF); |
| 2309 | + buf = flb_ra_value_buffer(val, &len); |
| 2310 | + TEST_CHECK(len == sizeof(BIN_DATA)); |
| 2311 | + TEST_CHECK(memcmp(buf, BIN_DATA, sizeof(BIN_DATA)) == 0); |
| 2312 | + TEST_CHECK(buf == bin_in_map); |
| 2313 | + |
| 2314 | + flb_ra_key_value_destroy(val); |
| 2315 | + flb_ra_destroy(ra); |
| 2316 | + msgpack_unpacked_destroy(&result); |
| 2317 | + destroy_sbuf(&sbuf); |
| 2318 | +} |
| 2319 | + |
| 2320 | +static void cb_ra_string_copy() |
| 2321 | +{ |
| 2322 | + msgpack_sbuffer sbuf; |
| 2323 | + const char *dummy; |
| 2324 | + msgpack_unpacked result; |
| 2325 | + msgpack_object map; |
| 2326 | + struct flb_record_accessor *ra; |
| 2327 | + struct flb_ra_value *val; |
| 2328 | + size_t off = 0, len; |
| 2329 | + const char *buf; |
| 2330 | + |
| 2331 | + build_ra_map(&sbuf, &dummy); |
| 2332 | + |
| 2333 | + msgpack_unpacked_init(&result); |
| 2334 | + TEST_CHECK(msgpack_unpack_next(&result, sbuf.data, sbuf.size, &off) == MSGPACK_UNPACK_SUCCESS); |
| 2335 | + map = result.data; |
| 2336 | + |
| 2337 | + ra = flb_ra_create("str", FLB_TRUE); |
| 2338 | + TEST_CHECK(ra != NULL); |
| 2339 | + val = flb_ra_get_value_object(ra, map); |
| 2340 | + TEST_CHECK(val != NULL && val->type == FLB_RA_STRING && val->storage == FLB_RA_COPY); |
| 2341 | + buf = flb_ra_value_buffer(val, &len); |
| 2342 | + TEST_CHECK(len == 3 && strncmp(buf, "abc", 3) == 0); |
| 2343 | + |
| 2344 | + flb_ra_key_value_destroy(val); |
| 2345 | + flb_ra_destroy(ra); |
| 2346 | + msgpack_unpacked_destroy(&result); |
| 2347 | + destroy_sbuf(&sbuf); |
| 2348 | +} |
| 2349 | + |
| 2350 | +static void cb_ra_string_ref() |
| 2351 | +{ |
| 2352 | + msgpack_sbuffer sbuf; |
| 2353 | + const char *dummy; |
| 2354 | + msgpack_unpacked result; |
| 2355 | + msgpack_object map; |
| 2356 | + struct flb_record_accessor *ra; |
| 2357 | + struct flb_ra_value *val; |
| 2358 | + size_t off = 0, len; |
| 2359 | + const char *buf; |
| 2360 | + const char *expected; |
| 2361 | + |
| 2362 | + build_ra_map(&sbuf, &dummy); |
| 2363 | + |
| 2364 | + expected = NULL; |
| 2365 | + for (size_t i = 0; i + 3 <= sbuf.size; i++) { |
| 2366 | + if (memcmp(sbuf.data + i, "abc", 3) == 0) { |
| 2367 | + expected = sbuf.data + i; |
| 2368 | + break; |
| 2369 | + } |
| 2370 | + } |
| 2371 | + |
| 2372 | + msgpack_unpacked_init(&result); |
| 2373 | + TEST_CHECK(msgpack_unpack_next(&result, sbuf.data, sbuf.size, &off) == MSGPACK_UNPACK_SUCCESS); |
| 2374 | + map = result.data; |
| 2375 | + |
| 2376 | + ra = flb_ra_create("str", FLB_TRUE); |
| 2377 | + TEST_CHECK(ra != NULL); |
| 2378 | + val = flb_ra_get_value_object_ref(ra, map); |
| 2379 | + TEST_CHECK(val != NULL && val->type == FLB_RA_STRING && val->storage == FLB_RA_REF); |
| 2380 | + buf = flb_ra_value_buffer(val, &len); |
| 2381 | + TEST_CHECK(len == 3 && strncmp(buf, "abc", 3) == 0); |
| 2382 | + TEST_CHECK(buf == expected); |
| 2383 | + |
| 2384 | + flb_ra_key_value_destroy(val); |
| 2385 | + flb_ra_destroy(ra); |
| 2386 | + msgpack_unpacked_destroy(&result); |
| 2387 | + destroy_sbuf(&sbuf); |
| 2388 | +} |
| 2389 | + |
2216 | 2390 | TEST_LIST = { |
2217 | 2391 | { "keys" , cb_keys}, |
2218 | 2392 | { "dash_key" , cb_dash_key}, |
@@ -2246,5 +2420,9 @@ TEST_LIST = { |
2246 | 2420 | { "nonexistent_key_access", cb_nonexistent_key_access }, |
2247 | 2421 | { "wrong_type_access", cb_wrong_type_access }, |
2248 | 2422 | { "nested_failure_recovery", cb_nested_failure_recovery }, |
| 2423 | + { "ra_binary_copy", cb_ra_binary_copy }, |
| 2424 | + { "ra_binary_ref", cb_ra_binary_ref }, |
| 2425 | + { "ra_string_copy", cb_ra_string_copy }, |
| 2426 | + { "ra_string_ref", cb_ra_string_ref }, |
2249 | 2427 | { NULL } |
2250 | 2428 | }; |
0 commit comments