diff mbox series

[BlueZ,1/2] shared/tester: Add tester_setup_io

Message ID 20220805201034.3838529-1-luiz.dentz@gmail.com (mailing list archive)
State Accepted
Commit 2dfe29197435ebeae5337bed6d965cdf2edc3f89
Headers show
Series [BlueZ,1/2] shared/tester: Add tester_setup_io | expand

Checks

Context Check Description
tedd_an/pre-ci_am success Success
tedd_an/checkpatch success Checkpatch PASS
tedd_an/gitlint success Gitlint PASS
tedd_an/setupell success Setup ELL PASS
tedd_an/buildprep success Build Prep PASS
tedd_an/build success Build Configuration PASS
tedd_an/makecheck success Make Check PASS
tedd_an/makecheckvalgrind success Make Check PASS
tedd_an/makedistcheck success Make Distcheck PASS
tedd_an/build_extell success Build External ELL PASS
tedd_an/build_extell_make success Build Make with External ELL PASS
tedd_an/incremental_build success Pass
tedd_an/scan_build success Pass

Commit Message

Luiz Augusto von Dentz Aug. 5, 2022, 8:10 p.m. UTC
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

This adds tester_setup_io which can be used to add a PDU list in the
form of iovec.
---
 src/shared/tester.c | 155 ++++++++++++++++++++++++++++++++++++++++++--
 src/shared/tester.h |  12 ++++
 2 files changed, 163 insertions(+), 4 deletions(-)

Comments

bluez.test.bot@gmail.com Aug. 5, 2022, 9:06 p.m. UTC | #1
This is automated email and please do not reply to this email!

Dear submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=665746

---Test result---

Test Summary:
CheckPatch                    PASS      3.05 seconds
GitLint                       PASS      2.09 seconds
Prep - Setup ELL              PASS      26.88 seconds
Build - Prep                  PASS      0.79 seconds
Build - Configure             PASS      8.52 seconds
Build - Make                  PASS      828.07 seconds
Make Check                    PASS      11.48 seconds
Make Check w/Valgrind         PASS      284.37 seconds
Make Distcheck                PASS      233.57 seconds
Build w/ext ELL - Configure   PASS      8.72 seconds
Build w/ext ELL - Make        PASS      81.50 seconds
Incremental Build w/ patches  PASS      194.17 seconds
Scan Build                    PASS      581.41 seconds



---
Regards,
Linux Bluetooth
patchwork-bot+bluetooth@kernel.org Aug. 5, 2022, 11 p.m. UTC | #2
Hello:

This series was applied to bluetooth/bluez.git (master)
by Luiz Augusto von Dentz <luiz.von.dentz@intel.com>:

On Fri,  5 Aug 2022 13:10:33 -0700 you wrote:
> From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
> 
> This adds tester_setup_io which can be used to add a PDU list in the
> form of iovec.
> ---
>  src/shared/tester.c | 155 ++++++++++++++++++++++++++++++++++++++++++--
>  src/shared/tester.h |  12 ++++
>  2 files changed, 163 insertions(+), 4 deletions(-)

Here is the summary with links:
  - [BlueZ,1/2] shared/tester: Add tester_setup_io
    https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=2dfe29197435
  - [BlueZ,2/2] test-tester: This add tests for tester
    https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=f07b88abfb89

You are awesome, thank you!
diff mbox series

Patch

diff --git a/src/shared/tester.c b/src/shared/tester.c
index c07cbc11c..885b2591d 100644
--- a/src/shared/tester.c
+++ b/src/shared/tester.c
@@ -81,6 +81,8 @@  struct test_case {
 	enum test_result result;
 	enum test_stage stage;
 	const void *test_data;
+	const struct iovec *iov;
+	size_t iovcnt;
 	tester_data_func_t pre_setup_func;
 	tester_data_func_t setup_func;
 	tester_data_func_t test_func;
@@ -346,14 +348,20 @@  void tester_add(const char *name, const void *test_data,
 					teardown_func, NULL, 0, NULL, NULL);
 }
 
-void *tester_get_data(void)
+static struct test_case *tester_get_test(void)
 {
-	struct test_case *test;
-
 	if (!test_current)
 		return NULL;
 
-	test = test_current->data;
+	return test_current->data;
+}
+
+void *tester_get_data(void)
+{
+	struct test_case *test = tester_get_test();
+
+	if (!test)
+		return NULL;
 
 	return test->user_data;
 }
@@ -859,6 +867,142 @@  void tester_init(int *argc, char ***argv)
 	test_current = NULL;
 }
 
+static struct io *ios[2];
+
+static bool io_disconnected(struct io *io, void *user_data)
+{
+	if (io == ios[0]) {
+		io_destroy(ios[0]);
+		ios[0] = NULL;
+	} else if (io == ios[1]) {
+		io_destroy(ios[1]);
+		ios[1] = NULL;
+	}
+
+	return false;
+}
+
+static const struct iovec *test_get_iov(struct test_case *test)
+{
+	const struct iovec *iov;
+
+	if (!test || !test->iov || !test->iovcnt)
+		return NULL;
+
+	iov = test->iov;
+
+	test->iov++;
+	test->iovcnt--;
+
+	return iov;
+}
+
+static bool test_io_send(struct io *io, void *user_data)
+{
+	struct test_case *test = tester_get_test();
+	const struct iovec *iov = test_get_iov(test);
+	ssize_t len;
+
+	if (!iov)
+		return false;
+
+	len = io_send(io, iov, 1);
+
+	tester_monitor('<', 0x0004, 0x0000, iov->iov_base, len);
+
+	g_assert_cmpint(len, ==, iov->iov_len);
+
+	return false;
+}
+
+static bool test_io_recv(struct io *io, void *user_data)
+{
+	struct test_case *test = tester_get_test();
+	const struct iovec *iov = test_get_iov(test);
+	unsigned char buf[512];
+	int fd;
+	ssize_t len;
+
+	fd = io_get_fd(io);
+
+	len = read(fd, buf, sizeof(buf));
+
+	g_assert(len > 0);
+
+	tester_monitor('>', 0x0004, 0x0000, buf, len);
+
+	if (!iov)
+		return true;
+
+	g_assert_cmpint(len, ==, iov->iov_len);
+
+	g_assert(memcmp(buf, iov->iov_base, len) == 0);
+
+	if (test->iovcnt)
+		io_set_write_handler(io, test_io_send, NULL, NULL);
+
+	return true;
+}
+
+static void setup_io(void)
+{
+	int fd[2], err;
+
+	io_destroy(ios[0]);
+	io_destroy(ios[1]);
+
+	err = socketpair(AF_UNIX, SOCK_SEQPACKET | SOCK_CLOEXEC, 0, fd);
+	if (err < 0) {
+		tester_warn("socketpair: %s (%d)", strerror(errno), errno);
+		return;
+	}
+
+	ios[0] = io_new(fd[0]);
+	if (!ios[0]) {
+		tester_warn("io_new: %p", ios[0]);
+		return;
+	}
+
+	io_set_close_on_destroy(ios[0], true);
+	io_set_disconnect_handler(ios[0], io_disconnected, NULL, NULL);
+
+	ios[1] = io_new(fd[1]);
+	if (!ios[1]) {
+		tester_warn("io_new: %p", ios[1]);
+		return;
+	}
+
+	io_set_close_on_destroy(ios[1], true);
+	io_set_disconnect_handler(ios[1], io_disconnected, NULL, NULL);
+	io_set_read_handler(ios[1], test_io_recv, NULL, NULL);
+}
+
+struct io *tester_setup_io(const struct iovec *iov, int iovcnt)
+{
+	struct test_case *test = tester_get_test();
+
+	if (!ios[0] || !ios[1]) {
+		setup_io();
+		if (!ios[0] || !ios[1]) {
+			tester_warn("Unable to setup IO");
+			return NULL;
+		}
+	}
+
+	test->iov = iov;
+	test->iovcnt = iovcnt;
+
+	return ios[0];
+}
+
+void tester_io_send(void)
+{
+	struct test_case *test = tester_get_test();
+
+	if (test->iovcnt)
+		io_set_write_handler(ios[1], test_io_send, NULL, NULL);
+}
+
 int tester_run(void)
 {
 	int ret;
@@ -879,5 +1023,8 @@  int tester_run(void)
 	if (option_monitor)
 		bt_log_close();
 
+	io_destroy(ios[0]);
+	io_destroy(ios[1]);
+
 	return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
 }
diff --git a/src/shared/tester.h b/src/shared/tester.h
index a304d89fe..f2590970e 100644
--- a/src/shared/tester.h
+++ b/src/shared/tester.h
@@ -11,6 +11,15 @@ 
 #include <stdbool.h>
 #include <stddef.h>
 #include <stdint.h>
+#include "src/shared/io.h"
+
+#define data(args...) ((const unsigned char[]) { args })
+
+#define IOV_DATA(args...) \
+	{ \
+		.iov_base = (void *)data(args), \
+		.iov_len = sizeof(data(args)), \
+	}
 
 void tester_init(int *argc, char ***argv);
 int tester_run(void);
@@ -66,3 +75,6 @@  typedef void (*tester_wait_func_t)(void *user_data);
 
 void tester_wait(unsigned int seconds, tester_wait_func_t func,
 							void *user_data);
+
+struct io *tester_setup_io(const struct iovec *iov, int iovcnt);
+void tester_io_send(void);