support dynamic stream compression

This commit is contained in:
Alex Coyte
2017-02-14 14:18:13 +11:00
committed by Matthew Barr
parent d9e2c3daca
commit 952f0aad21
12 changed files with 894 additions and 27 deletions

View File

@@ -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.