diff --git a/unit/hyperscan/logical_combination.cpp b/unit/hyperscan/logical_combination.cpp index 5b1c1ec2..49854be1 100644 --- a/unit/hyperscan/logical_combination.cpp +++ b/unit/hyperscan/logical_combination.cpp @@ -804,3 +804,66 @@ TEST(LogicalCombination, MultiCombPurelyNegativeUniSub6) { err = hs_free_scratch(scratch); ASSERT_EQ(HS_SUCCESS, err); } + +TEST(LogicalCombination, MultiCombStream1) { + hs_database_t *db = nullptr; + hs_compile_error_t *compile_err = nullptr; + CallBackContext c; + string data[] = {"xxxxxxxabcxxxxxxxdefxxxghixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "xxxxxxxxxxxxxxxxghixxxxxxxxxxxabcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "xxxxxxxxxxxxxxxxdefxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "xxxxxxxxxxxxxxxxxyzxxxxxxxxxxxxxxxxxxxxxghixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "xxxxxghixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzxy", + "z"}; + const char *expr[] = {"abc", "def", "xyz", "zxyz", + "101 & 102", "201 & !202"}; + unsigned flags[] = {0, 0, 0, 0, HS_FLAG_COMBINATION, HS_FLAG_COMBINATION}; + unsigned ids[] = {101, 102, 201, 202, 1001, 1002}; + hs_error_t err = hs_compile_multi(expr, flags, ids, 6, HS_MODE_STREAM, + nullptr, &db, &compile_err); + + ASSERT_EQ(HS_SUCCESS, err); + ASSERT_TRUE(db != nullptr); + + hs_scratch_t *scratch = nullptr; + err = hs_alloc_scratch(db, &scratch); + ASSERT_EQ(HS_SUCCESS, err); + ASSERT_TRUE(scratch != nullptr); + + hs_stream_t *stream = nullptr; + err = hs_open_stream(db, 0, &stream); + ASSERT_EQ(HS_SUCCESS, err); + ASSERT_TRUE(stream != nullptr); + + c.halt = 0; + int i; + for (i = 0; i < 11; i++) { + err = hs_scan_stream(stream, data[i].c_str(), data[i].size(), 0, + scratch, record_cb, (void *)&c); + ASSERT_EQ(HS_SUCCESS, err); + } + err = hs_close_stream(stream, scratch, dummy_cb, nullptr); + ASSERT_EQ(HS_SUCCESS, err); + + ASSERT_EQ(11U, c.matches.size()); + ASSERT_EQ(MatchRecord(10, 101), c.matches[0]); + ASSERT_EQ(MatchRecord(20, 102), c.matches[1]); + ASSERT_EQ(MatchRecord(20, 1001), c.matches[2]); + ASSERT_EQ(MatchRecord(109, 101), c.matches[3]); + ASSERT_EQ(MatchRecord(109, 1001), c.matches[4]); + ASSERT_EQ(MatchRecord(171, 102), c.matches[5]); + ASSERT_EQ(MatchRecord(171, 1001), c.matches[6]); + ASSERT_EQ(MatchRecord(247, 201), c.matches[7]); + ASSERT_EQ(MatchRecord(247, 1002), c.matches[8]); + ASSERT_EQ(MatchRecord(761, 201), c.matches[9]); + ASSERT_EQ(MatchRecord(761, 202), c.matches[10]); + + hs_free_database(db); + err = hs_free_scratch(scratch); + ASSERT_EQ(HS_SUCCESS, err); +}