Skip to content

Commit

Permalink
[unit] Added test for Transceive D-Bus call. JB#50041
Browse files Browse the repository at this point in the history
  • Loading branch information
monich committed Sep 2, 2020
1 parent 3ac3108 commit 37679ed
Show file tree
Hide file tree
Showing 5 changed files with 468 additions and 237 deletions.
157 changes: 143 additions & 14 deletions unit/common/test_target.c
Expand Up @@ -30,30 +30,91 @@
* THE POSSIBILITY OF SUCH DAMAGE.
*/

#include "test_common.h"
#include "test_target.h"
#include "nfc_target_impl.h"

typedef NfcTargetClass TestTargetClass;
typedef NfcTarget TestTarget;
#include <gutil_log.h>

G_DEFINE_TYPE(TestTarget, test_target, NFC_TYPE_TARGET)
#define TEST_TYPE_TARGET (test_target_get_type())

NfcTarget*
test_target_new(
void)
static
GUtilData*
test_target_next_data(
TestTarget* self)
{
return g_object_new(TEST_TYPE_TARGET, NULL);
if (self->cmd_resp->len) {
GUtilData* data = self->cmd_resp->pdata[0];

self->cmd_resp->pdata[0] = NULL;
g_ptr_array_remove_index(self->cmd_resp, 0);
return data;
}
return NULL;
}

NfcTarget*
test_target_new_tech(
NFC_TECHNOLOGY tech)
static
gboolean
test_target_transmit_done(
gpointer user_data)
{
NfcTarget* tag = test_target_new();
TestTarget* self = TEST_TARGET(user_data);
NfcTarget* target = &self->target;

tag->technology = tech;
return tag;
g_assert(self->transmit_id);
self->transmit_id = 0;
if (self->cmd_resp->len) {
GUtilData* data = test_target_next_data(self);

if (data) {
nfc_target_transmit_done(target, NFC_TRANSMIT_STATUS_OK,
data->bytes, data->size);
g_free(data);
} else {
nfc_target_transmit_done(target, NFC_TRANSMIT_STATUS_ERROR,
NULL, 0);
}
} else {
nfc_target_transmit_done(target, NFC_TRANSMIT_STATUS_ERROR, NULL, 0);
}
return G_SOURCE_REMOVE;
}

static
gboolean
test_target_transmit(
NfcTarget* target,
const void* data,
guint len)
{
TestTarget* self = TEST_TARGET(target);
GUtilData* expected = test_target_next_data(self);

if (self->fail_transmit < 0 ||
(self->fail_transmit > 0 && --self->fail_transmit == 0)) {
GDEBUG("Simulating transmit failure");
g_free(expected);
return FALSE;
} else {
if (expected) {
g_assert_cmpuint(expected->size, ==, len);
g_assert(!memcmp(data, expected->bytes, len));
g_free(expected);
}
self->transmit_id = g_idle_add(test_target_transmit_done, self);
return TRUE;
}
}

static
void
test_target_cancel_transmit(
NfcTarget* target)
{
TestTarget* self = TEST_TARGET(target);

g_assert(self->transmit_id);
g_source_remove(self->transmit_id);
self->transmit_id = 0;
}

static
Expand All @@ -69,14 +130,82 @@ void
test_target_init(
TestTarget* self)
{
self->fail_transmit = -1; /* Always fail everything by default */
self->cmd_resp = g_ptr_array_new_with_free_func(g_free);
}

static
void
test_target_finalize(
GObject* object)
{
TestTarget* self = TEST_TARGET(object);

if (self->transmit_id) {
g_source_remove(self->transmit_id);
}
g_ptr_array_free(self->cmd_resp, TRUE);
G_OBJECT_CLASS(test_target_parent_class)->finalize(object);
}

static
void
test_target_class_init(
NfcTargetClass* klass)
{
klass->transmit = test_target_transmit;
klass->cancel_transmit = test_target_cancel_transmit;
klass->deactivate = test_target_deactivate;
G_OBJECT_CLASS(klass)->finalize = test_target_finalize;
}

NfcTarget*
test_target_new(
void)
{
return g_object_new(TEST_TYPE_TARGET, NULL);
}

NfcTarget*
test_target_new_tech(
NFC_TECHNOLOGY tech)
{
NfcTarget* target = test_target_new();

target->technology = tech;
return target;
}

NfcTarget*
test_target_new_tech_with_data(
NFC_TECHNOLOGY tech,
const void* cmd_bytes,
guint cmd_len,
const void* resp_bytes,
guint resp_len)
{
TestTarget* self = g_object_new(TEST_TYPE_TARGET, NULL);

self->target.technology = tech;
self->fail_transmit = 0;
g_ptr_array_add(self->cmd_resp, test_alloc_data(cmd_bytes, cmd_len));
g_ptr_array_add(self->cmd_resp, test_alloc_data(resp_bytes, resp_len));
return &self->target;
}

void
test_target_add_data(
NfcTarget* target,
const void* cmd_bytes,
guint cmd_len,
const void* resp_bytes,
guint resp_len)
{
TestTarget* self = TEST_TARGET(target);

self->fail_transmit = 0;
g_ptr_array_add(self->cmd_resp, test_alloc_data(cmd_bytes, cmd_len));
g_ptr_array_add(self->cmd_resp, test_alloc_data(resp_bytes, resp_len));
}

/*
Expand Down
34 changes: 33 additions & 1 deletion unit/common/test_target.h
Expand Up @@ -33,7 +33,20 @@
#ifndef TEST_TARGET_H
#define TEST_TARGET_H

#include <nfc_types.h>
#include "nfc_target_impl.h"

typedef NfcTargetClass TestTargetClass;
typedef struct test_target {
NfcTarget target;
guint transmit_id;
GPtrArray* cmd_resp;
int fail_transmit;
} TestTarget;

GType test_target_get_type(void);
#define TEST_TYPE_TARGET (test_target_get_type())
#define TEST_TARGET(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, \
TEST_TYPE_TARGET, TestTarget))

NfcTarget*
test_target_new(
Expand All @@ -43,6 +56,25 @@ NfcTarget*
test_target_new_tech(
NFC_TECHNOLOGY tech);

NfcTarget*
test_target_new_tech_with_data(
NFC_TECHNOLOGY tech,
const void* cmd_bytes,
guint cmd_len,
const void* resp_bytes,
guint resp_len);

#define test_target_new_with_data(cmd,cmd_len,resp,resp_len) \
test_target_new_tech_with_data(NFC_TECHNOLOGY_A,cmd,cmd_len,resp,resp_len)

void
test_target_add_data(
NfcTarget* target,
const void* cmd_bytes,
guint cmd_len,
const void* resp_bytes,
guint resp_len);

#endif /* TEST_TARGET_H */

/*
Expand Down
2 changes: 2 additions & 0 deletions unit/core_tag_t4/Makefile
Expand Up @@ -2,4 +2,6 @@

EXE = test_core_tag_t4

COMMON_SRC = test_main.c test_target.c

include ../common/Makefile

0 comments on commit 37679ed

Please sign in to comment.