forked from mooncake-track/Mooncake
169 lines
4.8 KiB
C++
169 lines
4.8 KiB
C++
// transfer_task_test.cpp
|
|
#include "transfer_task.h"
|
|
|
|
#include <glog/logging.h>
|
|
#include <gtest/gtest.h>
|
|
|
|
#include <chrono>
|
|
#include <cstring>
|
|
#include <memory>
|
|
#include <thread>
|
|
#include <vector>
|
|
|
|
#include "types.h"
|
|
|
|
namespace mooncake {
|
|
|
|
// Test fixture for TransferTask tests
|
|
// TODO: Currently, this test does not cover TransferSubmitter and
|
|
// TransferEngine integration. Will add more tests in the future.
|
|
class TransferTaskTest : public ::testing::Test {
|
|
protected:
|
|
void SetUp() override {
|
|
// Initialize glog for logging
|
|
google::InitGoogleLogging("TransferTaskTest");
|
|
FLAGS_logtostderr = 1; // Output logs to stderr
|
|
}
|
|
|
|
void TearDown() override {
|
|
// Cleanup glog
|
|
google::ShutdownGoogleLogging();
|
|
}
|
|
};
|
|
|
|
// Test basic MemcpyOperation functionality
|
|
TEST_F(TransferTaskTest, MemcpyOperationBasic) {
|
|
const size_t data_size = 1024;
|
|
std::vector<char> src_data(data_size, 'A');
|
|
std::vector<char> dest_data(data_size, 'B');
|
|
|
|
// Create memcpy operation
|
|
MemcpyOperation op(dest_data.data(), src_data.data(), data_size);
|
|
|
|
// Verify operation parameters
|
|
EXPECT_EQ(op.dest, dest_data.data());
|
|
EXPECT_EQ(op.src, src_data.data());
|
|
EXPECT_EQ(op.size, data_size);
|
|
|
|
// Perform memcpy manually to test
|
|
std::memcpy(op.dest, op.src, op.size);
|
|
|
|
// Verify data was copied correctly
|
|
EXPECT_EQ(dest_data, src_data);
|
|
for (size_t i = 0; i < data_size; ++i) {
|
|
EXPECT_EQ(dest_data[i], 'A');
|
|
}
|
|
}
|
|
|
|
// Test MemcpyOperationState functionality
|
|
TEST_F(TransferTaskTest, MemcpyOperationState) {
|
|
auto state = std::make_shared<MemcpyOperationState>();
|
|
|
|
// Initially not completed
|
|
EXPECT_FALSE(state->is_completed());
|
|
EXPECT_EQ(state->get_strategy(), TransferStrategy::LOCAL_MEMCPY);
|
|
|
|
// Set completed with success
|
|
state->set_completed(ErrorCode::OK);
|
|
EXPECT_TRUE(state->is_completed());
|
|
EXPECT_EQ(state->get_result(), ErrorCode::OK);
|
|
}
|
|
|
|
// Test MemcpyWorkerPool basic functionality
|
|
TEST_F(TransferTaskTest, MemcpyWorkerPoolBasic) {
|
|
MemcpyWorkerPool pool;
|
|
|
|
const size_t data_size = 512;
|
|
std::vector<char> src_data(data_size, 'X');
|
|
std::vector<char> dest_data(data_size, 'Y');
|
|
|
|
auto state = std::make_shared<MemcpyOperationState>();
|
|
|
|
// Create memcpy operations
|
|
std::vector<MemcpyOperation> operations;
|
|
operations.emplace_back(dest_data.data(), src_data.data(), data_size);
|
|
|
|
// Create and submit task
|
|
MemcpyTask task(std::move(operations), state);
|
|
pool.submitTask(std::move(task));
|
|
|
|
// Wait for completion
|
|
state->wait_for_completion();
|
|
|
|
// Verify completion and result
|
|
EXPECT_TRUE(state->is_completed());
|
|
EXPECT_EQ(state->get_result(), ErrorCode::OK);
|
|
|
|
// Verify data was copied correctly
|
|
for (size_t i = 0; i < data_size; ++i) {
|
|
EXPECT_EQ(dest_data[i], 'X');
|
|
}
|
|
}
|
|
|
|
// Test multiple memcpy operations in one task
|
|
TEST_F(TransferTaskTest, MemcpyWorkerPoolMultipleOperations) {
|
|
MemcpyWorkerPool pool;
|
|
|
|
const size_t num_ops = 3;
|
|
const size_t data_size = 256;
|
|
|
|
std::vector<std::vector<char>> src_buffers(num_ops);
|
|
std::vector<std::vector<char>> dest_buffers(num_ops);
|
|
|
|
// Initialize source buffers with different patterns
|
|
for (size_t i = 0; i < num_ops; ++i) {
|
|
src_buffers[i].resize(data_size, 'A' + i);
|
|
dest_buffers[i].resize(data_size, 'Z');
|
|
}
|
|
|
|
auto state = std::make_shared<MemcpyOperationState>();
|
|
|
|
// Create multiple memcpy operations
|
|
std::vector<MemcpyOperation> operations;
|
|
for (size_t i = 0; i < num_ops; ++i) {
|
|
operations.emplace_back(dest_buffers[i].data(), src_buffers[i].data(),
|
|
data_size);
|
|
}
|
|
|
|
// Create and submit task
|
|
MemcpyTask task(std::move(operations), state);
|
|
pool.submitTask(std::move(task));
|
|
|
|
// Wait for completion
|
|
state->wait_for_completion();
|
|
|
|
// Verify completion and result
|
|
EXPECT_TRUE(state->is_completed());
|
|
EXPECT_EQ(state->get_result(), ErrorCode::OK);
|
|
|
|
// Verify all data was copied correctly
|
|
for (size_t i = 0; i < num_ops; ++i) {
|
|
for (size_t j = 0; j < data_size; ++j) {
|
|
EXPECT_EQ(dest_buffers[i][j], 'A' + i);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Test TransferStrategy enum and stream operator
|
|
TEST_F(TransferTaskTest, TransferStrategyEnum) {
|
|
// Test enum values
|
|
EXPECT_EQ(static_cast<int>(TransferStrategy::LOCAL_MEMCPY), 0);
|
|
EXPECT_EQ(static_cast<int>(TransferStrategy::TRANSFER_ENGINE), 1);
|
|
|
|
// Test stream operator
|
|
std::ostringstream oss;
|
|
oss << TransferStrategy::LOCAL_MEMCPY;
|
|
EXPECT_EQ(oss.str(), "LOCAL_MEMCPY");
|
|
|
|
oss.str("");
|
|
oss << TransferStrategy::TRANSFER_ENGINE;
|
|
EXPECT_EQ(oss.str(), "TRANSFER_ENGINE");
|
|
}
|
|
|
|
} // namespace mooncake
|
|
|
|
int main(int argc, char** argv) {
|
|
::testing::InitGoogleTest(&argc, argv);
|
|
return RUN_ALL_TESTS();
|
|
}
|