mirror of
https://github.com/VectorCamp/vectorscan.git
synced 2025-09-29 11:16:29 +03:00
support dynamic stream compression
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015-2016, Intel Corporation
|
||||
* Copyright (c) 2015-2017, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@@ -2318,6 +2318,289 @@ TEST(HyperscanArgChecks, hs_populate_platform_null) {
|
||||
ASSERT_EQ(HS_INVALID, err);
|
||||
}
|
||||
|
||||
TEST(HyperscanArgChecks, CompressStreamNoStream) {
|
||||
char buf[100];
|
||||
size_t used;
|
||||
hs_error_t err = hs_compress_stream(nullptr, buf, sizeof(buf), &used);
|
||||
ASSERT_EQ(HS_INVALID, err);
|
||||
}
|
||||
|
||||
TEST(HyperscanArgChecks, CompressStreamNoUsed) {
|
||||
hs_database_t *db = buildDB("(foo.*bar){3,}", 0, 0, HS_MODE_STREAM);
|
||||
ASSERT_NE(nullptr, db);
|
||||
|
||||
hs_stream_t *stream;
|
||||
hs_error_t err = hs_open_stream(db, 0, &stream);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
char buf[100];
|
||||
err = hs_compress_stream(stream, buf, sizeof(buf), nullptr);
|
||||
ASSERT_EQ(HS_INVALID, err);
|
||||
|
||||
err = hs_close_stream(stream, nullptr, nullptr, nullptr);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
err = hs_free_database(db);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
}
|
||||
|
||||
TEST(HyperscanArgChecks, CompressStreamNoBuf) {
|
||||
hs_database_t *db = buildDB("(foo.*bar){3,}", 0, 0, HS_MODE_STREAM);
|
||||
ASSERT_NE(nullptr, db);
|
||||
|
||||
hs_stream_t *stream;
|
||||
hs_error_t err = hs_open_stream(db, 0, &stream);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
char buf[100];
|
||||
size_t used;
|
||||
err = hs_compress_stream(stream, nullptr, sizeof(buf), &used);
|
||||
ASSERT_EQ(HS_INVALID, err);
|
||||
|
||||
err = hs_close_stream(stream, nullptr, nullptr, nullptr);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
err = hs_free_database(db);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
}
|
||||
|
||||
TEST(HyperscanArgChecks, CompressStreamSmallBuff) {
|
||||
hs_database_t *db = buildDB("(foo.*bar){3,}", 0, 0, HS_MODE_STREAM);
|
||||
ASSERT_NE(nullptr, db);
|
||||
|
||||
hs_stream_t *stream;
|
||||
hs_error_t err = hs_open_stream(db, 0, &stream);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
char buf[100];
|
||||
size_t used = 0;
|
||||
err = hs_compress_stream(stream, buf, 1, &used);
|
||||
ASSERT_EQ(HS_INSUFFICIENT_SPACE, err);
|
||||
ASSERT_LT(0, used);
|
||||
|
||||
err = hs_close_stream(stream, nullptr, nullptr, nullptr);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
err = hs_free_database(db);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
}
|
||||
|
||||
TEST(HyperscanArgChecks, ExpandNoDb) {
|
||||
hs_database_t *db = buildDB("(foo.*bar){3,}", 0, 0, HS_MODE_STREAM);
|
||||
ASSERT_NE(nullptr, db);
|
||||
|
||||
hs_stream_t *stream1;
|
||||
hs_error_t err = hs_open_stream(db, 0, &stream1);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
char buf[2000];
|
||||
size_t used = 0;
|
||||
err = hs_compress_stream(stream1, buf, sizeof(buf), &used);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
hs_stream_t *stream2;
|
||||
err = hs_expand_stream(nullptr, &stream2, buf, used);
|
||||
ASSERT_EQ(HS_INVALID, err);
|
||||
|
||||
err = hs_close_stream(stream1, nullptr, nullptr, nullptr);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
err = hs_free_database(db);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
}
|
||||
|
||||
TEST(HyperscanArgChecks, ExpandNoTo) {
|
||||
hs_database_t *db = buildDB("(foo.*bar){3,}", 0, 0, HS_MODE_STREAM);
|
||||
ASSERT_NE(nullptr, db);
|
||||
|
||||
hs_stream_t *stream1;
|
||||
hs_error_t err = hs_open_stream(db, 0, &stream1);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
char buf[2000];
|
||||
size_t used = 0;
|
||||
err = hs_compress_stream(stream1, buf, sizeof(buf), &used);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
hs_stream_t *stream2;
|
||||
err = hs_expand_stream(db, nullptr, buf, used);
|
||||
ASSERT_EQ(HS_INVALID, err);
|
||||
|
||||
err = hs_close_stream(stream1, nullptr, nullptr, nullptr);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
err = hs_free_database(db);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
}
|
||||
|
||||
TEST(HyperscanArgChecks, ExpandNoBuf) {
|
||||
hs_database_t *db = buildDB("(foo.*bar){3,}", 0, 0, HS_MODE_STREAM);
|
||||
ASSERT_NE(nullptr, db);
|
||||
|
||||
hs_stream_t *stream1;
|
||||
hs_error_t err = hs_open_stream(db, 0, &stream1);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
char buf[2000];
|
||||
size_t used = 0;
|
||||
err = hs_compress_stream(stream1, buf, sizeof(buf), &used);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
hs_stream_t *stream2;
|
||||
err = hs_expand_stream(db, &stream2, nullptr, used);
|
||||
ASSERT_EQ(HS_INVALID, err);
|
||||
|
||||
err = hs_close_stream(stream1, nullptr, nullptr, nullptr);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
err = hs_free_database(db);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
}
|
||||
|
||||
TEST(HyperscanArgChecks, ExpandSmallBuf) {
|
||||
hs_database_t *db = buildDB("(foo.*bar){3,}", 0, 0, HS_MODE_STREAM);
|
||||
ASSERT_NE(nullptr, db);
|
||||
|
||||
hs_stream_t *stream1;
|
||||
hs_error_t err = hs_open_stream(db, 0, &stream1);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
char buf[2000];
|
||||
size_t used = 0;
|
||||
err = hs_compress_stream(stream1, buf, sizeof(buf), &used);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
hs_stream_t *stream2;
|
||||
err = hs_expand_stream(db, &stream2, buf, used / 2);
|
||||
ASSERT_EQ(HS_INVALID, err);
|
||||
|
||||
err = hs_close_stream(stream1, nullptr, nullptr, nullptr);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
err = hs_free_database(db);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
}
|
||||
|
||||
TEST(HyperscanArgChecks, ResetAndExpandNoStream) {
|
||||
hs_database_t *db = buildDB("(foo.*bar){3,}", 0, 0, HS_MODE_STREAM);
|
||||
ASSERT_NE(nullptr, db);
|
||||
|
||||
hs_stream_t *stream1;
|
||||
hs_error_t err = hs_open_stream(db, 0, &stream1);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
char buf[2000];
|
||||
size_t used = 0;
|
||||
err = hs_compress_stream(stream1, buf, sizeof(buf), &used);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
err = hs_reset_and_expand_stream(nullptr, buf, used, nullptr, nullptr,
|
||||
nullptr);
|
||||
ASSERT_EQ(HS_INVALID, err);
|
||||
|
||||
err = hs_close_stream(stream1, nullptr, nullptr, nullptr);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
err = hs_free_database(db);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
}
|
||||
|
||||
TEST(HyperscanArgChecks, ResetAndExpandNoBuf) {
|
||||
hs_database_t *db = buildDB("(foo.*bar){3,}", 0, 0, HS_MODE_STREAM);
|
||||
ASSERT_NE(nullptr, db);
|
||||
|
||||
hs_stream_t *stream1;
|
||||
hs_error_t err = hs_open_stream(db, 0, &stream1);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
char buf[2000];
|
||||
size_t used = 0;
|
||||
err = hs_compress_stream(stream1, buf, sizeof(buf), &used);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
hs_stream_t *stream2;
|
||||
err = hs_open_stream(db, 0, &stream2);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
err = hs_reset_and_expand_stream(stream2, nullptr, used, nullptr, nullptr,
|
||||
nullptr);
|
||||
ASSERT_EQ(HS_INVALID, err);
|
||||
|
||||
err = hs_close_stream(stream1, nullptr, nullptr, nullptr);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
err = hs_close_stream(stream2, nullptr, nullptr, nullptr);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
err = hs_free_database(db);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
}
|
||||
|
||||
|
||||
TEST(HyperscanArgChecks, ResetAndExpandSmallBuf) {
|
||||
hs_database_t *db = buildDB("(foo.*bar){3,}", 0, 0, HS_MODE_STREAM);
|
||||
ASSERT_NE(nullptr, db);
|
||||
|
||||
hs_stream_t *stream1;
|
||||
hs_error_t err = hs_open_stream(db, 0, &stream1);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
char buf[2000];
|
||||
size_t used = 0;
|
||||
err = hs_compress_stream(stream1, buf, sizeof(buf), &used);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
hs_stream_t *stream2;
|
||||
err = hs_open_stream(db, 0, &stream2);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
err = hs_reset_and_expand_stream(stream2, buf, used / 2, nullptr, nullptr,
|
||||
nullptr);
|
||||
ASSERT_EQ(HS_INVALID, err);
|
||||
|
||||
err = hs_close_stream(stream1, nullptr, nullptr, nullptr);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
err = hs_close_stream(stream2, nullptr, nullptr, nullptr);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
err = hs_free_database(db);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
}
|
||||
|
||||
TEST(HyperscanArgChecks, ResetAndExpandNoScratch) {
|
||||
hs_database_t *db = buildDB("(foo.*bar){3,}", 0, 0, HS_MODE_STREAM);
|
||||
ASSERT_NE(nullptr, db);
|
||||
|
||||
hs_stream_t *stream1;
|
||||
hs_error_t err = hs_open_stream(db, 0, &stream1);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
char buf[2000];
|
||||
size_t used = 0;
|
||||
err = hs_compress_stream(stream1, buf, sizeof(buf), &used);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
hs_stream_t *stream2;
|
||||
err = hs_open_stream(db, 0, &stream2);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
int temp;
|
||||
|
||||
err = hs_reset_and_expand_stream(stream2, buf, used, nullptr, singleHandler,
|
||||
&temp);
|
||||
ASSERT_EQ(HS_INVALID, err);
|
||||
|
||||
err = hs_close_stream(stream1, nullptr, nullptr, nullptr);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
err = hs_close_stream(stream2, nullptr, nullptr, nullptr);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
|
||||
err = hs_free_database(db);
|
||||
ASSERT_EQ(HS_SUCCESS, err);
|
||||
}
|
||||
|
||||
class BadModeTest : public testing::TestWithParam<unsigned> {};
|
||||
|
||||
// hs_compile: Compile a pattern with bogus mode flags set.
|
||||
|
Reference in New Issue
Block a user