mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-24 02:35:41 +00:00
65313fd340
This imports Chromium's `make_dafsa.py` script [1]. It takes in a gperf formatted file (note: gperf is *not* required) and converts that to a compact binary representation of the string data in the form of a deterministic acyclic finite state automaton (DAFSA) [2]. The only change made to the script was to make it handle the arguments our file generation script passes in to the `main` function. It also imports the logic for traversing the DAFSA [3] almost verbatim in `Dafsa.cpp`. A thin wrapper was added so that we can reuse the DAFSA structure for multiple tables. The only change made to the original logic was to swap in mozilla style assertions and rename the not found constant from `kNotFound` to `Dafsa::kKeyNotFound` in order to avoid a collision with `kNotFound` defined in our nsString code. [1]6ba04a9056/tools/dafsa/make_dafsa.py
[2] https://en.wikipedia.org/wiki/Deterministic_acyclic_finite_state_automaton [3]a2a90a35aa/net/base/registry_controlled_domains/registry_controlled_domain.cc (72)
MozReview-Commit-ID: Eion9POHZm5
86 lines
2.7 KiB
C++
86 lines
2.7 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "mozilla/Dafsa.h"
|
|
#include "gtest/gtest.h"
|
|
|
|
#include "nsString.h"
|
|
|
|
using mozilla::Dafsa;
|
|
|
|
namespace dafsa_test_1 {
|
|
#include "dafsa_test_1.inc" // kDafsa
|
|
}
|
|
|
|
TEST(Dafsa, Constructor)
|
|
{
|
|
Dafsa d(dafsa_test_1::kDafsa);
|
|
}
|
|
|
|
TEST(Dafsa, StringsFound)
|
|
{
|
|
Dafsa d(dafsa_test_1::kDafsa);
|
|
|
|
int tag = d.Lookup(NS_LITERAL_CSTRING("foo.bar.baz"));
|
|
EXPECT_EQ(tag, 1);
|
|
|
|
tag = d.Lookup(NS_LITERAL_CSTRING("a.test.string"));
|
|
EXPECT_EQ(tag, 0);
|
|
|
|
tag = d.Lookup(NS_LITERAL_CSTRING("a.test.string2"));
|
|
EXPECT_EQ(tag, 2);
|
|
|
|
tag = d.Lookup(NS_LITERAL_CSTRING("aaaa"));
|
|
EXPECT_EQ(tag, 4);
|
|
}
|
|
|
|
TEST(Dafsa, StringsNotFound)
|
|
{
|
|
Dafsa d(dafsa_test_1::kDafsa);
|
|
|
|
// Matches all but last letter.
|
|
int tag = d.Lookup(NS_LITERAL_CSTRING("foo.bar.ba"));
|
|
EXPECT_EQ(tag, Dafsa::kKeyNotFound);
|
|
|
|
// Matches prefix with extra letter.
|
|
tag = d.Lookup(NS_LITERAL_CSTRING("a.test.strings"));
|
|
EXPECT_EQ(tag, Dafsa::kKeyNotFound);
|
|
|
|
// Matches small portion.
|
|
tag = d.Lookup(NS_LITERAL_CSTRING("a.test"));
|
|
EXPECT_EQ(tag, Dafsa::kKeyNotFound);
|
|
|
|
// Matches repeating pattern with extra letters.
|
|
tag = d.Lookup(NS_LITERAL_CSTRING("aaaaa"));
|
|
EXPECT_EQ(tag, Dafsa::kKeyNotFound);
|
|
|
|
// Empty string.
|
|
tag = d.Lookup(NS_LITERAL_CSTRING(""));
|
|
EXPECT_EQ(tag, Dafsa::kKeyNotFound);
|
|
}
|
|
|
|
TEST(Dafsa, HugeString)
|
|
{
|
|
Dafsa d(dafsa_test_1::kDafsa);
|
|
|
|
int tag = d.Lookup(NS_LITERAL_CSTRING(
|
|
"This is a very long string that is larger than the dafsa itself. "
|
|
"This is a very long string that is larger than the dafsa itself. "
|
|
"This is a very long string that is larger than the dafsa itself. "
|
|
"This is a very long string that is larger than the dafsa itself. "
|
|
"This is a very long string that is larger than the dafsa itself. "
|
|
"This is a very long string that is larger than the dafsa itself. "
|
|
"This is a very long string that is larger than the dafsa itself. "
|
|
"This is a very long string that is larger than the dafsa itself. "
|
|
"This is a very long string that is larger than the dafsa itself. "
|
|
"This is a very long string that is larger than the dafsa itself. "
|
|
"This is a very long string that is larger than the dafsa itself. "
|
|
"This is a very long string that is larger than the dafsa itself. "
|
|
"This is a very long string that is larger than the dafsa itself. "
|
|
));
|
|
EXPECT_EQ(tag, Dafsa::kKeyNotFound);
|
|
}
|