Files
TheRock/rocm-libraries/projects/rocsolver/clients/gtest/logging_gtest.cpp
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

439 lines
18 KiB
C++

/* **************************************************************************
* Copyright (C) 2022-2023 Advanced Micro Devices, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* *************************************************************************/
#include <cstdlib>
#if __has_include(<filesystem>)
#include <filesystem>
namespace fs = std::filesystem;
#else
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
#endif
#include <fstream>
#include <vector>
#include <fmt/format.h>
#include <fmt/ostream.h>
#include <gtest/gtest.h>
#include <rocblas/rocblas.h>
#include <rocsolver/rocsolver.h>
#include "common/misc/client_environment_helpers.hpp"
#include "common/misc/clientcommon.hpp"
using ::testing::Matcher;
using ::testing::MatchesRegex;
using ::testing::UnitTest;
class checkin_misc_LOGGING : public ::testing::Test
{
protected:
void SetUp() override
{
fs::path temp_dir = fs::temp_directory_path();
std::string test_name = UnitTest::GetInstance()->current_test_info()->name();
log_filepath = temp_dir / fmt::format("{}.{}.log", test_name, nondeterministic_value());
fs::path nonexistent_dirpath = temp_dir / fmt::format("nonexistent_{}", test_name);
ASSERT_FALSE(fs::exists(nonexistent_dirpath));
invalid_log_filepath = nonexistent_dirpath / "invalid.log";
ASSERT_EQ(hipMalloc(&dA, sizeof(double) * stA * bc), hipSuccess);
ASSERT_EQ(hipMalloc(&dP, sizeof(rocblas_int) * stP * bc), hipSuccess);
ASSERT_EQ(hipMalloc(&dinfo, sizeof(rocblas_int) * bc), hipSuccess);
}
void TearDown() override
{
if(fs::exists(log_filepath))
{
if(HasFailure() && std::getenv("ROCSOLVER_TEST_DEBUG"))
fmt::print(stderr, "ROCSOLVER_TEST_DEBUG is set so {} was not removed.\n",
log_filepath.string());
else
EXPECT_TRUE(fs::remove(log_filepath));
}
ASSERT_EQ(hipFree(dA), hipSuccess);
ASSERT_EQ(hipFree(dP), hipSuccess);
ASSERT_EQ(hipFree(dinfo), hipSuccess);
}
unsigned int nondeterministic_value()
{
return rd();
}
std::random_device rd;
fs::path log_filepath;
fs::path invalid_log_filepath;
double* dA;
rocblas_int *dP, *dinfo;
const rocblas_int m = 25;
const rocblas_int n = 25;
const rocblas_int lda = m;
const rocblas_stride stA = lda * n;
const rocblas_stride stP = n;
const rocblas_int bc = 3;
};
static void verify_file(const fs::path& filepath, const std::vector<std::string>& expected_lines)
{
std::ifstream logfile(filepath);
ASSERT_TRUE(logfile.good()) << "which implies a failure to open " << filepath;
std::string line;
size_t line_number = 1;
for(; std::getline(logfile, line); ++line_number)
{
ASSERT_LE(line_number, expected_lines.size())
<< "extra line containing '" << line << "' in " << filepath;
const std::string& expected_pattern = expected_lines[line_number - 1];
EXPECT_TRUE(Matcher<std::string>(MatchesRegex(expected_pattern)).Matches(line))
<< "Mismatch at line " << line_number << ":\n Actual line: " << line
<< "\nExpected pattern: " << expected_pattern;
}
ASSERT_EQ(line_number - 1, expected_lines.size()) << "missing lines in " << filepath;
}
TEST_F(checkin_misc_LOGGING, rocsolver_log_path)
{
rocblas_local_handle handle;
scoped_envvar logpath_variable("ROCSOLVER_LOG_PATH", log_filepath.generic_string().c_str());
ASSERT_EQ(rocsolver_log_begin(), rocblas_status_success);
EXPECT_EQ(rocsolver_log_set_layer_mode(rocblas_layer_mode_log_trace), rocblas_status_success);
EXPECT_EQ(rocsolver_log_set_max_levels(1), rocblas_status_success);
EXPECT_EQ(rocsolver_dgetrf_strided_batched(handle, m, n, dA, lda, stA, dP, stP, dinfo, bc),
rocblas_status_success);
ASSERT_EQ(rocsolver_log_end(), rocblas_status_success);
ASSERT_TRUE(fs::exists(log_filepath));
}
TEST_F(checkin_misc_LOGGING, rocblas_layer_mode_log_trace)
{
rocblas_local_handle handle;
scoped_envvar logpath_variable("ROCSOLVER_LOG_TRACE_PATH", log_filepath.generic_string().c_str());
ASSERT_EQ(rocsolver_log_begin(), rocblas_status_success);
EXPECT_EQ(rocsolver_log_set_layer_mode(rocblas_layer_mode_log_trace), rocblas_status_success);
EXPECT_EQ(rocsolver_log_set_max_levels(1), rocblas_status_success);
EXPECT_EQ(rocsolver_dgetrf_strided_batched(handle, m, n, dA, lda, stA, dP, stP, dinfo, bc),
rocblas_status_success);
ASSERT_EQ(rocsolver_log_end(), rocblas_status_success);
std::vector<std::string> expected_lines = {
"ROCSOLVER LOG FILE",
"rocSOLVER Version: .*",
"rocBLAS Version: .*",
".*ENTER rocsolver_dgetrf_strided_batched trace tree.*",
".*getrf.*m: 25, n: 25, shiftA: 0, inca: 1, lda: 25, shiftP: 0, bc: 3.*",
".*EXIT rocsolver_dgetrf_strided_batched trace tree.*",
"\\s*",
};
verify_file(log_filepath, expected_lines);
}
TEST_F(checkin_misc_LOGGING, rocblas_layer_mode_log_bench)
{
rocblas_local_handle handle;
scoped_envvar logpath_variable("ROCSOLVER_LOG_BENCH_PATH", log_filepath.generic_string().c_str());
ASSERT_EQ(rocsolver_log_begin(), rocblas_status_success);
EXPECT_EQ(rocsolver_log_set_layer_mode(rocblas_layer_mode_log_bench), rocblas_status_success);
EXPECT_EQ(rocsolver_log_set_max_levels(1), rocblas_status_success);
EXPECT_EQ(rocsolver_dgetrf_strided_batched(handle, m, n, dA, lda, stA, dP, stP, dinfo, bc),
rocblas_status_success);
ASSERT_EQ(rocsolver_log_end(), rocblas_status_success);
std::vector<std::string> expected_lines = {
"ROCSOLVER LOG FILE",
"rocSOLVER Version: .*",
"rocBLAS Version: .*",
".*rocsolver-bench -f getrf_strided_batched -r d -m 25 -n 25 --lda 25 --strideA 625 "
"--strideP 25 --batch_count 3",
};
verify_file(log_filepath, expected_lines);
}
TEST_F(checkin_misc_LOGGING, rocblas_layer_mode_log_profile)
{
rocblas_local_handle handle;
scoped_envvar logpath_variable("ROCSOLVER_LOG_PROFILE_PATH",
log_filepath.generic_string().c_str());
ASSERT_EQ(rocsolver_log_begin(), rocblas_status_success);
EXPECT_EQ(rocsolver_log_set_layer_mode(rocblas_layer_mode_log_profile), rocblas_status_success);
EXPECT_EQ(rocsolver_log_set_max_levels(1), rocblas_status_success);
EXPECT_EQ(rocsolver_dgetrf_strided_batched(handle, m, n, dA, lda, stA, dP, stP, dinfo, bc),
rocblas_status_success);
ASSERT_EQ(rocsolver_log_end(), rocblas_status_success);
std::vector<std::string> expected_lines = {
"ROCSOLVER LOG FILE",
"rocSOLVER Version: .*",
"rocBLAS Version: .*",
".*PROFILE.*",
".*getrf.*Calls: 1, Total Time: .+ .+ .in nested functions: .+ .+.",
"\\s*",
};
verify_file(log_filepath, expected_lines);
}
TEST_F(checkin_misc_LOGGING, rocsolver_log_write_profile)
{
rocblas_local_handle handle;
scoped_envvar logpath_variable("ROCSOLVER_LOG_PROFILE_PATH",
log_filepath.generic_string().c_str());
ASSERT_EQ(rocsolver_log_begin(), rocblas_status_success);
EXPECT_EQ(rocsolver_log_set_layer_mode(rocblas_layer_mode_log_profile), rocblas_status_success);
EXPECT_EQ(rocsolver_log_set_max_levels(1), rocblas_status_success);
EXPECT_EQ(rocsolver_dgetrf_strided_batched(handle, m, n, dA, lda, stA, dP, stP, dinfo, bc),
rocblas_status_success);
EXPECT_EQ(rocsolver_log_write_profile(), rocblas_status_success);
EXPECT_EQ(rocsolver_log_write_profile(), rocblas_status_success);
std::vector<std::string> expected_lines = {
"ROCSOLVER LOG FILE",
"rocSOLVER Version: .*",
"rocBLAS Version: .*",
".*PROFILE.*",
".*getrf.*Calls: 1, Total Time: .+ .+ .in nested functions: .+ .+.",
"\\s*",
".*PROFILE.*",
".*getrf.*Calls: 1, Total Time: .+ .+ .in nested functions: .+ .+.",
"\\s*",
};
verify_file(log_filepath, expected_lines);
ASSERT_EQ(rocsolver_log_end(), rocblas_status_success); // reset global state for other tests
}
TEST_F(checkin_misc_LOGGING, rocsolver_log_flush_profile)
{
rocblas_local_handle handle;
scoped_envvar logpath_variable("ROCSOLVER_LOG_PROFILE_PATH",
log_filepath.generic_string().c_str());
ASSERT_EQ(rocsolver_log_begin(), rocblas_status_success);
EXPECT_EQ(rocsolver_log_set_layer_mode(rocblas_layer_mode_log_profile), rocblas_status_success);
EXPECT_EQ(rocsolver_log_set_max_levels(1), rocblas_status_success);
EXPECT_EQ(rocsolver_dgetrf_strided_batched(handle, m, n, dA, lda, stA, dP, stP, dinfo, bc),
rocblas_status_success);
EXPECT_EQ(rocsolver_log_flush_profile(), rocblas_status_success);
EXPECT_EQ(rocsolver_dgetrf_strided_batched(handle, m, n, dA, lda, stA, dP, stP, dinfo, bc),
rocblas_status_success);
EXPECT_EQ(rocsolver_dgetrf_strided_batched(handle, m, n, dA, lda, stA, dP, stP, dinfo, bc),
rocblas_status_success);
EXPECT_EQ(rocsolver_log_flush_profile(), rocblas_status_success);
EXPECT_EQ(rocsolver_log_flush_profile(), rocblas_status_success);
std::vector<std::string> expected_lines = {
"ROCSOLVER LOG FILE",
"rocSOLVER Version: .*",
"rocBLAS Version: .*",
".*PROFILE.*",
".*getrf.*Calls: 1, Total Time: .+ .+ .in nested functions: .+ .+.",
"\\s*",
".*PROFILE.*",
".*getrf.*Calls: 2, Total Time: .+ .+ .in nested functions: .+ .+.",
"\\s*",
};
verify_file(log_filepath, expected_lines);
ASSERT_EQ(rocsolver_log_end(), rocblas_status_success); // reset global state for other tests
}
TEST_F(checkin_misc_LOGGING, rocsolver_log_restore_defaults_resets_layer_mode)
{
rocblas_local_handle handle;
scoped_envvar logpath_variable("ROCSOLVER_LOG_TRACE_PATH", log_filepath.generic_string().c_str());
ASSERT_EQ(rocsolver_log_begin(), rocblas_status_success);
EXPECT_EQ(rocsolver_log_set_layer_mode(rocblas_layer_mode_log_trace), rocblas_status_success);
EXPECT_EQ(rocsolver_log_restore_defaults(), rocblas_status_success);
EXPECT_EQ(rocsolver_dgetrf_strided_batched(handle, m, n, dA, lda, stA, dP, stP, dinfo, bc),
rocblas_status_success);
ASSERT_EQ(rocsolver_log_end(), rocblas_status_success);
std::vector<std::string> expected_lines = {
"ROCSOLVER LOG FILE",
"rocSOLVER Version: .*",
"rocBLAS Version: .*",
};
verify_file(log_filepath, expected_lines);
}
TEST_F(checkin_misc_LOGGING, rocsolver_log_restore_defaults_resets_max_levels)
{
rocblas_local_handle handle;
scoped_envvar logpath_variable("ROCSOLVER_LOG_TRACE_PATH", log_filepath.generic_string().c_str());
ASSERT_EQ(rocsolver_log_begin(), rocblas_status_success);
EXPECT_EQ(rocsolver_log_set_max_levels(2), rocblas_status_success);
EXPECT_EQ(rocsolver_log_restore_defaults(), rocblas_status_success);
EXPECT_EQ(rocsolver_log_set_layer_mode(rocblas_layer_mode_log_trace), rocblas_status_success);
EXPECT_EQ(rocsolver_dgetrf_strided_batched(handle, m, n, dA, lda, stA, dP, stP, dinfo, bc),
rocblas_status_success);
ASSERT_EQ(rocsolver_log_end(), rocblas_status_success);
std::vector<std::string> expected_lines = {
"ROCSOLVER LOG FILE",
"rocSOLVER Version: .*",
"rocBLAS Version: .*",
".*ENTER rocsolver_dgetrf_strided_batched trace tree.*",
".*getrf.*m: 25, n: 25, shiftA: 0, inca: 1, lda: 25, shiftP: 0, bc: 3.*",
".*EXIT rocsolver_dgetrf_strided_batched trace tree.*",
"\\s*",
};
verify_file(log_filepath, expected_lines);
}
TEST_F(checkin_misc_LOGGING, rocblas_layer_mode_log_trace_tree)
{
rocblas_local_handle handle;
scoped_envvar logpath_variable("ROCSOLVER_LOG_TRACE_PATH", log_filepath.generic_string().c_str());
ASSERT_EQ(rocsolver_log_begin(), rocblas_status_success);
EXPECT_EQ(rocsolver_log_set_layer_mode(rocblas_layer_mode_log_trace), rocblas_status_success);
EXPECT_EQ(rocsolver_log_set_max_levels(2), rocblas_status_success);
EXPECT_EQ(rocsolver_dgetrf_strided_batched(handle, m, n, dA, lda, stA, dP, stP, dinfo, bc),
rocblas_status_success);
ASSERT_EQ(rocsolver_log_end(), rocblas_status_success);
std::vector<std::string> expected_lines = {
"ROCSOLVER LOG FILE",
"rocSOLVER Version: .*",
"rocBLAS Version: .*",
".*ENTER rocsolver_dgetrf_strided_batched trace tree.*",
".*getrf.*m: 25, n: 25, shiftA: 0, inca: 1, lda: 25, shiftP: 0, bc: 3.*",
" .*getf2.*m: 25, n: 25, shiftA: 0, inca: 1, lda: 25, shiftP: 0, bc: 3.*",
".*EXIT rocsolver_dgetrf_strided_batched trace tree.*",
"\\s*",
};
verify_file(log_filepath, expected_lines);
}
TEST_F(checkin_misc_LOGGING, rocblas_layer_mode_log_profile_tree)
{
rocblas_local_handle handle;
scoped_envvar logpath_variable("ROCSOLVER_LOG_PROFILE_PATH",
log_filepath.generic_string().c_str());
ASSERT_EQ(rocsolver_log_begin(), rocblas_status_success);
EXPECT_EQ(rocsolver_log_set_layer_mode(rocblas_layer_mode_log_profile), rocblas_status_success);
EXPECT_EQ(rocsolver_log_set_max_levels(2), rocblas_status_success);
EXPECT_EQ(rocsolver_dgetrf_strided_batched(handle, m, n, dA, lda, stA, dP, stP, dinfo, bc),
rocblas_status_success);
ASSERT_EQ(rocsolver_log_end(), rocblas_status_success);
std::vector<std::string> expected_lines = {
"ROCSOLVER LOG FILE",
"rocSOLVER Version: .*",
"rocBLAS Version: .*",
".*PROFILE.*",
".*getrf.*Calls: 1, Total Time: .+ .+ .in nested functions: .+ .+.",
".*getf2.*Calls: 1, Total Time: .+ .+",
"\\s*",
};
verify_file(log_filepath, expected_lines);
}
TEST_F(checkin_misc_LOGGING, rocblas_layer_mode_log_bench_tree)
{
rocblas_local_handle handle;
scoped_envvar logpath_variable("ROCSOLVER_LOG_BENCH_PATH", log_filepath.generic_string().c_str());
ASSERT_EQ(rocsolver_log_begin(), rocblas_status_success);
EXPECT_EQ(rocsolver_log_set_layer_mode(rocblas_layer_mode_log_bench), rocblas_status_success);
EXPECT_EQ(rocsolver_log_set_max_levels(2), rocblas_status_success);
EXPECT_EQ(rocsolver_dgetrf_strided_batched(handle, m, n, dA, lda, stA, dP, stP, dinfo, bc),
rocblas_status_success);
ASSERT_EQ(rocsolver_log_end(), rocblas_status_success);
std::vector<std::string> expected_lines = {
"ROCSOLVER LOG FILE",
"rocSOLVER Version: .*",
"rocBLAS Version: .*",
".*rocsolver-bench -f getrf_strided_batched -r d -m 25 -n 25 --lda 25 --strideA 625 "
"--strideP 25 --batch_count 3",
};
verify_file(log_filepath, expected_lines);
}
TEST_F(checkin_misc_LOGGING, invalid_trace_file_open)
{
scoped_envvar logpath_variable("ROCSOLVER_LOG_TRACE_PATH",
invalid_log_filepath.generic_string().c_str());
ASSERT_EQ(rocsolver_log_begin(), rocblas_status_internal_error);
ASSERT_EQ(rocsolver_log_end(), rocblas_status_success);
}
TEST_F(checkin_misc_LOGGING, invalid_profile_file_open)
{
scoped_envvar logpath_variable("ROCSOLVER_LOG_PROFILE_PATH",
invalid_log_filepath.generic_string().c_str());
ASSERT_EQ(rocsolver_log_begin(), rocblas_status_internal_error);
ASSERT_EQ(rocsolver_log_end(), rocblas_status_success);
}
TEST_F(checkin_misc_LOGGING, invalid_bench_file_open)
{
scoped_envvar logpath_variable("ROCSOLVER_LOG_BENCH_PATH",
invalid_log_filepath.generic_string().c_str());
ASSERT_EQ(rocsolver_log_begin(), rocblas_status_internal_error);
ASSERT_EQ(rocsolver_log_end(), rocblas_status_success);
}
TEST_F(checkin_misc_LOGGING, begin_twice)
{
ASSERT_EQ(rocsolver_log_begin(), rocblas_status_success);
EXPECT_EQ(rocsolver_log_begin(), rocblas_status_internal_error);
ASSERT_EQ(rocsolver_log_end(), rocblas_status_success);
}
TEST_F(checkin_misc_LOGGING, end_twice)
{
ASSERT_EQ(rocsolver_log_begin(), rocblas_status_success);
EXPECT_EQ(rocsolver_log_end(), rocblas_status_success);
ASSERT_EQ(rocsolver_log_end(), rocblas_status_internal_error);
}
TEST_F(checkin_misc_LOGGING, end_before_begin)
{
ASSERT_EQ(rocsolver_log_end(), rocblas_status_internal_error);
}