Re: [PATCH BlueZ 2/2] unit/test-gatt: Add SERVER and COEX test types and MTU tests.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

> On Wed, Nov 19, 2014 at 9:03 PM, Arman Uguray <armansito@xxxxxxxxxxxx> wrote:
> This patch adds support for the following two features:
>
>   1. SERVER: The test context creates a bt_gatt_server.
>   2. COEX: The test context creates a bt_gatt_server AND a bt_gatt_client.
>
> Also added 4 new test cases for the "Server Configuration" category, with two
> new client-role and two new server-role tests which exercise the following:
>
> /TP/GAC/CL/BV-01-C:
>   1. CLIENT test with incoming "Exchange MTU" request. bt_att automatically
>   responds with "ERROR_NOT_SUPPORTED".
>   2. COEX test. The "DUT" sends "Exchange MTU" request first and the "tester"
>   sends it right after.
>
> /TP/GAC/SR/BV-01-C:
>   1. SERVER test with incoming "Exchange MTU" request. No outgoing request.
>   2. COEX test. The "tester" sends "Exchange MTU" request first and the "DUT"
>   sends it right after.
> ---
>  unit/test-gatt.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++----
>  1 file changed, 95 insertions(+), 6 deletions(-)
>
> diff --git a/unit/test-gatt.c b/unit/test-gatt.c
> index 900f5e3..7ab7780 100644
> --- a/unit/test-gatt.c
> +++ b/unit/test-gatt.c
> @@ -40,6 +40,9 @@
>  #include "src/shared/att.h"
>  #include "src/shared/gatt-helpers.h"
>  #include "src/shared/gatt-client.h"
> +#include "src/shared/queue.h"
> +#include "src/shared/gatt-db.h"
> +#include "src/shared/gatt-server.h"
>
>  struct test_pdu {
>         bool valid;
> @@ -50,7 +53,8 @@ struct test_pdu {
>  enum context_type {
>         ATT,
>         CLIENT,
> -       SERVER
> +       SERVER,
> +       COEX
>  };
>
>  struct gatt_service {
> @@ -72,7 +76,9 @@ struct test_data {
>  struct context {
>         GMainLoop *main_loop;
>         struct bt_gatt_client *client;
> +       struct bt_gatt_server *server;
>         struct bt_att *att;
> +       struct gatt_db *db;
>         guint source;
>         guint process;
>         int fd;
> @@ -114,9 +120,13 @@ struct context {
>  #define define_test_client(name, function, bt_services, test_step, args...)\
>         define_test(name, function, CLIENT, NULL, bt_services, test_step, args)
>
> -#define SERVICE_DATA_1_PDU                                             \
> -               raw_pdu(0x02, 0x00, 0x02),                              \
> -               raw_pdu(0x03, 0x00, 0x02),                              \
> +#define define_test_server(name, function, bt_services, test_step, args...)\
> +       define_test(name, function, SERVER, NULL, bt_services, test_step, args)
> +
> +#define define_test_coex(name, function, bt_services, test_step, args...)\
> +       define_test(name, function, COEX, NULL, bt_services, test_step, args)
> +
> +#define SERVICE_DATA_1_DISCOVERY_PDU                                   \
>                 raw_pdu(0x10, 0x01, 0x00, 0xff, 0xff, 0x00, 0x28),      \
>                 raw_pdu(0x11, 0x06, 0x01, 0x00, 0x04, 0x00, 0x01, 0x18),\
>                 raw_pdu(0x10, 0x05, 0x00, 0xff, 0xff, 0x00, 0x28),      \
> @@ -144,6 +154,11 @@ struct context {
>                 raw_pdu(0x04, 0x08, 0x00, 0x08, 0x00),                  \
>                 raw_pdu(0x05, 0x01, 0x08, 0x00, 0x01, 0x29)
>
> +#define SERVICE_DATA_1_PDU                                             \
> +               raw_pdu(0x02, 0x00, 0x02),                              \
> +               raw_pdu(0x03, 0x00, 0x02),                              \
> +               SERVICE_DATA_1_DISCOVERY_PDU
> +
>  static bt_uuid_t uuid_16 = {
>         .type = BT_UUID16,
>         .value.u16 = 0x1800
> @@ -282,11 +297,18 @@ static gboolean send_pdu(gpointer user_data)
>
>  static void context_process(struct context *context)
>  {
> +       /* Quit the context if we processed the last PDU */
>         if (!context->data->pdu_list[context->pdu_offset].valid) {
>                 context_quit(context);
>                 return;
>         }
>
> +       /* Skip the PDU, if it's empty */
> +       if (!context->data->pdu_list[context->pdu_offset].size) {
> +               context->pdu_offset++;
> +               return;
> +       }
> +
>         context->process = g_idle_add(send_pdu, context);
>  }
>
> @@ -427,6 +449,7 @@ static struct context *create_context(uint16_t mtu, gconstpointer data)
>         GIOChannel *channel;
>         int err, sv[2];
>         struct bt_att *att;
> +       bool coex = false;
>
>         context->main_loop = g_main_loop_new(NULL, FALSE);
>         g_assert(context->main_loop);
> @@ -447,6 +470,22 @@ static struct context *create_context(uint16_t mtu, gconstpointer data)
>
>                 bt_gatt_exchange_mtu(context->att, mtu, NULL, NULL, NULL);
>                 break;
> +       case COEX:
> +               coex = true;
> +       case SERVER:
> +               context->db = gatt_db_new();
> +               g_assert(context->db);
> +
> +               context->server = bt_gatt_server_new(context->db, att, mtu);
> +               g_assert(context->server);
> +
> +               if (g_test_verbose())
> +                       bt_gatt_server_set_debug(context->server, print_debug,
> +                                               "bt_gatt_server:", NULL);
> +               if (!coex) {
> +                       bt_att_unref(att);
> +                       break;
> +               }
>         case CLIENT:
>                 context->client = bt_gatt_client_new(att, mtu, NULL);
>                 g_assert(context->client);
> @@ -500,6 +539,8 @@ static void destroy_context(struct context *context)
>                 g_source_remove(context->source);
>
>         bt_gatt_client_unref(context->client);
> +       bt_gatt_server_unref(context->server);
> +       gatt_db_destroy(context->db);
>
>         if (context->att)
>                 bt_att_unref(context->att);
> @@ -577,6 +618,22 @@ static void test_client(gconstpointer data)
>         execute_context(context);
>  }
>
> +static void test_server(gconstpointer data)
> +{
> +       struct context *context = create_context(512, data);
> +       const struct test_pdu pdu = raw_pdu(0x02, 0x17, 0x00);
> +       ssize_t len;
> +
> +       len = write(context->fd, pdu.data, pdu.size);
> +
> +       if (g_test_verbose())
> +               util_hexdump('<', pdu.data, len, test_debug, "GATT: ");
> +
> +       g_assert_cmpint(len, ==, pdu.size);
> +
> +       execute_context(context);
> +}
> +
>  static void test_search_primary(gconstpointer data)
>  {
>         struct context *context = create_context(512, data);
> @@ -708,11 +765,43 @@ int main(int argc, char *argv[])
>          * Server Configuration
>          *
>          * The test group objective is to verify Generic Attribute Profile
> -        * Server Configuration.
> +        * Server Configuration. The tested configurations are:
> +        *
> +        *   1. Client-role only.
> +        *   2. Server-role only.
> +        *   3. Both roles with only bt_gatt_client.
> +        *   4. Both roles with bt_gatt_client and bt_gatt_server (client
> +        *      request first).
> +        *   5. Both roles with bt_gatt_client and bt_gatt_server (server
> +        *      response first).
>          */
>
>         define_test_client("/TP/GAC/CL/BV-01-C", test_client, NULL, NULL,
> -                               raw_pdu(0x02, 0x00, 0x02));
> +                                               raw_pdu(0x02, 0x00, 0x02));
> +
> +       define_test_server("/TP/GAC/SR/BV-01-C", test_server, NULL, NULL,
> +                                               raw_pdu(0x03, 0x00, 0x02));
> +
> +       define_test_client("/TP/GAC/CL/BV-01-C", test_client, NULL, NULL,
> +                                       raw_pdu(0x02, 0x00, 0x02),
> +                                       raw_pdu(0x02, 0x17, 0x00),
> +                                       raw_pdu(0x01, 0x02, 0x00, 0x00, 0x06),
> +                                       raw_pdu(0x03, 0x17, 0x00),
> +                                       SERVICE_DATA_1_DISCOVERY_PDU);
> +
> +       define_test_coex("/TP/GAC/CL/BV-01-C", test_client, NULL, NULL,
> +                                               raw_pdu(0x02, 0x00, 0x02),
> +                                               raw_pdu(0x02, 0x17, 0x00),
> +                                               raw_pdu(0x03, 0x00, 0x02),
> +                                               raw_pdu(0x03, 0x17, 0x00),
> +                                               SERVICE_DATA_1_DISCOVERY_PDU);
> +
> +       define_test_coex("/TP/GAC/SR/BV-01-C", test_server, NULL, NULL,
> +                                               raw_pdu(0x03, 0x00, 0x02),
> +                                               raw_pdu(),  /* wait */
> +                                               raw_pdu(0x02, 0x00, 0x02),
> +                                               raw_pdu(0x03, 0x17, 0x00),
> +                                               SERVICE_DATA_1_DISCOVERY_PDU);
>
>         /*
>          * Discovery
> --
> 2.1.0.rc2.206.gedb03e5
>

ping.
--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux