test: expand SmartPointer and thread affinity test coverage and update build preset

This commit is contained in:
AndreaRigoni
2026-04-18 18:02:49 +00:00
parent 390fc44043
commit ab886422bf
3 changed files with 76 additions and 11 deletions

View File

@@ -18,7 +18,7 @@ This rule provides instructions for building the uLib project using the micromam
```bash
export MAMBA_EXE="/home/share/micromamba/bin/micromamba"
export MAMBA_ROOT_PREFIX="/home/share/micromamba"
export PRESET="clang-make"
export PRESET="clang-debug"
eval "$(${MAMBA_EXE} shell hook --shell bash)"
micromamba activate uLib
```

View File

@@ -10,17 +10,52 @@
using namespace uLib;
std::vector<int> GetAvailableCpus() {
std::vector<int> available;
#ifdef __linux__
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
if (sched_getaffinity(0, sizeof(cpu_set_t), &cpuset) == 0) {
for (int i = 0; i < CPU_SETSIZE; ++i) {
if (CPU_ISSET(i, &cpuset)) {
available.push_back(i);
}
}
}
#endif
return available;
}
class TestThread : public Thread {
public:
void Run() override {
Thread::Sleep(200);
}
};
void TestThreadAffinity() {
std::cout << "Testing Thread Affinity..." << std::endl;
#ifdef __linux__
Thread t;
auto available = GetAvailableCpus();
if (available.empty()) {
std::cout << " No CPUs available for affinity test, skipping." << std::endl;
return;
}
int target_cpu = available[0];
std::cout << " Using CPU " << target_cpu << std::endl;
TestThread t;
t.Start();
t.SetAffinity(0); // Bind to CPU 0
t.SetAffinity(target_cpu);
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
pthread_getaffinity_np(t.GetNativeHandle(), sizeof(cpu_set_t), &cpuset);
assert(CPU_ISSET(0, &cpuset));
int s = pthread_getaffinity_np(t.GetNativeHandle(), sizeof(cpu_set_t), &cpuset);
if (s != 0) {
std::cerr << "Error: pthread_getaffinity_np failed with code " << s << std::endl;
assert(false);
}
assert(CPU_ISSET(target_cpu, &cpuset));
t.Join();
std::cout << " Passed (Thread bound to CPU 0)." << std::endl;
@@ -32,9 +67,15 @@ void TestThreadAffinity() {
void TestTeamAffinity() {
std::cout << "Testing Team Affinity..." << std::endl;
#ifdef __linux__
#ifdef _OPENMP
auto available = GetAvailableCpus();
if (available.size() < 2) {
std::cout << " Not enough CPUs available for Team affinity test, skipping." << std::endl;
return;
}
std::vector<int> cpus = {available[0], available[1]};
std::cout << " Using CPUs " << cpus[0] << ", " << cpus[1] << std::endl;
Team team(2);
std::vector<int> cpus = {0, 1};
team.SetAffinity(cpus);
// We check affinity inside a parallel region
@@ -48,7 +89,6 @@ void TestTeamAffinity() {
assert(CPU_ISSET(expected_cpu, &cpuset));
}
std::cout << " Passed (Team threads bound correctly)." << std::endl;
#endif
#else
std::cout << " Affinity not supported on this OS, skipping." << std::endl;
#endif

View File

@@ -27,6 +27,7 @@
#include <iostream>
#include "Core/Object.h"
#include "Core/SmartPointer.h"
#include "testing-prototype.h"
@@ -34,12 +35,12 @@ using namespace uLib;
namespace Test {
struct ObjectMockInterface {
struct ObjectMockInterface : public Object {
virtual void PrintValue()=0;
virtual int& Value()=0;
};
class ObjectMock : ObjectMockInterface {
class ObjectMock : public ObjectMockInterface {
int value;
public:
int& Value() { return value; }
@@ -72,12 +73,15 @@ int main () {
SmartPointer<Test::ObjectMock> spt(new Test::ObjectMock);
TEST1(test_smpt(spt));
}
{
SmartPointer<Test::ObjectMock> spt;
TEST1(test_smpt(spt));
}
{
SmartPointer<Test::ObjectMock> spt = new SmartPointer<Test::ObjectMock>;
SmartPointer<Test::ObjectMock> base_spt;
SmartPointer<Test::ObjectMock> spt = &base_spt;
TEST1(test_smpt(spt));
}
@@ -88,7 +92,28 @@ int main () {
TEST1(test_smpt(spt));
}
{
Test::ObjectMock obj;
SmartPointer<Object> spt1 = obj;
SmartPointer<Test::ObjectMock> spt2 = obj;
SmartPointer<Test::ObjectMockInterface> spt = obj;
}
{
Test::ObjectMock *obj = new Test::ObjectMock;
SmartPointer<Test::ObjectMock> spt(obj);
SmartPointer<Test::ObjectMock> spt2(spt);
SmartPointer<Test::ObjectMock> spt3(spt);
SmartPointer<Test::ObjectMock> spt4(spt2);
spt->Value() = 123;
spt2->Value() = 456;
spt3->Value() = 789;
spt4->Value() = 101112;
TEST1(spt->Value() == 101112);
TEST1(spt2->Value() == 101112);
TEST1(spt3->Value() == 101112);
TEST1(spt4->Value() == 101112);
}
END_TESTING;
}