This commit adds support for the googletest unit test
framework.  To enable the testing of non-exported
functions, a more permissive map file was added.

Signed-off-by: Tom Hromatka <tom.hroma...@oracle.com>
---
 .gitignore                 |   1 +
 .gitmodules                |   4 ++
 Makefile.am                |   3 +-
 configure.in               |   6 ++-
 googletest                 |   1 +
 gtests/.gitignore          |   6 +++
 gtests/001-path.cpp        | 114 +++++++++++++++++++++++++++++++++++++++
 gtests/Makefile.am         |  25 +++++++++
 gtests/gtest.cpp           |  14 +++++
 src/Makefile.am            |   6 ++-
 src/libcgroup_unittest.map | 130 +++++++++++++++++++++++++++++++++++++++++++++
 11 files changed, 307 insertions(+), 3 deletions(-)
 create mode 100644 .gitmodules
 create mode 160000 googletest
 create mode 100644 gtests/.gitignore
 create mode 100644 gtests/001-path.cpp
 create mode 100644 gtests/Makefile.am
 create mode 100644 gtests/gtest.cpp
 create mode 100644 src/libcgroup_unittest.map

diff --git a/.gitignore b/.gitignore
index 31b3376..fcae10c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,6 +19,7 @@ configure
 depcomp
 libtool
 ltmain.sh
+m4
 missing
 install-sh
 aclocal.m4
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..eddc93c
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,4 @@
+[submodule "googletest"]
+       path = googletest
+       url = g...@github.com:google/googletest.git
+       fetchRecurseSubmodules = true
diff --git a/Makefile.am b/Makefile.am
index 7b107cc..802535e 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,5 +1,6 @@
 AUTOMAKE_OPTIONS = foreign
-SUBDIRS = dist doc include samples scripts src tests
+ACLOCAL_AMFLAGS= -I m4
+SUBDIRS = dist doc include samples scripts src gtests tests
 
 EXTRA_DIST = README_daemon libcgroup.doxyfile README_systemd
 
diff --git a/configure.in b/configure.in
index 75f4a51..4a4cab1 100644
--- a/configure.in
+++ b/configure.in
@@ -16,7 +16,7 @@ AC_PREREQ(2.61)
 
 # In following section update all occurences of version, including soname
 AC_INIT([libcgroup], 0.41)
-AM_INIT_AUTOMAKE([foreign dist-bzip2])
+AM_INIT_AUTOMAKE([foreign dist-bzip2 subdir-objects])
 
 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
 
@@ -28,6 +28,9 @@ AC_SUBST(LIBRARY_VERSION_RELEASE, 41)
 # we do not want static libraries
 AC_DISABLE_STATIC
 
+AM_PROG_AR
+LT_INIT
+
 AC_CONFIG_SRCDIR([src])
 AC_CONFIG_HEADER([config.h])
 
@@ -194,6 +197,7 @@ if test x$with_pam = xtrue; then
 fi
 
 AC_CONFIG_FILES([Makefile
+       gtests/Makefile
        tests/Makefile
        tests/tools/testenv.sh
        tests/tools/Makefile
diff --git a/googletest b/googletest
new file mode 160000
index 0000000..2fe3bd9
--- /dev/null
+++ b/googletest
@@ -0,0 +1 @@
+Subproject commit 2fe3bd994b3189899d93f1d5a881e725e046fdc2
diff --git a/gtests/.gitignore b/gtests/.gitignore
new file mode 100644
index 0000000..3308721
--- /dev/null
+++ b/gtests/.gitignore
@@ -0,0 +1,6 @@
+*.log
+*.o
+*.trs
+
+gtest
+libgtest.la
diff --git a/gtests/001-path.cpp b/gtests/001-path.cpp
new file mode 100644
index 0000000..8fd0c00
--- /dev/null
+++ b/gtests/001-path.cpp
@@ -0,0 +1,114 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * libcgroup googletest for cg_build_path()
+ *
+ * Author: Tom Hromatka <tom.hroma...@oracle.com>
+ */
+#include "gtest/gtest.h"
+
+#include "libcgroup-internal.h"
+
+class BuildPathV1Test : public ::testing::Test {
+       protected:
+
+       /**
+        * Setup this test suite
+        *
+        * This test suite calls cg_build_path() to generate various
+        * cgroup paths.  The SetUp() routine creates a simple mount
+        * table that can be used to verify cg_build_path() behavior.
+        *
+        * cg_mount_table for this test is as follows:
+        *      name            mount_point                     index
+        *      -----------------------------------------------------
+        *      controller0     /sys/fs/cgroup/controller0      0
+        *      controller1     /sys/fs/cgroup/controller1      1
+        *      controller2     /sys/fs/cgroup/controller2      2
+        *      controller3     /sys/fs/cgroup/controller3      3
+        *      controller4     /sys/fs/cgroup/controller4      4
+        *      controller5     /sys/fs/cgroup/controller5      5
+        *
+        * Note that controllers 1 and 5 are also given namespaces
+        */
+       void SetUp() override {
+               char NAMESPACE1[] = "ns1";
+               char NAMESPACE5[] = "ns5";
+               const int ENTRY_CNT = 6;
+               int i;
+
+               memset(&cg_mount_table, 0, sizeof(cg_mount_table));
+               memset(cg_namespace_table, 0,
+                       CG_CONTROLLER_MAX * sizeof(cg_namespace_table[0]));
+
+               // Populate the mount table
+               for (i = 0; i < ENTRY_CNT; i++) {
+                       snprintf(cg_mount_table[i].name, FILENAME_MAX,
+                                "controller%d", i);
+                       cg_mount_table[i].index = i;
+
+                       snprintf(cg_mount_table[i].mount.path, FILENAME_MAX,
+                                "/sys/fs/cgroup/%s", cg_mount_table[i].name);
+                       cg_mount_table[i].mount.next = NULL;
+               }
+
+               // Give a couple of the entries a namespace as well
+               cg_namespace_table[1] = NAMESPACE1;
+               cg_namespace_table[5] = NAMESPACE5;
+       }
+};
+
+TEST_F(BuildPathV1Test, BuildPathV1_ControllerMismatch)
+{
+       char *name = NULL;
+       char path[FILENAME_MAX];
+       /* type intentionally _does not_ match any controllers */
+       char type[] = "FOO";
+       char *out;
+
+       out = cg_build_path(name, path, type);
+       ASSERT_STREQ(out, NULL);
+}
+
+TEST_F(BuildPathV1Test, BuildPathV1_ControllerMatch)
+{
+       char *name = NULL;
+       char path[FILENAME_MAX];
+       char type[] = "controller0";
+       char *out;
+
+       out = cg_build_path(name, path, type);
+       ASSERT_STREQ(out, "/sys/fs/cgroup/controller0/");
+}
+
+TEST_F(BuildPathV1Test, BuildPathV1_ControllerMatchWithName)
+{
+       char name[] = "TomsCgroup1";
+       char path[FILENAME_MAX];
+       char type[] = "controller3";
+       char *out;
+
+       out = cg_build_path(name, path, type);
+       ASSERT_STREQ(out, "/sys/fs/cgroup/controller3/TomsCgroup1/");
+}
+
+TEST_F(BuildPathV1Test, BuildPathV1_ControllerMatchWithNs)
+{
+       char *name = NULL;
+       char path[FILENAME_MAX];
+       char type[] = "controller1";
+       char *out;
+
+       out = cg_build_path(name, path, type);
+       ASSERT_STREQ(out, "/sys/fs/cgroup/controller1/ns1/");
+}
+
+TEST_F(BuildPathV1Test, BuildPathV1_ControllerMatchWithNameAndNs)
+{
+       char name[] = "TomsCgroup2";
+       char path[FILENAME_MAX];
+       char type[] = "controller5";
+       char *out;
+
+       out = cg_build_path(name, path, type);
+       ASSERT_STREQ(out, "/sys/fs/cgroup/controller5/ns5/TomsCgroup2/");
+}
diff --git a/gtests/Makefile.am b/gtests/Makefile.am
new file mode 100644
index 0000000..d9cf680
--- /dev/null
+++ b/gtests/Makefile.am
@@ -0,0 +1,25 @@
+# SPDX-License-Identifier: GPL-2.0
+#
+# libcgroup googletests Makefile.am
+#
+# Author: Tom Hromatka <tom.hroma...@oracle.com>
+#
+
+AM_CPPFLAGS = -I$(top_srcdir)/include \
+             -I$(top_srcdir)/src \
+             -I$(top_srcdir)/googletest/googletest/include \
+             -I$(top_srcdir)/googletest/googletest \
+             -std=c++11
+LDADD = $(top_builddir)/src/.libs/libcgroupfortesting.la \
+       libgtest.la
+
+libgtest_la_SOURCES = ../googletest/googletest/src/gtest-all.cc
+libgtest_la_CPPFLAGS = -I$(top_srcdir)/googletest/googletest/include \
+                      -I$(top_srcdir)/googletest/googletest
+
+check_LTLIBRARIES = libgtest.la
+check_PROGRAMS = gtest
+TESTS = gtest
+
+gtest_SOURCES = gtest.cpp \
+               001-path.cpp
diff --git a/gtests/gtest.cpp b/gtests/gtest.cpp
new file mode 100644
index 0000000..3b5b2b9
--- /dev/null
+++ b/gtests/gtest.cpp
@@ -0,0 +1,14 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * libcgroup googletest main entry point
+ *
+ * Author: Tom Hromatka <tom.hroma...@oracle.com>
+ */
+#include "gtest/gtest.h"
+
+int main(int argc, char **argv)
+{
+    ::testing::InitGoogleTest(&argc, argv);
+
+    return RUN_ALL_TESTS();
+}
diff --git a/src/Makefile.am b/src/Makefile.am
index 3a92d59..af21c51 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -10,9 +10,13 @@ AM_YFLAGS = -d
 CLEANFILES = lex.c parse.c parse.h
 
 INCLUDES = -I$(top_srcdir)/include
-lib_LTLIBRARIES = libcgroup.la
+lib_LTLIBRARIES = libcgroup.la libcgroupfortesting.la
 libcgroup_la_SOURCES = parse.h parse.y lex.l api.c config.c 
libcgroup-internal.h libcgroup.map wrapper.c log.c
 libcgroup_la_LIBADD = -lpthread
 libcgroup_la_LDFLAGS = -Wl,--version-script,$(srcdir)/libcgroup.map \
        -version-number 
$(LIBRARY_VERSION_MAJOR):$(LIBRARY_VERSION_MINOR):$(LIBRARY_VERSION_RELEASE)
 
+libcgroupfortesting_la_SOURCES = parse.h parse.y lex.l api.c config.c 
libcgroup-internal.h libcgroup_unittest.map wrapper.c log.c
+libcgroupfortesting_la_LIBADD = -lpthread
+libcgroupfortesting_la_LDFLAGS = 
-Wl,--version-script,$(srcdir)/libcgroup_unittest.map \
+       -version-number 
$(LIBRARY_VERSION_MAJOR):$(LIBRARY_VERSION_MINOR):$(LIBRARY_VERSION_RELEASE)
diff --git a/src/libcgroup_unittest.map b/src/libcgroup_unittest.map
new file mode 100644
index 0000000..d2af56c
--- /dev/null
+++ b/src/libcgroup_unittest.map
@@ -0,0 +1,130 @@
+CGROUP_0.32 {
+global:
+       cgroup_init;
+       cgroup_attach_task;
+       cgroup_modify_cgroup;
+       cgroup_create_cgroup;
+       cgroup_delete_cgroup;
+       cgroup_attach_task_pid;
+       cgroup_get_cgroup;
+       cgroup_create_cgroup_from_parent;
+       cgroup_copy_cgroup;
+       cgroup_change_cgroup_uid_gid;
+       cgroup_change_cgroup_path;
+       cgroup_new_cgroup;
+       cgroup_add_controller;
+       cgroup_free;
+       cgroup_free_controllers;
+       cgroup_add_value_string;
+       cgroup_add_value_int64;
+       cgroup_add_value_uint64;
+       cgroup_add_value_bool;
+       cgroup_compare_cgroup;
+       cgroup_compare_controllers;
+       cgroup_set_uid_gid;
+       cgroup_get_uid_gid;
+       cgroup_get_value_string;
+       cgroup_set_value_string;
+       cgroup_get_value_int64;
+       cgroup_set_value_int64;
+       cgroup_get_value_uint64;
+       cgroup_set_value_uint64;
+       cgroup_get_value_bool;
+       cgroup_set_value_bool;
+       cgroup_change_cgroup_uid_gid_flags;
+       cgroup_print_rules_config;
+       cgroup_reload_cached_rules;
+       cgroup_init_rules_cache;
+       cgroup_get_current_controller_path;
+       cgroup_config_load_config;
+       *;
+};
+
+CGROUP_0.32.1 {
+global:
+       cgroup_strerror;
+} CGROUP_0.32;
+
+CGROUP_0.33 {
+global:
+       cgroup_get_last_errno;
+       cgroup_walk_tree_begin;
+       cgroup_walk_tree_next;
+       cgroup_walk_tree_end;
+} CGROUP_0.32.1;
+
+CGROUP_0.34 {
+global:
+       cgroup_get_task_begin;
+       cgroup_get_task_end;
+       cgroup_get_task_next;
+       cgroup_read_stats_begin;
+       cgroup_read_stats_next;
+       cgroup_read_stats_end;
+       cgroup_walk_tree_set_flags;
+       cgroup_get_controller_end;
+       cgroup_get_controller_next;
+       cgroup_get_controller_begin;
+       cgroup_unload_cgroups;
+       cgroup_get_controller;
+       cgroup_get_uid_gid_from_procfs;
+       cgroup_get_subsys_mount_point;
+       cgroup_get_procname_from_procfs;
+       cgroup_register_unchanged_process;
+       cgroup_change_cgroup_flags;
+} CGROUP_0.33;
+
+CGROUP_0.35 {
+global:
+       create_cgroup_from_name_value_pairs;
+       cgroup_delete_cgroup_ext;
+       cgroup_get_all_controller_begin;
+       cgroup_get_all_controller_next;
+       cgroup_get_all_controller_end;
+       cgroup_get_value_name_count;
+       cgroup_get_value_name;
+} CGROUP_0.34;
+
+CGROUP_0.36 {
+} CGROUP_0.35;
+
+CGROUP_0.37 {
+       cgroup_get_procs;
+       cgroup_read_value_begin;
+       cgroup_read_value_next;
+       cgroup_read_value_end;
+       cg_chmod_recursive;
+} CGROUP_0.36;
+
+CGROUP_0.38 {
+       cgroup_get_subsys_mount_point_begin;
+       cgroup_get_subsys_mount_point_next;
+       cgroup_get_subsys_mount_point_end;
+       cgroup_set_permissions;
+       cgroup_config_unload_config;
+       cgroup_config_set_default;
+} CGROUP_0.37;
+
+CGROUP_0.39 {
+       cgroup_reload_cached_templates;
+       cgroup_init_templates_cache;
+       cgroup_config_create_template_group;
+       cgroup_change_all_cgroups;
+       cgroup_set_logger;
+       cgroup_set_default_logger;
+       cgroup_set_loglevel;
+       cgroup_log;
+       cgroup_parse_log_level_str;
+} CGROUP_0.38;
+
+CGROUP_0.40 {
+       cgroup_templates_cache_set_source_files;
+       cgroup_load_templates_cache_from_files;
+} CGROUP_0.39;
+
+CGROUP_0.41 {
+} CGROUP_0.40;
+
+CGROUP_0.42 {
+       cgroup_add_all_controllers;
+} CGROUP_0.41;
-- 
1.8.3.1



_______________________________________________
Libcg-devel mailing list
Libcg-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libcg-devel

Reply via email to