[unit] More unit tests
This commit is contained in:
44
lib/Makefile
44
lib/Makefile
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
5
unit/unit_ext_ims/Makefile
Normal file
5
unit/unit_ext_ims/Makefile
Normal file
@@ -0,0 +1,5 @@
|
||||
# -*- Mode: makefile-gmake -*-
|
||||
|
||||
EXE = unit_ext_ims
|
||||
|
||||
include ../common/Makefile
|
||||
271
unit/unit_ext_ims/unit_ext_ims.c
Normal file
271
unit/unit_ext_ims/unit_ext_ims.c
Normal 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:
|
||||
*/
|
||||
5
unit/unit_ext_slot/Makefile
Normal file
5
unit/unit_ext_slot/Makefile
Normal file
@@ -0,0 +1,5 @@
|
||||
# -*- Mode: makefile-gmake -*-
|
||||
|
||||
EXE = unit_ext_slot
|
||||
|
||||
include ../common/Makefile
|
||||
133
unit/unit_ext_slot/unit_ext_slot.c
Normal file
133
unit/unit_ext_slot/unit_ext_slot.c
Normal 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:
|
||||
*/
|
||||
Reference in New Issue
Block a user