suricata增加单元测试编译失败

一、环境

$ lsb_release  -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 22.04.5 LTS
Release:	22.04
Codename:	jammy

suricata: suricata7.0.5
IDE: vscode

二、背景

在suricata中开发了某个功能后,增加unittest时,无法编译通过。

三、unittest增加过程

3.1 增加Add功能

src/util-add.h

#ifndef __UTIL_ADD_H__
#define __UTIL_ADD_H__

int Add(int a, int b);

#ifdef UNITTESTS
void AddRegisterTests(void);
#endif

#endif

src/util-add.c

#include "util-add.h"

int Add(int a, int b)
{
    return a+b;
}

#ifdef UNITTESTS
#include "tests/util-add.c"
#endif

3.2 添加源码编译

src/Makefile.am

noinst_HEADERS = \
    ...
    util-add.h \
    ...

libsuricata_c_a_SOURCES = \
    ...
    util-add.c \
    ...

3.3 增加unittest

src/tests/util-add.c

#include "util-add.h"
#include "util-unittest.h"

static int AddTest01(void)
{
    int a = Add(1, 2);
    FAIL_IF(a != 3);

    PASS;
}

void AddRegisterTests(void)
{
    UtRegisterTests("AddTest01", AddTest01);
}

3.4 注册单元测试

src/runmode-unittests.c

#ifdef UNITTESTS
...
#include "util-add.h"
...
#endif

...

#ifdef UNITTESTS
static void RegisterUnittests(void)
{
    ...
    AddRegisterTests();
    ...
}
#endif

3.5 编译

$ ./configure --enable-unittest

请添加图片描述

$ make -j8

请添加图片描述

四、问题排查

明明有AddRegisterTests函数的实现,为啥报错说没有实现呢?
经过对比发现vscode未识别到宏UNITTESTS的定义
请添加图片描述

经过查找发现UNITTESTS定义在src/autoconf.h,
请添加图片描述

src/autoconf.h是通过文件src/suricata-common.h引用的
请添加图片描述

因此在src/util-add.c中增加 #include "suricata-common.h"解决。

五、总结

因缺少引用头文件src/suricata-common.h,导致UNITTESTS宏在util-add.c中未定义,致使并未编译src/tests/util-add.c
以后添加功能,都引用suricata-common.h头文件,此文件为公共头文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值