X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=tests%2Funit%2Ftest_kernel_probe.cpp;fp=tests%2Funit%2Ftest_kernel_probe.cpp;h=0f6f89ec950cb7a0c94c3fac91e670b2b51c3d76;hb=740da7d5000ca1ffdcf14bda5096bf7ccfb86bdd;hp=0000000000000000000000000000000000000000;hpb=02c3d2c2e3b27ab0bad1207c70465f84b649c816;p=lttng-tools.git diff --git a/tests/unit/test_kernel_probe.cpp b/tests/unit/test_kernel_probe.cpp new file mode 100644 index 000000000..0f6f89ec9 --- /dev/null +++ b/tests/unit/test_kernel_probe.cpp @@ -0,0 +1,168 @@ +/* + * Unit tests for the kernel probe location API. + * + * Copyright (C) 2020 Jonathan Rajotte + * + * SPDX-License-Identifier: LGPL-2.1-only + * + */ + +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +/* For error.h */ +int lttng_opt_quiet = 1; +int lttng_opt_verbose; +int lttng_opt_mi; + +#define NUM_TESTS 24 + +static void test_kernel_probe_location_address(void) +{ + struct lttng_kernel_probe_location *location = NULL; + struct lttng_kernel_probe_location *location_from_buffer = NULL; + enum lttng_kernel_probe_location_status status; + enum lttng_kernel_probe_location_type type; + uint64_t address = 50, _address; + struct lttng_payload payload; + + diag("Testing kernel probe location address"); + + lttng_payload_init(&payload); + + location = lttng_kernel_probe_location_address_create(address); + ok(location, "Location object"); + + type = lttng_kernel_probe_location_get_type(location); + ok(LTTNG_KERNEL_PROBE_LOCATION_TYPE_ADDRESS == type, + "Location type got %d expected %d", type, + LTTNG_KERNEL_PROBE_LOCATION_TYPE_ADDRESS); + + status = lttng_kernel_probe_location_address_get_address( + location, &_address); + ok(status == LTTNG_KERNEL_PROBE_LOCATION_STATUS_OK, "Getting address"); + ok(address == _address, + "Address is equal. Got %" PRIu64 " expected %" PRIu64, + _address, address); + + ok(lttng_kernel_probe_location_serialize(location, &payload) > 0, + "Serializing"); + { + struct lttng_payload_view view = + lttng_payload_view_from_payload( + &payload, 0, -1); + ok(lttng_kernel_probe_location_create_from_payload( + &view, &location_from_buffer) > 0, + "Deserializing"); + } + + type = lttng_kernel_probe_location_get_type(location_from_buffer); + ok(LTTNG_KERNEL_PROBE_LOCATION_TYPE_ADDRESS == type, + "Location from buffer type got %d expected %d", type, + LTTNG_KERNEL_PROBE_LOCATION_TYPE_ADDRESS); + + status = lttng_kernel_probe_location_address_get_address( + location_from_buffer, &_address); + ok(status == LTTNG_KERNEL_PROBE_LOCATION_STATUS_OK, "Getting address"); + ok(address == _address, + "Address from buffer is equal. Got %" PRIu64 + " expected %" PRIu64, + _address, address); + + ok(lttng_kernel_probe_location_is_equal(location, location_from_buffer), + "serialized and from buffer are equal"); + + lttng_payload_reset(&payload); + lttng_kernel_probe_location_destroy(location); + lttng_kernel_probe_location_destroy(location_from_buffer); +} + +static void test_kernel_probe_location_symbol(void) +{ + struct lttng_kernel_probe_location *location = NULL; + struct lttng_kernel_probe_location *location_from_buffer = NULL; + enum lttng_kernel_probe_location_status status; + enum lttng_kernel_probe_location_type type; + uint64_t offset = 50, _offset; + const char *symbol = "Une_bonne", *_symbol; + struct lttng_payload payload; + + diag("Testing kernel probe location symbol"); + + lttng_payload_init(&payload); + + location = lttng_kernel_probe_location_symbol_create(symbol, offset); + ok(location, "Location object"); + + type = lttng_kernel_probe_location_get_type(location); + ok(LTTNG_KERNEL_PROBE_LOCATION_TYPE_SYMBOL_OFFSET == type, + "Location type got %d expected %d", type, + LTTNG_KERNEL_PROBE_LOCATION_TYPE_SYMBOL_OFFSET); + + _symbol = lttng_kernel_probe_location_symbol_get_name(location); + ok(_symbol, "Getting symbol name"); + ok(!strncmp(symbol, _symbol, strlen(symbol)), + "Symbol name is equal. Got %s, expected %s", _symbol, + symbol); + + status = lttng_kernel_probe_location_symbol_get_offset( + location, &_offset); + ok(status == LTTNG_KERNEL_PROBE_LOCATION_STATUS_OK, "Getting offset"); + ok(offset == _offset, + "Offset is equal. Got %" PRIu64 " expected %" PRIu64, + _offset, offset); + + ok(lttng_kernel_probe_location_serialize(location, &payload) > 0, + "Serializing"); + { + struct lttng_payload_view view = + lttng_payload_view_from_payload( + &payload, 0, -1); + ok(lttng_kernel_probe_location_create_from_payload( + &view, &location_from_buffer) > 0, + "Deserializing"); + } + + type = lttng_kernel_probe_location_get_type(location_from_buffer); + ok(LTTNG_KERNEL_PROBE_LOCATION_TYPE_SYMBOL_OFFSET == type, + "Location from buffer type got %d expected %d", type, + LTTNG_KERNEL_PROBE_LOCATION_TYPE_SYMBOL_OFFSET); + + _symbol = lttng_kernel_probe_location_symbol_get_name( + location_from_buffer); + ok(_symbol, "Getting symbol name"); + ok(!strncmp(symbol, _symbol, strlen(symbol)), + "Symbol name is equal. Got %s, expected %s", _symbol, + symbol); + + status = lttng_kernel_probe_location_symbol_get_offset( + location_from_buffer, &_offset); + ok(status == LTTNG_KERNEL_PROBE_LOCATION_STATUS_OK, "Getting offset"); + ok(offset == _offset, + "Offset is equal. Got %" PRIu64 " expected %" PRIu64, + _offset, offset); + + ok(lttng_kernel_probe_location_is_equal(location, location_from_buffer), + "serialized and from buffer are equal"); + + lttng_payload_reset(&payload); + lttng_kernel_probe_location_destroy(location); + lttng_kernel_probe_location_destroy(location_from_buffer); +} + +int main(int argc, const char *argv[]) +{ + plan_tests(NUM_TESTS); + test_kernel_probe_location_address(); + test_kernel_probe_location_symbol(); + return exit_status(); +}