diff --git a/test/loader_api.cpp b/test/loader_api.cpp index aa389e68..0d35fc2b 100644 --- a/test/loader_api.cpp +++ b/test/loader_api.cpp @@ -12,9 +12,20 @@ #include "ze_api.h" #include "zes_api.h" +#include + #if defined(_WIN32) + #include + #include + #include #define putenv_safe _putenv #else + #include + #include + #include + #define _dup dup + #define _dup2 dup2 + #define _close close #define putenv_safe putenv #endif @@ -365,4 +376,68 @@ TEST( EXPECT_FALSE(zelCheckIsLoaderInTearDown()); } +class CaptureOutput { +private: + int original_fd; + int fd; + int stream; + char filename[50] = "/tmp/capture_output_XXXXXX"; + +public: + enum { Stdout = 1, Stderr = 2 }; + + CaptureOutput(int stream_) : stream(stream_) { + original_fd = _dup(stream); +#if defined(__linux__) + fd = mkstemp(filename); +#elif defined(_WIN32) + tmpnam_s(filename, sizeof(filename)); + _sopen_s(&fd, filename, _O_CREAT | _O_RDWR, _SH_DENYNO, _S_IREAD | _S_IWRITE); +#endif + fflush(nullptr); + _dup2(fd, stream); + _close(fd); + } + + ~CaptureOutput() { + if (original_fd != -1) { + fflush(nullptr); + _dup2(original_fd, stream); + _close(original_fd); + original_fd = -1; + } + if (remove(filename) != 0) { + std::cerr << "Deleting file " << filename << " failed."; + } + } + + std::string GetOutput() { + if (original_fd != -1) { + fflush(nullptr); + _dup2(original_fd, stream); + _close(original_fd); + original_fd = -1; + } + std::ifstream stream(filename); + std::string output = std::string((std::istreambuf_iterator(stream)), + std::istreambuf_iterator()); + return output; + } +}; + +TEST( + LoaderInitDrivers, + GivenZeInitDriverWhenCalledThenNoOutputIsPrintedToStdout) { + uint32_t pInitDriversCount = 0; + ze_init_driver_type_desc_t desc = { ZE_STRUCTURE_TYPE_INIT_DRIVER_TYPE_DESC }; + desc.flags = UINT32_MAX; + desc.pNext = nullptr; + + CaptureOutput capture(CaptureOutput::Stdout); + EXPECT_EQ(ZE_RESULT_SUCCESS, zeInitDrivers(&pInitDriversCount, nullptr, &desc)); + + std::string output = capture.GetOutput(); + EXPECT_TRUE(output.empty()); +} + } // namespace