PROGRAMS = $(sbin_PROGRAMS)
am__check_vnstat_SOURCES_DIST = tests/vnstat_tests.c \
tests/vnstat_tests.h tests/common_tests.c tests/common_tests.h \
- tests/dbsql_tests.c tests/dbsql_tests.h tests/config_tests.c \
- tests/config_tests.h tests/fs_tests.c tests/fs_tests.h \
- tests/id_tests.c tests/id_tests.h src/cfg.c src/cfg.h \
- src/common.c src/common.h src/daemon.c src/daemon.h \
+ tests/dbsql_tests.c tests/dbsql_tests.h \
+ tests/datacache_tests.c tests/datacache_tests.h \
+ tests/config_tests.c tests/config_tests.h tests/fs_tests.c \
+ tests/fs_tests.h tests/id_tests.c tests/id_tests.h src/cfg.c \
+ src/cfg.h src/common.c src/common.h src/daemon.c src/daemon.h \
src/dbsql.c src/dbsql.h src/dbaccess.c src/dbaccess.h \
- src/dbcache.c src/dbcache.h src/dbjson.c src/dbjson.h \
- src/dbmerge.c src/dbmerge.h src/dbshow.c src/dbshow.h \
- src/dbxml.c src/dbxml.h src/ibw.c src/ibw.h src/ifinfo.c \
- src/ifinfo.h src/misc.c src/misc.h src/fs.c src/fs.h src/id.c \
- src/id.h src/traffic.c src/traffic.h
+ src/dbcache.c src/dbcache.h src/datacache.c src/datacache.h \
+ src/dbjson.c src/dbjson.h src/dbmerge.c src/dbmerge.h \
+ src/dbshow.c src/dbshow.h src/dbxml.c src/dbxml.h src/ibw.c \
+ src/ibw.h src/ifinfo.c src/ifinfo.h src/misc.c src/misc.h \
+ src/fs.c src/fs.h src/id.c src/id.h src/traffic.c \
+ src/traffic.h
am__dirstamp = $(am__leading_dot)dirstamp
@HAVE_CHECK_TRUE@am_check_vnstat_OBJECTS = \
@HAVE_CHECK_TRUE@ tests/check_vnstat-vnstat_tests.$(OBJEXT) \
@HAVE_CHECK_TRUE@ tests/check_vnstat-common_tests.$(OBJEXT) \
@HAVE_CHECK_TRUE@ tests/check_vnstat-dbsql_tests.$(OBJEXT) \
+@HAVE_CHECK_TRUE@ tests/check_vnstat-datacache_tests.$(OBJEXT) \
@HAVE_CHECK_TRUE@ tests/check_vnstat-config_tests.$(OBJEXT) \
@HAVE_CHECK_TRUE@ tests/check_vnstat-fs_tests.$(OBJEXT) \
@HAVE_CHECK_TRUE@ tests/check_vnstat-id_tests.$(OBJEXT) \
@HAVE_CHECK_TRUE@ src/check_vnstat-dbsql.$(OBJEXT) \
@HAVE_CHECK_TRUE@ src/check_vnstat-dbaccess.$(OBJEXT) \
@HAVE_CHECK_TRUE@ src/check_vnstat-dbcache.$(OBJEXT) \
+@HAVE_CHECK_TRUE@ src/check_vnstat-datacache.$(OBJEXT) \
@HAVE_CHECK_TRUE@ src/check_vnstat-dbjson.$(OBJEXT) \
@HAVE_CHECK_TRUE@ src/check_vnstat-dbmerge.$(OBJEXT) \
@HAVE_CHECK_TRUE@ src/check_vnstat-dbshow.$(OBJEXT) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
am_vnstatd_OBJECTS = src/vnstatd.$(OBJEXT) src/ifinfo.$(OBJEXT) \
src/dbsql.$(OBJEXT) src/dbaccess.$(OBJEXT) \
- src/dbcache.$(OBJEXT) src/common.$(OBJEXT) src/misc.$(OBJEXT) \
- src/cfg.$(OBJEXT) src/ibw.$(OBJEXT) src/fs.$(OBJEXT) \
- src/id.$(OBJEXT) src/daemon.$(OBJEXT)
+ src/dbcache.$(OBJEXT) src/datacache.$(OBJEXT) \
+ src/common.$(OBJEXT) src/misc.$(OBJEXT) src/cfg.$(OBJEXT) \
+ src/ibw.$(OBJEXT) src/fs.$(OBJEXT) src/id.$(OBJEXT) \
+ src/daemon.$(OBJEXT)
vnstatd_OBJECTS = $(am_vnstatd_OBJECTS)
vnstatd_LDADD = $(LDADD)
AM_V_P = $(am__v_P_@AM_V@)
src/dbsql.c src/dbsql.h \
src/dbaccess.c src/dbaccess.h \
src/dbcache.c src/dbcache.h \
+ src/datacache.c src/datacache.h \
src/common.c src/common.h \
src/misc.c src/misc.h \
src/cfg.c src/cfg.h \
@HAVE_CHECK_TRUE@check_vnstat_SOURCES = tests/vnstat_tests.c \
@HAVE_CHECK_TRUE@ tests/vnstat_tests.h tests/common_tests.c \
@HAVE_CHECK_TRUE@ tests/common_tests.h tests/dbsql_tests.c \
-@HAVE_CHECK_TRUE@ tests/dbsql_tests.h tests/config_tests.c \
+@HAVE_CHECK_TRUE@ tests/dbsql_tests.h tests/datacache_tests.c \
+@HAVE_CHECK_TRUE@ tests/datacache_tests.h tests/config_tests.c \
@HAVE_CHECK_TRUE@ tests/config_tests.h tests/fs_tests.c \
@HAVE_CHECK_TRUE@ tests/fs_tests.h tests/id_tests.c \
@HAVE_CHECK_TRUE@ tests/id_tests.h src/cfg.c src/cfg.h \
@HAVE_CHECK_TRUE@ src/common.c src/common.h src/daemon.c \
@HAVE_CHECK_TRUE@ src/daemon.h src/dbsql.c src/dbsql.h \
@HAVE_CHECK_TRUE@ src/dbaccess.c src/dbaccess.h src/dbcache.c \
-@HAVE_CHECK_TRUE@ src/dbcache.h src/dbjson.c src/dbjson.h \
-@HAVE_CHECK_TRUE@ src/dbmerge.c src/dbmerge.h src/dbshow.c \
-@HAVE_CHECK_TRUE@ src/dbshow.h src/dbxml.c src/dbxml.h \
-@HAVE_CHECK_TRUE@ src/ibw.c src/ibw.h src/ifinfo.c src/ifinfo.h \
-@HAVE_CHECK_TRUE@ src/misc.c src/misc.h src/fs.c src/fs.h \
-@HAVE_CHECK_TRUE@ src/id.c src/id.h src/traffic.c src/traffic.h
+@HAVE_CHECK_TRUE@ src/dbcache.h src/datacache.c src/datacache.h \
+@HAVE_CHECK_TRUE@ src/dbjson.c src/dbjson.h src/dbmerge.c \
+@HAVE_CHECK_TRUE@ src/dbmerge.h src/dbshow.c src/dbshow.h \
+@HAVE_CHECK_TRUE@ src/dbxml.c src/dbxml.h src/ibw.c src/ibw.h \
+@HAVE_CHECK_TRUE@ src/ifinfo.c src/ifinfo.h src/misc.c \
+@HAVE_CHECK_TRUE@ src/misc.h src/fs.c src/fs.h src/id.c \
+@HAVE_CHECK_TRUE@ src/id.h src/traffic.c src/traffic.h
all: all-recursive
.SUFFIXES:
tests/$(DEPDIR)/$(am__dirstamp)
tests/check_vnstat-dbsql_tests.$(OBJEXT): tests/$(am__dirstamp) \
tests/$(DEPDIR)/$(am__dirstamp)
+tests/check_vnstat-datacache_tests.$(OBJEXT): tests/$(am__dirstamp) \
+ tests/$(DEPDIR)/$(am__dirstamp)
tests/check_vnstat-config_tests.$(OBJEXT): tests/$(am__dirstamp) \
tests/$(DEPDIR)/$(am__dirstamp)
tests/check_vnstat-fs_tests.$(OBJEXT): tests/$(am__dirstamp) \
src/$(DEPDIR)/$(am__dirstamp)
src/check_vnstat-dbcache.$(OBJEXT): src/$(am__dirstamp) \
src/$(DEPDIR)/$(am__dirstamp)
+src/check_vnstat-datacache.$(OBJEXT): src/$(am__dirstamp) \
+ src/$(DEPDIR)/$(am__dirstamp)
src/check_vnstat-dbjson.$(OBJEXT): src/$(am__dirstamp) \
src/$(DEPDIR)/$(am__dirstamp)
src/check_vnstat-dbmerge.$(OBJEXT): src/$(am__dirstamp) \
src/$(DEPDIR)/$(am__dirstamp)
src/dbcache.$(OBJEXT): src/$(am__dirstamp) \
src/$(DEPDIR)/$(am__dirstamp)
+src/datacache.$(OBJEXT): src/$(am__dirstamp) \
+ src/$(DEPDIR)/$(am__dirstamp)
src/common.$(OBJEXT): src/$(am__dirstamp) \
src/$(DEPDIR)/$(am__dirstamp)
src/misc.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/check_vnstat-cfg.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/check_vnstat-common.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/check_vnstat-daemon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/check_vnstat-datacache.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/check_vnstat-dbaccess.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/check_vnstat-dbcache.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/check_vnstat-dbjson.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/check_vnstat-traffic.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/common.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/daemon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/datacache.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/dbaccess.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/dbcache.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/dbsql.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/vnstatd.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/check_vnstat-common_tests.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/check_vnstat-config_tests.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/check_vnstat-datacache_tests.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/check_vnstat-dbsql_tests.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/check_vnstat-fs_tests.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/check_vnstat-id_tests.Po@am__quote@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_vnstat_CFLAGS) $(CFLAGS) -c -o tests/check_vnstat-dbsql_tests.obj `if test -f 'tests/dbsql_tests.c'; then $(CYGPATH_W) 'tests/dbsql_tests.c'; else $(CYGPATH_W) '$(srcdir)/tests/dbsql_tests.c'; fi`
+tests/check_vnstat-datacache_tests.o: tests/datacache_tests.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_vnstat_CFLAGS) $(CFLAGS) -MT tests/check_vnstat-datacache_tests.o -MD -MP -MF tests/$(DEPDIR)/check_vnstat-datacache_tests.Tpo -c -o tests/check_vnstat-datacache_tests.o `test -f 'tests/datacache_tests.c' || echo '$(srcdir)/'`tests/datacache_tests.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/check_vnstat-datacache_tests.Tpo tests/$(DEPDIR)/check_vnstat-datacache_tests.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/datacache_tests.c' object='tests/check_vnstat-datacache_tests.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_vnstat_CFLAGS) $(CFLAGS) -c -o tests/check_vnstat-datacache_tests.o `test -f 'tests/datacache_tests.c' || echo '$(srcdir)/'`tests/datacache_tests.c
+
+tests/check_vnstat-datacache_tests.obj: tests/datacache_tests.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_vnstat_CFLAGS) $(CFLAGS) -MT tests/check_vnstat-datacache_tests.obj -MD -MP -MF tests/$(DEPDIR)/check_vnstat-datacache_tests.Tpo -c -o tests/check_vnstat-datacache_tests.obj `if test -f 'tests/datacache_tests.c'; then $(CYGPATH_W) 'tests/datacache_tests.c'; else $(CYGPATH_W) '$(srcdir)/tests/datacache_tests.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/check_vnstat-datacache_tests.Tpo tests/$(DEPDIR)/check_vnstat-datacache_tests.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/datacache_tests.c' object='tests/check_vnstat-datacache_tests.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_vnstat_CFLAGS) $(CFLAGS) -c -o tests/check_vnstat-datacache_tests.obj `if test -f 'tests/datacache_tests.c'; then $(CYGPATH_W) 'tests/datacache_tests.c'; else $(CYGPATH_W) '$(srcdir)/tests/datacache_tests.c'; fi`
+
tests/check_vnstat-config_tests.o: tests/config_tests.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_vnstat_CFLAGS) $(CFLAGS) -MT tests/check_vnstat-config_tests.o -MD -MP -MF tests/$(DEPDIR)/check_vnstat-config_tests.Tpo -c -o tests/check_vnstat-config_tests.o `test -f 'tests/config_tests.c' || echo '$(srcdir)/'`tests/config_tests.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/check_vnstat-config_tests.Tpo tests/$(DEPDIR)/check_vnstat-config_tests.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_vnstat_CFLAGS) $(CFLAGS) -c -o src/check_vnstat-dbcache.obj `if test -f 'src/dbcache.c'; then $(CYGPATH_W) 'src/dbcache.c'; else $(CYGPATH_W) '$(srcdir)/src/dbcache.c'; fi`
+src/check_vnstat-datacache.o: src/datacache.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_vnstat_CFLAGS) $(CFLAGS) -MT src/check_vnstat-datacache.o -MD -MP -MF src/$(DEPDIR)/check_vnstat-datacache.Tpo -c -o src/check_vnstat-datacache.o `test -f 'src/datacache.c' || echo '$(srcdir)/'`src/datacache.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/check_vnstat-datacache.Tpo src/$(DEPDIR)/check_vnstat-datacache.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/datacache.c' object='src/check_vnstat-datacache.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_vnstat_CFLAGS) $(CFLAGS) -c -o src/check_vnstat-datacache.o `test -f 'src/datacache.c' || echo '$(srcdir)/'`src/datacache.c
+
+src/check_vnstat-datacache.obj: src/datacache.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_vnstat_CFLAGS) $(CFLAGS) -MT src/check_vnstat-datacache.obj -MD -MP -MF src/$(DEPDIR)/check_vnstat-datacache.Tpo -c -o src/check_vnstat-datacache.obj `if test -f 'src/datacache.c'; then $(CYGPATH_W) 'src/datacache.c'; else $(CYGPATH_W) '$(srcdir)/src/datacache.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/check_vnstat-datacache.Tpo src/$(DEPDIR)/check_vnstat-datacache.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='src/datacache.c' object='src/check_vnstat-datacache.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_vnstat_CFLAGS) $(CFLAGS) -c -o src/check_vnstat-datacache.obj `if test -f 'src/datacache.c'; then $(CYGPATH_W) 'src/datacache.c'; else $(CYGPATH_W) '$(srcdir)/src/datacache.c'; fi`
+
src/check_vnstat-dbjson.o: src/dbjson.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_vnstat_CFLAGS) $(CFLAGS) -MT src/check_vnstat-dbjson.o -MD -MP -MF src/$(DEPDIR)/check_vnstat-dbjson.Tpo -c -o src/check_vnstat-dbjson.o `test -f 'src/dbjson.c' || echo '$(srcdir)/'`src/dbjson.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/check_vnstat-dbjson.Tpo src/$(DEPDIR)/check_vnstat-dbjson.Po
--- /dev/null
+#include "vnstat_tests.h"
+#include "datacache_tests.h"
+#include "common.h"
+#include "datacache.h"
+
+START_TEST(datacache_can_clear_empty_cache)
+{
+ datacache *dc = NULL;
+
+ datacache_clear(&dc);
+ ck_assert_ptr_eq(dc, NULL);
+}
+END_TEST
+
+START_TEST(datacache_can_add_to_cache)
+{
+ int ret;
+ datacache *dc = NULL;
+
+ ret = datacache_add(&dc, "eth0", 0);
+ ck_assert_int_eq(ret, 1);
+ ck_assert_str_eq(dc->interface, "eth0");
+ ck_assert_int_eq(dc->active, 0);
+ ck_assert_int_eq(dc->filled, 0);
+ ck_assert_int_eq(dc->syncneeded, 0);
+ ck_assert_int_eq(dc->currx, 0);
+ ck_assert_int_eq(dc->curtx, 0);
+ ck_assert_ptr_eq(dc->log, NULL);
+ ck_assert_ptr_eq(dc->next, NULL);
+
+ datacache_clear(&dc);
+ ck_assert_ptr_eq(dc, NULL);
+}
+END_TEST
+
+START_TEST(datacache_can_add_to_cache_consistently)
+{
+ int ret;
+ datacache *dc = NULL;
+ datacache *bookmark = NULL;
+
+ ret = datacache_add(&dc, "eth0", 0);
+ ck_assert_int_eq(ret, 1);
+ ck_assert_str_eq(dc->interface, "eth0");
+ ck_assert_int_eq(dc->active, 0);
+ ck_assert_int_eq(dc->filled, 0);
+ ck_assert_int_eq(dc->syncneeded, 0);
+ ck_assert_int_eq(dc->currx, 0);
+ ck_assert_int_eq(dc->curtx, 0);
+ ck_assert_ptr_eq(dc->log, NULL);
+ ck_assert_ptr_eq(dc->next, NULL);
+
+ bookmark = dc;
+
+ ret = datacache_add(&dc, "eth1", 0);
+ ck_assert_int_eq(ret, 1);
+
+ ck_assert_str_eq(dc->interface, "eth1");
+ ck_assert_int_eq(dc->active, 0);
+ ck_assert_int_eq(dc->filled, 0);
+ ck_assert_int_eq(dc->syncneeded, 0);
+ ck_assert_int_eq(dc->currx, 0);
+ ck_assert_int_eq(dc->curtx, 0);
+ ck_assert_ptr_eq(dc->log, NULL);
+ ck_assert_ptr_ne(dc->next, NULL);
+
+ ck_assert_str_eq(bookmark->interface, "eth0");
+
+ bookmark = dc;
+ ck_assert_str_eq(bookmark->interface, "eth1");
+
+ bookmark = bookmark->next;
+ ck_assert_str_eq(bookmark->interface, "eth0");
+
+ datacache_clear(&dc);
+ ck_assert_ptr_eq(dc, NULL);
+}
+END_TEST
+
+START_TEST(datacache_knows_how_to_count)
+{
+ int ret;
+ datacache *dc = NULL;
+
+ ret = datacache_add(&dc, "eth0", 0);
+ ck_assert_int_eq(ret, 1);
+
+ ret = datacache_count(&dc);
+ ck_assert_int_eq(ret, 1);
+
+ ret = datacache_add(&dc, "eth1", 0);
+ ck_assert_int_eq(ret, 1);
+
+ ret = datacache_count(&dc);
+ ck_assert_int_eq(ret, 2);
+
+ ret = datacache_activecount(&dc);
+ ck_assert_int_eq(ret, 0);
+
+ dc->active = 1;
+
+ ret = datacache_activecount(&dc);
+ ck_assert_int_eq(ret, 1);
+
+ datacache_clear(&dc);
+ ck_assert_ptr_eq(dc, NULL);
+
+ ret = datacache_count(&dc);
+ ck_assert_int_eq(ret, 0);
+
+ ret = datacache_activecount(&dc);
+ ck_assert_int_eq(ret, 0);
+}
+END_TEST
+
+START_TEST(datacache_can_seek)
+{
+ int ret;
+ datacache *dc = NULL;
+ datacache *iter = NULL;
+
+ ret = datacache_add(&dc, "eth0", 0);
+ ck_assert_int_eq(ret, 1);
+
+ ret = datacache_add(&dc, "eth1", 0);
+ ck_assert_int_eq(ret, 1);
+
+ ret = datacache_add(&dc, "eth2", 0);
+ ck_assert_int_eq(ret, 1);
+
+ ret = datacache_add(&dc, "eth3", 0);
+ ck_assert_int_eq(ret, 1);
+
+ iter = dc;
+ ck_assert_str_eq(iter->interface, "eth3");
+ ret = datacache_seek(&iter, "eth3");
+ ck_assert_int_eq(ret, 1);
+ ck_assert_str_eq(iter->interface, "eth3");
+
+ iter = dc;
+ ck_assert_str_eq(iter->interface, "eth3");
+ ret = datacache_seek(&iter, "eth1");
+ ck_assert_int_eq(ret, 1);
+ ck_assert_str_eq(iter->interface, "eth1");
+
+ iter = dc;
+ ck_assert_str_eq(iter->interface, "eth3");
+ ret = datacache_seek(&iter, "eth0");
+ ck_assert_int_eq(ret, 1);
+ ck_assert_str_eq(iter->interface, "eth0");
+
+ iter = dc;
+ ck_assert_str_eq(iter->interface, "eth3");
+ ret = datacache_seek(&iter, "eth");
+ ck_assert_int_eq(ret, 0);
+
+ datacache_clear(&dc);
+ ck_assert_ptr_eq(dc, NULL);
+}
+END_TEST
+
+START_TEST(datacache_can_remove)
+{
+ int ret;
+ datacache *dc = NULL;
+
+ ret = datacache_add(&dc, "eth0", 0);
+ ck_assert_int_eq(ret, 1);
+
+ ret = datacache_add(&dc, "eth1", 0);
+ ck_assert_int_eq(ret, 1);
+
+ ret = datacache_add(&dc, "eth2", 0);
+ ck_assert_int_eq(ret, 1);
+
+ ret = datacache_add(&dc, "eth3", 0);
+ ck_assert_int_eq(ret, 1);
+
+ ret = datacache_count(&dc);
+ ck_assert_int_eq(ret, 4);
+
+ /* invalid removal doesn't cause issues */
+ ret = datacache_remove(&dc, "eth4");
+ ck_assert_int_eq(ret, 0);
+ ret = datacache_count(&dc);
+ ck_assert_int_eq(ret, 4);
+ ck_assert_str_eq(dc->interface, "eth3");
+
+ /* head removal */
+ ret = datacache_remove(&dc, "eth3");
+ ck_assert_int_eq(ret, 1);
+ ret = datacache_count(&dc);
+ ck_assert_int_eq(ret, 3);
+ ck_assert_str_eq(dc->interface, "eth2");
+
+ /* middle removal */
+ ret = datacache_remove(&dc, "eth1");
+ ck_assert_int_eq(ret, 1);
+ ret = datacache_count(&dc);
+ ck_assert_int_eq(ret, 2);
+ ck_assert_str_eq(dc->interface, "eth2");
+
+ /* tail removal */
+ ret = datacache_remove(&dc, "eth0");
+ ck_assert_int_eq(ret, 1);
+ ret = datacache_count(&dc);
+ ck_assert_int_eq(ret, 1);
+ ck_assert_str_eq(dc->interface, "eth2");
+
+ datacache_clear(&dc);
+ ck_assert_ptr_eq(dc, NULL);
+}
+END_TEST
+
+START_TEST(datacache_can_do_stuff)
+{
+ int ret, i;
+ datacache *dc = NULL;
+ datacache *iter = NULL;
+
+ ret = datacache_add(&dc, "eth0", 0);
+ ck_assert_int_eq(ret, 1);
+
+ ret = datacache_add(&dc, "eth1", 0);
+ ck_assert_int_eq(ret, 1);
+
+ ret = xferlog_add(&dc->log, 2, 1, 2);
+ ck_assert_int_eq(ret, 1);
+
+ ret = xferlog_add(&dc->log, 2, 10, 15);
+ ck_assert_int_eq(ret, 1);
+
+ ret = datacache_add(&dc, "eth2", 0);
+ ck_assert_int_eq(ret, 1);
+
+ ret = datacache_add(&dc, "eth3", 0);
+ ck_assert_int_eq(ret, 1);
+
+ ret = xferlog_add(&dc->log, 2, 2, 2);
+ ck_assert_int_eq(ret, 1);
+
+ ret = datacache_count(&dc);
+ ck_assert_int_eq(ret, 4);
+
+ iter = dc;
+ ret = datacache_seek(&iter, "eth1");
+ ck_assert_int_eq(ret, 1);
+ ck_assert_int_eq(iter->log->timestamp, 2);
+ ck_assert_int_eq(iter->log->rx, 11);
+ ck_assert_int_eq(iter->log->tx, 17);
+ ret = xferlog_add(&iter->log, 2, 10, 20);
+ ck_assert_int_eq(ret, 1);
+ ck_assert_int_eq(iter->log->rx, 21);
+ ck_assert_int_eq(iter->log->tx, 37);
+
+ iter = dc;
+ ret = datacache_seek(&iter, "eth0");
+ ck_assert_ptr_eq(iter->log, NULL);
+ ret = xferlog_add(&iter->log, 2, 12, 34);
+ ck_assert_int_eq(ret, 1);
+ ck_assert_int_eq(iter->log->timestamp, 2);
+ ck_assert_int_eq(iter->log->rx, 12);
+ ck_assert_int_eq(iter->log->tx, 34);
+
+ iter = dc;
+ ret = datacache_seek(&iter, "eth1");
+ ck_assert_int_eq(ret, 1);
+ ck_assert_int_eq(iter->log->timestamp, 2);
+ ck_assert_int_eq(iter->log->rx, 21);
+ ck_assert_int_eq(iter->log->tx, 37);
+ ret = xferlog_add(&iter->log, 10, 12, 34);
+ ck_assert_int_eq(ret, 1);
+ ck_assert_int_eq(iter->log->timestamp, 10);
+ ck_assert_int_eq(iter->log->rx, 12);
+ ck_assert_int_eq(iter->log->tx, 34);
+
+ iter = dc;
+ ret = datacache_seek(&iter, "eth3");
+ for (i=1; i<=10; i++) {
+ ret = xferlog_add(&iter->log, i, i*10, i*20);
+ ck_assert_int_eq(ret, 1);
+ }
+ ck_assert_int_eq(iter->log->timestamp, 10);
+ ck_assert_int_eq(iter->log->rx, 100);
+ ck_assert_int_eq(iter->log->tx, 200);
+
+ /* suppress output to validate that debug function doesn't cause a crash */
+ suppress_output();
+ datacache_debug(&dc);
+ printf("\n");
+
+ ret = datacache_remove(&dc, "eth1");
+ ck_assert_int_eq(ret, 1);
+ ret = datacache_count(&dc);
+ ck_assert_int_eq(ret, 3);
+
+ datacache_debug(&dc);
+ printf("\n");
+
+ datacache_clear(&dc);
+ ck_assert_ptr_eq(dc, NULL);
+ datacache_debug(&dc);
+ ret = datacache_count(&dc);
+ ck_assert_int_eq(ret, 0);
+}
+END_TEST
+
+START_TEST(xferlog_can_clear_empty_log)
+{
+ xferlog *log = NULL;
+
+ xferlog_clear(&log);
+ ck_assert_ptr_eq(log, NULL);
+}
+END_TEST
+
+START_TEST(xferlog_can_log)
+{
+ int ret;
+ xferlog *log = NULL;
+
+ ret = xferlog_add(&log, 1, 1, 1);
+ ck_assert_int_eq(ret, 1);
+
+ ck_assert_ptr_ne(log, NULL);
+
+ xferlog_clear(&log);
+ ck_assert_ptr_eq(log, NULL);
+}
+END_TEST
+
+START_TEST(xferlog_can_handle_multiple_entries)
+{
+ int ret;
+ xferlog *log = NULL;
+ xferlog *bookmark = NULL;
+
+ ret = xferlog_add(&log, 1, 1, 1);
+ ck_assert_int_eq(ret, 1);
+ ck_assert_int_eq(log->timestamp, 1);
+ ck_assert_int_eq(log->rx, 1);
+ ck_assert_int_eq(log->tx, 1);
+
+ bookmark = log;
+
+ ret = xferlog_add(&log, 1, 1, 2);
+ ck_assert_int_eq(ret, 1);
+ ck_assert_int_eq(log->timestamp, 1);
+ ck_assert_int_eq(log->rx, 2);
+ ck_assert_int_eq(log->tx, 3);
+
+ ret = xferlog_add(&log, 4, 5, 5);
+ ck_assert_int_eq(ret, 1);
+ ck_assert_int_eq(log->timestamp, 4);
+ ck_assert_int_eq(log->rx, 5);
+ ck_assert_int_eq(log->tx, 5);
+
+ ret = xferlog_add(&log, 7, 4, 4);
+ ck_assert_int_eq(ret, 1);
+ ck_assert_int_eq(log->timestamp, 7);
+ ck_assert_int_eq(log->rx, 4);
+ ck_assert_int_eq(log->tx, 4);
+
+ ret = xferlog_add(&log, 1, 1, 1);
+ ck_assert_int_eq(ret, 1);
+ ck_assert_int_eq(log->timestamp, 1);
+ ck_assert_int_eq(log->rx, 1);
+ ck_assert_int_eq(log->tx, 1);
+
+ /* check that new addition with same timestamp doesn't modify old record */
+ ck_assert_int_eq(bookmark->timestamp, 1);
+ ck_assert_int_eq(bookmark->rx, 2);
+ ck_assert_int_eq(bookmark->tx, 3);
+
+ xferlog_clear(&log);
+ ck_assert_ptr_eq(log, NULL);
+}
+END_TEST
+
+void add_datacache_tests(Suite *s)
+{
+ TCase *tc_datacache = tcase_create("Datacache");
+ tcase_add_test(tc_datacache, datacache_can_clear_empty_cache);
+ tcase_add_test(tc_datacache, datacache_can_add_to_cache);
+ tcase_add_test(tc_datacache, datacache_can_add_to_cache_consistently);
+ tcase_add_test(tc_datacache, datacache_knows_how_to_count);
+ tcase_add_test(tc_datacache, datacache_can_seek);
+ tcase_add_test(tc_datacache, datacache_can_remove);
+ tcase_add_test(tc_datacache, datacache_can_do_stuff);
+ tcase_add_test(tc_datacache, xferlog_can_clear_empty_log);
+ tcase_add_test(tc_datacache, xferlog_can_log);
+ tcase_add_test(tc_datacache, xferlog_can_handle_multiple_entries);
+ suite_add_tcase(s, tc_datacache);
+}