mirror of
https://github.com/dragonflydb/dragonfly
synced 2024-11-21 23:19:53 +00:00
chore: make usan asan optional and enable them on CI (#2631)
* add daily job to run unit tests with asan/usan
This commit is contained in:
parent
cf889486bc
commit
f3ba448106
96
.github/workflows/daily-sanitizers.yml
vendored
Normal file
96
.github/workflows/daily-sanitizers.yml
vendored
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
name: daily-sanitizers
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 4 * * *' # run at 4 AM UTC
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: [self-hosted, linux, ARM64]
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
container: ["ubuntu-dev:22"]
|
||||||
|
build-type: [Debug]
|
||||||
|
compiler: [{ cxx: g++, c: gcc }]
|
||||||
|
cxx_flags: ["-Werror"]
|
||||||
|
timeout-minutes: 45
|
||||||
|
env:
|
||||||
|
SCCACHE_GHA_ENABLED: "true"
|
||||||
|
SCCACHE_CACHE_SIZE: 6G
|
||||||
|
SCCACHE_ERROR_LOG: /tmp/sccache_log.txt
|
||||||
|
|
||||||
|
container:
|
||||||
|
image: ghcr.io/romange/${{ matrix.container }}
|
||||||
|
credentials:
|
||||||
|
username: ${{ github.repository_owner }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
submodules: true
|
||||||
|
|
||||||
|
- name: Run sccache-cache
|
||||||
|
uses: mozilla-actions/sccache-action@v0.0.4
|
||||||
|
|
||||||
|
- name: Configure Cache Env
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
|
||||||
|
core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || '')
|
||||||
|
|
||||||
|
- name: Prepare Environment
|
||||||
|
run: |
|
||||||
|
uname -a
|
||||||
|
cmake --version
|
||||||
|
mkdir -p ${GITHUB_WORKSPACE}/build
|
||||||
|
|
||||||
|
echo "===================Before freeing up space ============================================"
|
||||||
|
df -h
|
||||||
|
rm -rf /hostroot/usr/share/dotnet
|
||||||
|
rm -rf /hostroot/usr/local/share/boost
|
||||||
|
rm -rf /hostroot/usr/local/lib/android
|
||||||
|
rm -rf /hostroot/opt/ghc
|
||||||
|
echo "===================After freeing up space ============================================"
|
||||||
|
df -h
|
||||||
|
|
||||||
|
- name: Configure & Build
|
||||||
|
run: |
|
||||||
|
echo "ulimit is"
|
||||||
|
ulimit -s
|
||||||
|
echo "-----------------------------"
|
||||||
|
echo "disk space is:"
|
||||||
|
df -h
|
||||||
|
echo "-----------------------------"
|
||||||
|
mkdir -p $GITHUB_WORKSPACE/build
|
||||||
|
cd $GITHUB_WORKSPACE/build
|
||||||
|
cmake .. \
|
||||||
|
-DCMAKE_BUILD_TYPE=Debug \
|
||||||
|
-GNinja \
|
||||||
|
-DCMAKE_C_COMPILER="${{matrix.compiler.c}}" \
|
||||||
|
-DCMAKE_CXX_COMPILER="${{matrix.compiler.cxx}}" \
|
||||||
|
-DCMAKE_C_COMPILER_LAUNCHER=sccache \
|
||||||
|
-DCMAKE_CXX_COMPILER_LAUNCHER=sccache \
|
||||||
|
-DCMAKE_CXX_FLAGS="${{matrix.cxx_flags}}" \
|
||||||
|
-DWITH_ASAN=ON \
|
||||||
|
-DWITH_USAN=ON
|
||||||
|
|
||||||
|
ninja src/all
|
||||||
|
|
||||||
|
- name: Test
|
||||||
|
run: |
|
||||||
|
cd $GITHUB_WORKSPACE/build
|
||||||
|
ctest -V -L DFLY
|
||||||
|
|
||||||
|
- name: Send notifications on failure
|
||||||
|
if: failure()
|
||||||
|
run: |
|
||||||
|
job_link="${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}"
|
||||||
|
message="Daily sanitizers failed.\\n The commit is: ${{github.sha}}.\\n Job Link: ${job_link}\\n"
|
||||||
|
|
||||||
|
curl -s \
|
||||||
|
-X POST \
|
||||||
|
-H 'Content-Type: application/json' \
|
||||||
|
'${{ inputs.gspace-secret }}' \
|
||||||
|
-d '{"text": "'"${message}"'"}'
|
@ -35,11 +35,15 @@ option(DF_USE_SSL "Provide support for SSL connections" ON)
|
|||||||
|
|
||||||
find_package(OpenSSL)
|
find_package(OpenSSL)
|
||||||
|
|
||||||
if (SUPPORT_ASAN AND NOT DEFINED ENV{CI})
|
option(WITH_ASAN "Enable -fsanitize=address" OFF)
|
||||||
|
if (SUPPORT_ASAN AND WITH_ASAN)
|
||||||
|
message(STATUS "address sanitizer enabled")
|
||||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fsanitize=address")
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fsanitize=address")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (SUPPORT_USAN AND NOT DEFINED ENV{CI})
|
option(WITH_USAN "Enable -fsanitize=undefined" OFF)
|
||||||
|
if (SUPPORT_USAN AND WITH_USAN)
|
||||||
|
message(STATUS "ub sanitizer enabled")
|
||||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fsanitize=undefined")
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fsanitize=undefined")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@ -85,6 +85,10 @@ cxx_test(list_family_test dfly_test_lib LABELS DFLY)
|
|||||||
cxx_test(server_family_test dfly_test_lib LABELS DFLY)
|
cxx_test(server_family_test dfly_test_lib LABELS DFLY)
|
||||||
cxx_test(set_family_test dfly_test_lib LABELS DFLY)
|
cxx_test(set_family_test dfly_test_lib LABELS DFLY)
|
||||||
cxx_test(stream_family_test dfly_test_lib LABELS DFLY)
|
cxx_test(stream_family_test dfly_test_lib LABELS DFLY)
|
||||||
|
if (WITH_ASAN OR WITH_USAN)
|
||||||
|
target_compile_definitions(stream_family_test PRIVATE SANITIZERS)
|
||||||
|
target_compile_definitions(multi_test PRIVATE SANITIZERS)
|
||||||
|
endif()
|
||||||
cxx_test(string_family_test dfly_test_lib LABELS DFLY)
|
cxx_test(string_family_test dfly_test_lib LABELS DFLY)
|
||||||
cxx_test(bitops_family_test dfly_test_lib LABELS DFLY)
|
cxx_test(bitops_family_test dfly_test_lib LABELS DFLY)
|
||||||
cxx_test(rdb_test dfly_test_lib DATA testdata/empty.rdb testdata/redis6_small.rdb
|
cxx_test(rdb_test dfly_test_lib DATA testdata/empty.rdb testdata/redis6_small.rdb
|
||||||
|
@ -740,6 +740,8 @@ TEST_F(MultiTest, ScriptFlagsEmbedded) {
|
|||||||
EXPECT_THAT(Run({"eval", s2, "0"}), ErrArg("Invalid flag: this-is-an-error"));
|
EXPECT_THAT(Run({"eval", s2, "0"}), ErrArg("Invalid flag: this-is-an-error"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// todo: ASAN fails heres on arm
|
||||||
|
#ifndef SANITIZERS
|
||||||
TEST_F(MultiTest, ScriptBadCommand) {
|
TEST_F(MultiTest, ScriptBadCommand) {
|
||||||
const char* s1 = "redis.call('FLUSHALL')";
|
const char* s1 = "redis.call('FLUSHALL')";
|
||||||
const char* s2 = "redis.call('FLUSHALL'); redis.set(KEYS[1], ARGS[1]);";
|
const char* s2 = "redis.call('FLUSHALL'); redis.set(KEYS[1], ARGS[1]);";
|
||||||
@ -762,6 +764,7 @@ TEST_F(MultiTest, ScriptBadCommand) {
|
|||||||
resp = Run({"eval", s4, "0"});
|
resp = Run({"eval", s4, "0"});
|
||||||
EXPECT_EQ(resp, "OK");
|
EXPECT_EQ(resp, "OK");
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
TEST_F(MultiTest, MultiEvalModeConflict) {
|
TEST_F(MultiTest, MultiEvalModeConflict) {
|
||||||
if (auto mode = absl::GetFlag(FLAGS_multi_exec_mode); mode == Transaction::GLOBAL) {
|
if (auto mode = absl::GetFlag(FLAGS_multi_exec_mode); mode == Transaction::GLOBAL) {
|
||||||
|
@ -122,6 +122,8 @@ TEST_F(SearchFamilyTest, Stats) {
|
|||||||
EXPECT_LE(metrics.search_stats.used_memory, 3 * expected_usage);
|
EXPECT_LE(metrics.search_stats.used_memory, 3 * expected_usage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// todo: ASAN fails heres on arm
|
||||||
|
#ifndef SANITIZERS
|
||||||
TEST_F(SearchFamilyTest, Simple) {
|
TEST_F(SearchFamilyTest, Simple) {
|
||||||
Run({"hset", "d:1", "foo", "baz", "k", "v"});
|
Run({"hset", "d:1", "foo", "baz", "k", "v"});
|
||||||
Run({"hset", "d:2", "foo", "bar", "k", "v"});
|
Run({"hset", "d:2", "foo", "bar", "k", "v"});
|
||||||
@ -143,6 +145,7 @@ TEST_F(SearchFamilyTest, Simple) {
|
|||||||
Run({"hset", "w:2", "foo", "this", "k", "v"});
|
Run({"hset", "w:2", "foo", "this", "k", "v"});
|
||||||
EXPECT_THAT(Run({"ft.search", "i1", "@foo:this"}), kNoResults);
|
EXPECT_THAT(Run({"ft.search", "i1", "@foo:this"}), kNoResults);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
TEST_F(SearchFamilyTest, Errors) {
|
TEST_F(SearchFamilyTest, Errors) {
|
||||||
Run({"ft.create", "i1", "PREFIX", "1", "d:", "SCHEMA", "foo", "TAG", "bar", "TEXT"});
|
Run({"ft.create", "i1", "PREFIX", "1", "d:", "SCHEMA", "foo", "TAG", "bar", "TEXT"});
|
||||||
@ -196,6 +199,8 @@ TEST_F(SearchFamilyTest, JsonAttributesPaths) {
|
|||||||
EXPECT_THAT(Run({"ft.search", "i1", "yes"}), AreDocIds("k2"));
|
EXPECT_THAT(Run({"ft.search", "i1", "yes"}), AreDocIds("k2"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// todo: fails on arm build
|
||||||
|
#ifndef SANITIZERS
|
||||||
TEST_F(SearchFamilyTest, JsonArrayValues) {
|
TEST_F(SearchFamilyTest, JsonArrayValues) {
|
||||||
string_view D1 = R"(
|
string_view D1 = R"(
|
||||||
{
|
{
|
||||||
@ -271,6 +276,7 @@ TEST_F(SearchFamilyTest, JsonArrayValues) {
|
|||||||
EXPECT_EQ(res.GetVec()[1], "k1");
|
EXPECT_EQ(res.GetVec()[1], "k1");
|
||||||
EXPECT_THAT(res.GetVec()[2], RespArray(ElementsAre()));
|
EXPECT_THAT(res.GetVec()[2], RespArray(ElementsAre()));
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
TEST_F(SearchFamilyTest, Tags) {
|
TEST_F(SearchFamilyTest, Tags) {
|
||||||
Run({"hset", "d:1", "color", "red, green"});
|
Run({"hset", "d:1", "color", "red, green"});
|
||||||
|
@ -419,6 +419,8 @@ TEST_F(StreamFamilyTest, XReadGroupInvalidArgs) {
|
|||||||
EXPECT_THAT(resp, ErrArg("syntax error"));
|
EXPECT_THAT(resp, ErrArg("syntax error"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// todo: ASAN fails heres on arm
|
||||||
|
#ifndef SANITIZERS
|
||||||
TEST_F(StreamFamilyTest, Issue854) {
|
TEST_F(StreamFamilyTest, Issue854) {
|
||||||
auto resp = Run({"xgroup", "help"});
|
auto resp = Run({"xgroup", "help"});
|
||||||
EXPECT_THAT(resp, ArgType(RespExpr::ARRAY));
|
EXPECT_THAT(resp, ArgType(RespExpr::ARRAY));
|
||||||
@ -426,6 +428,7 @@ TEST_F(StreamFamilyTest, Issue854) {
|
|||||||
resp = Run({"eval", "redis.call('xgroup', 'help')", "0"});
|
resp = Run({"eval", "redis.call('xgroup', 'help')", "0"});
|
||||||
EXPECT_THAT(resp, ErrArg("is not allowed"));
|
EXPECT_THAT(resp, ErrArg("is not allowed"));
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
TEST_F(StreamFamilyTest, XGroupConsumer) {
|
TEST_F(StreamFamilyTest, XGroupConsumer) {
|
||||||
Run({"xgroup", "create", "foo", "group", "$", "MKSTREAM"});
|
Run({"xgroup", "create", "foo", "group", "$", "MKSTREAM"});
|
||||||
|
Loading…
Reference in New Issue
Block a user