Implement mock functionality for some system calls in bp_sys.
authorDavin McCall <davmac@davmac.org>
Mon, 15 Jan 2018 09:10:10 +0000 (09:10 +0000)
committerDavin McCall <davmac@davmac.org>
Mon, 15 Jan 2018 09:10:10 +0000 (09:10 +0000)
src/tests/Makefile
src/tests/proctests.cc
src/tests/test-bpsys.cc [new file with mode: 0644]
src/tests/test-includes/baseproc-sys.h
src/tests/test-includes/dinit.h

index b4b115310395aec3f411745f8bc85655d02aee91..dd82c0ee7d650d433ce8b73c2fba7f9c6fecaf2b 100644 (file)
@@ -1,6 +1,6 @@
 -include ../../mconfig
 
-objects = tests.o test-dinit.o proctests.o test-run-child-proc.o
+objects = tests.o test-dinit.o proctests.o test-run-child-proc.o test-bpsys.o
 parent_objs = service.o proc-service.o dinit-log.o load_service.o baseproc-service.o
 
 check: build-tests
@@ -16,11 +16,11 @@ prepare-incdir:
        cd includes; ln -sf ../../includes/*.h .
        cd includes; ln -sf ../test-includes/*.h .
 
-tests: prepare-incdir $(parent_objs) tests.o test-dinit.o
-       $(CXX) $(SANITIZEOPTS) -o tests $(parent_objs) tests.o test-dinit.o $(EXTRA_LIBS)
+tests: prepare-incdir $(parent_objs) tests.o test-dinit.o test-bpsys.o
+       $(CXX) $(SANITIZEOPTS) -o tests $(parent_objs) tests.o test-dinit.o test-bpsys.o $(EXTRA_LIBS)
 
-proctests: prepare-incdir $(parent_objs) proctests.o test-dinit.o
-       $(CXX) $(SANITIZEOPTS) -o proctests $(parent_objs) proctests.o test-dinit.o $(EXTRA_LIBS)
+proctests: prepare-incdir $(parent_objs) proctests.o test-dinit.o test-bpsys.o
+       $(CXX) $(SANITIZEOPTS) -o proctests $(parent_objs) proctests.o test-dinit.o test-bpsys.o $(EXTRA_LIBS)
 
 $(objects): %.o: %.cc
        $(CXX) $(CXXOPTS) $(SANITIZEOPTS) -Iincludes -I../dasynq -c $< -o $@
index 9d715602f55eae2ea32a8de7615ad68772e3e1a5..eb453897fd1ab6e43bc8466b149df835b86e901f 100644 (file)
@@ -41,8 +41,12 @@ void test1()
 
     process_service p = process_service(&sset, "testproc", std::move(command), command_offsets, depends);
     p.start(true);
+    sset.process_queues();
+
+    assert(p.get_state() == service_state_t::STARTING);
 
     base_process_service_test::exec_succeeded(&p);
+    sset.process_queues();
 
     assert(p.get_state() == service_state_t::STARTED);
 }
diff --git a/src/tests/test-bpsys.cc b/src/tests/test-bpsys.cc
new file mode 100644 (file)
index 0000000..a244f8c
--- /dev/null
@@ -0,0 +1,40 @@
+#include <vector>
+#include <utility>
+#include <algorithm>
+
+#include "baseproc-sys.h"
+
+std::vector<bool> usedfds = {true, true, true};
+
+// Allocate a file descriptor
+static int allocfd()
+{
+    auto f = std::find(usedfds.begin(), usedfds.end(), false);
+    if (f == usedfds.end()) {
+        int r = usedfds.size();
+        usedfds.push_back(true);
+        return r;
+    }
+
+    *f = true;
+    return f - usedfds.begin();
+}
+
+namespace bp_sys {
+
+int pipe2(int fds[2], int flags)
+{
+    fds[0] = allocfd();
+    fds[1] = allocfd();
+    return 0;
+}
+
+int close(int fd)
+{
+    if (fd >= usedfds.size()) abort();
+
+    usedfds[fd] = false;
+    return 0;
+}
+
+}
index b12c4952e0223a41fc9a54c3ce124c828c9837a0..fbe4a61c835325d2a2259338f630354b0cbd7c9c 100644 (file)
@@ -1,14 +1,12 @@
 #include <sys/types.h>
+#include <iostream>
 
 // Mock system functions for testing.
 
 namespace bp_sys {
 
-inline int pipe2(int pipefd[2], int flags)
-{
-    abort();
-    return 0;
-}
+int pipe2(int pipefd[2], int flags);
+int close(int fd);
 
 inline int fcntl(int fd, int cmd, ...)
 {
@@ -16,14 +14,10 @@ inline int fcntl(int fd, int cmd, ...)
     return 0;
 }
 
-inline int close(int fd)
-{
-    abort();
-    return 0;
-}
-
 inline int kill(pid_t pid, int sig)
 {
+    // No proper mock implemented yet:
+    std::cout << "(kill; aborting)" << std::endl;
     abort();
     return 0;
 }
index 8582bed6d43d0ca922687c32e3a2bf54e8db7c50..521f68ff195493f99e401af87e6a64a66c9c77e8 100644 (file)
@@ -22,7 +22,7 @@ class eventloop_t
         public:
         pid_t fork(eventloop_t &loop, bool reserved_child_watcher, int priority = dasynq::DEFAULT_PRIORITY)
         {
-            return -1;
+            return 2; // doesn't matter much what we return here, but it should be a potentially valid pid
         }
 
         void add_reserved(eventloop_t &eloop, pid_t child, int prio = dasynq::DEFAULT_PRIORITY) noexcept