From 8f8ba2d59140a2eabeed9f516669d0f9f6d57ec2 Mon Sep 17 00:00:00 2001 From: Alex Coyte Date: Mon, 27 Feb 2017 10:33:49 +1100 Subject: [PATCH] basic unit test to check correct stream state is being used. --- unit/hyperscan/behaviour.cpp | 102 ++++++++++++++++++++++++++++++++++- 1 file changed, 101 insertions(+), 1 deletion(-) diff --git a/unit/hyperscan/behaviour.cpp b/unit/hyperscan/behaviour.cpp index a816969c..f15e7171 100644 --- a/unit/hyperscan/behaviour.cpp +++ b/unit/hyperscan/behaviour.cpp @@ -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: @@ -1172,6 +1172,106 @@ TEST(HyperscanTestBehaviour, Vectored7) { hs_free_database(db); } +TEST(HyperscanTestBehaviour, MultiStream1) { + hs_error_t err; + + // build a database + hs_database_t *db = buildDB("foo.*bar.*\\b", 0, 0, HS_MODE_STREAM); + ASSERT_TRUE(db != nullptr); + + // alloc some scratch + hs_scratch_t *scratch = nullptr; + err = hs_alloc_scratch(db, &scratch); + ASSERT_EQ(HS_SUCCESS, err); + EXPECT_TRUE(scratch != nullptr); + + hs_stream_t *stream = nullptr; + err = hs_open_stream(db, 0, &stream); + ASSERT_EQ(HS_SUCCESS, err); + ASSERT_TRUE(stream != nullptr); + + hs_stream_t *stream2 = nullptr; + err = hs_open_stream(db, 0, &stream2); + ASSERT_EQ(HS_SUCCESS, err); + ASSERT_TRUE(stream2 != nullptr); + + matchCount = 0; + const string data("foo bara"); + err = hs_scan_stream(stream, data.c_str(), data.size(), 0, scratch, + countHandler, nullptr); + ASSERT_EQ(HS_SUCCESS, err); + EXPECT_EQ(0U, matchCount); // hasn't matched until stream end + + const string data2("foo bar "); + err = hs_scan_stream(stream2, data2.c_str(), data2.size(), 0, scratch, + nullptr, nullptr); + ASSERT_EQ(HS_SUCCESS, err); + EXPECT_EQ(0U, matchCount); + + err = hs_close_stream(stream, scratch, countHandler, nullptr); + ASSERT_EQ(HS_SUCCESS, err); + EXPECT_EQ(1U, matchCount); + + err = hs_close_stream(stream2, scratch, countHandler, nullptr); + ASSERT_EQ(HS_SUCCESS, err); + EXPECT_EQ(1U, matchCount); + + // teardown + err = hs_free_scratch(scratch); + ASSERT_EQ(HS_SUCCESS, err); + hs_free_database(db); +} + +TEST(HyperscanTestBehaviour, MultiStream2) { + hs_error_t err; + + // build a database + hs_database_t *db = buildDB("foo.*bar.*\\b", 0, 0, HS_MODE_STREAM); + ASSERT_TRUE(db != nullptr); + + // alloc some scratch + hs_scratch_t *scratch = nullptr; + err = hs_alloc_scratch(db, &scratch); + ASSERT_EQ(HS_SUCCESS, err); + EXPECT_TRUE(scratch != nullptr); + + hs_stream_t *stream = nullptr; + err = hs_open_stream(db, 0, &stream); + ASSERT_EQ(HS_SUCCESS, err); + ASSERT_TRUE(stream != nullptr); + + hs_stream_t *stream2 = nullptr; + err = hs_open_stream(db, 0, &stream2); + ASSERT_EQ(HS_SUCCESS, err); + ASSERT_TRUE(stream2 != nullptr); + + matchCount = 0; + const string data2("foo bar "); + err = hs_scan_stream(stream2, data2.c_str(), data2.size(), 0, scratch, + nullptr, nullptr); + ASSERT_EQ(HS_SUCCESS, err); + EXPECT_EQ(0U, matchCount); + + const string data("foo bara"); + err = hs_scan_stream(stream, data.c_str(), data.size(), 0, scratch, + countHandler, nullptr); + ASSERT_EQ(HS_SUCCESS, err); + EXPECT_EQ(0U, matchCount); // hasn't matched until stream end + + err = hs_close_stream(stream2, scratch, countHandler, nullptr); + ASSERT_EQ(HS_SUCCESS, err); + EXPECT_EQ(0U, matchCount); + + err = hs_close_stream(stream, scratch, countHandler, nullptr); + ASSERT_EQ(HS_SUCCESS, err); + EXPECT_EQ(1U, matchCount); + + // teardown + err = hs_free_scratch(scratch); + ASSERT_EQ(HS_SUCCESS, err); + hs_free_database(db); +} + TEST(regression, UE_1005) { hs_error_t err; vector patterns;