Re: [PATCH 5/5] android/tester: add initial support for map-client tester

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

 



Hi Szymon,

On 10 December 2014 at 13:56, Szymon Janc <szymon.janc@xxxxxxxxx> wrote:
> Hi Grzegorz,
>
> Start commit message with capital letter.
>
> On Monday 08 of December 2014 11:35:08 Grzegorz Kolodziejczyk wrote:
>> This adds callback, callback verification, step verification, mas
>> instance verification, map client profile setup handling and basic
>> files.
>> ---
>>  android/Makefile.am         |   1 +
>>  android/tester-main.c       | 160
>> ++++++++++++++++++++++++++++++++++++++++++++ android/tester-main.h       |
>> 18 +++++
>>  android/tester-map-client.c |  43 ++++++++++++
>>  4 files changed, 222 insertions(+)
>>  create mode 100644 android/tester-map-client.c
>>
>> diff --git a/android/Makefile.am b/android/Makefile.am
>> index 6d74c05..deea6c3 100644
>> --- a/android/Makefile.am
>> +++ b/android/Makefile.am
>> @@ -154,6 +154,7 @@ android_android_tester_SOURCES = emulator/hciemu.h
>> emulator/hciemu.c \ android/tester-a2dp.c \
>>                               android/tester-avrcp.c \
>>                               android/tester-gatt.c \
>> +                             android/tester-map-client.c \
>>                               android/tester-main.h android/tester-main.c
>>  android_android_tester_CFLAGS = $(AM_CFLAGS) -I$(srcdir)/android \
>>                               -DPLUGINDIR=\""$(android_plugindir)"\"
>> diff --git a/android/tester-main.c b/android/tester-main.c
>> index 06730d2..19d25fc 100644
>> --- a/android/tester-main.c
>> +++ b/android/tester-main.c
>> @@ -111,6 +111,9 @@ static struct {
>>       DBG_CB(CB_GATTS_REQUEST_EXEC_WRITE),
>>       DBG_CB(CB_GATTS_RESPONSE_CONFIRMATION),
>>
>> +     /* Map client */
>> +     DBG_CB(CB_MAP_CLIENT_GET_REMOTE_MAS_INSTANCES),
>> +
>>       /* Emulator callbacks */
>>       DBG_CB(CB_EMU_CONFIRM_SEND_DATA),
>>       DBG_CB(CB_EMU_ENCRYPTION_ENABLED),
>> @@ -484,6 +487,40 @@ static bool match_property(bt_property_t *exp_prop,
>> bt_property_t *rec_prop, return 1;
>>  }
>>
>> +static bool match_mas_inst(btmce_mas_instance_t *exp_inst,
>> +                             btmce_mas_instance_t *rec_inst, int inst_num)
>> +{
>> +     if (exp_inst->id && (exp_inst->id != rec_inst->id)) {
>> +             tester_debug("Mas instance [%d] id don't match! received=%d, "
>> +                                     "expected=%d", inst_num, rec_inst->id,
>> +                                     exp_inst->id);
>
> Something is wrong with this indentation. Also I'd prefer if you could try not
> breaking formatting strings.
>
>> +             return 0;
>> +     }
>> +
>> +     if (exp_inst->scn && (exp_inst->scn != exp_inst->scn)) {
>> +             tester_debug("Mas instance [%d] scn don't match! received=%d, "
>> +                                     "expected=%d", inst_num, rec_inst->scn,
>> +                                     exp_inst->scn);
>> +             return 0;
>> +     }
>> +
>> +     if (exp_inst->msg_types && (exp_inst->msg_types !=
>> +                                                     exp_inst->msg_types)) {
>> +             tester_debug("Mas instance [%d] message type don't match! "
>> +                                     "received=%d, expected=%d", inst_num,
>> +                                     rec_inst->scn, exp_inst->scn);
>> +             return 0;
>> +     }
>> +
>> +     if (exp_inst->p_name && memcmp(exp_inst->p_name, rec_inst->p_name,
>> +                                             strlen(exp_inst->p_name))) {
>> +             tester_debug("Mas instance [%d] name don't match!", inst_num);
>> +             return 0;
>> +     }
>> +
>> +     return 1;
>> +}
>> +
>>  static int verify_property(bt_property_t *exp_props, int exp_num_props,
>>                               bt_property_t *rec_props, int rec_num_props)
>>  {
>> @@ -511,6 +548,33 @@ static int verify_property(bt_property_t *exp_props,
>> int exp_num_props, return exp_prop_to_find;
>>  }
>>
>> +static int verify_mas_inst(btmce_mas_instance_t *exp_inst, int
>> exp_num_inst, +                                               btmce_mas_instance_t  *rec_inst,
>> +                                             int rec_num_inst)
>> +{
>
> Some coding style violation here.
>
>> +     int i, j;
>> +     int exp_inst_to_find = exp_num_inst;
>> +
>> +     for (i = 0; i < exp_num_inst; i++) {
>> +             for (j = 0; j < rec_num_inst; j++) {
>> +                     if (match_mas_inst(&exp_inst[i], &rec_inst[i], i)) {
>> +                             exp_inst_to_find--;
>> +                             break;
>> +                     }
>> +             }
>> +     }
>> +
>> +     if ((i == 0) && exp_num_inst) {
>> +             tester_warn("No mas instance was verified: %s", exp_num_inst ?
>> +                             "unknown error!" :
>> +                             "wrong \'.callback_result.num_properties\'?");
>> +
>
> This is ugly. Make those messages shorter.
>
>> +             return 1;
>> +     }
>> +
>> +     return exp_inst_to_find;
>> +}
>> +
>>  /*
>>   * Check each test case step if test case expected
>>   * data is set and match it with expected result.
>> @@ -945,6 +1009,15 @@ static bool match_data(struct step *step)
>>               return false;
>>       }
>>
>> +     if (exp->callback_result.mas_instances &&
>> +             verify_mas_inst(exp->callback_result.mas_instances,
>> +                             exp->callback_result.num_mas_instances,
>> +                             step->callback_result.mas_instances,
>> +                             step->callback_result.num_mas_instances)) {
>> +             tester_debug("Mas instances don't match");
>> +             return false;
>> +     }
>> +
>>       if (exp->store_srvc_handle)
>>               memcpy(exp->store_srvc_handle,
>>                                       step->callback_result.srvc_handle,
>> @@ -2032,6 +2105,47 @@ static btrc_callbacks_t btavrcp_callbacks = {
>>       .get_element_attr_cb = avrcp_get_element_attr_cb,
>>  };
>>
>> +static btmce_mas_instance_t *copy_map_instances(int num_instances,
>> +                                             btmce_mas_instance_t *instances)
>> +{
>> +     int i;
>> +     btmce_mas_instance_t *inst = g_new0(btmce_mas_instance_t,
>> +                                                             num_instances);
>
> Just put this into new line.
>
>> +
>> +     for (i = 0; i < num_instances; i++) {
>> +             inst[i].id = instances[i].id;
>> +             inst[i].scn = instances[i].scn;
>> +             inst[i].msg_types = instances[i].msg_types;
>> +             inst[i].p_name = g_memdup(instances[i].p_name,
>> +                                             strlen(instances[i].p_name));
>> +     }
>> +
>> +     return inst;
>> +}
>> +
>> +static void map_client_get_remote_mas_instances_cb(bt_status_t status,
>> +                                                     bt_bdaddr_t *bd_addr,
>> +                                                     int num_instances,
>> +                                                     btmce_mas_instance_t
>> +                                                     *instances)
>> +{
>> +     struct step *step = g_new0(struct step, 1);
>> +
>> +     step->callback_result.status = status;
>> +     step->callback_result.num_mas_instances = num_instances;
>> +     step->callback_result.mas_instances = copy_map_instances(num_instances,
>> +                                                             instances);
>> +
>> +     step->callback = CB_MAP_CLIENT_GET_REMOTE_MAS_INSTANCES;
>> +
>> +     schedule_callback_verification(step);
>> +}
>> +
>> +static btmce_callbacks_t btmap_client_callbacks = {
>> +     .size = sizeof(btmap_client_callbacks),
>> +     .remote_mas_instances_cb = map_client_get_remote_mas_instances_cb,
>> +};
>> +
>>  static bool setup_base(struct test_data *data)
>>  {
>>       const hw_module_t *module;
>> @@ -2396,6 +2510,44 @@ static void setup_gatt(const void *test_data)
>>       tester_setup_complete();
>>  }
>>
>> +static void setup_map_client(const void *test_data)
>> +{
>> +     struct test_data *data = tester_get_data();
>> +     bt_status_t status;
>> +     const void *map_client;
>> +
>> +     if (!setup_base(data)) {
>> +             tester_setup_failed();
>> +             return;
>> +     }
>> +
>> +     status = data->if_bluetooth->init(&bt_callbacks);
>> +     if (status != BT_STATUS_SUCCESS) {
>> +             data->if_bluetooth = NULL;
>> +             tester_setup_failed();
>> +             return;
>> +     }
>> +
>> +     map_client = data->if_bluetooth->get_profile_interface(
>> +                                             BT_PROFILE_MAP_CLIENT_ID);
>> +     if (!map_client) {
>> +             tester_setup_failed();
>> +             return;
>> +     }
>> +
>> +     data->if_map_client = map_client;
>> +
>> +     status = data->if_map_client->init(&btmap_client_callbacks);
>> +     if (status != BT_STATUS_SUCCESS) {
>> +             data->if_map_client = NULL;
>> +
>> +             tester_setup_failed();
>> +             return;
>> +     }
>> +
>> +     tester_setup_complete();
>> +}
>> +
>>  static void teardown(const void *test_data)
>>  {
>>       struct test_data *data = tester_get_data();
>> @@ -3101,6 +3253,13 @@ static void add_gatt_tests(void *data, void
>> *user_data) test(tc, setup_gatt, generic_test_function, teardown);
>>  }
>>
>> +static void add_map_client_tests(void *data, void *user_data)
>> +{
>> +     struct test_case *tc = data;
>> +
>> +     test(tc, setup_map_client, generic_test_function, teardown);
>> +}
>> +
>>  int main(int argc, char *argv[])
>>  {
>>       snprintf(exec_dir, sizeof(exec_dir), "%s", dirname(argv[0]));
>> @@ -3115,6 +3274,7 @@ int main(int argc, char *argv[])
>>       queue_foreach(get_a2dp_tests(), add_a2dp_tests, NULL);
>>       queue_foreach(get_avrcp_tests(), add_avrcp_tests, NULL);
>>       queue_foreach(get_gatt_tests(), add_gatt_tests, NULL);
>> +     queue_foreach(get_map_client_tests(), add_map_client_tests, NULL);
>>
>>       if (tester_run())
>>               return 1;
>> diff --git a/android/tester-main.h b/android/tester-main.h
>> index ae65d72..55f5f5d 100644
>> --- a/android/tester-main.h
>> +++ b/android/tester-main.h
>> @@ -55,6 +55,7 @@
>>  #include <hardware/bt_gatt.h>
>>  #include <hardware/bt_gatt_client.h>
>>  #include <hardware/bt_gatt_server.h>
>> +#include <hardware/bt_mce.h>
>>
>>  struct pdu_set {
>>       struct iovec req;
>> @@ -539,6 +540,9 @@ typedef enum {
>>       CB_GATTS_REQUEST_EXEC_WRITE,
>>       CB_GATTS_RESPONSE_CONFIRMATION,
>>
>> +     /* Map client */
>> +     CB_MAP_CLIENT_GET_REMOTE_MAS_INSTANCES,
>> +
>>       /* Emulator callbacks */
>>       CB_EMU_CONFIRM_SEND_DATA,
>>       CB_EMU_ENCRYPTION_ENABLED,
>> @@ -566,6 +570,7 @@ struct test_data {
>>       struct audio_stream_out *if_stream;
>>       const btrc_interface_t *if_avrcp;
>>       const btgatt_interface_t *if_gatt;
>> +     const btmce_interface_t *if_map_client;
>>
>>       const void *test_data;
>>       struct queue *steps;
>> @@ -625,6 +630,14 @@ struct emu_l2cap_cid_data {
>>       bool is_sdp;
>>  };
>>
>> +struct map_inst_data {
>> +     int32_t id;
>> +     int32_t scn;
>> +     int32_t msg_types;
>> +     int32_t name_len;
>> +     uint8_t *name;
>> +};
>> +
>>  /*
>>   * Callback data structure should be enhanced with data
>>   * returned by callbacks. It's used for test case step
>> @@ -688,6 +701,9 @@ struct bt_callback_data {
>>       uint64_t rc_index;
>>       uint8_t num_of_attrs;
>>       btrc_element_attr_val_t *attrs;
>> +
>> +     int num_mas_instances;
>> +     btmce_mas_instance_t *mas_instances;
>>  };
>>
>>  /*
>> @@ -737,6 +753,8 @@ struct queue *get_avrcp_tests(void);
>>  void remove_avrcp_tests(void);
>>  struct queue *get_gatt_tests(void);
>>  void remove_gatt_tests(void);
>> +struct queue *get_map_client_tests(void);
>> +void remove_map_client_tests(void);
>>
>>  /* Generic tester API */
>>  void schedule_action_verification(struct step *step);
>> diff --git a/android/tester-map-client.c b/android/tester-map-client.c
>> new file mode 100644
>> index 0000000..a2bb08f
>> --- /dev/null
>> +++ b/android/tester-map-client.c
>> @@ -0,0 +1,43 @@
>> +/*
>> + * Copyright (C) 2014 Intel Corporation
>> + *
>> + * Licensed under the Apache License, Version 2.0 (the "License");
>> + * you may not use this file except in compliance with the License.
>> + * You may obtain a copy of the License at
>> + *
>> + *      http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing, software
>> + * distributed under the License is distributed on an "AS IS" BASIS,
>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>> + * See the License for the specific language governing permissions and + *
>> limitations under the License.
>> + *
>> + */
>> +
>> +#include "tester-main.h"
>> +
>> +static struct queue *list; /* List of map client test cases */
>> +
>> +static struct test_case test_cases[] = {
>> +     TEST_CASE_BREDRLE("MAP Client Init", ACTION_SUCCESS(dummy_action, NULL),
>> +     ),
>> +};
>> +
>> +struct queue *get_map_client_tests(void)
>> +{
>> +     uint16_t i = 0;
>> +
>> +     list = queue_new();
>> +
>> +     for (; i < sizeof(test_cases) / sizeof(test_cases[0]); ++i)
>> +             if (!queue_push_tail(list, &test_cases[i]))
>> +                     return NULL;
>> +
>
> This probably makes static checkers unhappy. I'd prefer you explicitly check
> if queue_new() succeed and clean it up if push failed.
>
> (you may also want to fix that in other testers)
>
>> +     return list;
>> +}
>> +
>> +void remove_map_client_tests(void)
>> +{
>> +     queue_destroy(list, NULL);
>> +}

I'll take those comments into consideration and send v2.
>
> --
> BR
> Szymon Janc

BR
Grzegorz Kołodziejczyk
--
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