Add mock 'open' system call to bpsys
authorDavin McCall <davmac@davmac.org>
Tue, 14 Apr 2020 22:56:21 +0000 (08:56 +1000)
committerDavin McCall <davmac@davmac.org>
Tue, 14 Apr 2020 22:56:21 +0000 (08:56 +1000)
This allows a test harness to supply file content for particular paths;
opening a "file" will then allow reading the supplied content.

src/includes/baseproc-sys.h
src/includes/dinit-util.h
src/tests/test-bpsys.cc
src/tests/test-includes/baseproc-sys.h

index fcf50565c1d9d469ee4ea23f6bee7e45a63cca60..6c4f7a900ab65707c744733cc13fe95bafdd7551 100644 (file)
@@ -19,6 +19,7 @@ namespace bp_sys {
 using dasynq::pipe2;
 
 using ::fcntl;
+using ::open;
 using ::close;
 using ::kill;
 using ::getpgid;
index bd28c2e6db7df189a180474e7fc983e4e57fdc3c..caa2cdd695ab21dc973f6c0165dbbb35efcdc4fa 100644 (file)
@@ -9,6 +9,8 @@
 #include <sys/types.h>
 #include <unistd.h>
 
+#include "baseproc-sys.h"
+
 // Complete read - read the specified size until end-of-file or error; continue read if
 // interrupted by signal.
 inline ssize_t complete_read(int fd, void * buf, size_t n)
@@ -16,7 +18,7 @@ inline ssize_t complete_read(int fd, void * buf, size_t n)
     char * cbuf = static_cast<char *>(buf);
     ssize_t r = 0;
     while ((size_t)r < n) {
-        ssize_t res = read(fd, cbuf + r, n - r);
+        ssize_t res = bp_sys::read(fd, cbuf + r, n - r);
         if (res == 0) {
             return r;
         }
index fc0a08d788066a19584e7a04ed7dd412fd49b79f..737231ba4614ecb8f346b649ee33d3ba4ebf5a33 100644 (file)
@@ -39,6 +39,9 @@ std::map<int,read_cond> read_data;
 // map of fd to the handler for writes to that fd
 std::map<int, std::unique_ptr<bp_sys::write_handler>> write_hndlr_map;
 
+// map of path to file content
+std::map<std::string, std::vector<char>> file_content_map;
+
 } // anon namespace
 
 namespace bp_sys {
@@ -102,9 +105,32 @@ void extract_written_data(int fd, std::vector<char> &data)
        data = std::move(dwhndlr->data);
 }
 
+// Supply a file content
+void supply_file_content(const std::string &path, std::vector<char> &data)
+{
+    file_content_map[path] = data;
+}
+
+void supply_file_content(const std::string &path, std::vector<char> &&data)
+{
+    file_content_map[path] = std::move(data);
+}
 
 // Mock implementations of system calls:
 
+int open(const char *pathname, int flags)
+{
+    auto i = file_content_map.find(pathname);
+    if (i == file_content_map.end()) {
+        errno = ENOENT;
+        return -1;
+    }
+
+    int nfd = allocfd();
+    supply_read_data(nfd, i->second);
+    return nfd;
+}
+
 int pipe2(int fds[2], int flags)
 {
     fds[0] = allocfd();
index 2d2980783a36b2bdb75255c753a73d73c8803363..e0c1d98a7d01cdacf7d90cdd8fb1107416e78b92 100644 (file)
@@ -43,10 +43,13 @@ void supply_read_data(int fd, std::vector<char> &data);
 void supply_read_data(int fd, std::vector<char> &&data);
 void set_blocking(int fd);
 void extract_written_data(int fd, std::vector<char> &data);
+void supply_file_content(const std::string &path, const std::vector<char> &data);
+void supply_file_content(const std::string &path, std::vector<char> &&data);
 
 // Mock system calls:
 
 // implementations elsewhere:
+int open(const char *pathname, int flags);
 int pipe2(int pipefd[2], int flags);
 int close(int fd);
 int kill(pid_t pid, int sig);
@@ -126,7 +129,8 @@ class exit_status
 
 inline pid_t waitpid(pid_t p, exit_status *statusp, int flags)
 {
-    throw std::string("not implemented");
+    // throw std::string("not implemented");
+    return 0; // TODO complete mock
 }
 
 ssize_t read(int fd, void *buf, size_t count);