运行 时分叉的 allegro 单元测试崩溃

Forked allegro unit tests crash when run

我正在为 c 使用一个自定义的 unit-testing 系统,它将每个测试分叉到一个新进程中,这样即使一个测试崩溃,其他测试仍然可以不间断地执行。现在我正在尝试使用它来测试使用 Allegro 的代码。当我在 main 中 运行 al_init() 时(如下所示),我的测试程序在第一次测试后终止并显示错误消息:

X connection to :1 broken (explicit kill or server shutdown).
X connection to :1 broken (explicit kill or server shutdown).
make: *** [Makefile:39: tests/results/collision.result] Error 1

导致问题的错误代码:

void MakeCollisionCircleInWorldTest()
{
    Testing_Unimplemented();
}

/*
 * other unimplemented tests here, cropped for brevity
 */ 

int main(int argc, char **argv)
{
    al_init();
    Testing_Init(argc, argv);

    TESTING_RUN(MakeCollisionCircleInWorldTest);
    TESTING_RUN(DuplicateCollisionCircleTest);
    TESTING_RUN(AddCollisionCircleTest);
    TESTING_RUN(RemoveCollisionCircleTest);
    TESTING_RUN(MoveTest);
    TESTING_RUN(CheckCollisionsTest);

    return 0;
}

注意:TESTING_RUN 执行上述分叉。我假设这与崩溃有关(也许连接在第一个 child 终止后被终止?),但我不确定具体如何,也不确定如何解决。

当我在每个测试中分别调用 al_init() 时(如下所示),没有提前终止也没有错误消息,但它似乎有点慢(不是慢得无法忍受,但有一个明显的pause 对于那些因为未实现而立即失败的测试来说不应该存在)。此外,为每个单独的测试重新启动 Allegro 似乎有点痛苦。

void MakeCollisionCircleInWorldTest()
{
    al_init();
    Testing_Unimplemented();
}

/*
 * other unimplemented tests here, cropped for brevity
 */ 

int main(int argc, char **argv)
{
    Testing_Init(argc, argv);

    TESTING_RUN(MakeCollisionCircleInWorldTest);
    TESTING_RUN(DuplicateCollisionCircleTest);
    TESTING_RUN(AddCollisionCircleTest);
    TESTING_RUN(RemoveCollisionCircleTest);
    TESTING_RUN(MoveTest);
    TESTING_RUN(CheckCollisionsTest);

    return 0;
}

导致崩溃的原因是什么?有没有什么方法可以在 main 中初始化 Allegro 而不会破坏我的测试?

此问题是由 al_init()al_uninstall_system 设置为 atexit 函数引起的。结果是child在退出的时候进行了系统卸载。这可以通过调用 al_install_system(ALLEGRO_VERSION_INT, NULL) 而不是 al_init(),然后在 parent 进程完成时手动调用 al_uninstall_system() 来防止。还有其他解决方案,但这就是我现在采用的解决方案,因为我的单元测试程序只有一个退出点。