The branch, master has been updated via ced1d018ce1 Add editorconfig config file via de4e8a1af95 tevent: bump the version number to 0.11.0 via 683c44a79f0 tevent: add event trace api via fc9dd8ce9f0 tevent: add custom tag to events via 5203e70ada0 tevent: add support for cmocka unit tests via 740a217264f third_party:cmocka: Fix build when used in lib/tevent from 00bab5b3c82 smbXsrv_{open,session,tcon}: protect smbXsrv_{open,session,tcon}_global_traverse_fn against invalid records
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit ced1d018ce1957633d8defe3597fbb5eba32ca17 Author: Andreas Schneider <a...@samba.org> Date: Sun Jul 4 20:06:04 2021 +0200 Add editorconfig config file See https://editorconfig.org/ for details. (neo)vim: https://github.com/editorconfig/editorconfig-vim emacs: https://github.com/editorconfig/editorconfig-emacs Signed-off-by: Andreas Schneider <a...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> Autobuild-User(master): Andreas Schneider <a...@cryptomilk.org> Autobuild-Date(master): Wed Jul 7 05:54:16 UTC 2021 on sn-devel-184 commit de4e8a1af9564f6056f9af90867c2f013449051c Author: Pavel Březina <pbrez...@redhat.com> Date: Mon May 31 14:58:19 2021 +0200 tevent: bump the version number to 0.11.0 * Other minor build fixes. * Add custom tag to events * Add event trace api Pair-Programmed-With: Stefan Metzmacher <me...@samba.org> Signed-off-by: Pavel Březina <pbrez...@redhat.com> Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 683c44a79f09550a59e99606c9c80304666604a0 Author: Pavel Březina <pbrez...@redhat.com> Date: Tue Jun 1 14:10:05 2021 +0200 tevent: add event trace api Adds new tracing API to trace fd, timer, signal and immediate events on specific trace points: attach, before handler and dettach. This can be used in combination with the event tag to keep track of the currently executed event for purpose of debugging. Pair-Programmed-With: Stefan Metzmacher <me...@samba.org> Signed-off-by: Pavel Březina <pbrez...@redhat.com> Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit fc9dd8ce9f0ae2a7ae972035e56c4c4f9028e261 Author: Pavel Březina <pbrez...@redhat.com> Date: Tue Jun 1 13:57:45 2021 +0200 tevent: add custom tag to events Adds a new API to set and get an uint64_t tag on fd, timer, signal and immediate events. This can be used to assign a unique and known id to the event to allow easy tracking of such event. Pair-Programmed-With: Stefan Metzmacher <me...@samba.org> Signed-off-by: Pavel Březina <pbrez...@redhat.com> Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 5203e70ada0d5727591e80a11f941828a0bbadda Author: Pavel Březina <pbrez...@redhat.com> Date: Thu Jun 3 13:05:46 2021 +0200 tevent: add support for cmocka unit tests This adds a placeholder for new cmocka tests for tevent. Tests are added in individual commits. Signed-off-by: Pavel Březina <pbrez...@redhat.com> Reviewed-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 740a217264f10c5f3a9ecac8aab8727e45ff885d Author: Andreas Schneider <a...@samba.org> Date: Tue Jun 8 14:29:06 2021 +0200 third_party:cmocka: Fix build when used in lib/tevent Signed-off-by: Andreas Schneider <a...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> ----------------------------------------------------------------------- Summary of changes: .editorconfig | 33 + .../ABI/{tevent-0.10.2.sigs => tevent-0.11.0.sigs} | 20 + lib/tevent/tests/test_tevent_tag.c | 212 ++++ lib/tevent/tests/test_tevent_trace.c | 1065 ++++++++++++++++++++ lib/tevent/tevent.c | 4 + lib/tevent/tevent.h | 213 ++++ lib/tevent/tevent_debug.c | 139 ++- lib/tevent/tevent_fd.c | 22 + lib/tevent/tevent_immediate.c | 51 + lib/tevent/tevent_internal.h | 51 +- lib/tevent/tevent_signal.c | 21 + lib/tevent/tevent_timed.c | 32 +- lib/tevent/wscript | 41 +- third_party/cmocka/wscript | 2 + 14 files changed, 1892 insertions(+), 14 deletions(-) create mode 100644 .editorconfig copy lib/tevent/ABI/{tevent-0.10.2.sigs => tevent-0.11.0.sigs} (85%) create mode 100644 lib/tevent/tests/test_tevent_tag.c create mode 100644 lib/tevent/tests/test_tevent_trace.c Changeset truncated at 500 lines: diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000000..118f88807ea --- /dev/null +++ b/.editorconfig @@ -0,0 +1,33 @@ +root = true + +[*] +charset = utf-8 +max_line_length = 80 +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = false + +[*.{c,h,idl}] +indent_style = tab +indent_size = 8 +tab_width = 8 + +[*.{py,sh}] +indent_style = space +indent_size = 4 +tab_width = 4 + +[*.{pl,pm}] +indent_style = tab +indent_size = 8 +tab_width = 8 + +[wscript*] +indent_style = space +indent_size = 4 +tab_width = 4 + +[source4/heimdal/**.{c,h}] +indent_style = space +indent_size = 4 +tab_width = 4 diff --git a/lib/tevent/ABI/tevent-0.10.2.sigs b/lib/tevent/ABI/tevent-0.11.0.sigs similarity index 85% copy from lib/tevent/ABI/tevent-0.10.2.sigs copy to lib/tevent/ABI/tevent-0.11.0.sigs index f6227db5c93..e64007e0516 100644 --- a/lib/tevent/ABI/tevent-0.10.2.sigs +++ b/lib/tevent/ABI/tevent-0.11.0.sigs @@ -54,10 +54,18 @@ tevent_context_is_wrapper: bool (struct tevent_context *) tevent_context_same_loop: bool (struct tevent_context *, struct tevent_context *) tevent_debug: void (struct tevent_context *, enum tevent_debug_level, const char *, ...) tevent_fd_get_flags: uint16_t (struct tevent_fd *) +tevent_fd_get_tag: uint64_t (const struct tevent_fd *) tevent_fd_set_auto_close: void (struct tevent_fd *) tevent_fd_set_close_fn: void (struct tevent_fd *, tevent_fd_close_fn_t) tevent_fd_set_flags: void (struct tevent_fd *, uint16_t) +tevent_fd_set_tag: void (struct tevent_fd *, uint64_t) tevent_get_trace_callback: void (struct tevent_context *, tevent_trace_callback_t *, void *) +tevent_get_trace_fd_callback: void (struct tevent_context *, tevent_trace_fd_callback_t *, void *) +tevent_get_trace_immediate_callback: void (struct tevent_context *, tevent_trace_immediate_callback_t *, void *) +tevent_get_trace_signal_callback: void (struct tevent_context *, tevent_trace_signal_callback_t *, void *) +tevent_get_trace_timer_callback: void (struct tevent_context *, tevent_trace_timer_callback_t *, void *) +tevent_immediate_get_tag: uint64_t (const struct tevent_immediate *) +tevent_immediate_set_tag: void (struct tevent_immediate *, uint64_t) tevent_loop_allow_nesting: void (struct tevent_context *) tevent_loop_set_nesting_hook: void (struct tevent_context *, tevent_nesting_hook, void *) tevent_num_signals: size_t (void) @@ -108,10 +116,18 @@ tevent_set_debug: int (struct tevent_context *, void (*)(void *, enum tevent_deb tevent_set_debug_stderr: int (struct tevent_context *) tevent_set_default_backend: void (const char *) tevent_set_trace_callback: void (struct tevent_context *, tevent_trace_callback_t, void *) +tevent_set_trace_fd_callback: void (struct tevent_context *, tevent_trace_fd_callback_t, void *) +tevent_set_trace_immediate_callback: void (struct tevent_context *, tevent_trace_immediate_callback_t, void *) +tevent_set_trace_signal_callback: void (struct tevent_context *, tevent_trace_signal_callback_t, void *) +tevent_set_trace_timer_callback: void (struct tevent_context *, tevent_trace_timer_callback_t, void *) +tevent_signal_get_tag: uint64_t (const struct tevent_signal *) +tevent_signal_set_tag: void (struct tevent_signal *, uint64_t) tevent_signal_support: bool (struct tevent_context *) tevent_thread_proxy_create: struct tevent_thread_proxy *(struct tevent_context *) tevent_thread_proxy_schedule: void (struct tevent_thread_proxy *, struct tevent_immediate **, tevent_immediate_handler_t, void *) tevent_threaded_context_create: struct tevent_threaded_context *(TALLOC_CTX *, struct tevent_context *) +tevent_timer_get_tag: uint64_t (const struct tevent_timer *) +tevent_timer_set_tag: void (struct tevent_timer *, uint64_t) tevent_timeval_add: struct timeval (const struct timeval *, uint32_t, uint32_t) tevent_timeval_compare: int (const struct timeval *, const struct timeval *) tevent_timeval_current: struct timeval (void) @@ -120,7 +136,11 @@ tevent_timeval_is_zero: bool (const struct timeval *) tevent_timeval_set: struct timeval (uint32_t, uint32_t) tevent_timeval_until: struct timeval (const struct timeval *, const struct timeval *) tevent_timeval_zero: struct timeval (void) +tevent_trace_fd_callback: void (struct tevent_context *, struct tevent_fd *, enum tevent_event_trace_point) +tevent_trace_immediate_callback: void (struct tevent_context *, struct tevent_immediate *, enum tevent_event_trace_point) tevent_trace_point_callback: void (struct tevent_context *, enum tevent_trace_point) +tevent_trace_signal_callback: void (struct tevent_context *, struct tevent_signal *, enum tevent_event_trace_point) +tevent_trace_timer_callback: void (struct tevent_context *, struct tevent_timer *, enum tevent_event_trace_point) tevent_update_timer: void (struct tevent_timer *, struct timeval) tevent_wakeup_recv: bool (struct tevent_req *) tevent_wakeup_send: struct tevent_req *(TALLOC_CTX *, struct tevent_context *, struct timeval) diff --git a/lib/tevent/tests/test_tevent_tag.c b/lib/tevent/tests/test_tevent_tag.c new file mode 100644 index 00000000000..ce64d3c396e --- /dev/null +++ b/lib/tevent/tests/test_tevent_tag.c @@ -0,0 +1,212 @@ +/* + * Unix SMB/CIFS implementation. + * + * testing of some tevent_req aspects + * + * Copyright (C) Pavel Březina <pbrez...@redhat.com> 2021 + * + * ** NOTE! The following LGPL license applies to the tevent + * ** library. This does NOT imply that all of Samba is released + * ** under the LGPL + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see <http://www.gnu.org/licenses/>. + */ + +#include <errno.h> +#include <setjmp.h> +#include <stdlib.h> +#include <stdint.h> +#include <signal.h> + +#include <talloc.h> +#include <tevent.h> +#include <cmocka.h> + +static void fd_handler(struct tevent_context *ev, + struct tevent_fd *fde, + uint16_t flags, + void *private_data) +{ + /* Dummy handler. Just return. */ + return; +} + +static void timer_handler(struct tevent_context *ev, + struct tevent_timer *te, + struct timeval current_time, + void *private_data) +{ + /* Dummy handler. Just return. */ + return; +} + +static void signal_handler(struct tevent_context *ev, + struct tevent_signal *se, + int signum, + int count, + void *siginfo, + void *private_data) +{ + /* Dummy handler. Just return. */ + return; +} + +static void immediate_handler(struct tevent_context *ctx, + struct tevent_immediate *im, + void *private_data) +{ + /* Dummy handler. Just return. */ + return; +} + +static int test_setup(void **state) +{ + struct tevent_context *ev; + + ev = tevent_context_init(NULL); + assert_non_null(ev); + + *state = ev; + return 0; +} + +static int test_teardown(void **state) +{ + struct tevent_context *ev = (struct tevent_context *)(*state); + talloc_free(ev); + return 0; +} + +static void test_fd_tag(void **state) +{ + struct tevent_context *ev = (struct tevent_context *)(*state); + struct tevent_fd *fde; + uint64_t tag; + + fde = tevent_add_fd(ev, ev, 0, TEVENT_FD_READ, fd_handler, NULL); + assert_non_null(fde); + + tag = tevent_fd_get_tag(fde); + assert_int_equal(0, tag); + + tevent_fd_set_tag(fde, 1); + tag = tevent_fd_get_tag(fde); + assert_int_equal(1, tag); + + tevent_re_initialise(ev); + + tag = tevent_fd_get_tag(fde); + assert_int_equal(1, tag); + + TALLOC_FREE(fde); +} + +static void test_timer_tag(void **state) +{ + struct tevent_context *ev = (struct tevent_context *)(*state); + struct tevent_timer *te; + struct timeval next; + uint64_t tag; + + next = tevent_timeval_current(); + te = tevent_add_timer(ev, ev, next, timer_handler, NULL); + assert_non_null(te); + + tag = tevent_timer_get_tag(te); + assert_int_equal(0, tag); + + tevent_timer_set_tag(te, 1); + tag = tevent_timer_get_tag(te); + assert_int_equal(1, tag); + + next = tevent_timeval_current(); + tevent_update_timer(te, next); + + tag = tevent_timer_get_tag(te); + assert_int_equal(1, tag); + + tevent_re_initialise(ev); + + tag = tevent_timer_get_tag(te); + assert_int_equal(1, tag); + + TALLOC_FREE(te); +} + +static void test_signal_tag(void **state) +{ + struct tevent_context *ev = (struct tevent_context *)(*state); + struct tevent_signal *se; + uint64_t tag; + + se = tevent_add_signal(ev, ev, SIGUSR1, 0, signal_handler, NULL); + assert_non_null(se); + + tag = tevent_signal_get_tag(se); + assert_int_equal(0, tag); + + tevent_signal_set_tag(se, 1); + tag = tevent_signal_get_tag(se); + assert_int_equal(1, tag); + + tevent_re_initialise(ev); + + tag = tevent_signal_get_tag(se); + assert_int_equal(1, tag); + + TALLOC_FREE(se); +} + +static void test_immediate_tag(void **state) +{ + struct tevent_context *ev = (struct tevent_context *)(*state); + struct tevent_immediate *im; + uint64_t tag; + + im = tevent_create_immediate(ev); + assert_non_null(im); + + tag = tevent_immediate_get_tag(im); + assert_int_equal(0, tag); + + tevent_immediate_set_tag(im, 1); + tag = tevent_immediate_get_tag(im); + assert_int_equal(1, tag); + + tevent_schedule_immediate(im, ev, immediate_handler, NULL); + + tag = tevent_immediate_get_tag(im); + assert_int_equal(1, tag); + + tevent_re_initialise(ev); + + tag = tevent_immediate_get_tag(im); + assert_int_equal(1, tag); + + TALLOC_FREE(im); +} + +int main(int argc, char **argv) +{ + const struct CMUnitTest tests[] = { + cmocka_unit_test_setup_teardown(test_fd_tag, test_setup, test_teardown), + cmocka_unit_test_setup_teardown(test_timer_tag, test_setup, test_teardown), + cmocka_unit_test_setup_teardown(test_signal_tag, test_setup, test_teardown), + cmocka_unit_test_setup_teardown(test_immediate_tag, test_setup, test_teardown), + }; + + cmocka_set_message_output(CM_OUTPUT_SUBUNIT); + + return cmocka_run_group_tests(tests, NULL, NULL); +} diff --git a/lib/tevent/tests/test_tevent_trace.c b/lib/tevent/tests/test_tevent_trace.c new file mode 100644 index 00000000000..e9d26f9ceba --- /dev/null +++ b/lib/tevent/tests/test_tevent_trace.c @@ -0,0 +1,1065 @@ +/* + * Unix SMB/CIFS implementation. + * + * testing of some tevent_req aspects + * + * Copyright (C) Pavel Březina <pbrez...@redhat.com> 2021 + * + * ** NOTE! The following LGPL license applies to the tevent + * ** library. This does NOT imply that all of Samba is released + * ** under the LGPL + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see <http://www.gnu.org/licenses/>. + */ + +#include <errno.h> +#include <setjmp.h> +#include <stdlib.h> +#include <stdint.h> +#include <signal.h> +#include <unistd.h> + +#include <talloc.h> +#include <tevent.h> +#include <cmocka.h> + +struct test_ctx { + struct tevent_context *ev; + + bool handler_skipped; + bool reattach_reset; + + uint64_t (*get_tag)(const void *event); + void (*set_tag)(void *event, uint64_t tag); + uint64_t current_tag; + + bool attach; + bool before_handler; + bool handler_called; + bool detach; +}; + +static void fd_handler(struct tevent_context *ev, + struct tevent_fd *fde, + uint16_t flags, + void *private_data) +{ + struct test_ctx *tctx = (struct test_ctx *)private_data; + uint64_t tag = tevent_fd_get_tag(fde); + assert_true(tctx->attach); + assert_true(tctx->before_handler); + assert_false(tctx->handler_called); + assert_false(tctx->detach); + tctx->handler_called = true; + assert_int_equal(tag, tctx->current_tag); + return; +} + +static void timer_handler(struct tevent_context *ev, + struct tevent_timer *te, + struct timeval current_time, + void *private_data) +{ + struct test_ctx *tctx = (struct test_ctx *)private_data; + uint64_t tag = tevent_timer_get_tag(te); + assert_true(tctx->attach); + assert_true(tctx->before_handler); + assert_false(tctx->handler_called); + assert_false(tctx->detach); + tctx->handler_called = true; + assert_int_equal(tag, tctx->current_tag); + return; +} + +static void signal_handler(struct tevent_context *ev, + struct tevent_signal *se, + int signum, + int count, + void *siginfo, + void *private_data) +{ + struct test_ctx *tctx = (struct test_ctx *)private_data; + uint64_t tag = tevent_signal_get_tag(se); + assert_true(tctx->attach); + assert_true(tctx->before_handler); + assert_false(tctx->handler_called); + assert_false(tctx->detach); + tctx->handler_called = true; + assert_int_equal(tag, tctx->current_tag); + return; +} + +static void immediate_handler(struct tevent_context *ctx, + struct tevent_immediate *im, + void *private_data) +{ + struct test_ctx *tctx = (struct test_ctx *)private_data; + uint64_t tag = tevent_immediate_get_tag(im); + assert_true(tctx->attach); + assert_true(tctx->before_handler); + assert_false(tctx->handler_called); + assert_false(tctx->detach); + tctx->handler_called = true; + assert_int_equal(tag, tctx->current_tag); + return; +} + +static void immediate_handler_reschedule(struct tevent_context *ctx, + struct tevent_immediate *im, + void *private_data) +{ + struct test_ctx *tctx = (struct test_ctx *)private_data; + uint64_t tag = tevent_immediate_get_tag(im); + assert_true(tctx->attach); + assert_true(tctx->before_handler); + assert_false(tctx->handler_called); + assert_false(tctx->detach); + tctx->handler_called = true; + assert_int_equal(tag, tctx->current_tag); + + assert_false(tctx->reattach_reset); + tctx->reattach_reset = true; + tevent_schedule_immediate(im, tctx->ev, immediate_handler, tctx); + assert_false(tctx->reattach_reset); + assert_false(tctx->handler_skipped); + assert_true(tctx->attach); + assert_false(tctx->before_handler); + assert_false(tctx->handler_called); + assert_false(tctx->detach); + assert_int_not_equal(tag, tctx->current_tag); + tag = tevent_immediate_get_tag(im); + assert_int_equal(tag, tctx->current_tag); + + tctx->handler_skipped = true; + tctx->reattach_reset = true; + tevent_schedule_immediate(im, tctx->ev, immediate_handler, tctx); + assert_false(tctx->reattach_reset); + assert_false(tctx->handler_skipped); + assert_true(tctx->attach); + assert_false(tctx->before_handler); + assert_false(tctx->handler_called); + assert_false(tctx->detach); + assert_int_not_equal(tag, tctx->current_tag); + tag = tevent_immediate_get_tag(im); + assert_int_equal(tag, tctx->current_tag); +} + +static void fd_handler_free(struct tevent_context *ev, + struct tevent_fd *fde, + uint16_t flags, + void *private_data) +{ + struct test_ctx *tctx = (struct test_ctx *)private_data; + uint64_t tag = tevent_fd_get_tag(fde); + assert_true(tctx->attach); + assert_true(tctx->before_handler); + assert_false(tctx->handler_called); + assert_false(tctx->detach); + tctx->handler_called = true; + assert_int_equal(tag, tctx->current_tag); + TALLOC_FREE(fde); + assert_true(tctx->detach); + return; +} + +static void timer_handler_free(struct tevent_context *ev, + struct tevent_timer *te, + struct timeval current_time, + void *private_data) +{ -- Samba Shared Repository