diff --git a/modules/Cat/tests/testsCat.cpp b/modules/Cat/tests/testsCat.cpp index eb21120..dc873da 100644 --- a/modules/Cat/tests/testsCat.cpp +++ b/modules/Cat/tests/testsCat.cpp @@ -1,5 +1,7 @@ #include "../Cat.hpp" +#include + #ifdef __linux__ #elif _WIN32 #include @@ -23,64 +25,60 @@ int main() bool testCat() { - std::string testFile = "test1.txt"; - std::string fileContent = "testCat"; + namespace fs = std::filesystem; + fs::path temp = fs::temp_directory_path() / "c2core_cat_test"; + fs::create_directories(temp); - std::ofstream outfile("test1.txt"); - outfile << "testCat" << std::endl; - outfile.close(); + bool ok = true; std::unique_ptr cat = std::make_unique(); + + // ----- valid file ----- + fs::path file = temp / "file.txt"; { - std::vector splitedCmd; - splitedCmd.push_back("cat"); - splitedCmd.push_back(testFile); - - C2Message c2Message; - C2Message c2RetMessage; - cat->init(splitedCmd, c2Message); - cat->process(c2Message, c2RetMessage); - - std::string output = "\n\noutput:\n"; - output += c2RetMessage.returnvalue(); - output += "\n"; - std::cout << output << std::endl; - - if (c2RetMessage.returnvalue().compare(0, fileContent.length(), fileContent) == 0) - { - } - else - { - std::cout << "[-] fileContent " << fileContent << std::endl; - std::cout << "[-] c2RetMessage.returnvalue() " << c2RetMessage.returnvalue() << std::endl; - return false; - } - } - - { - std::vector splitedCmd; - splitedCmd.push_back("cat"); - splitedCmd.push_back(".\\test space folder\\test space.txt"); - - C2Message c2Message; - C2Message c2RetMessage; - cat->init(splitedCmd, c2Message); - cat->process(c2Message, c2RetMessage); - - std::string output = "\n\noutput:\n"; - output += c2RetMessage.returnvalue(); - output += "\n"; - std::cout << output << std::endl; - - if (c2RetMessage.errorCode()) - { - std::cout << "[+] c2RetMessage.errorCode() " << c2RetMessage.errorCode() << std::endl; - } - else - { - return false; - } + std::ofstream(file) << "hello"; + std::vector cmd = {"cat", file.string()}; + C2Message msg, ret; + cat->init(cmd, msg); + msg.set_inputfile(file.string()); + cat->process(msg, ret); + + ok &= ret.returnvalue().find("hello") == 0; } - return true; + // ----- path containing spaces and tokens splitted ----- + fs::path spaced = temp / "space file.txt"; + { + std::ofstream(spaced) << "space"; + std::vector cmd = {"cat", (temp.string()+"/space").c_str(), "file.txt"}; + C2Message msg, ret; + cat->init(cmd, msg); + msg.set_inputfile(spaced.string()); + cat->process(msg, ret); + + ok &= ret.returnvalue().find("space") == 0; + } + + // ----- invalid file ----- + { + fs::path invalid = temp / "does_not_exist.txt"; + std::vector cmd = {"cat", invalid.string()}; + C2Message msg, ret; + cat->init(cmd, msg); + msg.set_inputfile(invalid.string()); + cat->process(msg, ret); + std::string err; + cat->errorCodeToMsg(ret, err); +#ifdef BUILD_TEAMSERVER + ok &= ret.errorCode() == 1 && !err.empty(); +#else + + ok &= ret.errorCode() == 1; +#endif + } + + + + fs::remove_all(temp); + return ok; } diff --git a/modules/ModuleTemplate/tests/testsModuleTemplate.cpp b/modules/ModuleTemplate/tests/testsModuleTemplate.cpp index 997bc58..756ea85 100644 --- a/modules/ModuleTemplate/tests/testsModuleTemplate.cpp +++ b/modules/ModuleTemplate/tests/testsModuleTemplate.cpp @@ -29,49 +29,47 @@ bool testModuleTemplate() { std::unique_ptr moduleTemplate = std::make_unique(); - + bool ok = true; + + // ----- correct argument ----- { - std::vector splitedCmd; - splitedCmd.push_back("moduleTemplate"); - splitedCmd.push_back("arg1"); - - C2Message c2Message; - C2Message c2RetMessage; - moduleTemplate->init(splitedCmd, c2Message); - moduleTemplate->process(c2Message, c2RetMessage); - - std::string output = "output:\n"; - output += c2RetMessage.returnvalue(); - output += "\n"; - std::cout << output << std::endl; + std::vector cmd = {"moduleTemplate", "arg1"}; + C2Message msg, ret; + moduleTemplate->init(cmd, msg); + moduleTemplate->process(msg, ret); + ok &= ret.returnvalue().find("return value") != std::string::npos; } + // ----- wrong argument triggers error ----- { - std::vector splitedCmd; - splitedCmd.push_back("moduleTemplate"); - splitedCmd.push_back("notarg1"); - - C2Message c2Message; - C2Message c2RetMessage; - moduleTemplate->init(splitedCmd, c2Message); - moduleTemplate->process(c2Message, c2RetMessage); - - std::string output = "output:\n"; - output += c2RetMessage.returnvalue(); - output += "\n"; - std::cout << output << std::endl; - - if (c2RetMessage.errorCode()) - { - std::string errorMsg; - moduleTemplate->errorCodeToMsg(c2RetMessage, errorMsg); - std::cout << "[+] error: \n" << errorMsg << std::endl; - } - else - { - return false; - } + std::vector cmd = {"moduleTemplate", "notarg1"}; + C2Message msg, ret; + moduleTemplate->init(cmd, msg); + moduleTemplate->process(msg, ret); + std::string err; + moduleTemplate->errorCodeToMsg(ret, err); +#ifdef BUILD_TEAMSERVER + ok &= ret.errorCode() == 1 && !err.empty(); +#else + ok &= ret.errorCode() == 1; +#endif } - return true; + // ----- missing argument ----- + { + std::vector cmd = {"moduleTemplate"}; + C2Message msg, ret; + ok &= moduleTemplate->init(cmd, msg) == -1; + ok &= !msg.returnvalue().empty(); + } + + // ----- followUp path ----- + { + C2Message ret; + ret.set_errorCode(-1); + ret.set_args("dummy"); + ok &= moduleTemplate->followUp(ret) == 0; + } + + return ok; } diff --git a/modules/Run/tests/testsRun.cpp b/modules/Run/tests/testsRun.cpp index 06144a6..d31f131 100644 --- a/modules/Run/tests/testsRun.cpp +++ b/modules/Run/tests/testsRun.cpp @@ -1,5 +1,7 @@ #include "../Run.hpp" +#include + #ifdef __linux__ #elif _WIN32 #include @@ -24,101 +26,44 @@ int main() bool testRun() { std::unique_ptr run = std::make_unique(); + bool ok = true; + // ----- simple echo ----- { - std::vector splitedCmd; - splitedCmd.push_back("run"); - splitedCmd.push_back("whoami"); - - C2Message c2Message; - C2Message c2RetMessage; - run->init(splitedCmd, c2Message); - run->process(c2Message, c2RetMessage); - - std::string output = "\n\noutput:\n"; - output += c2RetMessage.returnvalue(); - output += "\n"; - std::cout << output << std::endl; - } - { - std::vector splitedCmd; - splitedCmd.push_back("run"); - splitedCmd.push_back("id"); - - C2Message c2Message; - C2Message c2RetMessage; - run->init(splitedCmd, c2Message); - run->process(c2Message, c2RetMessage); - - std::string output = "\n\noutput:\n"; - output += c2RetMessage.returnvalue(); - output += "\n"; - std::cout << output << std::endl; - } - { - std::vector splitedCmd; - splitedCmd.push_back("run"); - splitedCmd.push_back("dir"); - - C2Message c2Message; - C2Message c2RetMessage; - run->init(splitedCmd, c2Message); - run->process(c2Message, c2RetMessage); - - std::string output = "\n\noutput:\n"; - output += c2RetMessage.returnvalue(); - output += "\n"; - std::cout << output << std::endl; - } - { - std::vector splitedCmd; - splitedCmd.push_back("run"); -#ifdef __linux__ - splitedCmd.push_back("/c ping 127.0.0.1 -c 1"); -#elif _WIN32 - splitedCmd.push_back("/c ping 127.0.0.1 /n 1"); -#endif - - C2Message c2Message; - C2Message c2RetMessage; - run->init(splitedCmd, c2Message); - run->process(c2Message, c2RetMessage); - - std::string output = "\n\noutput:\n"; - output += c2RetMessage.returnvalue(); - output += "\n"; - std::cout << output << std::endl; - } - { - std::vector splitedCmd; - splitedCmd.push_back("run"); - splitedCmd.push_back("calc.exe"); - - C2Message c2Message; - C2Message c2RetMessage; - run->init(splitedCmd, c2Message); - run->process(c2Message, c2RetMessage); - - std::string output = "\n\noutput:\n"; - output += c2RetMessage.returnvalue(); - output += "\n"; - std::cout << output << std::endl; - } - { - std::vector splitedCmd; - splitedCmd.push_back("run"); - splitedCmd.push_back(".\\test.bat"); - - C2Message c2Message; - C2Message c2RetMessage; - run->init(splitedCmd, c2Message); - run->process(c2Message, c2RetMessage); - - std::string output = "\n\noutput:\n"; - output += c2RetMessage.returnvalue(); - output += "\n"; - std::cout << output << std::endl; + std::vector cmd = {"run", "echo", "hello"}; + C2Message msg, ret; + run->init(cmd, msg); + msg.set_cmd("echo hello"); + run->process(msg, ret); + ok &= ret.returnvalue().find("hello") != std::string::npos; } - return true; + // ----- command with spaces (split tokens) ----- + { + std::vector cmd = {"run", "echo", "hello", "world"}; + C2Message msg, ret; + run->init(cmd, msg); + msg.set_cmd("echo hello world"); + run->process(msg, ret); + ok &= ret.returnvalue().find("hello world") != std::string::npos; + } + + // ----- invalid command should return error text ----- + { + std::vector cmd = {"run", "nonexistent_command_foo"}; + C2Message msg, ret; + run->init(cmd, msg); + msg.set_cmd("nonexistent_command_foo"); + run->process(msg, ret); + ok &= ret.returnvalue().empty(); + } + + // ----- missing argument ----- + { + std::vector cmd = {"run"}; + C2Message msg, ret; + ok &= run->init(cmd, msg) == -1; + } + + return ok; } diff --git a/modules/Tree/tests/testsTree.cpp b/modules/Tree/tests/testsTree.cpp index 9aa5f94..8f644c7 100644 --- a/modules/Tree/tests/testsTree.cpp +++ b/modules/Tree/tests/testsTree.cpp @@ -1,5 +1,7 @@ #include "../Tree.hpp" +#include + #ifdef __linux__ #elif _WIN32 #include @@ -23,67 +25,61 @@ int main() bool testTree() { + namespace fs = std::filesystem; + fs::path temp = fs::temp_directory_path() / "c2core_tree_test"; + fs::remove_all(temp); + fs::create_directories(temp / "sub"); + std::ofstream(temp / "file.txt") << "data"; + std::ofstream(temp / "sub" / "inner.txt") << "data"; + std::unique_ptr tree = std::make_unique(); + bool ok = true; + // ----- explicit path ----- { - std::vector splitedCmd; - splitedCmd.push_back("tree"); - - C2Message c2Message; - C2Message c2RetMessage; - tree->init(splitedCmd, c2Message); - tree->process(c2Message, c2RetMessage); - - std::string output = "\n\noutput:\n"; - output += c2RetMessage.returnvalue(); - output += "\n"; - std::cout << output << std::endl; + std::vector cmd = {"tree", temp.string()}; + C2Message msg, ret; + tree->init(cmd, msg); + msg.set_cmd(temp.string()); + tree->process(msg, ret); + std::string out = ret.returnvalue(); + ok &= out.find((temp / "file.txt").string()) != std::string::npos; + ok &= out.find((temp / "sub").string() + "\\") != std::string::npos; } + + // ----- path with spaces using split tokens ----- + fs::path spacedDir = temp / "dir space"; + fs::create_directories(spacedDir); + std::ofstream(spacedDir / "dummy.txt") << "a"; { - std::vector splitedCmd; - splitedCmd.push_back("tree"); - splitedCmd.push_back("C:\\Users"); - - C2Message c2Message; - C2Message c2RetMessage; - tree->init(splitedCmd, c2Message); - tree->process(c2Message, c2RetMessage); - - std::string output = "\n\noutput:\n"; - output += c2RetMessage.returnvalue(); - output += "\n"; - std::cout << output << std::endl; + std::vector cmd = {"tree", (temp.string()+"/dir").c_str(), "space"}; + C2Message msg, ret; + tree->init(cmd, msg); + msg.set_cmd(spacedDir.string()); + tree->process(msg, ret); + ok &= ret.returnvalue().find((spacedDir/"dummy.txt").string()) != std::string::npos; } + + // ----- invalid path ----- { - std::vector splitedCmd; - splitedCmd.push_back("tree"); - splitedCmd.push_back("."); - - C2Message c2Message; - C2Message c2RetMessage; - tree->init(splitedCmd, c2Message); - tree->process(c2Message, c2RetMessage); - - std::string output = "\n\noutput:\n"; - output += c2RetMessage.returnvalue(); - output += "\n"; - std::cout << output << std::endl; + fs::path invalid = temp / "does_not_exist"; + std::vector cmd = {"tree", invalid.string()}; + C2Message msg, ret; + tree->init(cmd, msg); + msg.set_cmd(invalid.string()); + tree->process(msg, ret); + ok &= ret.returnvalue().empty(); } - // { - // std::vector splitedCmd; - // splitedCmd.push_back("tree"); - // splitedCmd.push_back("C:\\Program Files"); - // C2Message c2Message; - // C2Message c2RetMessage; - // tree->init(splitedCmd, c2Message); - // tree->process(c2Message, c2RetMessage); + // ----- no argument ----- + { + std::vector cmd = {"tree"}; + C2Message msg, ret; + tree->init(cmd, msg); + tree->process(msg, ret); + ok &= !ret.returnvalue().empty(); + } - // std::string output = "\n\noutput:\n"; - // output += c2RetMessage.returnvalue(); - // output += "\n"; - // std::cout << output << std::endl; - // } - - return true; + fs::remove_all(temp); + return ok; }