tripwire-open-source/src/twtest/unixfsservices_t.cpp

242 lines
7.1 KiB
C++

//
// The developer of the original code and/or files is Tripwire, Inc.
// Portions created by Tripwire, Inc. are copyright (C) 2000-2021 Tripwire,
// Inc. Tripwire is a registered trademark of Tripwire, Inc. All rights
// reserved.
//
// This program is free software. The contents of this file are subject
// to the terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2 of the License, or (at your
// option) any later version. You may redistribute it and/or modify it
// only in compliance with the GNU General Public License.
//
// This program is distributed in the hope that it will be useful.
// However, this program is distributed AS-IS WITHOUT ANY
// WARRANTY; INCLUDING THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS
// FOR A PARTICULAR PURPOSE. Please see the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
// USA.
//
// Nothing in the GNU General Public License or any other license to use
// the code or files shall permit you to use Tripwire's trademarks,
// service marks, or other intellectual property without Tripwire's
// prior written consent.
//
// If you have any questions, please contact Tripwire, Inc. at either
// info@tripwire.org or www.tripwire.org.
//
// unixfsservices_t.cpp: Tests cUnixFSServices
//#include <fcntl.h>
#include "core/stdcore.h"
#include "core/unixfsservices.h"
#include <iostream>
#include "core/archive.h"
#include "fco/fconame.h"
#ifndef __TEST_H
#include "twtest/test.h"
#endif
#include <unistd.h>
using namespace std;
std::string makeTestFile(const std::string& filename)
{
TSTRING testfile = TwTestPath(filename);
cFileArchive filearch;
filearch.OpenReadWrite(testfile.c_str());
filearch.Seek(0, cBidirArchive::BEGINNING);
filearch.WriteString(_T("This is a test"));
filearch.Close();
return testfile;
}
//Tests the functions that are currently implemented in win32fsservices.
void TestReadDir()
{
cDebug d("TestReadDir");
// d.RemoveOutTarget(cDebug::OUT_STDOUT);
iFSServices* pFSServices = iFSServices::GetInstance();
// working primarily with the temp dir.
cFCOName name(TwTestDir());
// Check to make sure test dir is a dir
//TEST(pFSServices->GetFileType(name) == cFSStatArgs::TY_DIR);
// get directory contents (test readdir)
std::vector<TSTRING> v;
pFSServices->ReadDir(name.AsString(), v);
{
d.TraceDebug("name: %d entries\n", v.size());
std::vector<TSTRING>::iterator p;
size_t n = 0;
for (p = v.begin(); p != v.end(); ++p)
{
d.TraceDetail(" %s\n", p->c_str());
n++;
}
TEST(n == v.size());
}
}
void TestStat()
{
//Test the Stat method
cFSStatArgs stat;
std::string testfile = makeTestFile("stat.tmp");
iFSServices::GetInstance()->Stat(testfile, stat);
TEST("Stat() did not throw");
/*
cDebug d("TestStat");
//print out the information returned by Stat
d.TraceDetail("Information returned by Stat: \n");
d.TraceDetail("Group ID : %-5d \n", stat.gid);
//d.TraceDetail("Last access time: %d \n", stat.atime);
d.TraceDetail("Last inode change: %d \n", stat.ctime);
d.TraceDetail("Last modified: %d \n", stat.mtime);
d.TraceDetail("Major/minor device nums: %d \n", stat.dev);
d.TraceDetail("Inode # of file : %d \n", stat.ino);
d.TraceDetail("Mode bits: %d \n", stat.mode);
d.TraceDetail("Num links: %d \n", stat.nlink);
d.TraceDetail("Major/minor dev if special: %d \n", stat.rdev);
d.TraceDetail("File size: %d \n", stat.size);
d.TraceDetail("User ID: %d \n", stat.uid);
*/
}
void TestGetCurrentDir()
{
TSTRING currpath;
iFSServices::GetInstance()->GetCurrentDir(currpath);
TEST("GetCurrentDir() did not throw");
//d.TraceDetail("GetCurrentDir returned %s\n", currpath.c_str());
//TEST(currpath == _T("~"));
//they should both be ~!!
}
void TestMakeTempFilename()
{
TSTRING _template(_T("twtempXXXXXX"));
iFSServices::GetInstance()->MakeTempFilename(_template);
TEST("MakeTempFilename() did not throw");
}
void TestGetMachineName()
{
TSTRING uname;
iFSServices::GetInstance()->GetMachineName(uname);
TEST("GetMachineName() did not throw");
}
void TestGetHostID()
{
TSTRING hostid;
iFSServices::GetInstance()->GetHostID(hostid);
TEST("GetHostID() did not throw:");
}
void TestGetCurrentUserName()
{
#if !IS_SKYOS // SkyOS breaks on this, for as-yet-unknown reasons
TSTRING username;
bool success = iFSServices::GetInstance()->GetCurrentUserName(username);
if (!success)
skip("GetCurrentUserName test skipped, usually caused by system configuration problems");
TEST("GetCurrentUserName() did not throw");
#endif
}
void TestGetIPAddress()
{
uint32_t ipaddr;
bool success = iFSServices::GetInstance()->GetIPAddress(ipaddr);
if (!success)
skip("GetIPAddress test skipped, usually caused by hostname/IP configuration problems");
TEST("GetIPAddress() did not throw");
}
void TestGetExecutableFilename()
{
if (-1 == access("/bin/sh", F_OK))
skip("/bin/sh not found/accessible");
TSTRING filename = _T("sh");
TSTRING fullpath = _T("/bin/");
TEST(iFSServices::GetInstance()->GetExecutableFilename(fullpath, filename));
filename = _T("/bin/sh");
TEST(iFSServices::GetInstance()->GetExecutableFilename(fullpath, filename));
}
void TestRename()
{
std::string testfile = makeTestFile("rename_from");
TSTRING newtestfile = TwTestPath("rename_to");
TEST(iFSServices::GetInstance()->Rename(testfile, newtestfile));
}
void TestFileDelete()
{
std::string to_rm = makeTestFile("to_rm");
TEST(iFSServices::GetInstance()->FileDelete(to_rm));
}
// This looks silly, but we've run into situations where basic exception handling fails due to
// fun linker issues, so here's a test to verify that we were built correctly.
void TestCatch()
{
bool threw = false;
try
{
throw eFSServices("a thing happened");
}
catch (const eFSServices& e)
{
threw = true;
}
TEST(threw);
}
void RegisterSuite_UnixFSServices()
{
RegisterTest("UnixFSServices", "ReadDir", TestReadDir);
RegisterTest("UnixFSServices", "Stat", TestStat);
RegisterTest("UnixFSServices", "GetCurrentDir", TestGetCurrentDir);
RegisterTest("UnixFSServices", "MakeTempFilename", TestMakeTempFilename);
RegisterTest("UnixFSServices", "GetMachineName", TestGetMachineName);
RegisterTest("UnixFSServices", "GetHostID", TestGetHostID);
RegisterTest("UnixFSServices", "GetCurrentUserName", TestGetCurrentUserName);
RegisterTest("UnixFSServices", "GetIPAddress", TestGetIPAddress);
RegisterTest("UnixFSServices", "GetExecutableFilename", TestGetExecutableFilename);
RegisterTest("UnixFSServices", "Rename", TestRename);
RegisterTest("UnixFSServices", "FileDelete", TestFileDelete);
RegisterTest("UnixFSServices", "TestCatch", TestCatch);
}