diff --git a/utils/cloudio/SMComm.cpp b/utils/cloudio/SMComm.cpp index 5f19c0849..8b4cda059 100644 --- a/utils/cloudio/SMComm.cpp +++ b/utils/cloudio/SMComm.cpp @@ -65,6 +65,8 @@ SMComm * SMComm::get() errno = l_errno; \ common_exit(bs1, bs2, retCode); \ } \ + else \ + errno = 0; \ } SMComm::SMComm() diff --git a/utils/cloudio/SMDataFile.cpp b/utils/cloudio/SMDataFile.cpp index c2e600165..af7ba19dd 100644 --- a/utils/cloudio/SMDataFile.cpp +++ b/utils/cloudio/SMDataFile.cpp @@ -127,4 +127,17 @@ int SMDataFile::close() return 0; } +// constructor used for testing +SMDataFile::SMDataFile(const char *fname, int _openmode, size_t fake_size) + : IDBDataFile(fname) +{ + openmode = _openmode; + // the 'a' file open mode is the only one that starts at EOF + if ((openmode & O_APPEND) && !(openmode & O_RDWR)) + position = fake_size; + else + position = 0; + comm = SMComm::get(); +} + } diff --git a/utils/cloudio/SMDataFile.h b/utils/cloudio/SMDataFile.h index 512c835a4..bc062d457 100644 --- a/utils/cloudio/SMDataFile.h +++ b/utils/cloudio/SMDataFile.h @@ -42,6 +42,9 @@ class SMDataFile : public IDBDataFile time_t mtime(); int close(); + // for testing only + SMDataFile(const char *fname, int openmode, size_t fake_size); + private: SMDataFile(); SMDataFile(const char *fname, int openmode, const struct stat &); diff --git a/utils/cloudio/component_test.cpp b/utils/cloudio/component_test.cpp index f54b4968c..750f15206 100644 --- a/utils/cloudio/component_test.cpp +++ b/utils/cloudio/component_test.cpp @@ -20,6 +20,8 @@ #include #include #include +#include +#include #include #include #include @@ -127,8 +129,8 @@ int test1() SMFileFactory factory; cout << "open" << endl; - IDBDataFile *f = factory.open("dummy", "r", 0, 0); - assert(f == NULL && errno == EINVAL && !die); + IDBDataFile *file = factory.open("dummy", "r", 0, 0); + assert(file == NULL && errno == EINVAL && !die); SMFileSystem filesystem; @@ -162,35 +164,89 @@ int test1() cout << "exists" << endl; err = filesystem.exists("dummy"); - assert(!err); + assert(!err && errno == EINVAL); cout << "filesystemisup" << endl; err = filesystem.filesystemIsUp(); - assert(!err && !die); + assert(!err && errno == EINVAL && !die); cout << "isdir" << endl; err = filesystem.isDir("dummy"); - assert(!err && !die); + assert(!err && errno == EINVAL && !die); cout << "listdirectory" << endl; list filenames; err = filesystem.listDirectory("dummy", filenames); - assert(err == -1 && filenames.empty() && !die); + assert(err == -1 && errno == EINVAL && filenames.empty() && !die); cout << "remove" << endl; err = filesystem.remove("dummy"); - assert(err == -1 && !die); + assert(err == -1 && errno == EINVAL && !die); cout << "size" << endl; err = filesystem.size("dummy"); - assert(err == -1 && !die); + assert(err == -1 && errno == EINVAL && !die); cout << "mkdir" << endl; err = filesystem.mkdir("dummy"); assert(err == 0 && !die); + cout << "datafile constructor" << endl; + SMDataFile f("dummy", O_RDONLY, 12345); + f = SMDataFile("dummy2", O_WRONLY, 123456); + f = SMDataFile("dummy2", O_RDWR | O_APPEND, 1234567); + + cout << "pread" << endl; + uint8_t buf[1024]; + err = f.pread(buf, 0, 1024); + assert(err == -1 && errno == EINVAL && !die); + + cout << "read" << endl; + err = f.read(buf, 1024); + assert(err == -1 && errno == EINVAL && !die); + + cout << "write" << endl; + err = f.write(buf, 1024); + assert(err == -1 && errno == EINVAL && !die); + + cout << "seek" << endl; + err = f.seek(1234, SEEK_SET); + assert(err == 0 && !die); + + err = f.seek(1234, SEEK_CUR); + assert(err == 0 && !die); + + err = f.seek(1234, SEEK_END); + assert(err == -1 && errno == EINVAL && !die); + + cout << "truncate" << endl; + err = f.truncate(1234); + assert(err == -1 && errno == EINVAL && !die); + + cout << "size" << endl; + err = f.size(); + assert(err == -1 && errno == EINVAL && !die); + + cout << "tell" << endl; + err = f.tell(); + assert(err == 2468); + + cout << "flush" << endl; + err = f.flush(); + assert(err == 0); + + cout << "mtime" << endl; + err = f.mtime(); + assert(err == -1 && errno == EINVAL && !die); + + cout << "close" << endl; + err = f.close(); + assert(err == 0); + + // done, return errCode die = true; + cout << "done, waiting for server thread to stop" << endl; server_thread.join(); return errCode; }