Skip to content
This repository was archived by the owner on Jul 4, 2025. It is now read-only.

Commit ffb1ee4

Browse files
committed
chore: add some unit tests
1 parent a2e54ce commit ffb1ee4

File tree

7 files changed

+253
-149
lines changed

7 files changed

+253
-149
lines changed

engine/commands/engine_init_cmd.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,9 @@ bool EngineInitCmd::Exec() const {
7575
matched_variant = engine_matcher_utils::ValidateOnnx(
7676
variants, system_info.os, system_info.arch);
7777
} else if (engineName_ == "cortex.llamacpp") {
78-
auto suitable_avx = engine_matcher_utils::GetSuitableAvxVariant();
78+
cortex::cpuid::CpuInfo cpu_info;
79+
auto suitable_avx =
80+
engine_matcher_utils::GetSuitableAvxVariant(cpu_info);
7981
matched_variant = engine_matcher_utils::Validate(
8082
variants, system_info.os, system_info.arch, suitable_avx,
8183
cuda_driver_version);
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
#include <string>
2+
#include <vector>
3+
#include "gtest/gtest.h"
4+
#include "utils/engine_matcher_utils.h"
5+
6+
class EngineMatcherUtilsTestSuite : public ::testing::Test {
7+
protected:
8+
const std::vector<std::string> cortex_llamacpp_variants{
9+
"cortex.llamacpp-0.1.25-25.08.24-linux-amd64-avx-cuda-11-7.tar.gz",
10+
"cortex.llamacpp-0.1.25-25.08.24-linux-amd64-avx-cuda-12-0.tar.gz",
11+
"cortex.llamacpp-0.1.25-25.08.24-linux-amd64-avx.tar.gz",
12+
"cortex.llamacpp-0.1.25-25.08.24-linux-amd64-avx2-cuda-11-7.tar.gz",
13+
"cortex.llamacpp-0.1.25-25.08.24-linux-amd64-avx2-cuda-12-0.tar.gz",
14+
"cortex.llamacpp-0.1.25-25.08.24-linux-amd64-avx2.tar.gz",
15+
"cortex.llamacpp-0.1.25-25.08.24-linux-amd64-avx512-cuda-11-7.tar.gz",
16+
"cortex.llamacpp-0.1.25-25.08.24-linux-amd64-avx512-cuda-12-0.tar.gz",
17+
"cortex.llamacpp-0.1.25-25.08.24-linux-amd64-avx512.tar.gz",
18+
"cortex.llamacpp-0.1.25-25.08.24-linux-amd64-noavx-cuda-11-7.tar.gz",
19+
"cortex.llamacpp-0.1.25-25.08.24-linux-amd64-noavx-cuda-12-0.tar.gz",
20+
"cortex.llamacpp-0.1.25-25.08.24-linux-amd64-noavx.tar.gz",
21+
"cortex.llamacpp-0.1.25-25.08.24-linux-amd64-vulkan.tar.gz",
22+
"cortex.llamacpp-0.1.25-25.08.24-mac-amd64.tar.gz",
23+
"cortex.llamacpp-0.1.25-25.08.24-mac-arm64.tar.gz",
24+
"cortex.llamacpp-0.1.25-25.08.24-windows-amd64-avx-cuda-11-7.tar.gz",
25+
"cortex.llamacpp-0.1.25-25.08.24-windows-amd64-avx-cuda-12-0.tar.gz",
26+
"cortex.llamacpp-0.1.25-25.08.24-windows-amd64-avx.tar.gz",
27+
"cortex.llamacpp-0.1.25-25.08.24-windows-amd64-avx2-cuda-11-7.tar.gz",
28+
"cortex.llamacpp-0.1.25-25.08.24-windows-amd64-avx2-cuda-12-0.tar.gz",
29+
"cortex.llamacpp-0.1.25-25.08.24-windows-amd64-avx2.tar.gz",
30+
"cortex.llamacpp-0.1.25-25.08.24-windows-amd64-avx512-cuda-11-7.tar.gz",
31+
"cortex.llamacpp-0.1.25-25.08.24-windows-amd64-avx512-cuda-12-0.tar.gz",
32+
"cortex.llamacpp-0.1.25-25.08.24-windows-amd64-avx512.tar.gz",
33+
"cortex.llamacpp-0.1.25-25.08.24-windows-amd64-noavx-cuda-11-7.tar.gz",
34+
"cortex.llamacpp-0.1.25-25.08.24-windows-amd64-noavx-cuda-12-0.tar.gz",
35+
"cortex.llamacpp-0.1.25-25.08.24-windows-amd64-noavx.tar.gz",
36+
"cortex.llamacpp-0.1.25-25.08.24-windows-amd64-vulkan.tar.gz",
37+
};
38+
39+
const std::vector<std::string> cortex_tensorrt_variants{
40+
"cortex.tensorrt-llm-0.0.9-linux-cuda-12-4.tar.gz",
41+
"cortex.tensorrt-llm-0.0.9-windows-cuda-12-4.tar.gz"};
42+
43+
const std::vector<std::string> cortex_onnx_variants{
44+
"cortex.onnx-0.1.7-windows-amd64.tar.gz"};
45+
};
46+
47+
TEST_F(EngineMatcherUtilsTestSuite, TestValidateOnnx) {
48+
49+
{
50+
auto expect_matched_variant = cortex_onnx_variants[0];
51+
auto result = engine_matcher_utils::ValidateOnnx(cortex_onnx_variants,
52+
"windows", "amd64");
53+
54+
EXPECT_EQ(result, expect_matched_variant);
55+
}
56+
57+
{
58+
// should return an empty variant because no variant matched
59+
auto expect_matched_variant{""};
60+
auto windows_arm_result = engine_matcher_utils::ValidateOnnx(
61+
cortex_onnx_variants, "windows", "arm");
62+
auto mac_arm64_result = engine_matcher_utils::ValidateOnnx(
63+
cortex_onnx_variants, "mac", "arm64");
64+
65+
EXPECT_EQ(windows_arm_result, expect_matched_variant);
66+
EXPECT_EQ(mac_arm64_result, expect_matched_variant);
67+
}
68+
}
69+
70+
TEST_F(EngineMatcherUtilsTestSuite, TestValidateTensorrt) {
71+
72+
{
73+
auto windows_expect_matched_variant{cortex_tensorrt_variants[1]};
74+
auto linux_expect_matched_variant{cortex_tensorrt_variants[0]};
75+
auto windows{"windows"};
76+
auto linux{"linux"};
77+
auto cuda_version{"12.4"};
78+
auto windows_result = engine_matcher_utils::ValidateTensorrtLlm(
79+
cortex_tensorrt_variants, windows, cuda_version);
80+
auto linux_result = engine_matcher_utils::ValidateTensorrtLlm(
81+
cortex_tensorrt_variants, linux, cuda_version);
82+
83+
EXPECT_EQ(windows_result, windows_expect_matched_variant);
84+
EXPECT_EQ(linux_result, linux_expect_matched_variant);
85+
}
86+
87+
{ // macos is not supported
88+
auto os = "mac";
89+
auto cuda_version{"12.4"};
90+
91+
auto result = engine_matcher_utils::ValidateTensorrtLlm(
92+
cortex_tensorrt_variants, os, cuda_version);
93+
EXPECT_EQ(result, "");
94+
}
95+
}
96+
97+
TEST_F(EngineMatcherUtilsTestSuite, TestValidate) {
98+
{
99+
auto os{"windows"};
100+
auto cpu_arch{"amd64"};
101+
auto suitable_avx{"avx2"};
102+
auto cuda_version{"12.4"};
103+
104+
auto variant = engine_matcher_utils::Validate(
105+
cortex_llamacpp_variants, os, cpu_arch, suitable_avx, cuda_version);
106+
107+
EXPECT_EQ(
108+
variant,
109+
"cortex.llamacpp-0.1.25-25.08.24-windows-amd64-avx2-cuda-12-0.tar.gz");
110+
}
111+
112+
{
113+
auto os{"mac"};
114+
auto cpu_arch{"amd64"};
115+
auto suitable_avx{""};
116+
auto cuda_version{""};
117+
118+
auto variant = engine_matcher_utils::Validate(
119+
cortex_llamacpp_variants, os, cpu_arch, suitable_avx, cuda_version);
120+
121+
EXPECT_EQ(variant, "cortex.llamacpp-0.1.25-25.08.24-mac-amd64.tar.gz");
122+
}
123+
124+
{
125+
auto os{"windows"};
126+
auto cpu_arch{"amd64"};
127+
auto suitable_avx{"avx2"};
128+
auto cuda_version{"10"};
129+
130+
auto variant = engine_matcher_utils::Validate(
131+
cortex_llamacpp_variants, os, cpu_arch, suitable_avx, cuda_version);
132+
133+
// fallback to no cuda version
134+
EXPECT_EQ(variant,
135+
"cortex.llamacpp-0.1.25-25.08.24-windows-amd64-avx2.tar.gz");
136+
}
137+
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
#include <string>
2+
#include "gtest/gtest.h"
3+
4+
class SystemInfoUtilsTestSuite : public ::testing::Test {
5+
protected:
6+
const std::string nvidia_smi_sample_output = R"(
7+
Sun Aug 25 22:29:25 2024
8+
+-----------------------------------------------------------------------------------------+
9+
| NVIDIA-SMI 560.70 Driver Version: 560.70 CUDA Version: 12.6 |
10+
|-----------------------------------------+------------------------+----------------------+
11+
| GPU Name Driver-Model | Bus-Id Disp.A | Volatile Uncorr. ECC |
12+
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
13+
| | | MIG M. |
14+
|=========================================+========================+======================|
15+
| 0 NVIDIA GeForce RTX 4090 WDDM | 00000000:01:00.0 Off | Off |
16+
| 0% 24C P8 10W / 500W | 395MiB / 24564MiB | 19% Default |
17+
| | | N/A |
18+
+-----------------------------------------+------------------------+----------------------+
19+
20+
+-----------------------------------------------------------------------------------------+
21+
| Processes: |
22+
| GPU GI CI PID Type Process name GPU Memory |
23+
| ID ID Usage |
24+
|=========================================================================================|
25+
| 0 N/A N/A 3984 C+G ...5n1h2txyewy\ShellExperienceHost.exe N/A |
26+
| 0 N/A N/A 7904 C+G ...ekyb3d8bbwe\PhoneExperienceHost.exe N/A |
27+
| 0 N/A N/A 8240 C+G ...__8wekyb3d8bbwe\WindowsTerminal.exe N/A |
28+
| 0 N/A N/A 8904 C+G C:\Windows\explorer.exe N/A |
29+
| 0 N/A N/A 9304 C+G ...siveControlPanel\SystemSettings.exe N/A |
30+
| 0 N/A N/A 9944 C+G ...nt.CBS_cw5n1h2txyewy\SearchHost.exe N/A |
31+
| 0 N/A N/A 11140 C+G ...2txyewy\StartMenuExperienceHost.exe N/A |
32+
+-----------------------------------------------------------------------------------------+
33+
)";
34+
35+
const std::string vulkan_sample_output = R"(
36+
==========
37+
VULKANINFO
38+
==========
39+
40+
Vulkan Instance Version: 1.3.280
41+
42+
43+
Instance Extensions: count = 19
44+
-------------------------------
45+
VK_EXT_debug_report : extension revision 10
46+
VK_EXT_debug_utils : extension revision 2
47+
VK_EXT_direct_mode_display : extension revision 1
48+
VK_EXT_surface_maintenance1 : extension revision 1
49+
VK_EXT_swapchain_colorspace : extension revision 4
50+
VK_KHR_device_group_creation : extension revision 1
51+
VK_KHR_display : extension revision 23
52+
VK_KHR_external_fence_capabilities : extension revision 1
53+
VK_KHR_external_memory_capabilities : extension revision 1
54+
VK_KHR_external_semaphore_capabilities : extension revision 1
55+
VK_KHR_get_display_properties2 : extension revision 1
56+
VK_KHR_get_physical_device_properties2 : extension revision 2
57+
VK_KHR_get_surface_capabilities2 : extension revision 1
58+
VK_KHR_portability_enumeration : extension revision 1
59+
VK_KHR_surface : extension revision 25
60+
VK_KHR_surface_protected_capabilities : extension revision 1
61+
VK_KHR_win32_surface : extension revision 6
62+
VK_LUNARG_direct_driver_loading : extension revision 1
63+
VK_NV_external_memory_capabilities : extension revision 1
64+
65+
Instance Layers: count = 1
66+
--------------------------
67+
VK_LAYER_NV_optimus NVIDIA Optimus layer 1.3.280 version 1
68+
69+
Devices:
70+
========
71+
GPU0:
72+
apiVersion = 1.3.280
73+
driverVersion = 560.70.0.0
74+
vendorID = 0x10de
75+
deviceID = 0x2684
76+
deviceType = PHYSICAL_DEVICE_TYPE_DISCRETE_GPU
77+
deviceName = NVIDIA GeForce RTX 4090
78+
driverID = DRIVER_ID_NVIDIA_PROPRIETARY
79+
driverName = NVIDIA
80+
driverInfo = 560.70
81+
conformanceVersion = 1.3.8.2
82+
deviceUUID = 11deafdf-9f15-e857-2a87-8acc153fc9f7
83+
driverUUID = 10f251d9-d3c0-5001-bf67-24bb06423040
84+
)";
85+
86+
const std::string gpu_query_list_sample_output = R"(
87+
0, 46068, NVIDIA RTX A6000, 8.6
88+
1, 46068, NVIDIA RTX A6000, 8.6
89+
)";
90+
};

engine/utils/engine_matcher_utils.h

Lines changed: 3 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -8,49 +8,10 @@
88
#include "utils/logging_utils.h"
99

1010
namespace engine_matcher_utils {
11-
// for testing purpose
12-
const std::vector<std::string> cortex_llamacpp_variants{
13-
"cortex.llamacpp-0.1.25-25.08.24-linux-amd64-avx-cuda-11-7.tar.gz",
14-
"cortex.llamacpp-0.1.25-25.08.24-linux-amd64-avx-cuda-12-0.tar.gz",
15-
"cortex.llamacpp-0.1.25-25.08.24-linux-amd64-avx.tar.gz",
16-
"cortex.llamacpp-0.1.25-25.08.24-linux-amd64-avx2-cuda-11-7.tar.gz",
17-
"cortex.llamacpp-0.1.25-25.08.24-linux-amd64-avx2-cuda-12-0.tar.gz",
18-
"cortex.llamacpp-0.1.25-25.08.24-linux-amd64-avx2.tar.gz",
19-
"cortex.llamacpp-0.1.25-25.08.24-linux-amd64-avx512-cuda-11-7.tar.gz",
20-
"cortex.llamacpp-0.1.25-25.08.24-linux-amd64-avx512-cuda-12-0.tar.gz",
21-
"cortex.llamacpp-0.1.25-25.08.24-linux-amd64-avx512.tar.gz",
22-
"cortex.llamacpp-0.1.25-25.08.24-linux-amd64-noavx-cuda-11-7.tar.gz",
23-
"cortex.llamacpp-0.1.25-25.08.24-linux-amd64-noavx-cuda-12-0.tar.gz",
24-
"cortex.llamacpp-0.1.25-25.08.24-linux-amd64-noavx.tar.gz",
25-
"cortex.llamacpp-0.1.25-25.08.24-linux-amd64-vulkan.tar.gz",
26-
"cortex.llamacpp-0.1.25-25.08.24-mac-amd64.tar.gz",
27-
"cortex.llamacpp-0.1.25-25.08.24-mac-arm64.tar.gz",
28-
"cortex.llamacpp-0.1.25-25.08.24-windows-amd64-avx-cuda-11-7.tar.gz",
29-
"cortex.llamacpp-0.1.25-25.08.24-windows-amd64-avx-cuda-12-0.tar.gz",
30-
"cortex.llamacpp-0.1.25-25.08.24-windows-amd64-avx.tar.gz",
31-
"cortex.llamacpp-0.1.25-25.08.24-windows-amd64-avx2-cuda-11-7.tar.gz",
32-
"cortex.llamacpp-0.1.25-25.08.24-windows-amd64-avx2-cuda-12-0.tar.gz",
33-
"cortex.llamacpp-0.1.25-25.08.24-windows-amd64-avx2.tar.gz",
34-
"cortex.llamacpp-0.1.25-25.08.24-windows-amd64-avx512-cuda-11-7.tar.gz",
35-
"cortex.llamacpp-0.1.25-25.08.24-windows-amd64-avx512-cuda-12-0.tar.gz",
36-
"cortex.llamacpp-0.1.25-25.08.24-windows-amd64-avx512.tar.gz",
37-
"cortex.llamacpp-0.1.25-25.08.24-windows-amd64-noavx-cuda-11-7.tar.gz",
38-
"cortex.llamacpp-0.1.25-25.08.24-windows-amd64-noavx-cuda-12-0.tar.gz",
39-
"cortex.llamacpp-0.1.25-25.08.24-windows-amd64-noavx.tar.gz",
40-
"cortex.llamacpp-0.1.25-25.08.24-windows-amd64-vulkan.tar.gz",
41-
};
42-
const std::vector<std::string> cortex_onnx_variants{
43-
"cortex.onnx-0.1.7-windows-amd64.tar.gz"};
44-
45-
const std::vector<std::string> cortex_tensorrt_variants{
46-
"cortex.tensorrt-llm-0.0.9-linux-cuda-12-4.tar.gz",
47-
"cortex.tensorrt-llm-0.0.9-windows-cuda-12-4.tar.gz"};
48-
49-
inline std::string GetSuitableAvxVariant() {
50-
cortex::cpuid::CpuInfo cpu_info;
51-
11+
inline std::string GetSuitableAvxVariant(cortex::cpuid::CpuInfo& cpu_info) {
5212
CTL_INF("GetSuitableAvxVariant:" << "\n" << cpu_info.to_string());
5313

14+
// prioritize avx512 > avx2 > avx > noavx
5415
if (cpu_info.has_avx512_f())
5516
return "avx512";
5617
if (cpu_info.has_avx2())
@@ -151,10 +112,8 @@ inline std::string Validate(const std::vector<std::string>& variants,
151112
const std::string& os, const std::string& cpu_arch,
152113
const std::string& suitable_avx,
153114
const std::string& cuda_version) {
154-
155-
// Early return if the OS is unsupported
115+
// Early return if the OS is not supported
156116
if (os != "mac" && os != "windows" && os != "linux") {
157-
// TODO: throw is better
158117
return "";
159118
}
160119

engine/utils/http_util.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#pragma once
22

33
#include <drogon/HttpController.h>
4+
#include "utils/cortex_utils.h"
45

56
using namespace drogon;
67

@@ -21,4 +22,4 @@ inline bool HasFieldInReq(const HttpRequestPtr& req,
2122
return true;
2223
}
2324

24-
} // namespace http_util
25+
} // namespace http_util

0 commit comments

Comments
 (0)