Files
TheRock/rocm-systems/shared/kpack/runtime/tests/test_archive_integration.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

262 lines
8.7 KiB
C++

// Copyright (c) 2025 Advanced Micro Devices, Inc.
// SPDX-License-Identifier: MIT
#include <gtest/gtest.h>
#include <cstring>
#include "rocm_kpack/kpack.h"
#include "test_utils.h"
// Integration tests for full archive reading with generated test data
TEST(ArchiveIntegrationTest, NoOpArchive) {
std::string test_kpack =
(test_utils::get_test_assets_dir() / "test_noop.kpack").string();
ASSERT_TRUE(std::filesystem::exists(test_kpack))
<< "Test asset not found: " << test_kpack;
// Open archive
kpack_archive_t archive;
kpack_error_t err = kpack_open(test_kpack.c_str(), &archive);
ASSERT_EQ(err, KPACK_SUCCESS) << "Failed to open NoOp test archive";
// Verify architectures
size_t arch_count;
err = kpack_get_architecture_count(archive, &arch_count);
ASSERT_EQ(err, KPACK_SUCCESS);
EXPECT_EQ(arch_count, 2); // gfx900, gfx906
const char* arch0;
err = kpack_get_architecture(archive, 0, &arch0);
ASSERT_EQ(err, KPACK_SUCCESS);
EXPECT_STREQ(arch0, "gfx900");
const char* arch1;
err = kpack_get_architecture(archive, 1, &arch1);
ASSERT_EQ(err, KPACK_SUCCESS);
EXPECT_STREQ(arch1, "gfx906");
// Verify binaries
size_t binary_count;
err = kpack_get_binary_count(archive, &binary_count);
ASSERT_EQ(err, KPACK_SUCCESS);
EXPECT_EQ(binary_count, 2); // lib/libtest.so#0, bin/testapp#0
// Load and verify kernel 1: lib/libtest.so#0 @ gfx900
void* kernel_data;
size_t kernel_size;
err = kpack_get_kernel(archive, "lib/libtest.so#0", "gfx900", &kernel_data,
&kernel_size);
ASSERT_EQ(err, KPACK_SUCCESS);
EXPECT_EQ(kernel_size, 119);
EXPECT_EQ(0, memcmp(kernel_data, "KERNEL1_GFX900_DATA", 19));
kpack_free_kernel(kernel_data);
// Load and verify kernel 2: lib/libtest.so#0 @ gfx906
err = kpack_get_kernel(archive, "lib/libtest.so#0", "gfx906", &kernel_data,
&kernel_size);
ASSERT_EQ(err, KPACK_SUCCESS);
EXPECT_EQ(kernel_size, 219);
EXPECT_EQ(0, memcmp(kernel_data, "KERNEL2_GFX906_DATA", 19));
kpack_free_kernel(kernel_data);
// Load and verify kernel 3: bin/testapp#0 @ gfx900
err = kpack_get_kernel(archive, "bin/testapp#0", "gfx900", &kernel_data,
&kernel_size);
ASSERT_EQ(err, KPACK_SUCCESS);
EXPECT_EQ(kernel_size, 168);
EXPECT_EQ(0, memcmp(kernel_data, "KERNEL3_APP_GFX900", 18));
kpack_free_kernel(kernel_data);
// Verify kernel not found
err = kpack_get_kernel(archive, "nonexistent/binary", "gfx900", &kernel_data,
&kernel_size);
EXPECT_EQ(err, KPACK_ERROR_KERNEL_NOT_FOUND);
err = kpack_get_kernel(archive, "lib/libtest.so#0", "gfx908", &kernel_data,
&kernel_size);
EXPECT_EQ(err, KPACK_ERROR_KERNEL_NOT_FOUND);
kpack_close(archive);
}
TEST(ArchiveIntegrationTest, ZstdArchive) {
std::string test_kpack =
(test_utils::get_test_assets_dir() / "test_zstd.kpack").string();
ASSERT_TRUE(std::filesystem::exists(test_kpack))
<< "Test asset not found: " << test_kpack;
// Open archive
kpack_archive_t archive;
kpack_error_t err = kpack_open(test_kpack.c_str(), &archive);
ASSERT_EQ(err, KPACK_SUCCESS) << "Failed to open Zstd test archive";
// Verify architectures
size_t arch_count;
err = kpack_get_architecture_count(archive, &arch_count);
ASSERT_EQ(err, KPACK_SUCCESS);
EXPECT_EQ(arch_count, 2); // gfx1100, gfx1101
const char* arch0;
err = kpack_get_architecture(archive, 0, &arch0);
ASSERT_EQ(err, KPACK_SUCCESS);
EXPECT_STREQ(arch0, "gfx1100");
const char* arch1;
err = kpack_get_architecture(archive, 1, &arch1);
ASSERT_EQ(err, KPACK_SUCCESS);
EXPECT_STREQ(arch1, "gfx1101");
// Verify binaries
size_t binary_count;
err = kpack_get_binary_count(archive, &binary_count);
ASSERT_EQ(err, KPACK_SUCCESS);
EXPECT_EQ(binary_count, 2); // lib/libhip.so#0, bin/hiptest#0
// Load and verify kernel 1: lib/libhip.so#0 @ gfx1100
void* kernel_data;
size_t kernel_size;
err = kpack_get_kernel(archive, "lib/libhip.so#0", "gfx1100", &kernel_data,
&kernel_size);
ASSERT_EQ(err, KPACK_SUCCESS);
EXPECT_EQ(kernel_size, 1019);
EXPECT_EQ(0, memcmp(kernel_data, "HIP_KERNEL_GFX1100_", 19));
kpack_free_kernel(kernel_data);
// Load and verify kernel 2: lib/libhip.so#0 @ gfx1101
err = kpack_get_kernel(archive, "lib/libhip.so#0", "gfx1101", &kernel_data,
&kernel_size);
ASSERT_EQ(err, KPACK_SUCCESS);
EXPECT_EQ(kernel_size, 619);
EXPECT_EQ(0, memcmp(kernel_data, "HIP_KERNEL_GFX1101_", 19));
kpack_free_kernel(kernel_data);
// Load and verify kernel 3: bin/hiptest#0 @ gfx1100
err = kpack_get_kernel(archive, "bin/hiptest#0", "gfx1100", &kernel_data,
&kernel_size);
ASSERT_EQ(err, KPACK_SUCCESS);
EXPECT_EQ(kernel_size, 1018);
EXPECT_EQ(0, memcmp(kernel_data, "TEST_APP_KERNEL___", 18));
kpack_free_kernel(kernel_data);
kpack_close(archive);
}
// Test kpack_get_binary retrieves binary names correctly
TEST(ArchiveIntegrationTest, GetBinaryNames) {
std::string test_kpack =
(test_utils::get_test_assets_dir() / "test_noop.kpack").string();
ASSERT_TRUE(std::filesystem::exists(test_kpack))
<< "Test asset not found: " << test_kpack;
kpack_archive_t archive;
kpack_error_t err = kpack_open(test_kpack.c_str(), &archive);
ASSERT_EQ(err, KPACK_SUCCESS);
// Verify binary count
size_t binary_count;
err = kpack_get_binary_count(archive, &binary_count);
ASSERT_EQ(err, KPACK_SUCCESS);
EXPECT_EQ(binary_count, 2u);
// Get binary 0 (expected: bin/testapp#0 based on alphabetical ordering)
const char* binary0;
err = kpack_get_binary(archive, 0, &binary0);
ASSERT_EQ(err, KPACK_SUCCESS);
EXPECT_STREQ(binary0, "bin/testapp#0");
// Get binary 1 (expected: lib/libtest.so#0)
const char* binary1;
err = kpack_get_binary(archive, 1, &binary1);
ASSERT_EQ(err, KPACK_SUCCESS);
EXPECT_STREQ(binary1, "lib/libtest.so#0");
// Verify pointer stability - get again, should be same pointer
const char* binary0_again;
err = kpack_get_binary(archive, 0, &binary0_again);
ASSERT_EQ(err, KPACK_SUCCESS);
EXPECT_EQ(binary0, binary0_again); // Same pointer, archive owns memory
kpack_close(archive);
}
// Test kpack_get_binary retrieves binaries from zstd archive
TEST(ArchiveIntegrationTest, GetBinaryNames_Zstd) {
std::string test_kpack =
(test_utils::get_test_assets_dir() / "test_zstd.kpack").string();
ASSERT_TRUE(std::filesystem::exists(test_kpack))
<< "Test asset not found: " << test_kpack;
kpack_archive_t archive;
kpack_error_t err = kpack_open(test_kpack.c_str(), &archive);
ASSERT_EQ(err, KPACK_SUCCESS);
// Verify binary count
size_t binary_count;
err = kpack_get_binary_count(archive, &binary_count);
ASSERT_EQ(err, KPACK_SUCCESS);
EXPECT_EQ(binary_count, 2u);
// Get both binaries
const char* binary0;
err = kpack_get_binary(archive, 0, &binary0);
ASSERT_EQ(err, KPACK_SUCCESS);
EXPECT_STREQ(binary0, "bin/hiptest#0");
const char* binary1;
err = kpack_get_binary(archive, 1, &binary1);
ASSERT_EQ(err, KPACK_SUCCESS);
EXPECT_STREQ(binary1, "lib/libhip.so#0");
kpack_close(archive);
}
// Test that multiple kernel loads return independent copies
TEST(ArchiveIntegrationTest, KernelCacheOverwrite) {
std::string test_kpack =
(test_utils::get_test_assets_dir() / "test_noop.kpack").string();
kpack_archive_t archive;
kpack_error_t err = kpack_open(test_kpack.c_str(), &archive);
ASSERT_EQ(err, KPACK_SUCCESS);
// Load first kernel
void* kernel1_data;
size_t kernel1_size;
err = kpack_get_kernel(archive, "lib/libtest.so#0", "gfx900", &kernel1_data,
&kernel1_size);
ASSERT_EQ(err, KPACK_SUCCESS);
EXPECT_EQ(kernel1_size, 119);
// Load second kernel - returns independent copy
void* kernel2_data;
size_t kernel2_size;
err = kpack_get_kernel(archive, "lib/libtest.so#0", "gfx906", &kernel2_data,
&kernel2_size);
ASSERT_EQ(err, KPACK_SUCCESS);
// Verify second kernel is correct
EXPECT_EQ(kernel2_size, 219);
EXPECT_EQ(0, memcmp(kernel2_data, "KERNEL2_GFX906_DATA", 19));
// Verify first kernel is STILL valid (independent copy, not overwritten)
EXPECT_EQ(0, memcmp(kernel1_data, "KERNEL1_GFX900_DATA", 19));
// Load first kernel again - verify it still works
void* kernel1_reload;
size_t kernel1_reload_size;
err = kpack_get_kernel(archive, "lib/libtest.so#0", "gfx900", &kernel1_reload,
&kernel1_reload_size);
ASSERT_EQ(err, KPACK_SUCCESS);
EXPECT_EQ(kernel1_reload_size, 119);
EXPECT_EQ(0, memcmp(kernel1_reload, "KERNEL1_GFX900_DATA", 19));
// Free all kernels
kpack_free_kernel(kernel1_data);
kpack_free_kernel(kernel2_data);
kpack_free_kernel(kernel1_reload);
kpack_close(archive);
}