[unit] More unit tests

This commit is contained in:
Slava Monich
2022-04-22 04:04:02 +03:00
parent ebff1ad75c
commit fdcd1f626b
8 changed files with 502 additions and 17 deletions

View File

@@ -1,7 +1,9 @@
# -*- Mode: makefile-gmake -*-
.PHONY: clean all debug release
.PHONY: debug_lib release_lib coverage_lib
.PHONY: print_debug_so print_release_so
.PHONY: print_debug_lib print_release_lib print_coverage_lib
.PHONY: pkgconfig install install-dev
@@ -61,6 +63,7 @@ INCLUDE_DIR = include
BUILD_DIR = build
DEBUG_BUILD_DIR = $(BUILD_DIR)/debug
RELEASE_BUILD_DIR = $(BUILD_DIR)/release
COVERAGE_BUILD_DIR = $(BUILD_DIR)/coverage
#
# Tools and flags
@@ -68,6 +71,7 @@ RELEASE_BUILD_DIR = $(BUILD_DIR)/release
CC = $(CROSS_COMPILE)gcc
LD = $(CC)
STRIP ?= strip
WARNINGS = -Wall -Wstrict-aliasing -Wunused-result
INCLUDES = -I$(INCLUDE_DIR)
BASE_FLAGS = -fPIC
@@ -77,6 +81,7 @@ FULL_LDFLAGS = $(BASE_FLAGS) $(LDFLAGS) -shared -Wl,-soname,$(LIB_SONAME) \
$(shell pkg-config --libs $(PKGS)) -lpthread
DEBUG_FLAGS = -g
RELEASE_FLAGS =
COVERAGE_FLAGS = -g
KEEP_SYMBOLS ?= 0
ifneq ($(KEEP_SYMBOLS),0)
@@ -87,6 +92,7 @@ DEBUG_LDFLAGS = $(FULL_LDFLAGS) $(DEBUG_FLAGS)
RELEASE_LDFLAGS = $(FULL_LDFLAGS) $(RELEASE_FLAGS)
DEBUG_CFLAGS = $(FULL_CFLAGS) $(DEBUG_FLAGS) -DDEBUG
RELEASE_CFLAGS = $(FULL_CFLAGS) $(RELEASE_FLAGS) -O2
COVERAGE_CFLAGS = $(FULL_CFLAGS) $(COVERAGE_FLAGS) --coverage
#
# Files
@@ -95,6 +101,7 @@ RELEASE_CFLAGS = $(FULL_CFLAGS) $(RELEASE_FLAGS) -O2
PKGCONFIG = $(BUILD_DIR)/$(LIB_NAME).pc
DEBUG_OBJS = $(SRC:%.c=$(DEBUG_BUILD_DIR)/%.o)
RELEASE_OBJS = $(SRC:%.c=$(RELEASE_BUILD_DIR)/%.o)
COVERAGE_OBJS = $(SRC:%.c=$(COVERAGE_BUILD_DIR)/%.o)
#
# Dependencies
@@ -110,6 +117,7 @@ endif
$(PKGCONFIG): | $(BUILD_DIR)
$(DEBUG_OBJS) $(DEBUG_SO): | $(DEBUG_BUILD_DIR)
$(RELEASE_OBJS) $(RELEASE_SO): | $(RELEASE_BUILD_DIR)
$(COVERAGE_OBJS) $(COVERAGE_LIB): | $(COVERAGE_BUILD_DIR)
#
# Rules
@@ -119,11 +127,20 @@ DEBUG_SO = $(DEBUG_BUILD_DIR)/$(LIB_SO)
RELEASE_SO = $(RELEASE_BUILD_DIR)/$(LIB_SO)
DEBUG_LINK = $(DEBUG_BUILD_DIR)/$(LIB_SYMLINK1)
RELEASE_LINK = $(RELEASE_BUILD_DIR)/$(LIB_SYMLINK1)
DEBUG_LIB = $(DEBUG_BUILD_DIR)/$(LIB)
RELEASE_LIB = $(RELEASE_BUILD_DIR)/$(LIB)
COVERAGE_LIB = $(COVERAGE_BUILD_DIR)/$(LIB)
debug: $(DEBUG_SO)
release: $(RELEASE_SO)
debug_lib: $(DEBUG_LIB)
release_lib: $(RELEASE_LIB)
coverage_lib: $(COVERAGE_LIB)
pkgconfig: $(PKGCONFIG)
print_debug_so:
@@ -132,6 +149,15 @@ print_debug_so:
print_release_so:
@echo $(RELEASE_SO)
print_debug_lib:
@echo $(DEBUG_LIB)
print_release_lib:
@echo $(RELEASE_LIB)
print_coverage_lib:
@echo $(COVERAGE_LIB)
clean:
rm -f *~ $(SRC_DIR)/*~ $(INCLUDE_DIR)/*~
rm -fr $(BUILD_DIR)
@@ -145,12 +171,18 @@ $(DEBUG_BUILD_DIR):
$(RELEASE_BUILD_DIR):
mkdir -p $@
$(COVERAGE_BUILD_DIR):
mkdir -p $@
$(DEBUG_BUILD_DIR)/%.o : $(SRC_DIR)/%.c
$(CC) -c $(DEBUG_CFLAGS) -MT"$@" -MF"$(@:%.o=%.d)" $< -o $@
$(RELEASE_BUILD_DIR)/%.o : $(SRC_DIR)/%.c
$(CC) -c $(RELEASE_CFLAGS) -MT"$@" -MF"$(@:%.o=%.d)" $< -o $@
$(COVERAGE_BUILD_DIR)/%.o : $(SRC_DIR)/%.c
$(CC) -c $(COVERAGE_CFLAGS) -MT"$@" -MF"$(@:%.o=%.d)" $< -o $@
$(DEBUG_SO): $(DEBUG_OBJS)
$(LD) $(DEBUG_OBJS) $(DEBUG_LDFLAGS) -o $@
ln -sf $(LIB_SO) $(DEBUG_LINK)
@@ -162,6 +194,18 @@ ifeq ($(KEEP_SYMBOLS),0)
strip $@
endif
$(DEBUG_LIB): $(DEBUG_OBJS)
$(AR) rc $@ $?
ranlib $@
$(RELEASE_LIB): $(RELEASE_OBJS)
$(AR) rc $@ $?
ranlib $@
$(COVERAGE_LIB): $(COVERAGE_OBJS)
$(AR) rc $@ $?
ranlib $@
#
# LIBDIR usually gets substituted with arch specific dir.
# It's relative in deb build and can be whatever in rpm build.

View File

@@ -5,6 +5,8 @@
all:
%:
@$(MAKE) -C unit_base $*
@$(MAKE) -C unit_ext_ims $*
@$(MAKE) -C unit_ext_slot $*
@$(MAKE) -C unit_sim_settings $*
clean: unitclean

View File

@@ -2,6 +2,7 @@
.PHONY: clean cleaner unitclean all debug release coverage valgrind
.PHONY: debug_lib release_lib coverage_lib
.PHONY: debug_ext_lib release_ext_lib coverage_ext_lib
.PHONY: test test_banner
#
@@ -34,6 +35,7 @@ all: debug release
SRC_DIR = .
LIB_DIR = ../..
EXT_DIR = $(LIB_DIR)/lib
COMMON_DIR = ../common
BUILD_DIR = build
DEBUG_BUILD_DIR = $(BUILD_DIR)/debug
@@ -51,7 +53,7 @@ COMMON_COVERAGE_BUILD_DIR = $(COMMON_BUILD_DIR)/coverage
CC ?= $(CROSS_COMPILE)gcc
LD = $(CC)
WARNINGS += -Wall -Wno-deprecated-declarations
INCLUDES += -I$(COMMON_DIR) -I$(LIB_DIR)/src -I$(LIB_DIR)/include
INCLUDES += -I$(COMMON_DIR) -I$(LIB_DIR)/src -I$(EXT_DIR)/include
BASE_FLAGS = -fPIC
FULL_CFLAGS = $(BASE_FLAGS) $(CFLAGS) $(DEFINES) $(WARNINGS) $(INCLUDES) \
-MMD -MP $(shell pkg-config --cflags $(PKGS))
@@ -78,9 +80,17 @@ DEBUG_LIB = $(LIB_DIR)/$(DEBUG_LIB_FILE)
RELEASE_LIB = $(LIB_DIR)/$(RELEASE_LIB_FILE)
COVERAGE_LIB = $(LIB_DIR)/$(COVERAGE_LIB_FILE)
DEBUG_LIBS = $(DEBUG_LIB) $(LIBS)
RELEASE_LIBS = $(RELEASE_LIB) $(LIBS)
COVERAGE_LIBS = $(COVERAGE_LIB) $(LIBS)
DEBUG_EXT_LIB_FILE := $(shell $(QUIET_MAKE) -C $(EXT_DIR) print_debug_lib)
RELEASE_EXT_LIB_FILE := $(shell $(QUIET_MAKE) -C $(EXT_DIR) print_release_lib)
COVERAGE_EXT_LIB_FILE := $(shell $(QUIET_MAKE) -C $(EXT_DIR) print_coverage_lib)
DEBUG_EXT_LIB = $(EXT_DIR)/$(DEBUG_EXT_LIB_FILE)
RELEASE_EXT_LIB = $(EXT_DIR)/$(RELEASE_EXT_LIB_FILE)
COVERAGE_EXT_LIB = $(EXT_DIR)/$(COVERAGE_EXT_LIB_FILE)
DEBUG_LIBS = $(DEBUG_LIB) $(DEBUG_EXT_LIB) $(LIBS)
RELEASE_LIBS = $(RELEASE_LIB) $(RELEASE_EXT_LIB) $(LIBS)
COVERAGE_LIBS = $(COVERAGE_LIB) $(COVERAGE_EXT_LIB) $(LIBS)
#
# Files
@@ -107,9 +117,9 @@ ifneq ($(strip $(DEPS)),)
endif
endif
$(DEBUG_LIB): | debug_lib
$(RELEASE_LIB): | release_lib
$(COVERAGE_LIB): | coverage_lib
$(DEBUG_LIB): | debug_lib debug_ext_lib
$(RELEASE_LIB): | release_lib release_ext_lib
$(COVERAGE_LIB): | coverage_lib coverage_ext_lib
$(TEST_DEBUG_OBJS): | $(DEBUG_BUILD_DIR)
$(TEST_RELEASE_OBJS): | $(RELEASE_BUILD_DIR)
@@ -193,7 +203,7 @@ $(DEBUG_EXE): $(DEBUG_LIB) $(DEBUG_OBJS)
$(RELEASE_EXE): $(RELEASE_LIB) $(RELEASE_OBJS)
$(LD) $(RELEASE_LDFLAGS) $(RELEASE_OBJS) $(RELEASE_LIBS) -o $@
$(COVERAGE_EXE): $(COVERAG_LIB) $(COVERAGE_OBJS)
$(COVERAGE_EXE): $(COVERAGE_LIB) $(COVERAGE_OBJS)
$(LD) $(COVERAGE_LDFLAGS) $(COVERAGE_OBJS) $(COVERAGE_LIBS) -o $@
debug_lib:
@@ -204,3 +214,12 @@ release_lib:
coverage_lib:
$(MAKE) -C $(LIB_DIR) $@
debug_ext_lib:
$(MAKE) -C $(EXT_DIR) debug_lib
release_ext_lib:
$(MAKE) -C $(EXT_DIR) release_lib
coverage_ext_lib:
$(MAKE) -C $(EXT_DIR) coverage_lib

View File

@@ -5,6 +5,8 @@
TESTS="\
unit_base \
unit_ext_ims \
unit_ext_slot \
unit_sim_settings"
function err() {
@@ -23,6 +25,8 @@ if [ ! -z "$(lcov --help | grep ' --rc ')" ] ; then
GENHTML_OPT="--branch-coverage"
fi
LCOV="lcov $LCOV_OPT"
pushd `dirname $0` > /dev/null
COV_DIR="$PWD"
pushd .. > /dev/null
@@ -32,6 +36,7 @@ TOP_DIR="$PWD"
popd > /dev/null
popd > /dev/null
popd > /dev/null
EXT_DIR="$TOP_DIR/lib"
make -C "$TOP_DIR" clean
for t in $TESTS ; do
@@ -41,13 +46,14 @@ for t in $TESTS ; do
popd
done
# Sometimes you need this, sometimes that :S
BASE_DIR="$TOP_DIR"
#BASE_DIR="$TOP_DIR/src"
PLUGIN_BASE_DIR="$TOP_DIR"
EXT_BASE_DIR="$EXT_DIR"
FULL_COV="$COV_DIR/full.gcov"
LIB_COV="$COV_DIR/lib.gcov"
rm -f "$FULL_COV" "$LIB_COV"
lcov $LCOV_OPT -c -d "$TOP_DIR/build/coverage" -b "$BASE_DIR" -o "$FULL_COV" || exit 1
lcov $LCOV_OPT -e "$FULL_COV" "$BASE_DIR/*" -o "$LIB_COV" || exit 1
genhtml $GENHTML_OPT "$LIB_COV" -t "ofono binder plugin" --output-directory "$COV_DIR/report" || exit 1
PLUGIN_COV="$COV_DIR/plugin.gcov"
EXT_COV="$COV_DIR/ext.gcov"
OUT_COV="$COV_DIR/out.gcov"
rm -f "$PLUGIN_COV" "$EXT_COV" "$OUT_COV"
$LCOV -c -d "$TOP_DIR/build/coverage" -b "$PLUGIN_BASE_DIR" -o "$PLUGIN_COV" || exit 1
$LCOV -c -d "$EXT_DIR/build/coverage" -b "$EXT_BASE_DIR" -o "$EXT_COV" || exit 1
$LCOV -a "$PLUGIN_COV" -a "$EXT_COV" -o "$OUT_COV" || exit 1
genhtml $GENHTML_OPT "$OUT_COV" -t "ofono binder plugin" --output-directory "$COV_DIR/report" || exit 1

View File

@@ -0,0 +1,5 @@
# -*- Mode: makefile-gmake -*-
EXE = unit_ext_ims
include ../common/Makefile

View File

@@ -0,0 +1,271 @@
/*
* oFono - Open Source Telephony - binder based adaptation
*
* Copyright (C) 2021 Jolla Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include "binder_ext_ims_impl.h"
#include <gutil_log.h>
/*==========================================================================*
* Dummy BinderExtImsInterface implementation
*==========================================================================*/
typedef GObjectClass TestDummyImsClass;
typedef struct test_dummy_ims {
GObject parent;
} TestDummyIms;
static void test_dummy_ims_iface_init(BinderExtImsInterface* iface);
G_DEFINE_TYPE_WITH_CODE(TestDummyIms, test_dummy_ims, G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE(BINDER_EXT_TYPE_IMS, test_dummy_ims_iface_init))
#define TEST_TYPE_DUMMY_IMS test_dummy_ims_get_type()
static
void
test_dummy_ims_iface_init(
BinderExtImsInterface* iface)
{
iface->version = BINDER_EXT_IMS_INTERFACE_VERSION;
/* No callbacks at all */
}
static
void
test_dummy_ims_init(
TestDummyIms* self)
{
}
static
void
test_dummy_ims_class_init(
TestDummyImsClass* klass)
{
}
/*==========================================================================*
* Test BinderExtImsInterface implementation
*==========================================================================*/
typedef GObjectClass TestImsClass;
typedef struct test_ims {
GObject parent;
int cancelled;
} TestIms;
static void test_ims_iface_init(BinderExtImsInterface* iface);
G_DEFINE_TYPE_WITH_CODE(TestIms, test_ims, G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE(BINDER_EXT_TYPE_IMS, test_ims_iface_init))
#define TEST_TYPE_IMS test_ims_get_type()
#define TEST_IMS(obj) G_TYPE_CHECK_INSTANCE_CAST(obj, TEST_TYPE_IMS, TestIms)
#define TEST_IMS_FLAGS BINDER_EXT_IMS_INTERFACE_FLAG_SMS_SUPPORT
#define TEST_CALL_ID 42
enum test_ims_signal {
TEST_SIGNAL_STATE_CHANGED,
TEST_SIGNAL_COUNT
};
#define TEST_SIGNAL_STATE_CHANGED_NAME "test-ims-state-changed"
static guint test_ims_signals[TEST_SIGNAL_COUNT] = { 0 };
static
BINDER_EXT_IMS_STATE
test_ims_get_state(
BinderExtIms* ext)
{
return BINDER_EXT_IMS_STATE_NOT_REGISTERED;
}
static
guint
test_ims_set_registration(
BinderExtIms* ext,
BINDER_EXT_IMS_REGISTRATION registration,
BinderExtImsResultFunc complete,
GDestroyNotify destroy,
void* user_data)
{
return TEST_CALL_ID;
}
static
void
test_ims_cancel(
BinderExtIms* ext,
guint id)
{
g_assert_cmpuint(id, == ,TEST_CALL_ID);
TEST_IMS(ext)->cancelled++;
}
static
gulong
test_ims_add_state_handler(
BinderExtIms* ext,
BinderExtImsFunc handler,
void* user_data)
{
return G_LIKELY(handler) ? g_signal_connect(TEST_IMS(ext),
TEST_SIGNAL_STATE_CHANGED_NAME, G_CALLBACK(handler), user_data) : 0;
}
static
void
test_ims_iface_init(
BinderExtImsInterface* iface)
{
iface->flags |= TEST_IMS_FLAGS;
iface->version = BINDER_EXT_IMS_INTERFACE_VERSION;
iface->get_state = test_ims_get_state;
iface->set_registration = test_ims_set_registration;
iface->cancel = test_ims_cancel;
iface->add_state_handler = test_ims_add_state_handler;
}
static
void
test_ims_init(
TestIms* self)
{
}
static
void
test_ims_class_init(
TestImsClass* klass)
{
test_ims_signals[TEST_SIGNAL_STATE_CHANGED] =
g_signal_new(TEST_SIGNAL_STATE_CHANGED_NAME,
G_OBJECT_CLASS_TYPE(klass), G_SIGNAL_RUN_FIRST, 0,
NULL, NULL, NULL, G_TYPE_NONE, 0);
}
/*==========================================================================*
* basic
*==========================================================================*/
static
void
test_not_reached(
BinderExtIms* ext,
void* user_data)
{
g_assert_not_reached();
}
static
void
test_basic(
void)
{
TestIms* test = g_object_new(TEST_TYPE_IMS, NULL);
BinderExtIms* ims = BINDER_EXT_IMS(test);
gulong id;
/* NULL resistance */
binder_ext_ims_unref(NULL);
binder_ext_ims_cancel(NULL, 0);
binder_ext_ims_remove_handler(NULL, 0);
binder_ext_ims_remove_handler(ims, 0);
binder_ext_ims_remove_handlers(NULL, NULL, 0);
binder_ext_ims_remove_handlers(ims, NULL, 1); /* NULL is checked first */
binder_ext_ims_remove_handlers(ims, &id, 0);
binder_ext_ims_cancel(ims, 0);
g_assert(!binder_ext_ims_ref(NULL));
g_assert_cmpint(binder_ext_ims_get_interface_flags(NULL), == ,
BINDER_EXT_IMS_INTERFACE_NO_FLAGS);
g_assert_cmpint(binder_ext_ims_get_state(NULL), == ,
BINDER_EXT_IMS_STATE_UNKNOWN);
g_assert_cmpint(binder_ext_ims_set_registration(NULL,
BINDER_EXT_IMS_REGISTRATION_ON, NULL, NULL, NULL), == ,0);
g_assert_cmpint(binder_ext_ims_add_state_handler(NULL, NULL, NULL), == ,0);
g_assert_cmpint(binder_ext_ims_add_state_handler(ims, NULL, NULL), == ,0);
/* Basic operations */
g_assert(binder_ext_ims_ref(ims) == ims);
binder_ext_ims_unref(ims);
g_assert_cmpint(binder_ext_ims_get_interface_flags(ims), == ,
TEST_IMS_FLAGS);
g_assert_cmpint(binder_ext_ims_get_state(ims), == ,
BINDER_EXT_IMS_STATE_NOT_REGISTERED);
g_assert_cmpuint(binder_ext_ims_set_registration(ims,
BINDER_EXT_IMS_REGISTRATION_ON, NULL, NULL, NULL), == ,TEST_CALL_ID);
id = binder_ext_ims_add_state_handler(ims, test_not_reached, NULL);
g_assert(id);
binder_ext_ims_remove_handler(ims, id);
id = binder_ext_ims_add_state_handler(ims, test_not_reached, NULL);
g_assert(id);
binder_ext_ims_remove_handlers(ims, &id, 1);
g_assert(!id);
binder_ext_ims_remove_handlers(ims, &id, 1);
binder_ext_ims_cancel(ims, TEST_CALL_ID);
g_assert_cmpint(test->cancelled, == ,1);
binder_ext_ims_unref(ims);
}
/*==========================================================================*
* dummy
*==========================================================================*/
static
void
test_dummy(
void)
{
TestDummyIms* test = g_object_new(TEST_TYPE_DUMMY_IMS, NULL);
BinderExtIms* ims = BINDER_EXT_IMS(test);
g_assert_cmpint(binder_ext_ims_get_interface_flags(ims), == ,
BINDER_EXT_IMS_INTERFACE_NO_FLAGS);
g_assert_cmpint(binder_ext_ims_get_state(ims), == ,
BINDER_EXT_IMS_STATE_UNKNOWN);
g_assert_cmpint(binder_ext_ims_set_registration(ims,
BINDER_EXT_IMS_REGISTRATION_ON, NULL, NULL, NULL), == ,0);
g_assert(!binder_ext_ims_add_state_handler(ims, test_not_reached, NULL));
binder_ext_ims_cancel(ims, TEST_CALL_ID);
binder_ext_ims_remove_handler(ims, 0);
binder_ext_ims_unref(ims);
}
/*==========================================================================*
* Common
*==========================================================================*/
#define TEST_PREFIX "/ext_ims/"
#define TEST_(t) TEST_PREFIX t
int main(int argc, char* argv[])
{
g_test_init(&argc, &argv, NULL);
g_test_add_func(TEST_("basic"), test_basic);
g_test_add_func(TEST_("dummy"), test_dummy);
gutil_log_default.level = g_test_verbose() ?
GLOG_LEVEL_VERBOSE : GLOG_LEVEL_NONE;
gutil_log_timestamp = FALSE;
return g_test_run();
}
/*
* Local Variables:
* mode: C
* c-basic-offset: 4
* indent-tabs-mode: nil
* End:
*/

View File

@@ -0,0 +1,5 @@
# -*- Mode: makefile-gmake -*-
EXE = unit_ext_slot
include ../common/Makefile

View File

@@ -0,0 +1,133 @@
/*
* oFono - Open Source Telephony - binder based adaptation
*
* Copyright (C) 2021 Jolla Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include "binder_ext_ims.h"
#include "binder_ext_slot_impl.h"
#include <gutil_log.h>
/*==========================================================================*
* Test slot
*==========================================================================*/
typedef BinderExtSlotClass TestSlotClass;
typedef struct test_slot {
BinderExtSlot parent;
int* shutdown;
} TestSlot;
G_DEFINE_TYPE(TestSlot, test_slot, BINDER_EXT_TYPE_SLOT)
#define TEST_TYPE_SLOT test_slot_get_type()
#define TEST_SLOT(obj) G_TYPE_CHECK_INSTANCE_CAST(obj, TEST_TYPE_SLOT, TestSlot)
static
gpointer
test_slot_get_interface(
BinderExtSlot* slot,
GType iface)
{
return BINDER_EXT_SLOT_CLASS(test_slot_parent_class)->
get_interface(slot, iface);
}
static
void
test_slot_shutdown(
BinderExtSlot* slot)
{
TestSlot* self = TEST_SLOT(slot);
if (self->shutdown) {
(*self->shutdown)++;
}
BINDER_EXT_SLOT_CLASS(test_slot_parent_class)->shutdown(slot);
}
static
void
test_slot_init(
TestSlot* self)
{
}
static
void
test_slot_class_init(
TestSlotClass* klass)
{
klass->get_interface = test_slot_get_interface;
klass->shutdown = test_slot_shutdown;
}
/*==========================================================================*
* basic
*==========================================================================*/
static
void
test_basic(
void)
{
TestSlot* test = g_object_new(TEST_TYPE_SLOT, NULL);
BinderExtSlot* slot = BINDER_EXT_SLOT(test);
int shutdown_count = 0;
/* NULL resistance */
binder_ext_slot_drop(NULL);
binder_ext_slot_unref(NULL);
g_assert(!binder_ext_slot_ref(NULL));
g_assert(!binder_ext_slot_get_interface(NULL, BINDER_EXT_TYPE_IMS));
/* Basic operations */
test->shutdown = &shutdown_count;
g_assert(!binder_ext_slot_get_interface(slot, BINDER_EXT_TYPE_IMS));
g_assert(binder_ext_slot_ref(slot) == slot);
binder_ext_slot_drop(slot);
g_assert_cmpint(shutdown_count, == ,1);
g_assert(binder_ext_slot_ref(slot) == slot);
binder_ext_slot_drop(slot);
g_assert_cmpint(shutdown_count, == ,1); /* It's done only once */
binder_ext_slot_unref(slot);
}
/*==========================================================================*
* Common
*==========================================================================*/
#define TEST_PREFIX "/ext_slot/"
#define TEST_(t) TEST_PREFIX t
int main(int argc, char* argv[])
{
g_test_init(&argc, &argv, NULL);
g_test_add_func(TEST_("basic"), test_basic);
gutil_log_default.level = g_test_verbose() ?
GLOG_LEVEL_VERBOSE : GLOG_LEVEL_NONE;
gutil_log_timestamp = FALSE;
return g_test_run();
}
/*
* Local Variables:
* mode: C
* c-basic-offset: 4
* indent-tabs-mode: nil
* End:
*/