Linux bluetooth development
 help / color / mirror / Atom feed
* Re: [PATCH] Bluetooth: Set HCI_QUIRK_RESET_ON_CLOSE for Socket SDIO cards
From: Johan Hedberg @ 2013-12-23 16:51 UTC (permalink / raw)
  To: Marcel Holtmann; +Cc: linux-bluetooth
In-Reply-To: <1387810352-48383-1-git-send-email-marcel@holtmann.org>

Hi Marcel,

On Mon, Dec 23, 2013, Marcel Holtmann wrote:
> The Socket Bluetooth SDIO cards are branded versions of Toshiba SD-BT2
> and they do not support sending HCI_Reset as first command. To make
> this card work the HCI_QUIRK_RESET_ON_CLOSE quirk needs to be set
> before registering the controller.
> 
> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
> ---
>  drivers/bluetooth/btsdio.c | 3 +++
>  1 file changed, 3 insertions(+)

Applied to bluetooth-next. Thanks.

Johan

^ permalink raw reply

* Re: [PATCH v2 1/6] android/tester: Seperate Socket HAL cbs from Bluetooth HAL cb
From: Szymon Janc @ 2013-12-23 15:59 UTC (permalink / raw)
  To: Grzegorz Kolodziejczyk; +Cc: linux-bluetooth
In-Reply-To: <1387808154-21661-1-git-send-email-grzegorz.kolodziejczyk@tieto.com>

Hi Grzegorz,

> This patch adds seperate callbacks structure for socket HAL test cases.
> Is's needed beceause Socket HAL cb have other purpose than Bluetooth HAL
> cb. Callbacks are now initialized outside test setup function and
> cb struct depends on HAL type.
> ---
>  android/android-tester.c | 63 ++++++++++++++++++++++++++++++++++++++++++------
>  1 file changed, 56 insertions(+), 7 deletions(-)
> 
> diff --git a/android/android-tester.c b/android/android-tester.c
> index 0383115..f5ab14f 100644
> --- a/android/android-tester.c
> +++ b/android/android-tester.c
> @@ -872,7 +872,6 @@ static void setup(struct test_data *data)
>  {
>  	const hw_module_t *module;
>  	hw_device_t *device;
> -	bt_status_t status;
>  	int signal_fd[2];
>  	char buf[1024];
>  	pid_t pid;
> @@ -935,19 +934,21 @@ static void setup(struct test_data *data)
>  		return;
>  	}
>  
> -	status = data->if_bluetooth->init(&bt_callbacks);
> -	if (status != BT_STATUS_SUCCESS) {
> -		data->if_bluetooth = NULL;
> -		tester_setup_failed();
> -	}
>  }
>  
>  static void setup_base(const void *test_data)
>  {
>  	struct test_data *data = tester_get_data();
> +	bt_status_t status;
>  
>  	setup(data);
>  
> +	status = data->if_bluetooth->init(&bt_callbacks);
> +	if (status != BT_STATUS_SUCCESS) {
> +		data->if_bluetooth = NULL;
> +		tester_setup_failed();
> +	}
> +
>  	tester_setup_complete();
>  }
>  
> @@ -958,6 +959,11 @@ static void setup_enabled_adapter(const void *test_data)
>  
>  	setup(data);
>  
> +	status = data->if_bluetooth->init(&bt_callbacks);
> +	if (status != BT_STATUS_SUCCESS) {
> +		data->if_bluetooth = NULL;
> +		tester_setup_failed();
> +	}
>  	status = data->if_bluetooth->enable();
>  	if (status != BT_STATUS_SUCCESS)
>  		tester_setup_failed();
> @@ -1157,6 +1163,20 @@ static void test_setprop_service_record_invalid(const void *test_data)
>  
>  /* Test Socket HAL */
>  
> +static void adapter_socket_state_changed_cb(bt_state_t state)
> +{
> +	switch (state) {
> +	case BT_STATE_ON:
> +		setup_powered_emulated_remote();
> +		break;
> +	case BT_STATE_OFF:
> +		tester_setup_failed();
> +		break;
> +	default:
> +		break;
> +	}
> +}
> +
>  const bt_bdaddr_t bdaddr_dummy = {
>  	.address = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55}
>  };
> @@ -1233,13 +1253,36 @@ static const struct socket_data btsock_inv_listen_listen = {
>  	.test_channel = true,
>  };
>  
> +static bt_callbacks_t bt_socket_callbacks = {
> +	.size = sizeof(bt_callbacks),
> +	.adapter_state_changed_cb = adapter_socket_state_changed_cb,
> +	.adapter_properties_cb = NULL,
> +	.remote_device_properties_cb = NULL,
> +	.device_found_cb = NULL,
> +	.discovery_state_changed_cb = NULL,
> +	.pin_request_cb = NULL,
> +	.ssp_request_cb = NULL,
> +	.bond_state_changed_cb = NULL,
> +	.acl_state_changed_cb = NULL,
> +	.thread_evt_cb = NULL,
> +	.dut_mode_recv_cb = NULL,
> +	.le_test_mode_cb = NULL
> +};
> +
>  static void setup_socket_interface(const void *test_data)
>  {
>  	struct test_data *data = tester_get_data();
> +	bt_status_t status;
>  	const void *sock;
>  
>  	setup(data);
>  
> +	status = data->if_bluetooth->init(&bt_socket_callbacks);
> +	if (status != BT_STATUS_SUCCESS) {
> +		data->if_bluetooth = NULL;
> +		tester_setup_failed();
> +	}
> +
>  	sock = data->if_bluetooth->get_profile_interface(BT_PROFILE_SOCKETS_ID);
>  	if (!sock) {
>  		tester_setup_failed();
> @@ -1254,11 +1297,17 @@ static void setup_socket_interface(const void *test_data)
>  static void setup_socket_interface_enabled(const void *test_data)
>  {
>  	struct test_data *data = tester_get_data();
> -	const void *sock;
>  	bt_status_t status;
> +	const void *sock;
>  
>  	setup(data);
>  
> +	status = data->if_bluetooth->init(&bt_socket_callbacks);
> +	if (status != BT_STATUS_SUCCESS) {
> +		data->if_bluetooth = NULL;
> +		tester_setup_failed();
> +	}
> +
>  	sock = data->if_bluetooth->get_profile_interface(BT_PROFILE_SOCKETS_ID);
>  	if (!sock) {
>  		tester_setup_failed();
> 

All patches applied, thanks.

-- 
BR
Szymon Janc

^ permalink raw reply

* Re: [RFC] btdev: Send Link Key Request on Authentication Requested
From: Marcel Holtmann @ 2013-12-23 15:41 UTC (permalink / raw)
  To: Andrei Emeltchenko; +Cc: linux-bluetooth@vger.kernel.org development
In-Reply-To: <1387812799-21728-1-git-send-email-Andrei.Emeltchenko.news@gmail.com>

Hi Andrei,

> From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
> 
> The Link Key Request event shall be generated when Simple Pairing Mode
> is enabled.
> ---
> emulator/btdev.c | 13 +++++++++++++
> 1 file changed, 13 insertions(+)
> 
> diff --git a/emulator/btdev.c b/emulator/btdev.c
> index b1e804b..c0cfdef 100644
> --- a/emulator/btdev.c
> +++ b/emulator/btdev.c
> @@ -2005,6 +2005,19 @@ static void default_cmd_completion(struct btdev *btdev, uint16_t opcode,
> 		conn_complete(btdev, rcr->bdaddr, BT_HCI_ERR_UNKNOWN_CONN_ID);
> 		break;
> 
> +	case BT_HCI_CMD_AUTH_REQUESTED:
> +		if (btdev->type == BTDEV_TYPE_LE)
> +			return;

please make sure that you send correct command status event first. The Core specification is pretty detailed on what needs to be send when here.

> +
> +		if (btdev->simple_pairing_mode) {
> +			struct bt_hci_evt_link_key_request lkr;
> +
> +			memcpy(lkr.bdaddr, btdev->conn->bdaddr, 6);
> +			send_event(btdev, BT_HCI_EVT_LINK_KEY_REQUEST, &lkr,
> +								sizeof(lkr));
> +		}
> +		break;
> +
> 	case BT_HCI_CMD_REMOTE_NAME_REQUEST:
> 		if (btdev->type == BTDEV_TYPE_LE)
> 			return;

Regards

Marcel


^ permalink raw reply

* [RFC] btdev: Send Link Key Request on Authentication Requested
From: Andrei Emeltchenko @ 2013-12-23 15:33 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

The Link Key Request event shall be generated when Simple Pairing Mode
is enabled.
---
 emulator/btdev.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/emulator/btdev.c b/emulator/btdev.c
index b1e804b..c0cfdef 100644
--- a/emulator/btdev.c
+++ b/emulator/btdev.c
@@ -2005,6 +2005,19 @@ static void default_cmd_completion(struct btdev *btdev, uint16_t opcode,
 		conn_complete(btdev, rcr->bdaddr, BT_HCI_ERR_UNKNOWN_CONN_ID);
 		break;
 
+	case BT_HCI_CMD_AUTH_REQUESTED:
+		if (btdev->type == BTDEV_TYPE_LE)
+			return;
+
+		if (btdev->simple_pairing_mode) {
+			struct bt_hci_evt_link_key_request lkr;
+
+			memcpy(lkr.bdaddr, btdev->conn->bdaddr, 6);
+			send_event(btdev, BT_HCI_EVT_LINK_KEY_REQUEST, &lkr,
+								sizeof(lkr));
+		}
+		break;
+
 	case BT_HCI_CMD_REMOTE_NAME_REQUEST:
 		if (btdev->type == BTDEV_TYPE_LE)
 			return;
-- 
1.8.3.2


^ permalink raw reply related

* Re: [PATCH BlueZ 1/2] android/AVDTP: Remove get_all parameter for get_capability callback
From: Szymon Janc @ 2013-12-23 15:31 UTC (permalink / raw)
  To: Luiz Augusto von Dentz; +Cc: linux-bluetooth
In-Reply-To: <1387807690-31617-1-git-send-email-luiz.dentz@gmail.com>

Hi Luiz,

> From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
> 
> This is not necessary anymore since all delay reporting is now added
> automatically whenever supported.
> ---
>  android/avdtp.c   | 4 ++--
>  android/avdtp.h   | 1 -
>  unit/test-avdtp.c | 8 ++++----
>  3 files changed, 6 insertions(+), 7 deletions(-)
> 
> diff --git a/android/avdtp.c b/android/avdtp.c
> index 02ee920..3cf390f 100644
> --- a/android/avdtp.c
> +++ b/android/avdtp.c
> @@ -1192,8 +1192,8 @@ static gboolean avdtp_getcap_cmd(struct avdtp *session, uint8_t transaction,
>  		goto failed;
>  	}
>  
> -	if (!sep->ind->get_capability(session, sep, get_all, &caps,
> -							&err, sep->user_data))
> +	if (!sep->ind->get_capability(session, sep, &caps, &err,
> +							sep->user_data))
>  		goto failed;
>  
>  	for (l = caps, rsp_size = 0; l != NULL; l = g_slist_next(l)) {
> diff --git a/android/avdtp.h b/android/avdtp.h
> index d371653..e8d1907 100644
> --- a/android/avdtp.h
> +++ b/android/avdtp.h
> @@ -161,7 +161,6 @@ struct avdtp_sep_cfm {
>  struct avdtp_sep_ind {
>  	gboolean (*get_capability) (struct avdtp *session,
>  					struct avdtp_local_sep *sep,
> -					gboolean get_all,
>  					GSList **caps, uint8_t *err,
>  					void *user_data);
>  	gboolean (*set_configuration) (struct avdtp *session,
> diff --git a/unit/test-avdtp.c b/unit/test-avdtp.c
> index 458daa7..66c45f3 100644
> --- a/unit/test-avdtp.c
> +++ b/unit/test-avdtp.c
> @@ -269,8 +269,8 @@ static void execute_context(struct context *context)
>  
>  static gboolean sep_getcap_ind(struct avdtp *session,
>  					struct avdtp_local_sep *sep,
> -					gboolean get_all, GSList **caps,
> -					uint8_t *err, void *user_data)
> +					GSList **caps, uint8_t *err,
> +					void *user_data)
>  {
>  	struct avdtp_service_capability *media_transport, *media_codec;
>  	struct avdtp_media_codec_capability *codec_caps;
> @@ -550,8 +550,8 @@ static void test_server_0_sep(gconstpointer data)
>  
>  static gboolean sep_getcap_ind_frg(struct avdtp *session,
>  					struct avdtp_local_sep *sep,
> -					gboolean get_all, GSList **caps,
> -					uint8_t *err, void *user_data)
> +					GSList **caps, uint8_t *err,
> +					void *user_data)
>  {
>  	struct avdtp_service_capability *media_transport, *media_codec;
>  	struct avdtp_service_capability *content_protection;
> 

Both patches applied, thanks.

-- 
BR
Szymon Janc



^ permalink raw reply

* [PATCHv2] btdev: Return Command Status for Authentication Requested
From: Andrei Emeltchenko @ 2013-12-23 15:07 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

Add support for "Authentication Requested" command
---
 emulator/btdev.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/emulator/btdev.c b/emulator/btdev.c
index d0dff74..b1e804b 100644
--- a/emulator/btdev.c
+++ b/emulator/btdev.c
@@ -268,6 +268,7 @@ static void set_bredr_commands(struct btdev *btdev)
 	btdev->commands[0]  |= 0x80;	/* Cancel Create Connection */
 	btdev->commands[1]  |= 0x01;	/* Accept Connection Request */
 	btdev->commands[1]  |= 0x02;	/* Reject Connection Request */
+	btdev->commands[1]  |= 0x80;	/* Authentication Requested */
 	btdev->commands[2]  |= 0x08;	/* Remote Name Request */
 	btdev->commands[2]  |= 0x10;	/* Cancel Remote Name Request */
 	btdev->commands[2]  |= 0x20;	/* Read Remote Supported Features */
@@ -1191,6 +1192,12 @@ static void default_cmd(struct btdev *btdev, uint16_t opcode,
 		cmd_status(btdev, BT_HCI_ERR_SUCCESS, opcode);
 		break;
 
+	case BT_HCI_CMD_AUTH_REQUESTED:
+		if (btdev->type == BTDEV_TYPE_LE)
+			return;
+		cmd_status(btdev, BT_HCI_ERR_SUCCESS, opcode);
+		break;
+
 	case BT_HCI_CMD_REMOTE_NAME_REQUEST:
 		if (btdev->type == BTDEV_TYPE_LE)
 			goto unsupported;
-- 
1.8.3.2


^ permalink raw reply related

* [PATCH] Bluetooth: Set HCI_QUIRK_RESET_ON_CLOSE for Socket SDIO cards
From: Marcel Holtmann @ 2013-12-23 14:52 UTC (permalink / raw)
  To: linux-bluetooth

The Socket Bluetooth SDIO cards are branded versions of Toshiba SD-BT2
and they do not support sending HCI_Reset as first command. To make
this card work the HCI_QUIRK_RESET_ON_CLOSE quirk needs to be set
before registering the controller.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
---
 drivers/bluetooth/btsdio.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/bluetooth/btsdio.c b/drivers/bluetooth/btsdio.c
index b61440aaee65..1f6815825e61 100644
--- a/drivers/bluetooth/btsdio.c
+++ b/drivers/bluetooth/btsdio.c
@@ -333,6 +333,9 @@ static int btsdio_probe(struct sdio_func *func,
 	hdev->flush    = btsdio_flush;
 	hdev->send     = btsdio_send_frame;
 
+	if (func->vendor == 0x0104 && func->device == 0x00c5)
+		set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks);
+
 	err = hci_register_dev(hdev);
 	if (err < 0) {
 		hci_free_dev(hdev);
-- 
1.8.4.2


^ permalink raw reply related

* Re: [PATCH v2 BlueZ] build: Add coverage support
From: Luiz Augusto von Dentz @ 2013-12-23 14:20 UTC (permalink / raw)
  To: Marcel Holtmann; +Cc: linux-bluetooth@vger.kernel.org
In-Reply-To: <C2EB6265-CEEC-4D1A-8A11-42D0AC64B290@holtmann.org>

Hi Marcel,

On Mon, Dec 23, 2013 at 3:57 PM, Marcel Holtmann <marcel@holtmann.org> wrote:
> Hi Luiz,
>
>>> Coverage is enabled with --enable-maintainer-mode, 2 new targets are
>>> added 'coverage' and 'clean-coverage', the first generate the reports
>>> using lcov and depend on the second to cleanup previous generated
>>> reports and .gcda files.
>>> ---
>>> .gitignore   |  4 ++++
>>> Makefile.am  | 18 ++++++++++++++++++
>>> acinclude.m4 |  4 ++++
>>> configure.ac |  4 ++++
>>> 4 files changed, 30 insertions(+)
>>>
>>> diff --git a/.gitignore b/.gitignore
>>> index c570728..21dbe26 100644
>>> --- a/.gitignore
>>> +++ b/.gitignore
>>> @@ -3,6 +3,8 @@
>>> *.lo
>>> *.la
>>> *.so
>>> +*.gcno
>>> +*.gcda
>>> .deps
>>> .libs
>>> .dirstamp
>>> @@ -27,7 +29,9 @@ stamp-h1
>>> autom4te.cache
>>> test-driver
>>> test-suite.log
>>> +coverage.info
>>>
>>> +coverage
>>> lib/bluez.pc
>>> lib/bluetooth
>>> src/builtin.h
>>> diff --git a/Makefile.am b/Makefile.am
>>> index 15cc149..7380e61 100644
>>> --- a/Makefile.am
>>> +++ b/Makefile.am
>>> @@ -331,5 +331,23 @@ lib/bluetooth/%.h: lib/%.h
>>>        $(AM_V_at)$(MKDIR_P) lib/bluetooth
>>>        $(AM_V_GEN)$(LN_S) -f "$(abs_top_builddir)"/$< $@
>>>
>>> +if MAINTAINER_MODE
>>> +clean-coverage:
>>> +       -find $(top_builddir) -name "*.gcda" -delete
>>> +       @lcov --directory $(top_builddir) --zerocounters
>>> +       $(RM) -r coverage $(top_builddir)/coverage.info
>>> +
>>> +coverage: clean-coverage check
>>> +       @lcov --compat-libtool --directory $(top_builddir) --capture \
>>> +                               --output-file $(top_builddir)/coverage.info
>>> +       $(AM_V_at)$(MKDIR_P) coverage
>>> +       @genhtml -o coverage/ $(top_builddir)/coverage.info
>>> +
>>> +clean-local: clean-coverage
>>> +       -find $(top_builddir) -name "*.gcno" -delete
>>> +       $(RM) -r lib/bluetooth
>>> +
>>> +else
>>> clean-local:
>>>        $(RM) -r lib/bluetooth
>>> +endif
>>> diff --git a/acinclude.m4 b/acinclude.m4
>>> index 2065852..afc7c6d 100644
>>> --- a/acinclude.m4
>>> +++ b/acinclude.m4
>>> @@ -51,6 +51,10 @@ AC_DEFUN([MISC_FLAGS], [
>>>                        misc_ldflags="$misc_ldflags -pie"
>>>                fi
>>>        ])
>>> +       if (test "$USE_MAINTAINER_MODE" = "yes"); then
>>> +               misc_cflags="$misc_cflags --coverage"
>>> +               misc_ldflags="$misc_ldflags --coverage"
>>> +       fi
>>>        AC_SUBST([MISC_CFLAGS], $misc_cflags)
>>>        AC_SUBST([MISC_LDFLAGS], $misc_ldflags)
>>> ])
>>> diff --git a/configure.ac b/configure.ac
>>> index 18d0b55..4f36355 100644
>>> --- a/configure.ac
>>> +++ b/configure.ac
>>> @@ -252,4 +252,8 @@ AC_ARG_ENABLE(android, AC_HELP_STRING([--enable-android],
>>>                                        [enable_android=${enableval}])
>>> AM_CONDITIONAL(ANDROID, test "${enable_android}" = "yes")
>>>
>>> +if (test "$USE_MAINTAINER_MODE" = "yes"); then
>>> +       AC_CHECK_PROG([LCOV], [lcov], [yes], AC_MSG_ERROR(lcov is required))
>>> +fi
>>> +
>>> AC_OUTPUT(Makefile src/bluetoothd.8 lib/bluez.pc)
>>> --
>>> 1.8.3.1
>>
>> Any feedback regarding this patch? It is now using maintainer mode as
>> you suggested.
>
> I have not tested it yet. In general this looks just fine. However the if else with clean-local in each branches is still something that I think could be done a bit cleaner.

Im all for it as well, but note that the .gcna needs to be cleanup
manually since they are not created by the build itself but at runtime
when the binary is run thus why I made clean-local to depend on
clean-coverage , the .gcno files could be cleanup like any .o file but
I couldn't figure out how to do it so far.

-- 
Luiz Augusto von Dentz

^ permalink raw reply

* [PATCH v2 6/6] android/tester: Refactor HAL callback check
From: Grzegorz Kolodziejczyk @ 2013-12-23 14:15 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1387808154-21661-1-git-send-email-grzegorz.kolodziejczyk@tieto.com>

This patch removes ID enum in favour of test cases having their own as
implementation of callbacks checking test conditions.
Now each test case uses it own callback function and within it
test conditions are checked, e.g. with property get test case, property
and if it's properly cb is checked.
Count of expected callback is defined as a number and after calling
proper cb, value is decremented.
This also changes to generic - property check used within HAL cb.
---
 android/android-tester.c | 403 ++++++++++++++++++++++-------------------------
 1 file changed, 185 insertions(+), 218 deletions(-)

diff --git a/android/android-tester.c b/android/android-tester.c
index 5e5b951..ee23fff 100644
--- a/android/android-tester.c
+++ b/android/android-tester.c
@@ -42,39 +42,13 @@
 
 #include "utils.h"
 
-#define ADAPTER_PROPS ADAPTER_PROP_BDADDR, ADAPTER_PROP_BDNAME, \
-			ADAPTER_PROP_UUIDS, ADAPTER_PROP_COD, \
-			ADAPTER_PROP_TYPE, ADAPTER_PROP_SCAN_MODE, \
-			ADAPTER_PROP_BONDED_DEVICES, ADAPTER_PROP_DISC_TIMEOUT
-
-/*
- * those are assigned to HAL methods and callbacks, we use ID later
- * on mapped in switch-case due to different functions prototypes.
- */
-
-enum hal_bluetooth_callbacks_id {
-	ADAPTER_TEST_END,
-	ADAPTER_STATE_CHANGED_ON,
-	ADAPTER_STATE_CHANGED_OFF,
-	ADAPTER_PROP_BDADDR,
-	ADAPTER_PROP_BDNAME,
-	ADAPTER_PROP_UUIDS,
-	ADAPTER_PROP_COD,
-	ADAPTER_PROP_TYPE,
-	ADAPTER_PROP_SCAN_MODE,
-	ADAPTER_PROP_DISC_TIMEOUT,
-	ADAPTER_PROP_SERVICE_RECORD,
-	ADAPTER_PROP_BONDED_DEVICES,
-	ADAPTER_DISCOVERY_STATE_ON,
-	ADAPTER_DISCOVERY_STATE_OFF,
-	REMOTE_DEVICE_FOUND,
-};
-
 struct generic_data {
 	int expected_adapter_status;
 	uint32_t expect_settings_set;
+	int expected_cb_count;
+	bt_property_t set_property;
 	bt_property_t expected_property;
-	uint8_t expected_hal_callbacks[];
+	bt_callbacks_t expected_hal_cb;
 };
 
 struct socket_data {
@@ -93,10 +67,6 @@ struct socket_data {
 
 #define BT_STATUS_NOT_EXPECTED	-1
 
-/* User flags for Device Discovery */
-#define DEVICE_DISCOVERY_CANCEL_ON_START	0x01
-#define DEVICE_DISCOVERY_START_ON_START		0x02
-
 struct test_data {
 	struct mgmt *mgmt;
 	uint16_t mgmt_index;
@@ -111,14 +81,14 @@ struct test_data {
 	const btsock_interface_t *if_sock;
 
 	bool mgmt_settings_set;
-	bool hal_cb_called;
+	bool cb_count_checked;
 	bool status_checked;
 	bool property_checked;
 
-	bt_property_t test_property;
-	GSList *expected_callbacks;
+	/* Set to true if test conditions are initialized */
+	bool test_init_done;
 
-	uint32_t userflag;
+	int cb_count;
 };
 
 static char exec_dir[PATH_MAX + 1];
@@ -127,9 +97,9 @@ static void test_update_state(void)
 {
 	struct test_data *data = tester_get_data();
 
-	if (!(data->mgmt_settings_set))
+	if (!(data->cb_count_checked))
 		return;
-	if (!(data->hal_cb_called))
+	if (!(data->mgmt_settings_set))
 		return;
 	if (!(data->status_checked))
 		return;
@@ -197,27 +167,27 @@ static void command_generic_new_settings(uint16_t index, uint16_t length,
 	mgmt_unregister(data->mgmt, data->mgmt_settings_id);
 }
 
-static bool is_empty_halcb_list(void)
+static void check_cb_count(void)
 {
 	struct test_data *data = tester_get_data();
 
-	return !(g_slist_length(data->expected_callbacks));
+	if (!data->test_init_done)
+		return;
+
+	if (data->cb_count == 0)
+		data->cb_count_checked = true;
+
+	test_update_state();
 }
 
-static void hal_cb_init(struct test_data *data)
+static void expected_cb_count_init(struct test_data *data)
 {
 	const struct generic_data *test_data = data->test_data;
-	unsigned int i = 0;
 
-	while (test_data->expected_hal_callbacks[i]) {
-		data->expected_callbacks =
-			g_slist_append(data->expected_callbacks,
-		GINT_TO_POINTER(test_data->expected_hal_callbacks[i]));
-		i++;
-	}
+	data->cb_count = test_data->expected_cb_count;
+
+	check_cb_count();
 
-	if (is_empty_halcb_list())
-		data->hal_cb_called = true;
 }
 
 static void mgmt_cb_init(struct test_data *data)
@@ -244,13 +214,15 @@ static void test_property_init(struct test_data *data)
 {
 	const struct generic_data *test_data = data->test_data;
 
-	if (is_empty_halcb_list() || !(test_data->expected_property.type))
+	if (!test_data->expected_property.type)
 		data->property_checked = true;
 }
 
 static void init_test_conditions(struct test_data *data)
 {
-	hal_cb_init(data);
+	data->test_init_done = true;
+
+	expected_cb_count_init(data);
 	mgmt_cb_init(data);
 	expected_status_init(data);
 	test_property_init(data);
@@ -269,48 +241,20 @@ static void check_expected_status(uint8_t status)
 	test_update_state();
 }
 
-static void check_test_property(void)
-{
-	struct test_data *data = tester_get_data();
-	bt_property_t expected_prop = data->test_property;
-	const struct generic_data *test_data = data->test_data;
-	bt_property_t test_prop = test_data->expected_property;
-
-	if (test_prop.type && (expected_prop.type != test_prop.type)) {
-		tester_test_failed();
-		return;
-	}
-
-	if (test_prop.len && (expected_prop.len != test_prop.len)) {
-		tester_test_failed();
-		return;
-	}
-
-	if (test_prop.val && memcmp(expected_prop.val, test_prop.val,
-							expected_prop.len)) {
-		tester_test_failed();
-		return;
-	}
-
-	data->property_checked = true;
-	test_update_state();
-}
-
-static void update_hal_cb_list(enum hal_bluetooth_callbacks_id
-							expected_callback)
+static bool check_test_property(bt_property_t received_prop,
+						bt_property_t expected_prop)
 {
 	struct test_data *data = tester_get_data();
 
-	if (is_empty_halcb_list())
-		return;
-
-	data->expected_callbacks = g_slist_remove(data->expected_callbacks,
-					GINT_TO_POINTER(expected_callback));
-
-	if (!data->expected_callbacks)
-		data->hal_cb_called = true;
+	if (expected_prop.type && (expected_prop.type != received_prop.type))
+		return false;
+	if (expected_prop.len && (expected_prop.len != received_prop.len))
+		return false;
+	if (expected_prop.val && memcmp(expected_prop.val, received_prop.val,
+							expected_prop.len))
+		return false;
 
-	test_update_state();
+	return data->property_checked = true;
 }
 
 static void read_info_callback(uint8_t status, uint16_t length,
@@ -544,56 +488,98 @@ static void setup_powered_emulated_remote(void)
 		bthost_write_scan_enable(bthost, 0x03);
 }
 
+static void enable_success_cb(bt_state_t state)
+{
+	struct test_data *data = tester_get_data();
+
+	if (state == BT_STATE_ON) {
+		setup_powered_emulated_remote();
+		data->cb_count--;
+	}
+}
+
+static void disable_success_cb(bt_state_t state)
+{
+	struct test_data *data = tester_get_data();
+
+	if (state == BT_STATE_OFF)
+		data->cb_count--;
+}
+
 static void adapter_state_changed_cb(bt_state_t state)
 {
-	switch (state) {
-	case BT_STATE_ON:
-		if (is_empty_halcb_list())
-			setup_powered_emulated_remote();
-		update_hal_cb_list(ADAPTER_STATE_CHANGED_ON);
-		break;
-	case BT_STATE_OFF:
-		if (is_empty_halcb_list())
-			tester_setup_failed();
-		update_hal_cb_list(ADAPTER_STATE_CHANGED_OFF);
-		break;
-	default:
-		break;
+	struct test_data *data = tester_get_data();
+	const struct generic_data *test = data->test_data;
+
+	if (data->test_init_done &&
+			test->expected_hal_cb.adapter_state_changed_cb) {
+		test->expected_hal_cb.adapter_state_changed_cb(state);
+		check_cb_count();
+		return;
 	}
+
+	if (!data->test_init_done && state == BT_STATE_ON)
+		setup_powered_emulated_remote();
+}
+
+static void discovery_start_success_cb(bt_discovery_state_t state)
+{
+	struct test_data *data = tester_get_data();
+
+	if (state == BT_DISCOVERY_STARTED)
+		data->cb_count--;
 }
 
-static void post_discovery_started_cb(bt_discovery_state_t state)
+static void discovery_start_done_cb(bt_discovery_state_t state)
 {
 	struct test_data *data = tester_get_data();
 	bt_status_t status;
 
-	if (data->userflag & DEVICE_DISCOVERY_CANCEL_ON_START) {
+	status = data->if_bluetooth->start_discovery();
+	data->cb_count--;
+	check_expected_status(status);
+}
+
+static void discovery_stop_success_cb(bt_discovery_state_t state)
+{
+	struct test_data *data = tester_get_data();
+	bt_status_t status;
+
+	if (state == BT_DISCOVERY_STARTED && data->cb_count == 2) {
 		status = data->if_bluetooth->cancel_discovery();
 		check_expected_status(status);
+		data->cb_count--;
+		return;
 	}
+	if (state == BT_DISCOVERY_STOPPED && data->cb_count == 1)
+		data->cb_count--;
+}
 
-	if (data->userflag & DEVICE_DISCOVERY_START_ON_START) {
-		status = data->if_bluetooth->start_discovery();
-		check_expected_status(status);
+static void discovery_device_found_state_changed_cb(bt_discovery_state_t state)
+{
+	struct test_data *data = tester_get_data();
+
+	if (state == BT_DISCOVERY_STARTED && data->cb_count == 3) {
+		data->cb_count--;
+		return;
 	}
+	if (state == BT_DISCOVERY_STOPPED && data->cb_count == 1)
+		data->cb_count--;
 }
 
 static void discovery_state_changed_cb(bt_discovery_state_t state)
 {
-	switch (state) {
-	case BT_DISCOVERY_STARTED:
-		update_hal_cb_list(ADAPTER_DISCOVERY_STATE_ON);
-		post_discovery_started_cb(state);
-		break;
-	case BT_DISCOVERY_STOPPED:
-		update_hal_cb_list(ADAPTER_DISCOVERY_STATE_OFF);
-		break;
-	default:
-		break;
+	struct test_data *data = tester_get_data();
+	const struct generic_data *test = data->test_data;
+
+	if (test && test->expected_hal_cb.discovery_state_changed_cb) {
+		test->expected_hal_cb.discovery_state_changed_cb(state);
+		check_cb_count();
 	}
 }
 
-static void device_found_cb(int num_properties, bt_property_t *properties)
+static void discovery_device_found_cb(int num_properties,
+						bt_property_t *properties)
 {
 	struct test_data *data = tester_get_data();
 	const uint8_t *remote_bdaddr =
@@ -603,7 +589,7 @@ static void device_found_cb(int num_properties, bt_property_t *properties)
 	bt_bdaddr_t emu_remote_bdaddr;
 	int i;
 
-	update_hal_cb_list(REMOTE_DEVICE_FOUND);
+	data->cb_count--;
 
 	if (num_properties < 1)
 		tester_test_failed();
@@ -642,83 +628,75 @@ static void device_found_cb(int num_properties, bt_property_t *properties)
 	}
 }
 
-static void adapter_properties_cb(bt_status_t status, int num_properties,
+static void device_found_cb(int num_properties, bt_property_t *properties)
+{
+	struct test_data *data = tester_get_data();
+	const struct generic_data *test = data->test_data;
+
+	if (data->test_init_done && test->expected_hal_cb.device_found_cb) {
+		test->expected_hal_cb.device_found_cb(num_properties,
+								properties);
+		check_cb_count();
+	}
+}
+
+static void check_count_properties_cb(bt_status_t status, int num_properties,
 						bt_property_t *properties)
 {
 	struct test_data *data = tester_get_data();
-	int i;
 
-	if (is_empty_halcb_list())
-		return;
+	data->cb_count--;
+}
 
-	for (i = 0; i < num_properties; i++) {
+static void getprop_success_cb(bt_status_t status, int num_properties,
+						bt_property_t *properties)
+{
+	struct test_data *data = tester_get_data();
+	const struct generic_data *test = data->test_data;
 
-		data->test_property = properties[i];
+	if (check_test_property(properties[0], test->expected_property))
+		data->cb_count--;
+}
 
-		if (g_slist_length(data->expected_callbacks) == 1)
-			check_test_property();
+static void adapter_properties_cb(bt_status_t status, int num_properties,
+						bt_property_t *properties)
+{
+	struct test_data *data = tester_get_data();
+	const struct generic_data *test = data->test_data;
 
-		switch (properties[i].type) {
-		case BT_PROPERTY_BDADDR:
-			update_hal_cb_list(ADAPTER_PROP_BDADDR);
-			break;
-		case BT_PROPERTY_BDNAME:
-			update_hal_cb_list(ADAPTER_PROP_BDNAME);
-			break;
-		case BT_PROPERTY_UUIDS:
-			update_hal_cb_list(ADAPTER_PROP_UUIDS);
-			break;
-		case BT_PROPERTY_CLASS_OF_DEVICE:
-			update_hal_cb_list(ADAPTER_PROP_COD);
-			break;
-		case BT_PROPERTY_TYPE_OF_DEVICE:
-			update_hal_cb_list(ADAPTER_PROP_TYPE);
-			break;
-		case BT_PROPERTY_SERVICE_RECORD:
-			update_hal_cb_list(ADAPTER_PROP_SERVICE_RECORD);
-			break;
-		case BT_PROPERTY_ADAPTER_SCAN_MODE:
-			update_hal_cb_list(ADAPTER_PROP_SCAN_MODE);
-			break;
-		case BT_PROPERTY_ADAPTER_BONDED_DEVICES:
-			update_hal_cb_list(ADAPTER_PROP_BONDED_DEVICES);
-			break;
-		case BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT:
-			update_hal_cb_list(ADAPTER_PROP_DISC_TIMEOUT);
-			break;
-		default:
-			goto fail;
-		}
+	if (data->test_init_done &&
+				test->expected_hal_cb.adapter_properties_cb) {
+		test->expected_hal_cb.adapter_properties_cb(
+							status, num_properties,
+							properties);
+		check_cb_count();
 	}
-	return;
-
-fail:
-	tester_print("Unexpected property: %u", properties[i].type);
-	tester_test_failed();
-	return;
 }
 
 static const struct generic_data bluetooth_enable_success_test = {
-	.expected_hal_callbacks = { ADAPTER_PROPS, ADAPTER_STATE_CHANGED_ON,
-							ADAPTER_TEST_END },
+	.expected_hal_cb.adapter_state_changed_cb = enable_success_cb,
+	.expected_hal_cb.adapter_properties_cb = check_count_properties_cb,
+	.expected_cb_count = 9,
 	.expected_adapter_status = BT_STATUS_SUCCESS,
 };
 
 static const struct generic_data bluetooth_enable_done_test = {
-	.expected_hal_callbacks = { ADAPTER_PROPS, ADAPTER_TEST_END },
+	.expected_hal_cb.adapter_properties_cb = check_count_properties_cb,
+	.expected_cb_count = 8,
 	.expected_adapter_status = BT_STATUS_DONE,
 };
 
 static const struct generic_data bluetooth_disable_success_test = {
-	.expected_hal_callbacks = { ADAPTER_STATE_CHANGED_OFF,
-							ADAPTER_TEST_END },
+	.expected_hal_cb.adapter_state_changed_cb = disable_success_cb,
+	.expected_cb_count = 1,
 	.expected_adapter_status = BT_STATUS_SUCCESS,
 };
 
 static char test_set_bdname[] = "test_bdname_set";
 
 static const struct generic_data bluetooth_setprop_bdname_success_test = {
-	.expected_hal_callbacks = { ADAPTER_PROP_BDNAME, ADAPTER_TEST_END },
+	.expected_hal_cb.adapter_properties_cb = getprop_success_cb,
+	.expected_cb_count = 1,
 	.expected_adapter_status = BT_STATUS_SUCCESS,
 	.expected_property.type = BT_PROPERTY_BDNAME,
 	.expected_property.val = test_set_bdname,
@@ -729,9 +707,8 @@ static bt_scan_mode_t test_setprop_scanmode_val =
 					BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE;
 
 static const struct generic_data bluetooth_setprop_scanmode_success_test = {
-	.expected_hal_callbacks = { ADAPTER_PROP_SCAN_MODE,
-						ADAPTER_PROP_SCAN_MODE,
-						ADAPTER_TEST_END },
+	.expected_hal_cb.adapter_properties_cb = getprop_success_cb,
+	.expected_cb_count = 1,
 	.expected_adapter_status = BT_STATUS_SUCCESS,
 	.expected_property.type = BT_PROPERTY_ADAPTER_SCAN_MODE,
 	.expected_property.val = &test_setprop_scanmode_val,
@@ -741,7 +718,8 @@ static const struct generic_data bluetooth_setprop_scanmode_success_test = {
 static uint32_t test_setprop_disctimeout_val = 120;
 
 static const struct generic_data bluetooth_setprop_disctimeout_success_test = {
-	.expected_hal_callbacks = { ADAPTER_PROP_DISC_TIMEOUT, ADAPTER_TEST_END },
+	.expected_hal_cb.adapter_properties_cb = getprop_success_cb,
+	.expected_cb_count = 1,
 	.expected_adapter_status = BT_STATUS_SUCCESS,
 	.expected_property.type = BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT,
 	.expected_property.val = &test_setprop_disctimeout_val,
@@ -749,7 +727,8 @@ static const struct generic_data bluetooth_setprop_disctimeout_success_test = {
 };
 
 static const struct generic_data bluetooth_getprop_bdaddr_success_test = {
-	.expected_hal_callbacks = { ADAPTER_PROP_BDADDR, ADAPTER_TEST_END },
+	.expected_hal_cb.adapter_properties_cb = getprop_success_cb,
+	.expected_cb_count = 1,
 	.expected_adapter_status = BT_STATUS_SUCCESS,
 	.expected_property.type = BT_PROPERTY_BDADDR,
 	.expected_property.val = NULL,
@@ -759,8 +738,8 @@ static const struct generic_data bluetooth_getprop_bdaddr_success_test = {
 static char test_bdname[] = "test_bdname_setget";
 
 static const struct generic_data bluetooth_getprop_bdname_success_test = {
-	.expected_hal_callbacks = { ADAPTER_PROP_BDNAME, ADAPTER_PROP_BDNAME,
-							ADAPTER_TEST_END },
+	.expected_hal_cb.adapter_properties_cb = getprop_success_cb,
+	.expected_cb_count = 1,
 	.expected_adapter_status = BT_STATUS_SUCCESS,
 	.expected_property.type = BT_PROPERTY_BDNAME,
 	.expected_property.val = test_bdname,
@@ -772,41 +751,37 @@ static unsigned char setprop_uuids[] = { 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00,
 			0x00, 0x00 };
 
 static const struct generic_data bluetooth_setprop_uuid_invalid_test = {
-	.expected_hal_callbacks = { ADAPTER_TEST_END },
 	.expected_adapter_status = BT_STATUS_FAIL,
-	.expected_property.type = BT_PROPERTY_UUIDS,
-	.expected_property.val = &setprop_uuids,
-	.expected_property.len = sizeof(setprop_uuids),
+	.set_property.type = BT_PROPERTY_UUIDS,
+	.set_property.val = &setprop_uuids,
+	.set_property.len = sizeof(setprop_uuids),
 };
 
 static uint32_t setprop_class_of_device = 0;
 
 static const struct generic_data bluetooth_setprop_cod_invalid_test = {
-	.expected_hal_callbacks = { ADAPTER_TEST_END },
 	.expected_adapter_status = BT_STATUS_FAIL,
-	.expected_property.type = BT_PROPERTY_CLASS_OF_DEVICE,
-	.expected_property.val = &setprop_class_of_device,
-	.expected_property.len = sizeof(setprop_class_of_device),
+	.set_property.type = BT_PROPERTY_CLASS_OF_DEVICE,
+	.set_property.val = &setprop_class_of_device,
+	.set_property.len = sizeof(setprop_class_of_device),
 };
 
 static bt_device_type_t setprop_type_of_device = BT_DEVICE_DEVTYPE_BREDR;
 
 static const struct generic_data bluetooth_setprop_tod_invalid_test = {
-	.expected_hal_callbacks = { ADAPTER_TEST_END },
 	.expected_adapter_status = BT_STATUS_FAIL,
-	.expected_property.type = BT_PROPERTY_TYPE_OF_DEVICE,
-	.expected_property.val = &setprop_type_of_device,
-	.expected_property.len = sizeof(setprop_type_of_device),
+	.set_property.type = BT_PROPERTY_TYPE_OF_DEVICE,
+	.set_property.val = &setprop_type_of_device,
+	.set_property.len = sizeof(setprop_type_of_device),
 };
 
 static int32_t setprop_remote_rssi = 0;
 
 static const struct generic_data bluetooth_setprop_remote_rssi_invalid_test = {
-	.expected_hal_callbacks = { ADAPTER_TEST_END },
 	.expected_adapter_status = BT_STATUS_FAIL,
-	.expected_property.type = BT_PROPERTY_REMOTE_RSSI,
-	.expected_property.val = &setprop_remote_rssi,
-	.expected_property.len = sizeof(setprop_remote_rssi),
+	.set_property.type = BT_PROPERTY_REMOTE_RSSI,
+	.set_property.val = &setprop_remote_rssi,
+	.set_property.len = sizeof(setprop_remote_rssi),
 };
 
 static bt_service_record_t setprop_remote_service = {
@@ -817,41 +792,40 @@ static bt_service_record_t setprop_remote_service = {
 
 static const struct generic_data
 			bluetooth_setprop_service_record_invalid_test = {
-	.expected_hal_callbacks = { ADAPTER_TEST_END },
 	.expected_adapter_status = BT_STATUS_FAIL,
-	.expected_property.type = BT_PROPERTY_SERVICE_RECORD,
-	.expected_property.val = &setprop_remote_service,
-	.expected_property.len = sizeof(setprop_remote_service),
+	.set_property.type = BT_PROPERTY_SERVICE_RECORD,
+	.set_property.val = &setprop_remote_service,
+	.set_property.len = sizeof(setprop_remote_service),
 };
 
 static const struct generic_data bluetooth_discovery_start_success_test = {
-	.expected_hal_callbacks = { ADAPTER_DISCOVERY_STATE_ON,
-							ADAPTER_TEST_END },
+	.expected_hal_cb.discovery_state_changed_cb =
+						discovery_start_success_cb,
+	.expected_cb_count = 1,
 	.expected_adapter_status = BT_STATUS_SUCCESS,
 };
 
 static const struct generic_data bluetooth_discovery_start_done_test = {
-	.expected_hal_callbacks = { ADAPTER_DISCOVERY_STATE_ON,
-							ADAPTER_TEST_END },
+	.expected_hal_cb.discovery_state_changed_cb = discovery_start_done_cb,
+	.expected_cb_count = 1,
 	.expected_adapter_status = BT_STATUS_DONE,
 };
 
 static const struct generic_data bluetooth_discovery_stop_done_test = {
-	.expected_hal_callbacks = { ADAPTER_TEST_END },
 	.expected_adapter_status = BT_STATUS_DONE,
 };
 
 static const struct generic_data bluetooth_discovery_stop_success_test = {
-	.expected_hal_callbacks = { ADAPTER_DISCOVERY_STATE_ON,
-				ADAPTER_DISCOVERY_STATE_OFF, ADAPTER_TEST_END },
+	.expected_hal_cb.discovery_state_changed_cb = discovery_stop_success_cb,
+	.expected_cb_count = 2,
 	.expected_adapter_status = BT_STATUS_SUCCESS,
 };
 
 static const struct generic_data bluetooth_discovery_device_found_test = {
-	.expected_hal_callbacks = { ADAPTER_DISCOVERY_STATE_ON,
-						REMOTE_DEVICE_FOUND,
-						ADAPTER_DISCOVERY_STATE_OFF,
-						ADAPTER_TEST_END },
+	.expected_hal_cb.discovery_state_changed_cb =
+					discovery_device_found_state_changed_cb,
+	.expected_hal_cb.device_found_cb = discovery_device_found_cb,
+	.expected_cb_count = 3,
 	.expected_adapter_status = BT_STATUS_NOT_EXPECTED,
 };
 
@@ -985,9 +959,6 @@ static void teardown(const void *test_data)
 	if (data->bluetoothd_pid)
 		waitpid(data->bluetoothd_pid, NULL, 0);
 
-	if (data->expected_callbacks)
-		g_slist_free(data->expected_callbacks);
-
 	tester_teardown_complete();
 }
 
@@ -1128,7 +1099,7 @@ static void test_setprop_tod_invalid(const void *test_data)
 {
 	struct test_data *data = tester_get_data();
 	const struct generic_data *test = data->test_data;
-	const bt_property_t *prop = &test->expected_property;
+	const bt_property_t *prop = &test->set_property;
 	bt_status_t adapter_status;
 
 	init_test_conditions(data);
@@ -1201,8 +1172,6 @@ static void test_discovery_stop_success(const void *test_data)
 	struct test_data *data = tester_get_data();
 	bt_status_t status;
 
-	data->userflag = DEVICE_DISCOVERY_CANCEL_ON_START;
-
 	init_test_conditions(data);
 
 	hciemu_add_hook(data->hciemu, HCIEMU_HOOK_PRE_EVT, BT_HCI_CMD_INQUIRY,
@@ -1216,8 +1185,6 @@ static void test_discovery_start_done(const void *test_data)
 {
 	struct test_data *data = tester_get_data();
 
-	data->userflag = DEVICE_DISCOVERY_START_ON_START;
-
 	init_test_conditions(data);
 
 	hciemu_add_hook(data->hciemu, HCIEMU_HOOK_PRE_EVT, BT_HCI_CMD_INQUIRY,
-- 
1.8.4.2


^ permalink raw reply related

* [PATCH v2 5/6] android/tester: Correct bdname set test case struc conditions
From: Grzegorz Kolodziejczyk @ 2013-12-23 14:15 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1387808154-21661-1-git-send-email-grzegorz.kolodziejczyk@tieto.com>

This patch correct struct elements initialization. Now test name is
declared as variable before test case struct and its size is calculated
using sizeof(), not by hard coded number.
---
 android/android-tester.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/android/android-tester.c b/android/android-tester.c
index fc53465..5e5b951 100644
--- a/android/android-tester.c
+++ b/android/android-tester.c
@@ -715,12 +715,14 @@ static const struct generic_data bluetooth_disable_success_test = {
 	.expected_adapter_status = BT_STATUS_SUCCESS,
 };
 
+static char test_set_bdname[] = "test_bdname_set";
+
 static const struct generic_data bluetooth_setprop_bdname_success_test = {
 	.expected_hal_callbacks = { ADAPTER_PROP_BDNAME, ADAPTER_TEST_END },
 	.expected_adapter_status = BT_STATUS_SUCCESS,
 	.expected_property.type = BT_PROPERTY_BDNAME,
-	.expected_property.val = "test_bdname",
-	.expected_property.len = 11,
+	.expected_property.val = test_set_bdname,
+	.expected_property.len = sizeof(test_set_bdname) - 1,
 };
 
 static bt_scan_mode_t test_setprop_scanmode_val =
-- 
1.8.4.2


^ permalink raw reply related

* [PATCH v2 4/6] android/tester: Whitespace and semicolon style correction
From: Grzegorz Kolodziejczyk @ 2013-12-23 14:15 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1387808154-21661-1-git-send-email-grzegorz.kolodziejczyk@tieto.com>

This patch adds semicolon to the last element in test case condition
structure. Additional whitespace was removed from function.
---
 android/android-tester.c | 38 ++++++++++++++++++--------------------
 1 file changed, 18 insertions(+), 20 deletions(-)

diff --git a/android/android-tester.c b/android/android-tester.c
index 57f3fc9..fc53465 100644
--- a/android/android-tester.c
+++ b/android/android-tester.c
@@ -701,18 +701,18 @@ fail:
 static const struct generic_data bluetooth_enable_success_test = {
 	.expected_hal_callbacks = { ADAPTER_PROPS, ADAPTER_STATE_CHANGED_ON,
 							ADAPTER_TEST_END },
-	.expected_adapter_status = BT_STATUS_SUCCESS
+	.expected_adapter_status = BT_STATUS_SUCCESS,
 };
 
 static const struct generic_data bluetooth_enable_done_test = {
 	.expected_hal_callbacks = { ADAPTER_PROPS, ADAPTER_TEST_END },
-	.expected_adapter_status = BT_STATUS_DONE
+	.expected_adapter_status = BT_STATUS_DONE,
 };
 
 static const struct generic_data bluetooth_disable_success_test = {
 	.expected_hal_callbacks = { ADAPTER_STATE_CHANGED_OFF,
 							ADAPTER_TEST_END },
-	.expected_adapter_status = BT_STATUS_SUCCESS
+	.expected_adapter_status = BT_STATUS_SUCCESS,
 };
 
 static const struct generic_data bluetooth_setprop_bdname_success_test = {
@@ -720,7 +720,7 @@ static const struct generic_data bluetooth_setprop_bdname_success_test = {
 	.expected_adapter_status = BT_STATUS_SUCCESS,
 	.expected_property.type = BT_PROPERTY_BDNAME,
 	.expected_property.val = "test_bdname",
-	.expected_property.len = 11
+	.expected_property.len = 11,
 };
 
 static bt_scan_mode_t test_setprop_scanmode_val =
@@ -733,7 +733,7 @@ static const struct generic_data bluetooth_setprop_scanmode_success_test = {
 	.expected_adapter_status = BT_STATUS_SUCCESS,
 	.expected_property.type = BT_PROPERTY_ADAPTER_SCAN_MODE,
 	.expected_property.val = &test_setprop_scanmode_val,
-	.expected_property.len = sizeof(bt_scan_mode_t)
+	.expected_property.len = sizeof(bt_scan_mode_t),
 };
 
 static uint32_t test_setprop_disctimeout_val = 120;
@@ -743,7 +743,7 @@ static const struct generic_data bluetooth_setprop_disctimeout_success_test = {
 	.expected_adapter_status = BT_STATUS_SUCCESS,
 	.expected_property.type = BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT,
 	.expected_property.val = &test_setprop_disctimeout_val,
-	.expected_property.len = sizeof(test_setprop_disctimeout_val)
+	.expected_property.len = sizeof(test_setprop_disctimeout_val),
 };
 
 static const struct generic_data bluetooth_getprop_bdaddr_success_test = {
@@ -751,7 +751,7 @@ static const struct generic_data bluetooth_getprop_bdaddr_success_test = {
 	.expected_adapter_status = BT_STATUS_SUCCESS,
 	.expected_property.type = BT_PROPERTY_BDADDR,
 	.expected_property.val = NULL,
-	.expected_property.len = sizeof(bt_bdaddr_t)
+	.expected_property.len = sizeof(bt_bdaddr_t),
 };
 
 static char test_bdname[] = "test_bdname_setget";
@@ -774,7 +774,7 @@ static const struct generic_data bluetooth_setprop_uuid_invalid_test = {
 	.expected_adapter_status = BT_STATUS_FAIL,
 	.expected_property.type = BT_PROPERTY_UUIDS,
 	.expected_property.val = &setprop_uuids,
-	.expected_property.len = sizeof(setprop_uuids)
+	.expected_property.len = sizeof(setprop_uuids),
 };
 
 static uint32_t setprop_class_of_device = 0;
@@ -784,7 +784,7 @@ static const struct generic_data bluetooth_setprop_cod_invalid_test = {
 	.expected_adapter_status = BT_STATUS_FAIL,
 	.expected_property.type = BT_PROPERTY_CLASS_OF_DEVICE,
 	.expected_property.val = &setprop_class_of_device,
-	.expected_property.len = sizeof(setprop_class_of_device)
+	.expected_property.len = sizeof(setprop_class_of_device),
 };
 
 static bt_device_type_t setprop_type_of_device = BT_DEVICE_DEVTYPE_BREDR;
@@ -794,7 +794,7 @@ static const struct generic_data bluetooth_setprop_tod_invalid_test = {
 	.expected_adapter_status = BT_STATUS_FAIL,
 	.expected_property.type = BT_PROPERTY_TYPE_OF_DEVICE,
 	.expected_property.val = &setprop_type_of_device,
-	.expected_property.len = sizeof(setprop_type_of_device)
+	.expected_property.len = sizeof(setprop_type_of_device),
 };
 
 static int32_t setprop_remote_rssi = 0;
@@ -804,13 +804,13 @@ static const struct generic_data bluetooth_setprop_remote_rssi_invalid_test = {
 	.expected_adapter_status = BT_STATUS_FAIL,
 	.expected_property.type = BT_PROPERTY_REMOTE_RSSI,
 	.expected_property.val = &setprop_remote_rssi,
-	.expected_property.len = sizeof(setprop_remote_rssi)
+	.expected_property.len = sizeof(setprop_remote_rssi),
 };
 
 static bt_service_record_t setprop_remote_service = {
 	.uuid = { {0x00} },
 	.channel = 12,
-	.name = "bt_name"
+	.name = "bt_name",
 };
 
 static const struct generic_data
@@ -819,30 +819,30 @@ static const struct generic_data
 	.expected_adapter_status = BT_STATUS_FAIL,
 	.expected_property.type = BT_PROPERTY_SERVICE_RECORD,
 	.expected_property.val = &setprop_remote_service,
-	.expected_property.len = sizeof(setprop_remote_service)
+	.expected_property.len = sizeof(setprop_remote_service),
 };
 
 static const struct generic_data bluetooth_discovery_start_success_test = {
 	.expected_hal_callbacks = { ADAPTER_DISCOVERY_STATE_ON,
 							ADAPTER_TEST_END },
-	.expected_adapter_status = BT_STATUS_SUCCESS
+	.expected_adapter_status = BT_STATUS_SUCCESS,
 };
 
 static const struct generic_data bluetooth_discovery_start_done_test = {
 	.expected_hal_callbacks = { ADAPTER_DISCOVERY_STATE_ON,
 							ADAPTER_TEST_END },
-	.expected_adapter_status = BT_STATUS_DONE
+	.expected_adapter_status = BT_STATUS_DONE,
 };
 
 static const struct generic_data bluetooth_discovery_stop_done_test = {
 	.expected_hal_callbacks = { ADAPTER_TEST_END },
-	.expected_adapter_status = BT_STATUS_DONE
+	.expected_adapter_status = BT_STATUS_DONE,
 };
 
 static const struct generic_data bluetooth_discovery_stop_success_test = {
 	.expected_hal_callbacks = { ADAPTER_DISCOVERY_STATE_ON,
 				ADAPTER_DISCOVERY_STATE_OFF, ADAPTER_TEST_END },
-	.expected_adapter_status = BT_STATUS_SUCCESS
+	.expected_adapter_status = BT_STATUS_SUCCESS,
 };
 
 static const struct generic_data bluetooth_discovery_device_found_test = {
@@ -850,7 +850,7 @@ static const struct generic_data bluetooth_discovery_device_found_test = {
 						REMOTE_DEVICE_FOUND,
 						ADAPTER_DISCOVERY_STATE_OFF,
 						ADAPTER_TEST_END },
-	.expected_adapter_status = BT_STATUS_NOT_EXPECTED
+	.expected_adapter_status = BT_STATUS_NOT_EXPECTED,
 };
 
 static bt_callbacks_t bt_callbacks = {
@@ -1486,7 +1486,6 @@ static void test_listen_close(const void *test_data)
 clean:
 	if (sock_fd >= 0)
 		close(sock_fd);
-
 }
 
 static void test_listen_listen(const void *test_data)
@@ -1554,7 +1553,6 @@ clean:
 		close(sock_fd);
 }
 
-
 static gboolean socket_chan_cb(GIOChannel *io, GIOCondition cond,
 							gpointer user_data)
 {
-- 
1.8.4.2


^ permalink raw reply related

* [PATCH v2 3/6] android/tester: Change test data variables placement
From: Grzegorz Kolodziejczyk @ 2013-12-23 14:15 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1387808154-21661-1-git-send-email-grzegorz.kolodziejczyk@tieto.com>

This patch moves two test variables to proper place in code - before
test case init structs.
---
 android/android-tester.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/android/android-tester.c b/android/android-tester.c
index 2078a40..57f3fc9 100644
--- a/android/android-tester.c
+++ b/android/android-tester.c
@@ -47,10 +47,6 @@
 			ADAPTER_PROP_TYPE, ADAPTER_PROP_SCAN_MODE, \
 			ADAPTER_PROP_BONDED_DEVICES, ADAPTER_PROP_DISC_TIMEOUT
 
-static bt_scan_mode_t test_setprop_scanmode_val =
-					BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE;
-static uint32_t test_setprop_disctimeout_val = 120;
-
 /*
  * those are assigned to HAL methods and callbacks, we use ID later
  * on mapped in switch-case due to different functions prototypes.
@@ -727,6 +723,9 @@ static const struct generic_data bluetooth_setprop_bdname_success_test = {
 	.expected_property.len = 11
 };
 
+static bt_scan_mode_t test_setprop_scanmode_val =
+					BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE;
+
 static const struct generic_data bluetooth_setprop_scanmode_success_test = {
 	.expected_hal_callbacks = { ADAPTER_PROP_SCAN_MODE,
 						ADAPTER_PROP_SCAN_MODE,
@@ -737,6 +736,8 @@ static const struct generic_data bluetooth_setprop_scanmode_success_test = {
 	.expected_property.len = sizeof(bt_scan_mode_t)
 };
 
+static uint32_t test_setprop_disctimeout_val = 120;
+
 static const struct generic_data bluetooth_setprop_disctimeout_success_test = {
 	.expected_hal_callbacks = { ADAPTER_PROP_DISC_TIMEOUT, ADAPTER_TEST_END },
 	.expected_adapter_status = BT_STATUS_SUCCESS,
-- 
1.8.4.2


^ permalink raw reply related

* [PATCH v2 2/6] android/tester: Move BT discovery test cases before Socket Hal
From: Grzegorz Kolodziejczyk @ 2013-12-23 14:15 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1387808154-21661-1-git-send-email-grzegorz.kolodziejczyk@tieto.com>

This moves and organize test case data. BT discovery test cases to right
place in code.
---
 android/android-tester.c | 160 +++++++++++++++++++++++------------------------
 1 file changed, 80 insertions(+), 80 deletions(-)

diff --git a/android/android-tester.c b/android/android-tester.c
index f5ab14f..2078a40 100644
--- a/android/android-tester.c
+++ b/android/android-tester.c
@@ -933,7 +933,6 @@ static void setup(struct test_data *data)
 		tester_setup_failed();
 		return;
 	}
-
 }
 
 static void setup_base(const void *test_data)
@@ -1161,6 +1160,78 @@ static void test_setprop_service_record_invalid(const void *test_data)
 	check_expected_status(adapter_status);
 }
 
+static void test_discovery_start_success(const void *test_data)
+{
+	struct test_data *data = tester_get_data();
+	bt_status_t status;
+
+	init_test_conditions(data);
+
+	status = data->if_bluetooth->start_discovery();
+	check_expected_status(status);
+}
+
+static void test_discovery_stop_done(const void *test_data)
+{
+	struct test_data *data = tester_get_data();
+	bt_status_t status;
+
+	init_test_conditions(data);
+
+	status = data->if_bluetooth->cancel_discovery();
+	check_expected_status(status);
+}
+
+static bool pre_inq_compl_hook(const void *dummy, uint16_t len, void *user_data)
+{
+	struct test_data *data = tester_get_data();
+
+	/* Make sure Inquiry Command Complete is not called */
+
+	hciemu_del_hook(data->hciemu, HCIEMU_HOOK_PRE_EVT, BT_HCI_CMD_INQUIRY);
+
+	return false;
+}
+
+static void test_discovery_stop_success(const void *test_data)
+{
+	struct test_data *data = tester_get_data();
+	bt_status_t status;
+
+	data->userflag = DEVICE_DISCOVERY_CANCEL_ON_START;
+
+	init_test_conditions(data);
+
+	hciemu_add_hook(data->hciemu, HCIEMU_HOOK_PRE_EVT, BT_HCI_CMD_INQUIRY,
+					pre_inq_compl_hook, data);
+
+	status = data->if_bluetooth->start_discovery();
+	check_expected_status(status);
+}
+
+static void test_discovery_start_done(const void *test_data)
+{
+	struct test_data *data = tester_get_data();
+
+	data->userflag = DEVICE_DISCOVERY_START_ON_START;
+
+	init_test_conditions(data);
+
+	hciemu_add_hook(data->hciemu, HCIEMU_HOOK_PRE_EVT, BT_HCI_CMD_INQUIRY,
+					pre_inq_compl_hook, data);
+
+	data->if_bluetooth->start_discovery();
+}
+
+static void test_discovery_device_found(const void *test_data)
+{
+	struct test_data *data = tester_get_data();
+
+	init_test_conditions(data);
+
+	data->if_bluetooth->start_discovery();
+}
+
 /* Test Socket HAL */
 
 static void adapter_socket_state_changed_cb(bt_state_t state)
@@ -1482,77 +1553,6 @@ clean:
 		close(sock_fd);
 }
 
-static void test_discovery_start_success(const void *test_data)
-{
-	struct test_data *data = tester_get_data();
-	bt_status_t status;
-
-	init_test_conditions(data);
-
-	status = data->if_bluetooth->start_discovery();
-	check_expected_status(status);
-}
-
-static void test_discovery_stop_done(const void *test_data)
-{
-	struct test_data *data = tester_get_data();
-	bt_status_t status;
-
-	init_test_conditions(data);
-
-	status = data->if_bluetooth->cancel_discovery();
-	check_expected_status(status);
-}
-
-static bool pre_inq_compl_hook(const void *dummy, uint16_t len, void *user_data)
-{
-	struct test_data *data = tester_get_data();
-
-	/* Make sure Inquiry Command Complete is not called */
-
-	hciemu_del_hook(data->hciemu, HCIEMU_HOOK_PRE_EVT, BT_HCI_CMD_INQUIRY);
-
-	return false;
-}
-
-static void test_discovery_stop_success(const void *test_data)
-{
-	struct test_data *data = tester_get_data();
-	bt_status_t status;
-
-	data->userflag = DEVICE_DISCOVERY_CANCEL_ON_START;
-
-	init_test_conditions(data);
-
-	hciemu_add_hook(data->hciemu, HCIEMU_HOOK_PRE_EVT, BT_HCI_CMD_INQUIRY,
-					pre_inq_compl_hook, data);
-
-	status = data->if_bluetooth->start_discovery();
-	check_expected_status(status);
-}
-
-static void test_discovery_start_done(const void *test_data)
-{
-	struct test_data *data = tester_get_data();
-
-	data->userflag = DEVICE_DISCOVERY_START_ON_START;
-
-	init_test_conditions(data);
-
-	hciemu_add_hook(data->hciemu, HCIEMU_HOOK_PRE_EVT, BT_HCI_CMD_INQUIRY,
-					pre_inq_compl_hook, data);
-
-	data->if_bluetooth->start_discovery();
-}
-
-static void test_discovery_device_found(const void *test_data)
-{
-	struct test_data *data = tester_get_data();
-
-	init_test_conditions(data);
-
-	data->if_bluetooth->start_discovery();
-}
 
 static gboolean socket_chan_cb(GIOChannel *io, GIOCondition cond,
 							gpointer user_data)
@@ -1725,26 +1725,26 @@ int main(int argc, char *argv[])
 				setup_enabled_adapter,
 				test_setprop_service_record_invalid, teardown);
 
-	test_bredrle("Bluetooth BREDR Discovery Start - Done",
-				&bluetooth_discovery_start_done_test,
-				setup_enabled_adapter,
-				test_discovery_start_done, teardown);
-
 	test_bredrle("Bluetooth BREDR Discovery Start - Success",
 				&bluetooth_discovery_start_success_test,
 				setup_enabled_adapter,
 				test_discovery_start_success, teardown);
 
-	test_bredrle("Bluetooth BREDR Discovery Stop - Done",
-				&bluetooth_discovery_stop_done_test,
+	test_bredrle("Bluetooth BREDR Discovery Start - Done",
+				&bluetooth_discovery_start_done_test,
 				setup_enabled_adapter,
-				test_discovery_stop_done, teardown);
+				test_discovery_start_done, teardown);
 
 	test_bredrle("Bluetooth BREDR Discovery Stop - Success",
 				&bluetooth_discovery_stop_success_test,
 				setup_enabled_adapter,
 				test_discovery_stop_success, teardown);
 
+	test_bredrle("Bluetooth BREDR Discovery Stop - Done",
+				&bluetooth_discovery_stop_done_test,
+				setup_enabled_adapter,
+				test_discovery_stop_done, teardown);
+
 	test_bredrle("Bluetooth BREDR Discovery Device Found",
 				&bluetooth_discovery_device_found_test,
 				setup_enabled_adapter,
-- 
1.8.4.2


^ permalink raw reply related

* [PATCH v2 1/6] android/tester: Seperate Socket HAL cbs from Bluetooth HAL cb
From: Grzegorz Kolodziejczyk @ 2013-12-23 14:15 UTC (permalink / raw)
  To: linux-bluetooth

This patch adds seperate callbacks structure for socket HAL test cases.
Is's needed beceause Socket HAL cb have other purpose than Bluetooth HAL
cb. Callbacks are now initialized outside test setup function and
cb struct depends on HAL type.
---
 android/android-tester.c | 63 ++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 56 insertions(+), 7 deletions(-)

diff --git a/android/android-tester.c b/android/android-tester.c
index 0383115..f5ab14f 100644
--- a/android/android-tester.c
+++ b/android/android-tester.c
@@ -872,7 +872,6 @@ static void setup(struct test_data *data)
 {
 	const hw_module_t *module;
 	hw_device_t *device;
-	bt_status_t status;
 	int signal_fd[2];
 	char buf[1024];
 	pid_t pid;
@@ -935,19 +934,21 @@ static void setup(struct test_data *data)
 		return;
 	}
 
-	status = data->if_bluetooth->init(&bt_callbacks);
-	if (status != BT_STATUS_SUCCESS) {
-		data->if_bluetooth = NULL;
-		tester_setup_failed();
-	}
 }
 
 static void setup_base(const void *test_data)
 {
 	struct test_data *data = tester_get_data();
+	bt_status_t status;
 
 	setup(data);
 
+	status = data->if_bluetooth->init(&bt_callbacks);
+	if (status != BT_STATUS_SUCCESS) {
+		data->if_bluetooth = NULL;
+		tester_setup_failed();
+	}
+
 	tester_setup_complete();
 }
 
@@ -958,6 +959,11 @@ static void setup_enabled_adapter(const void *test_data)
 
 	setup(data);
 
+	status = data->if_bluetooth->init(&bt_callbacks);
+	if (status != BT_STATUS_SUCCESS) {
+		data->if_bluetooth = NULL;
+		tester_setup_failed();
+	}
 	status = data->if_bluetooth->enable();
 	if (status != BT_STATUS_SUCCESS)
 		tester_setup_failed();
@@ -1157,6 +1163,20 @@ static void test_setprop_service_record_invalid(const void *test_data)
 
 /* Test Socket HAL */
 
+static void adapter_socket_state_changed_cb(bt_state_t state)
+{
+	switch (state) {
+	case BT_STATE_ON:
+		setup_powered_emulated_remote();
+		break;
+	case BT_STATE_OFF:
+		tester_setup_failed();
+		break;
+	default:
+		break;
+	}
+}
+
 const bt_bdaddr_t bdaddr_dummy = {
 	.address = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55}
 };
@@ -1233,13 +1253,36 @@ static const struct socket_data btsock_inv_listen_listen = {
 	.test_channel = true,
 };
 
+static bt_callbacks_t bt_socket_callbacks = {
+	.size = sizeof(bt_callbacks),
+	.adapter_state_changed_cb = adapter_socket_state_changed_cb,
+	.adapter_properties_cb = NULL,
+	.remote_device_properties_cb = NULL,
+	.device_found_cb = NULL,
+	.discovery_state_changed_cb = NULL,
+	.pin_request_cb = NULL,
+	.ssp_request_cb = NULL,
+	.bond_state_changed_cb = NULL,
+	.acl_state_changed_cb = NULL,
+	.thread_evt_cb = NULL,
+	.dut_mode_recv_cb = NULL,
+	.le_test_mode_cb = NULL
+};
+
 static void setup_socket_interface(const void *test_data)
 {
 	struct test_data *data = tester_get_data();
+	bt_status_t status;
 	const void *sock;
 
 	setup(data);
 
+	status = data->if_bluetooth->init(&bt_socket_callbacks);
+	if (status != BT_STATUS_SUCCESS) {
+		data->if_bluetooth = NULL;
+		tester_setup_failed();
+	}
+
 	sock = data->if_bluetooth->get_profile_interface(BT_PROFILE_SOCKETS_ID);
 	if (!sock) {
 		tester_setup_failed();
@@ -1254,11 +1297,17 @@ static void setup_socket_interface(const void *test_data)
 static void setup_socket_interface_enabled(const void *test_data)
 {
 	struct test_data *data = tester_get_data();
-	const void *sock;
 	bt_status_t status;
+	const void *sock;
 
 	setup(data);
 
+	status = data->if_bluetooth->init(&bt_socket_callbacks);
+	if (status != BT_STATUS_SUCCESS) {
+		data->if_bluetooth = NULL;
+		tester_setup_failed();
+	}
+
 	sock = data->if_bluetooth->get_profile_interface(BT_PROFILE_SOCKETS_ID);
 	if (!sock) {
 		tester_setup_failed();
-- 
1.8.4.2


^ permalink raw reply related

* Re: [PATCH 2/4] android/bluetooth: Add support for DUT mode configure command
From: Andrei Emeltchenko @ 2013-12-23 14:14 UTC (permalink / raw)
  To: Marcel Holtmann; +Cc: Szymon Janc, linux-bluetooth@vger.kernel.org development
In-Reply-To: <D2E91E85-2775-4DBF-B220-3F039DB5C320@holtmann.org>

Hi Marcel,

On Mon, Dec 23, 2013 at 05:55:28AM -0800, Marcel Holtmann wrote:
> Hi Andrei,
> 
> >> This allows to enable and disable DUT mode.
> > 
> > Hi Szymon, could you add some more info about the mode?
> 
> please refer to the Bluetooth Core specification that explain Device Under Test (DUT) mode. It is a commonly used term. There is really no need to go all out and explain it here.
> 

I was referring mostly to /sys/ entry in the kernel.

Best regards 
Andrei Emeltchenko 

^ permalink raw reply

* [PATCH BlueZ 2/2] android/AVDTP: Fix ignoring endpoint delay reporting
From: Luiz Augusto von Dentz @ 2013-12-23 14:08 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1387807690-31617-1-git-send-email-luiz.dentz@gmail.com>

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

The code was setting TRUE ignoring what the caller set.
---
 android/avdtp.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/android/avdtp.c b/android/avdtp.c
index 3cf390f..473e02b 100644
--- a/android/avdtp.c
+++ b/android/avdtp.c
@@ -3280,7 +3280,7 @@ struct avdtp_local_sep *avdtp_register_sep(uint8_t type, uint8_t media_type,
 	sep->ind = ind;
 	sep->cfm = cfm;
 	sep->user_data = user_data;
-	sep->delay_reporting = TRUE;
+	sep->delay_reporting = delay_reporting;
 
 	DBG("SEP %p registered: type:%d codec:%d seid:%d", sep,
 			sep->info.type, sep->codec, sep->info.seid);
-- 
1.8.4.2


^ permalink raw reply related

* [PATCH BlueZ 1/2] android/AVDTP: Remove get_all parameter for get_capability callback
From: Luiz Augusto von Dentz @ 2013-12-23 14:08 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

This is not necessary anymore since all delay reporting is now added
automatically whenever supported.
---
 android/avdtp.c   | 4 ++--
 android/avdtp.h   | 1 -
 unit/test-avdtp.c | 8 ++++----
 3 files changed, 6 insertions(+), 7 deletions(-)

diff --git a/android/avdtp.c b/android/avdtp.c
index 02ee920..3cf390f 100644
--- a/android/avdtp.c
+++ b/android/avdtp.c
@@ -1192,8 +1192,8 @@ static gboolean avdtp_getcap_cmd(struct avdtp *session, uint8_t transaction,
 		goto failed;
 	}
 
-	if (!sep->ind->get_capability(session, sep, get_all, &caps,
-							&err, sep->user_data))
+	if (!sep->ind->get_capability(session, sep, &caps, &err,
+							sep->user_data))
 		goto failed;
 
 	for (l = caps, rsp_size = 0; l != NULL; l = g_slist_next(l)) {
diff --git a/android/avdtp.h b/android/avdtp.h
index d371653..e8d1907 100644
--- a/android/avdtp.h
+++ b/android/avdtp.h
@@ -161,7 +161,6 @@ struct avdtp_sep_cfm {
 struct avdtp_sep_ind {
 	gboolean (*get_capability) (struct avdtp *session,
 					struct avdtp_local_sep *sep,
-					gboolean get_all,
 					GSList **caps, uint8_t *err,
 					void *user_data);
 	gboolean (*set_configuration) (struct avdtp *session,
diff --git a/unit/test-avdtp.c b/unit/test-avdtp.c
index 458daa7..66c45f3 100644
--- a/unit/test-avdtp.c
+++ b/unit/test-avdtp.c
@@ -269,8 +269,8 @@ static void execute_context(struct context *context)
 
 static gboolean sep_getcap_ind(struct avdtp *session,
 					struct avdtp_local_sep *sep,
-					gboolean get_all, GSList **caps,
-					uint8_t *err, void *user_data)
+					GSList **caps, uint8_t *err,
+					void *user_data)
 {
 	struct avdtp_service_capability *media_transport, *media_codec;
 	struct avdtp_media_codec_capability *codec_caps;
@@ -550,8 +550,8 @@ static void test_server_0_sep(gconstpointer data)
 
 static gboolean sep_getcap_ind_frg(struct avdtp *session,
 					struct avdtp_local_sep *sep,
-					gboolean get_all, GSList **caps,
-					uint8_t *err, void *user_data)
+					GSList **caps, uint8_t *err,
+					void *user_data)
 {
 	struct avdtp_service_capability *media_transport, *media_codec;
 	struct avdtp_service_capability *content_protection;
-- 
1.8.4.2


^ permalink raw reply related

* Re: [PATCH v2 BlueZ] build: Add coverage support
From: Marcel Holtmann @ 2013-12-23 13:57 UTC (permalink / raw)
  To: Luiz Augusto von Dentz; +Cc: linux-bluetooth@vger.kernel.org
In-Reply-To: <CABBYNZ+zw_yuUbp1GvMVkOVDQUr_4Xup+SUy4nhj=kb_QaKXUg@mail.gmail.com>

Hi Luiz,

>> Coverage is enabled with --enable-maintainer-mode, 2 new targets are
>> added 'coverage' and 'clean-coverage', the first generate the reports
>> using lcov and depend on the second to cleanup previous generated
>> reports and .gcda files.
>> ---
>> .gitignore   |  4 ++++
>> Makefile.am  | 18 ++++++++++++++++++
>> acinclude.m4 |  4 ++++
>> configure.ac |  4 ++++
>> 4 files changed, 30 insertions(+)
>> 
>> diff --git a/.gitignore b/.gitignore
>> index c570728..21dbe26 100644
>> --- a/.gitignore
>> +++ b/.gitignore
>> @@ -3,6 +3,8 @@
>> *.lo
>> *.la
>> *.so
>> +*.gcno
>> +*.gcda
>> .deps
>> .libs
>> .dirstamp
>> @@ -27,7 +29,9 @@ stamp-h1
>> autom4te.cache
>> test-driver
>> test-suite.log
>> +coverage.info
>> 
>> +coverage
>> lib/bluez.pc
>> lib/bluetooth
>> src/builtin.h
>> diff --git a/Makefile.am b/Makefile.am
>> index 15cc149..7380e61 100644
>> --- a/Makefile.am
>> +++ b/Makefile.am
>> @@ -331,5 +331,23 @@ lib/bluetooth/%.h: lib/%.h
>>        $(AM_V_at)$(MKDIR_P) lib/bluetooth
>>        $(AM_V_GEN)$(LN_S) -f "$(abs_top_builddir)"/$< $@
>> 
>> +if MAINTAINER_MODE
>> +clean-coverage:
>> +       -find $(top_builddir) -name "*.gcda" -delete
>> +       @lcov --directory $(top_builddir) --zerocounters
>> +       $(RM) -r coverage $(top_builddir)/coverage.info
>> +
>> +coverage: clean-coverage check
>> +       @lcov --compat-libtool --directory $(top_builddir) --capture \
>> +                               --output-file $(top_builddir)/coverage.info
>> +       $(AM_V_at)$(MKDIR_P) coverage
>> +       @genhtml -o coverage/ $(top_builddir)/coverage.info
>> +
>> +clean-local: clean-coverage
>> +       -find $(top_builddir) -name "*.gcno" -delete
>> +       $(RM) -r lib/bluetooth
>> +
>> +else
>> clean-local:
>>        $(RM) -r lib/bluetooth
>> +endif
>> diff --git a/acinclude.m4 b/acinclude.m4
>> index 2065852..afc7c6d 100644
>> --- a/acinclude.m4
>> +++ b/acinclude.m4
>> @@ -51,6 +51,10 @@ AC_DEFUN([MISC_FLAGS], [
>>                        misc_ldflags="$misc_ldflags -pie"
>>                fi
>>        ])
>> +       if (test "$USE_MAINTAINER_MODE" = "yes"); then
>> +               misc_cflags="$misc_cflags --coverage"
>> +               misc_ldflags="$misc_ldflags --coverage"
>> +       fi
>>        AC_SUBST([MISC_CFLAGS], $misc_cflags)
>>        AC_SUBST([MISC_LDFLAGS], $misc_ldflags)
>> ])
>> diff --git a/configure.ac b/configure.ac
>> index 18d0b55..4f36355 100644
>> --- a/configure.ac
>> +++ b/configure.ac
>> @@ -252,4 +252,8 @@ AC_ARG_ENABLE(android, AC_HELP_STRING([--enable-android],
>>                                        [enable_android=${enableval}])
>> AM_CONDITIONAL(ANDROID, test "${enable_android}" = "yes")
>> 
>> +if (test "$USE_MAINTAINER_MODE" = "yes"); then
>> +       AC_CHECK_PROG([LCOV], [lcov], [yes], AC_MSG_ERROR(lcov is required))
>> +fi
>> +
>> AC_OUTPUT(Makefile src/bluetoothd.8 lib/bluez.pc)
>> --
>> 1.8.3.1
> 
> Any feedback regarding this patch? It is now using maintainer mode as
> you suggested.

I have not tested it yet. In general this looks just fine. However the if else with clean-local in each branches is still something that I think could be done a bit cleaner.

Regards

Marcel


^ permalink raw reply

* Re: [PATCH 2/4] android/bluetooth: Add support for DUT mode configure command
From: Marcel Holtmann @ 2013-12-23 13:55 UTC (permalink / raw)
  To: Andrei Emeltchenko
  Cc: Szymon Janc, linux-bluetooth@vger.kernel.org development
In-Reply-To: <20131223084607.GA19604@aemeltch-MOBL1>

Hi Andrei,

>> This allows to enable and disable DUT mode.
> 
> Hi Szymon, could you add some more info about the mode?

please refer to the Bluetooth Core specification that explain Device Under Test (DUT) mode. It is a commonly used term. There is really no need to go all out and explain it here.

Regards

Marcel


^ permalink raw reply

* Re: [PATCH v2 2/2] android/bluetooth: Print error on unimplemented functions
From: Marcel Holtmann @ 2013-12-23 13:53 UTC (permalink / raw)
  To: Szymon Janc; +Cc: linux-bluetooth@vger.kernel.org development
In-Reply-To: <1387796839-8164-2-git-send-email-szymon.janc@tieto.com>

Hi Szymon,

> Functions, callbacks or properties that are not implemented due to
> being bogus or not feasible now prints error messages.
> ---
> android/bluetooth.c | 22 ++++++++++++++++++++--
> 1 file changed, 20 insertions(+), 2 deletions(-)
> 
> diff --git a/android/bluetooth.c b/android/bluetooth.c
> index 59f0810..0700972 100644
> --- a/android/bluetooth.c
> +++ b/android/bluetooth.c
> @@ -2146,6 +2146,10 @@ static void handle_get_adapter_prop_cmd(const void *buf, uint16_t len)
> 		break;
> 	}
> 
> +	if (status != HAL_STATUS_SUCCESS && status != HAL_STATUS_DONE)
> +		error("Failed to get adapter property (type %u status %u)",
> +							cmd->type, status);
> +
> 	ipc_send_rsp(HAL_SERVICE_ID_BLUETOOTH, HAL_OP_GET_ADAPTER_PROP, status);
> }
> 
> @@ -2293,6 +2297,10 @@ static void handle_set_adapter_prop_cmd(const void *buf, uint16_t len)
> 		break;
> 	}
> 
> +	if (status != HAL_STATUS_SUCCESS && status != HAL_STATUS_DONE)
> +		error("Failed to set adapter property (type %u status %u)",
> +							cmd->type, status);
> +
> 	ipc_send_rsp(HAL_SERVICE_ID_BLUETOOTH, HAL_OP_SET_ADAPTER_PROP, status);
> }
> 
> @@ -2745,6 +2753,10 @@ static void handle_get_remote_device_prop_cmd(const void *buf, uint16_t len)
> 		break;
> 	}
> 
> +	if (status != HAL_STATUS_SUCCESS && status != HAL_STATUS_DONE)
> +		error("Failed to get device property (type %u status %u)",
> +							cmd->type, status);
> +
> failed:
> 	ipc_send_rsp(HAL_SERVICE_ID_BLUETOOTH, HAL_OP_GET_REMOTE_DEVICE_PROP,
> 								status);
> @@ -2809,6 +2821,10 @@ static void handle_set_remote_device_prop_cmd(const void *buf, uint16_t len)
> 		break;
> 	}
> 
> +	if (status != HAL_STATUS_SUCCESS && status != HAL_STATUS_DONE)
> +		error("Failed to set device property (type %u status %u)",
> +							cmd->type, status);
> +
> failed:
> 	ipc_send_rsp(HAL_SERVICE_ID_BLUETOOTH, HAL_OP_SET_REMOTE_DEVICE_PROP,
> 									status);
> @@ -2818,6 +2834,8 @@ static void handle_get_remote_service_rec_cmd(const void *buf, uint16_t len)
> {
> 	/* TODO */
> 
> +	error("get_remote_service_record not supported");
> +
> 	ipc_send_rsp(HAL_SERVICE_ID_BLUETOOTH, HAL_OP_GET_REMOTE_SERVICE_REC,
> 							HAL_STATUS_FAILED);
> }
> @@ -2914,7 +2932,7 @@ static void handle_dut_mode_send_cmd(const void *buf, uint16_t len)
> 		return;
> 	}
> 
> -	DBG("opcode %u", cmd->opcode);
> +	error("dut_mode_send not supported”);
> 
> 	/* TODO */
> 
> @@ -2932,7 +2950,7 @@ static void handle_le_test_mode_cmd(const void *buf, uint16_t len)
> 		return;
> 	}
> 
> -	DBG("opcode %u", cmd->opcode);
> +	error("le_test_mode not supported”);

please keep the cmd->opcode in the error message here in both cases. This is valuable information on what kind of HCI command the Java layer tries to send.

Regards

Marcel


^ permalink raw reply

* [PATCH] btdev: Return Command Status for Authentication Requested
From: Andrei Emeltchenko @ 2013-12-23 13:43 UTC (permalink / raw)
  To: linux-bluetooth

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

---
 emulator/btdev.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/emulator/btdev.c b/emulator/btdev.c
index d0dff74..9338260 100644
--- a/emulator/btdev.c
+++ b/emulator/btdev.c
@@ -1191,6 +1191,12 @@ static void default_cmd(struct btdev *btdev, uint16_t opcode,
 		cmd_status(btdev, BT_HCI_ERR_SUCCESS, opcode);
 		break;
 
+	case BT_HCI_CMD_AUTH_REQUESTED:
+		if (btdev->type == BTDEV_TYPE_LE)
+			return;
+		cmd_status(btdev, BT_HCI_ERR_SUCCESS, opcode);
+		break;
+
 	case BT_HCI_CMD_REMOTE_NAME_REQUEST:
 		if (btdev->type == BTDEV_TYPE_LE)
 			goto unsupported;
-- 
1.8.3.2


^ permalink raw reply related

* Re: [PATCH v2 1/2] android/bluetooth: Add support for DUT mode configure command
From: Luiz Augusto von Dentz @ 2013-12-23 12:48 UTC (permalink / raw)
  To: Szymon Janc; +Cc: linux-bluetooth@vger.kernel.org
In-Reply-To: <1387796839-8164-1-git-send-email-szymon.janc@tieto.com>

Hi Szymon,

On Mon, Dec 23, 2013 at 1:07 PM, Szymon Janc <szymon.janc@tieto.com> wrote:
> This allows to enable and disable DUT mode. This is special mode so
> adding more info from related kernel commit:
>
> "The Device Under Test (DUT) mode is useful for doing certification
> testing and so expose this as debugfs option.
>
> This mode is actually special since you can only enter it. Restoring
> normal operation means that a HCI Reset is required. The current mode
> value gets tracked as a new device flag and when disabling it, the
> correct command to reset the controller is sent."
> ---
>  android/bluetooth.c | 29 ++++++++++++++++++++++++++---
>  1 file changed, 26 insertions(+), 3 deletions(-)
>
> diff --git a/android/bluetooth.c b/android/bluetooth.c
> index 2e75864..59f0810 100644
> --- a/android/bluetooth.c
> +++ b/android/bluetooth.c
> @@ -50,6 +50,8 @@
>  #include "utils.h"
>  #include "bluetooth.h"
>
> +#define DUT_MODE_FILE "/sys/kernel/debug/bluetooth/hci%u/dut_mode"
> +
>  #define DEVICE_ID_SOURCE       0x0002  /* USB */
>  #define DEVICE_ID_VENDOR       0x1d6b  /* Linux Foundation */
>  #define DEVICE_ID_PRODUCT      0x0247  /* BlueZ for Android */
> @@ -2872,13 +2874,34 @@ failed:
>  static void handle_dut_mode_conf_cmd(const void *buf, uint16_t len)
>  {
>         const struct hal_cmd_dut_mode_conf *cmd = buf;
> +       char path[FILENAME_MAX];
> +       uint8_t status;
> +       int fd, ret;
>
>         DBG("enable %u", cmd->enable);
>
> -       /* TODO */
> +       snprintf(path, sizeof(path), DUT_MODE_FILE, adapter.index);
>
> -       ipc_send_rsp(HAL_SERVICE_ID_BLUETOOTH, HAL_OP_DUT_MODE_CONF,
> -                                                       HAL_STATUS_FAILED);
> +       fd = open(path, O_WRONLY);
> +       if (fd < 0) {
> +               status = HAL_STATUS_FAILED;
> +               goto failed;
> +       }
> +
> +       if (cmd->enable)
> +               ret = write(fd, "1", sizeof("1"));
> +       else
> +               ret = write(fd, "0", sizeof("0"));
> +
> +       if (ret < 0)
> +               status = HAL_STATUS_FAILED;
> +       else
> +               status = HAL_STATUS_SUCCESS;
> +
> +       close(fd);
> +
> +failed:
> +       ipc_send_rsp(HAL_SERVICE_ID_BLUETOOTH, HAL_OP_DUT_MODE_CONF, status);
>  }
>
>  static void handle_dut_mode_send_cmd(const void *buf, uint16_t len)
> --
> 1.8.3.2

Pushed, thanks.


-- 
Luiz Augusto von Dentz

^ permalink raw reply

* [PATCH 6/6] android/tester: Refactor HAL callback check
From: Grzegorz Kolodziejczyk @ 2013-12-23 11:50 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1387799429-6674-1-git-send-email-grzegorz.kolodziejczyk@tieto.com>

This patch removes ID enum in favour of test cases having their own as
implementation of callbacks checking test conditions.
Now each test case uses it own callback function and within it
test conditions are checked, e.g. with property get test case, property
and if it's properly cb is checked.
Count of expected callback is defined as a number and after calling
proper cb, value is decremented.
This also changes to generic - property check used within HAL cb.
---
 android/android-tester.c | 403 ++++++++++++++++++++++-------------------------
 1 file changed, 185 insertions(+), 218 deletions(-)

diff --git a/android/android-tester.c b/android/android-tester.c
index 77dfa89..8c12b70 100644
--- a/android/android-tester.c
+++ b/android/android-tester.c
@@ -42,39 +42,13 @@
 
 #include "utils.h"
 
-#define ADAPTER_PROPS ADAPTER_PROP_BDADDR, ADAPTER_PROP_BDNAME, \
-			ADAPTER_PROP_UUIDS, ADAPTER_PROP_COD, \
-			ADAPTER_PROP_TYPE, ADAPTER_PROP_SCAN_MODE, \
-			ADAPTER_PROP_BONDED_DEVICES, ADAPTER_PROP_DISC_TIMEOUT
-
-/*
- * those are assigned to HAL methods and callbacks, we use ID later
- * on mapped in switch-case due to different functions prototypes.
- */
-
-enum hal_bluetooth_callbacks_id {
-	ADAPTER_TEST_END,
-	ADAPTER_STATE_CHANGED_ON,
-	ADAPTER_STATE_CHANGED_OFF,
-	ADAPTER_PROP_BDADDR,
-	ADAPTER_PROP_BDNAME,
-	ADAPTER_PROP_UUIDS,
-	ADAPTER_PROP_COD,
-	ADAPTER_PROP_TYPE,
-	ADAPTER_PROP_SCAN_MODE,
-	ADAPTER_PROP_DISC_TIMEOUT,
-	ADAPTER_PROP_SERVICE_RECORD,
-	ADAPTER_PROP_BONDED_DEVICES,
-	ADAPTER_DISCOVERY_STATE_ON,
-	ADAPTER_DISCOVERY_STATE_OFF,
-	REMOTE_DEVICE_FOUND,
-};
-
 struct generic_data {
 	int expected_adapter_status;
 	uint32_t expect_settings_set;
+	int expected_cb_count;
+	bt_property_t set_property;
 	bt_property_t expected_property;
-	uint8_t expected_hal_callbacks[];
+	bt_callbacks_t expected_hal_cb;
 };
 
 struct socket_data {
@@ -93,10 +67,6 @@ struct socket_data {
 
 #define BT_STATUS_NOT_EXPECTED	-1
 
-/* User flags for Device Discovery */
-#define DEVICE_DISCOVERY_CANCEL_ON_START	0x01
-#define DEVICE_DISCOVERY_START_ON_START		0x02
-
 struct test_data {
 	struct mgmt *mgmt;
 	uint16_t mgmt_index;
@@ -111,14 +81,14 @@ struct test_data {
 	const btsock_interface_t *if_sock;
 
 	bool mgmt_settings_set;
-	bool hal_cb_called;
+	bool cb_count_checked;
 	bool status_checked;
 	bool property_checked;
 
-	bt_property_t test_property;
-	GSList *expected_callbacks;
+	/* Set to true if test conditions are initialized */
+	bool test_init_done;
 
-	uint32_t userflag;
+	int cb_count;
 };
 
 static char exec_dir[PATH_MAX + 1];
@@ -127,9 +97,9 @@ static void test_update_state(void)
 {
 	struct test_data *data = tester_get_data();
 
-	if (!(data->mgmt_settings_set))
+	if (!(data->cb_count_checked))
 		return;
-	if (!(data->hal_cb_called))
+	if (!(data->mgmt_settings_set))
 		return;
 	if (!(data->status_checked))
 		return;
@@ -194,27 +164,27 @@ static void command_generic_new_settings(uint16_t index, uint16_t length,
 	mgmt_unregister(data->mgmt, data->mgmt_settings_id);
 }
 
-static bool is_empty_halcb_list(void)
+static void check_cb_count(void)
 {
 	struct test_data *data = tester_get_data();
 
-	return !(g_slist_length(data->expected_callbacks));
+	if (!data->test_init_done)
+		return;
+
+	if (data->cb_count == 0)
+		data->cb_count_checked = true;
+
+	test_update_state();
 }
 
-static void hal_cb_init(struct test_data *data)
+static void expected_cb_count_init(struct test_data *data)
 {
 	const struct generic_data *test_data = data->test_data;
-	unsigned int i = 0;
 
-	while (test_data->expected_hal_callbacks[i]) {
-		data->expected_callbacks =
-			g_slist_append(data->expected_callbacks,
-		GINT_TO_POINTER(test_data->expected_hal_callbacks[i]));
-		i++;
-	}
+	data->cb_count = test_data->expected_cb_count;
+
+	check_cb_count();
 
-	if (is_empty_halcb_list())
-		data->hal_cb_called = true;
 }
 
 static void mgmt_cb_init(struct test_data *data)
@@ -241,13 +211,15 @@ static void test_property_init(struct test_data *data)
 {
 	const struct generic_data *test_data = data->test_data;
 
-	if (is_empty_halcb_list() || !(test_data->expected_property.type))
+	if (!test_data->expected_property.type)
 		data->property_checked = true;
 }
 
 static void init_test_conditions(struct test_data *data)
 {
-	hal_cb_init(data);
+	data->test_init_done = true;
+
+	expected_cb_count_init(data);
 	mgmt_cb_init(data);
 	expected_status_init(data);
 	test_property_init(data);
@@ -266,48 +238,20 @@ static void check_expected_status(uint8_t status)
 	test_update_state();
 }
 
-static void check_test_property(void)
-{
-	struct test_data *data = tester_get_data();
-	bt_property_t expected_prop = data->test_property;
-	const struct generic_data *test_data = data->test_data;
-	bt_property_t test_prop = test_data->expected_property;
-
-	if (test_prop.type && (expected_prop.type != test_prop.type)) {
-		tester_test_failed();
-		return;
-	}
-
-	if (test_prop.len && (expected_prop.len != test_prop.len)) {
-		tester_test_failed();
-		return;
-	}
-
-	if (test_prop.val && memcmp(expected_prop.val, test_prop.val,
-							expected_prop.len)) {
-		tester_test_failed();
-		return;
-	}
-
-	data->property_checked = true;
-	test_update_state();
-}
-
-static void update_hal_cb_list(enum hal_bluetooth_callbacks_id
-							expected_callback)
+static bool check_test_property(bt_property_t received_prop,
+						bt_property_t expected_prop)
 {
 	struct test_data *data = tester_get_data();
 
-	if (is_empty_halcb_list())
-		return;
-
-	data->expected_callbacks = g_slist_remove(data->expected_callbacks,
-					GINT_TO_POINTER(expected_callback));
-
-	if (!data->expected_callbacks)
-		data->hal_cb_called = true;
+	if (expected_prop.type && (expected_prop.type != received_prop.type))
+		return false;
+	if (expected_prop.len && (expected_prop.len != received_prop.len))
+		return false;
+	if (expected_prop.val && memcmp(expected_prop.val, received_prop.val,
+							expected_prop.len))
+		return false;
 
-	test_update_state();
+	return data->property_checked = true;
 }
 
 static void read_info_callback(uint8_t status, uint16_t length,
@@ -541,56 +485,98 @@ static void setup_powered_emulated_remote(void)
 		bthost_write_scan_enable(bthost, 0x03);
 }
 
+static void enable_success_cb(bt_state_t state)
+{
+	struct test_data *data = tester_get_data();
+
+	if (state == BT_STATE_ON) {
+		setup_powered_emulated_remote();
+		data->cb_count--;
+	}
+}
+
+static void disable_success_cb(bt_state_t state)
+{
+	struct test_data *data = tester_get_data();
+
+	if (state == BT_STATE_OFF)
+		data->cb_count--;
+}
+
 static void adapter_state_changed_cb(bt_state_t state)
 {
-	switch (state) {
-	case BT_STATE_ON:
-		if (is_empty_halcb_list())
-			setup_powered_emulated_remote();
-		update_hal_cb_list(ADAPTER_STATE_CHANGED_ON);
-		break;
-	case BT_STATE_OFF:
-		if (is_empty_halcb_list())
-			tester_setup_failed();
-		update_hal_cb_list(ADAPTER_STATE_CHANGED_OFF);
-		break;
-	default:
-		break;
+	struct test_data *data = tester_get_data();
+	const struct generic_data *test = data->test_data;
+
+	if (data->test_init_done &&
+			test->expected_hal_cb.adapter_state_changed_cb) {
+		test->expected_hal_cb.adapter_state_changed_cb(state);
+		check_cb_count();
+		return;
 	}
+
+	if (!data->test_init_done && state == BT_STATE_ON)
+		setup_powered_emulated_remote();
+}
+
+static void discovery_start_success_cb(bt_discovery_state_t state)
+{
+	struct test_data *data = tester_get_data();
+
+	if (state == BT_DISCOVERY_STARTED)
+		data->cb_count--;
 }
 
-static void post_discovery_started_cb(bt_discovery_state_t state)
+static void discovery_start_done_cb(bt_discovery_state_t state)
 {
 	struct test_data *data = tester_get_data();
 	bt_status_t status;
 
-	if (data->userflag & DEVICE_DISCOVERY_CANCEL_ON_START) {
+	status = data->if_bluetooth->start_discovery();
+	data->cb_count--;
+	check_expected_status(status);
+}
+
+static void discovery_stop_success_cb(bt_discovery_state_t state)
+{
+	struct test_data *data = tester_get_data();
+	bt_status_t status;
+
+	if (state == BT_DISCOVERY_STARTED && data->cb_count == 2) {
 		status = data->if_bluetooth->cancel_discovery();
 		check_expected_status(status);
+		data->cb_count--;
+		return;
 	}
+	if (state == BT_DISCOVERY_STOPPED && data->cb_count == 1)
+		data->cb_count--;
+}
 
-	if (data->userflag & DEVICE_DISCOVERY_START_ON_START) {
-		status = data->if_bluetooth->start_discovery();
-		check_expected_status(status);
+static void discovery_device_found_state_changed_cb(bt_discovery_state_t state)
+{
+	struct test_data *data = tester_get_data();
+
+	if (state == BT_DISCOVERY_STARTED && data->cb_count == 3) {
+		data->cb_count--;
+		return;
 	}
+	if (state == BT_DISCOVERY_STOPPED && data->cb_count == 1)
+		data->cb_count--;
 }
 
 static void discovery_state_changed_cb(bt_discovery_state_t state)
 {
-	switch (state) {
-	case BT_DISCOVERY_STARTED:
-		update_hal_cb_list(ADAPTER_DISCOVERY_STATE_ON);
-		post_discovery_started_cb(state);
-		break;
-	case BT_DISCOVERY_STOPPED:
-		update_hal_cb_list(ADAPTER_DISCOVERY_STATE_OFF);
-		break;
-	default:
-		break;
+	struct test_data *data = tester_get_data();
+	const struct generic_data *test = data->test_data;
+
+	if (test && test->expected_hal_cb.discovery_state_changed_cb) {
+		test->expected_hal_cb.discovery_state_changed_cb(state);
+		check_cb_count();
 	}
 }
 
-static void device_found_cb(int num_properties, bt_property_t *properties)
+static void discovery_device_found_cb(int num_properties,
+						bt_property_t *properties)
 {
 	struct test_data *data = tester_get_data();
 	const uint8_t *remote_bdaddr =
@@ -600,7 +586,7 @@ static void device_found_cb(int num_properties, bt_property_t *properties)
 	bt_bdaddr_t emu_remote_bdaddr;
 	int i;
 
-	update_hal_cb_list(REMOTE_DEVICE_FOUND);
+	data->cb_count--;
 
 	if (num_properties < 1)
 		tester_test_failed();
@@ -639,83 +625,75 @@ static void device_found_cb(int num_properties, bt_property_t *properties)
 	}
 }
 
-static void adapter_properties_cb(bt_status_t status, int num_properties,
+static void device_found_cb(int num_properties, bt_property_t *properties)
+{
+	struct test_data *data = tester_get_data();
+	const struct generic_data *test = data->test_data;
+
+	if (data->test_init_done && test->expected_hal_cb.device_found_cb) {
+		test->expected_hal_cb.device_found_cb(num_properties,
+								properties);
+		check_cb_count();
+	}
+}
+
+static void check_count_properties_cb(bt_status_t status, int num_properties,
 						bt_property_t *properties)
 {
 	struct test_data *data = tester_get_data();
-	int i;
 
-	if (is_empty_halcb_list())
-		return;
+	data->cb_count--;
+}
 
-	for (i = 0; i < num_properties; i++) {
+static void getprop_success_cb(bt_status_t status, int num_properties,
+						bt_property_t *properties)
+{
+	struct test_data *data = tester_get_data();
+	const struct generic_data *test = data->test_data;
 
-		data->test_property = properties[i];
+	if (check_test_property(properties[0], test->expected_property))
+		data->cb_count--;
+}
 
-		if (g_slist_length(data->expected_callbacks) == 1)
-			check_test_property();
+static void adapter_properties_cb(bt_status_t status, int num_properties,
+						bt_property_t *properties)
+{
+	struct test_data *data = tester_get_data();
+	const struct generic_data *test = data->test_data;
 
-		switch (properties[i].type) {
-		case BT_PROPERTY_BDADDR:
-			update_hal_cb_list(ADAPTER_PROP_BDADDR);
-			break;
-		case BT_PROPERTY_BDNAME:
-			update_hal_cb_list(ADAPTER_PROP_BDNAME);
-			break;
-		case BT_PROPERTY_UUIDS:
-			update_hal_cb_list(ADAPTER_PROP_UUIDS);
-			break;
-		case BT_PROPERTY_CLASS_OF_DEVICE:
-			update_hal_cb_list(ADAPTER_PROP_COD);
-			break;
-		case BT_PROPERTY_TYPE_OF_DEVICE:
-			update_hal_cb_list(ADAPTER_PROP_TYPE);
-			break;
-		case BT_PROPERTY_SERVICE_RECORD:
-			update_hal_cb_list(ADAPTER_PROP_SERVICE_RECORD);
-			break;
-		case BT_PROPERTY_ADAPTER_SCAN_MODE:
-			update_hal_cb_list(ADAPTER_PROP_SCAN_MODE);
-			break;
-		case BT_PROPERTY_ADAPTER_BONDED_DEVICES:
-			update_hal_cb_list(ADAPTER_PROP_BONDED_DEVICES);
-			break;
-		case BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT:
-			update_hal_cb_list(ADAPTER_PROP_DISC_TIMEOUT);
-			break;
-		default:
-			goto fail;
-		}
+	if (data->test_init_done &&
+				test->expected_hal_cb.adapter_properties_cb) {
+		test->expected_hal_cb.adapter_properties_cb(
+							status, num_properties,
+							properties);
+		check_cb_count();
 	}
-	return;
-
-fail:
-	tester_print("Unexpected property: %u", properties[i].type);
-	tester_test_failed();
-	return;
 }
 
 static const struct generic_data bluetooth_enable_success_test = {
-	.expected_hal_callbacks = { ADAPTER_PROPS, ADAPTER_STATE_CHANGED_ON,
-							ADAPTER_TEST_END },
+	.expected_hal_cb.adapter_state_changed_cb = enable_success_cb,
+	.expected_hal_cb.adapter_properties_cb = check_count_properties_cb,
+	.expected_cb_count = 9,
 	.expected_adapter_status = BT_STATUS_SUCCESS
 };
 
 static const struct generic_data bluetooth_enable_done_test = {
-	.expected_hal_callbacks = { ADAPTER_PROPS, ADAPTER_TEST_END },
+	.expected_hal_cb.adapter_properties_cb = check_count_properties_cb,
+	.expected_cb_count = 8,
 	.expected_adapter_status = BT_STATUS_DONE
 };
 
 static const struct generic_data bluetooth_disable_success_test = {
-	.expected_hal_callbacks = { ADAPTER_STATE_CHANGED_OFF,
-							ADAPTER_TEST_END },
+	.expected_hal_cb.adapter_state_changed_cb = disable_success_cb,
+	.expected_cb_count = 1,
 	.expected_adapter_status = BT_STATUS_SUCCESS
 };
 
 static char test_set_bdname[] = "test_bdname_set";
 
 static const struct generic_data bluetooth_setprop_bdname_success_test = {
-	.expected_hal_callbacks = { ADAPTER_PROP_BDNAME, ADAPTER_TEST_END },
+	.expected_hal_cb.adapter_properties_cb = getprop_success_cb,
+	.expected_cb_count = 1,
 	.expected_adapter_status = BT_STATUS_SUCCESS,
 	.expected_property.type = BT_PROPERTY_BDNAME,
 	.expected_property.val = test_set_bdname,
@@ -726,9 +704,8 @@ static bt_scan_mode_t test_setprop_scanmode_val =
 					BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE;
 
 static const struct generic_data bluetooth_setprop_scanmode_success_test = {
-	.expected_hal_callbacks = { ADAPTER_PROP_SCAN_MODE,
-						ADAPTER_PROP_SCAN_MODE,
-						ADAPTER_TEST_END },
+	.expected_hal_cb.adapter_properties_cb = getprop_success_cb,
+	.expected_cb_count = 1,
 	.expected_adapter_status = BT_STATUS_SUCCESS,
 	.expected_property.type = BT_PROPERTY_ADAPTER_SCAN_MODE,
 	.expected_property.val = &test_setprop_scanmode_val,
@@ -738,7 +715,8 @@ static const struct generic_data bluetooth_setprop_scanmode_success_test = {
 static uint32_t test_setprop_disctimeout_val = 120;
 
 static const struct generic_data bluetooth_setprop_disctimeout_success_test = {
-	.expected_hal_callbacks = { ADAPTER_PROP_DISC_TIMEOUT, ADAPTER_TEST_END },
+	.expected_hal_cb.adapter_properties_cb = getprop_success_cb,
+	.expected_cb_count = 1,
 	.expected_adapter_status = BT_STATUS_SUCCESS,
 	.expected_property.type = BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT,
 	.expected_property.val = &test_setprop_disctimeout_val,
@@ -746,7 +724,8 @@ static const struct generic_data bluetooth_setprop_disctimeout_success_test = {
 };
 
 static const struct generic_data bluetooth_getprop_bdaddr_success_test = {
-	.expected_hal_callbacks = { ADAPTER_PROP_BDADDR, ADAPTER_TEST_END },
+	.expected_hal_cb.adapter_properties_cb = getprop_success_cb,
+	.expected_cb_count = 1,
 	.expected_adapter_status = BT_STATUS_SUCCESS,
 	.expected_property.type = BT_PROPERTY_BDADDR,
 	.expected_property.val = NULL,
@@ -756,8 +735,8 @@ static const struct generic_data bluetooth_getprop_bdaddr_success_test = {
 static char test_bdname[] = "test_bdname_setget";
 
 static const struct generic_data bluetooth_getprop_bdname_success_test = {
-	.expected_hal_callbacks = { ADAPTER_PROP_BDNAME, ADAPTER_PROP_BDNAME,
-							ADAPTER_TEST_END },
+	.expected_hal_cb.adapter_properties_cb = getprop_success_cb,
+	.expected_cb_count = 1,
 	.expected_adapter_status = BT_STATUS_SUCCESS,
 	.expected_property.type = BT_PROPERTY_BDNAME,
 	.expected_property.val = test_bdname,
@@ -769,41 +748,37 @@ static unsigned char setprop_uuids[] = { 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00,
 			0x00, 0x00 };
 
 static const struct generic_data bluetooth_setprop_uuid_invalid_test = {
-	.expected_hal_callbacks = { ADAPTER_TEST_END },
 	.expected_adapter_status = BT_STATUS_FAIL,
-	.expected_property.type = BT_PROPERTY_UUIDS,
-	.expected_property.val = &setprop_uuids,
-	.expected_property.len = sizeof(setprop_uuids)
+	.set_property.type = BT_PROPERTY_UUIDS,
+	.set_property.val = &setprop_uuids,
+	.set_property.len = sizeof(setprop_uuids)
 };
 
 static uint32_t setprop_class_of_device = 0;
 
 static const struct generic_data bluetooth_setprop_cod_invalid_test = {
-	.expected_hal_callbacks = { ADAPTER_TEST_END },
 	.expected_adapter_status = BT_STATUS_FAIL,
-	.expected_property.type = BT_PROPERTY_CLASS_OF_DEVICE,
-	.expected_property.val = &setprop_class_of_device,
-	.expected_property.len = sizeof(setprop_class_of_device)
+	.set_property.type = BT_PROPERTY_CLASS_OF_DEVICE,
+	.set_property.val = &setprop_class_of_device,
+	.set_property.len = sizeof(setprop_class_of_device)
 };
 
 static bt_device_type_t setprop_type_of_device = BT_DEVICE_DEVTYPE_BREDR;
 
 static const struct generic_data bluetooth_setprop_tod_invalid_test = {
-	.expected_hal_callbacks = { ADAPTER_TEST_END },
 	.expected_adapter_status = BT_STATUS_FAIL,
-	.expected_property.type = BT_PROPERTY_TYPE_OF_DEVICE,
-	.expected_property.val = &setprop_type_of_device,
-	.expected_property.len = sizeof(setprop_type_of_device)
+	.set_property.type = BT_PROPERTY_TYPE_OF_DEVICE,
+	.set_property.val = &setprop_type_of_device,
+	.set_property.len = sizeof(setprop_type_of_device)
 };
 
 static int32_t setprop_remote_rssi = 0;
 
 static const struct generic_data bluetooth_setprop_remote_rssi_invalid_test = {
-	.expected_hal_callbacks = { ADAPTER_TEST_END },
 	.expected_adapter_status = BT_STATUS_FAIL,
-	.expected_property.type = BT_PROPERTY_REMOTE_RSSI,
-	.expected_property.val = &setprop_remote_rssi,
-	.expected_property.len = sizeof(setprop_remote_rssi)
+	.set_property.type = BT_PROPERTY_REMOTE_RSSI,
+	.set_property.val = &setprop_remote_rssi,
+	.set_property.len = sizeof(setprop_remote_rssi)
 };
 
 static bt_service_record_t setprop_remote_service = {
@@ -814,41 +789,40 @@ static bt_service_record_t setprop_remote_service = {
 
 static const struct generic_data
 			bluetooth_setprop_service_record_invalid_test = {
-	.expected_hal_callbacks = { ADAPTER_TEST_END },
 	.expected_adapter_status = BT_STATUS_FAIL,
-	.expected_property.type = BT_PROPERTY_SERVICE_RECORD,
-	.expected_property.val = &setprop_remote_service,
-	.expected_property.len = sizeof(setprop_remote_service)
+	.set_property.type = BT_PROPERTY_SERVICE_RECORD,
+	.set_property.val = &setprop_remote_service,
+	.set_property.len = sizeof(setprop_remote_service)
 };
 
 static const struct generic_data bluetooth_discovery_start_success_test = {
-	.expected_hal_callbacks = { ADAPTER_DISCOVERY_STATE_ON,
-							ADAPTER_TEST_END },
+	.expected_hal_cb.discovery_state_changed_cb =
+						discovery_start_success_cb,
+	.expected_cb_count = 1,
 	.expected_adapter_status = BT_STATUS_SUCCESS
 };
 
 static const struct generic_data bluetooth_discovery_start_done_test = {
-	.expected_hal_callbacks = { ADAPTER_DISCOVERY_STATE_ON,
-							ADAPTER_TEST_END },
+	.expected_hal_cb.discovery_state_changed_cb = discovery_start_done_cb,
+	.expected_cb_count = 1,
 	.expected_adapter_status = BT_STATUS_DONE
 };
 
 static const struct generic_data bluetooth_discovery_stop_done_test = {
-	.expected_hal_callbacks = { ADAPTER_TEST_END },
 	.expected_adapter_status = BT_STATUS_DONE
 };
 
 static const struct generic_data bluetooth_discovery_stop_success_test = {
-	.expected_hal_callbacks = { ADAPTER_DISCOVERY_STATE_ON,
-				ADAPTER_DISCOVERY_STATE_OFF, ADAPTER_TEST_END },
+	.expected_hal_cb.discovery_state_changed_cb = discovery_stop_success_cb,
+	.expected_cb_count = 2,
 	.expected_adapter_status = BT_STATUS_SUCCESS
 };
 
 static const struct generic_data bluetooth_discovery_device_found_test = {
-	.expected_hal_callbacks = { ADAPTER_DISCOVERY_STATE_ON,
-						REMOTE_DEVICE_FOUND,
-						ADAPTER_DISCOVERY_STATE_OFF,
-						ADAPTER_TEST_END },
+	.expected_hal_cb.discovery_state_changed_cb =
+					discovery_device_found_state_changed_cb,
+	.expected_hal_cb.device_found_cb = discovery_device_found_cb,
+	.expected_cb_count = 3,
 	.expected_adapter_status = BT_STATUS_NOT_EXPECTED
 };
 
@@ -982,9 +956,6 @@ static void teardown(const void *test_data)
 	if (data->bluetoothd_pid)
 		waitpid(data->bluetoothd_pid, NULL, 0);
 
-	if (data->expected_callbacks)
-		g_slist_free(data->expected_callbacks);
-
 	tester_teardown_complete();
 }
 
@@ -1125,7 +1096,7 @@ static void test_setprop_tod_invalid(const void *test_data)
 {
 	struct test_data *data = tester_get_data();
 	const struct generic_data *test = data->test_data;
-	const bt_property_t *prop = &test->expected_property;
+	const bt_property_t *prop = &test->set_property;
 	bt_status_t adapter_status;
 
 	init_test_conditions(data);
@@ -1198,8 +1169,6 @@ static void test_discovery_stop_success(const void *test_data)
 	struct test_data *data = tester_get_data();
 	bt_status_t status;
 
-	data->userflag = DEVICE_DISCOVERY_CANCEL_ON_START;
-
 	init_test_conditions(data);
 
 	hciemu_add_hook(data->hciemu, HCIEMU_HOOK_PRE_EVT, BT_HCI_CMD_INQUIRY,
@@ -1213,8 +1182,6 @@ static void test_discovery_start_done(const void *test_data)
 {
 	struct test_data *data = tester_get_data();
 
-	data->userflag = DEVICE_DISCOVERY_START_ON_START;
-
 	init_test_conditions(data);
 
 	hciemu_add_hook(data->hciemu, HCIEMU_HOOK_PRE_EVT, BT_HCI_CMD_INQUIRY,
-- 
1.8.4.2


^ permalink raw reply related

* [PATCH 5/6] android/tester: Correct bdname set test case struc conditions
From: Grzegorz Kolodziejczyk @ 2013-12-23 11:50 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1387799429-6674-1-git-send-email-grzegorz.kolodziejczyk@tieto.com>

This patch correct struct elements initialization. Now test name is
declared as variable before test case struct and its size is calculated
using sizeof(), not by hard coded number.
---
 android/android-tester.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/android/android-tester.c b/android/android-tester.c
index 547488e..77dfa89 100644
--- a/android/android-tester.c
+++ b/android/android-tester.c
@@ -712,12 +712,14 @@ static const struct generic_data bluetooth_disable_success_test = {
 	.expected_adapter_status = BT_STATUS_SUCCESS
 };
 
+static char test_set_bdname[] = "test_bdname_set";
+
 static const struct generic_data bluetooth_setprop_bdname_success_test = {
 	.expected_hal_callbacks = { ADAPTER_PROP_BDNAME, ADAPTER_TEST_END },
 	.expected_adapter_status = BT_STATUS_SUCCESS,
 	.expected_property.type = BT_PROPERTY_BDNAME,
-	.expected_property.val = "test_bdname",
-	.expected_property.len = 11
+	.expected_property.val = test_set_bdname,
+	.expected_property.len = sizeof(test_set_bdname) - 1
 };
 
 static bt_scan_mode_t test_setprop_scanmode_val =
-- 
1.8.4.2


^ permalink raw reply related

* [PATCH 4/6] android/tester: Whitespace and semicolon style correction
From: Grzegorz Kolodziejczyk @ 2013-12-23 11:50 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1387799429-6674-1-git-send-email-grzegorz.kolodziejczyk@tieto.com>

This patch correct redundant semicolon (in other test cases there were
no semicolon at last struct element). Additional whitespace was removed
from function.
---
 android/android-tester.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/android/android-tester.c b/android/android-tester.c
index 2a9323f..547488e 100644
--- a/android/android-tester.c
+++ b/android/android-tester.c
@@ -759,7 +759,7 @@ static const struct generic_data bluetooth_getprop_bdname_success_test = {
 	.expected_adapter_status = BT_STATUS_SUCCESS,
 	.expected_property.type = BT_PROPERTY_BDNAME,
 	.expected_property.val = test_bdname,
-	.expected_property.len = sizeof(test_bdname) - 1,
+	.expected_property.len = sizeof(test_bdname) - 1
 };
 
 static unsigned char setprop_uuids[] = { 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00,
@@ -1483,7 +1483,6 @@ static void test_listen_close(const void *test_data)
 clean:
 	if (sock_fd >= 0)
 		close(sock_fd);
-
 }
 
 static void test_listen_listen(const void *test_data)
@@ -1551,7 +1550,6 @@ clean:
 		close(sock_fd);
 }
 
-
 static gboolean socket_chan_cb(GIOChannel *io, GIOCondition cond,
 							gpointer user_data)
 {
-- 
1.8.4.2


^ permalink raw reply related


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox