blob: 1958e2697bd2c8a6a76c650460086b7852bbac46 [file] [log] [blame]
// Copyright 2011 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
extern "C" {
#include "domain_registry/private/trie_search.h"
// These additional methods in trie_search.c are not public, but we
// want to test them, so we declare their signatures here.
const struct TrieNode* FindNodeInRange(
const char* value,
const struct TrieNode* start,
const struct TrieNode* end);
const char* FindLeafNodeInRange(
const char* value,
const REGISTRY_U16* start,
const REGISTRY_U16* end);
} // extern "C"
#include "testing/gtest/include/gtest/gtest.h"
// Include the simple test tables inline.
#include "domain_registry/testing/simple_node_table.c"
namespace {
class TrieSearchTest : public ::testing::Test {
protected:
static void SetUpTestCase() {
// For these tests we use the test tables from simple_node_table.c.
SetRegistryTables(kSimpleStringTable,
kSimpleNodeTable,
kSimpleNumRootChildren,
kSimpleLeafNodeTable,
kSimpleLeafNodeTableOffset);
}
static void TearDownTestCase() {
SetRegistryTables(NULL, NULL, 0, NULL, 0);
}
};
class TrieSearchFindNodeTest : public ::testing::Test {
protected:
static void SetUpTestCase() {
// For these tests we need only the string table from simple_node_table.c.
SetRegistryTables(kSimpleStringTable, NULL, 0, NULL, 0);
}
static void TearDownTestCase() {
SetRegistryTables(NULL, NULL, 0, NULL, 0);
}
};
TEST_F(TrieSearchTest, FindRegistryNode) {
// Tests for searching root nodes.
EXPECT_EQ(NULL, FindRegistryNode("", NULL));
EXPECT_EQ(&kSimpleNodeTable[0], FindRegistryNode("com", NULL));
EXPECT_EQ(&kSimpleNodeTable[1], FindRegistryNode("foo", NULL));
// Tests for searching non-root nodes.
EXPECT_EQ(&kSimpleNodeTable[2],
FindRegistryNode("baz", &kSimpleNodeTable[1]));
EXPECT_EQ(&kSimpleNodeTable[3],
FindRegistryNode("zzz", &kSimpleNodeTable[1]));
EXPECT_EQ(&kSimpleNodeTable[3],
FindRegistryNode("wildcard", &kSimpleNodeTable[1]));
EXPECT_EQ(&kSimpleNodeTable[3],
FindRegistryNode("wc", &kSimpleNodeTable[1]));
EXPECT_EQ(&kSimpleNodeTable[4],
FindRegistryNode("bar", &kSimpleNodeTable[1]));
EXPECT_EQ(&kSimpleNodeTable[4],
FindRegistryNode("bar", &kSimpleNodeTable[1]));
// Tests to verify that searches for wildcard and exceptions never match.
EXPECT_EQ(NULL, FindRegistryNode("!baz", &kSimpleNodeTable[1]));
EXPECT_EQ(NULL, FindRegistryNode("*", &kSimpleNodeTable[1]));
// Test to verify that a search for the empty string on a wildcard
// node doesn't match.
EXPECT_EQ(NULL, FindRegistryNode("", &kSimpleNodeTable[1]));
}
TEST_F(TrieSearchTest, FindRegistryLeafNode) {
// Simple leaf tests
EXPECT_EQ(NULL, FindRegistryLeafNode("", &kSimpleNodeTable[0]));
EXPECT_EQ(&kSimpleStringTable[4],
FindRegistryLeafNode("foo", &kSimpleNodeTable[0]));
EXPECT_EQ(&kSimpleStringTable[10],
FindRegistryLeafNode("baz", &kSimpleNodeTable[3]));
EXPECT_EQ(&kSimpleStringTable[4],
FindRegistryLeafNode("foo", &kSimpleNodeTable[3]));
EXPECT_EQ(&kSimpleStringTable[8],
FindRegistryLeafNode("zzz", &kSimpleNodeTable[3]));
EXPECT_EQ(&kSimpleStringTable[8],
FindRegistryLeafNode("wildcard", &kSimpleNodeTable[3]));
EXPECT_EQ(&kSimpleStringTable[8],
FindRegistryLeafNode("wc", &kSimpleNodeTable[3]));
EXPECT_EQ(&kSimpleStringTable[4],
FindRegistryLeafNode("foo", &kSimpleNodeTable[4]));
EXPECT_EQ(&kSimpleStringTable[8],
FindRegistryLeafNode("zzz", &kSimpleNodeTable[4]));
// Tests to verify that searches for wildcard and exceptions never
// match.
EXPECT_EQ(NULL, FindRegistryLeafNode("!baz", &kSimpleNodeTable[4]));
EXPECT_EQ(NULL, FindRegistryLeafNode("*", &kSimpleNodeTable[4]));
// Test to verify that a search for the empty string on a wildcard
// node doesn't match.
EXPECT_EQ(NULL, FindRegistryLeafNode("", &kSimpleNodeTable[4]));
}
TEST_F(TrieSearchTest, GetHostnamePart) {
EXPECT_STREQ("com", GetHostnamePart(0));
EXPECT_STREQ("foo", GetHostnamePart(4));
}
TEST_F(TrieSearchTest, HasLeafChildren) {
EXPECT_TRUE(HasLeafChildren(&kSimpleNodeTable[0]));
EXPECT_FALSE(HasLeafChildren(&kSimpleNodeTable[1]));
}
TEST_F(TrieSearchFindNodeTest, FindNodeInRangeSingleNode) {
EXPECT_EQ(&kSimpleNodeTable[0],
FindNodeInRange("com", &kSimpleNodeTable[0], &kSimpleNodeTable[0]));
EXPECT_EQ(NULL,
FindNodeInRange("co", &kSimpleNodeTable[0], &kSimpleNodeTable[0]));
EXPECT_EQ(NULL,
FindNodeInRange("comm",
&kSimpleNodeTable[0],
&kSimpleNodeTable[0]));
EXPECT_EQ(NULL,
FindNodeInRange("foo", &kSimpleNodeTable[0], &kSimpleNodeTable[0]));
EXPECT_EQ(NULL,
FindNodeInRange("", &kSimpleNodeTable[0], &kSimpleNodeTable[0]));
}
TEST_F(TrieSearchFindNodeTest, FindNodeInRangeTwoNodes) {
EXPECT_EQ(&kSimpleNodeTable[0],
FindNodeInRange("com", &kSimpleNodeTable[0], &kSimpleNodeTable[1]));
EXPECT_EQ(&kSimpleNodeTable[1],
FindNodeInRange("foo", &kSimpleNodeTable[0], &kSimpleNodeTable[1]));
EXPECT_EQ(NULL,
FindNodeInRange("", &kSimpleNodeTable[0], &kSimpleNodeTable[1]));
}
TEST_F(TrieSearchFindNodeTest, FindNodeInRangeThreeNodes) {
EXPECT_EQ(&kSimpleNodeTable[2],
FindNodeInRange("!baz", &kSimpleNodeTable[2], &kSimpleNodeTable[4]));
EXPECT_EQ(&kSimpleNodeTable[3],
FindNodeInRange("*", &kSimpleNodeTable[2], &kSimpleNodeTable[4]));
EXPECT_EQ(&kSimpleNodeTable[4],
FindNodeInRange("bar", &kSimpleNodeTable[2], &kSimpleNodeTable[4]));
// exception and wildcard matches are not performed at this level,
// so we expect them to fail here.
EXPECT_EQ(NULL,
FindNodeInRange("baz", &kSimpleNodeTable[2], &kSimpleNodeTable[4]));
EXPECT_EQ(NULL,
FindNodeInRange("wc", &kSimpleNodeTable[2], &kSimpleNodeTable[4]));
}
TEST_F(TrieSearchFindNodeTest, FindLeafNodeInRangeSingleNode) {
EXPECT_EQ(&kSimpleStringTable[10],
FindLeafNodeInRange("!baz",
&kSimpleLeafNodeTable[0],
&kSimpleLeafNodeTable[0]));
EXPECT_EQ(NULL,
FindLeafNodeInRange("foo",
&kSimpleLeafNodeTable[0],
&kSimpleLeafNodeTable[0]));
EXPECT_EQ(NULL,
FindLeafNodeInRange("",
&kSimpleLeafNodeTable[0],
&kSimpleLeafNodeTable[0]));
EXPECT_EQ(NULL,
FindLeafNodeInRange("!ba",
&kSimpleLeafNodeTable[0],
&kSimpleLeafNodeTable[0]));
EXPECT_EQ(NULL,
FindLeafNodeInRange("!bazz",
&kSimpleLeafNodeTable[0],
&kSimpleLeafNodeTable[0]));
}
TEST_F(TrieSearchFindNodeTest, FindLeafNodeInRangeTwoNodes) {
EXPECT_EQ(&kSimpleStringTable[10],
FindLeafNodeInRange("!baz",
&kSimpleLeafNodeTable[0],
&kSimpleLeafNodeTable[1]));
EXPECT_EQ(&kSimpleStringTable[8],
FindLeafNodeInRange("*",
&kSimpleLeafNodeTable[0],
&kSimpleLeafNodeTable[1]));
EXPECT_EQ(&kSimpleStringTable[4],
FindLeafNodeInRange("foo",
&kSimpleLeafNodeTable[1],
&kSimpleLeafNodeTable[2]));
}
TEST_F(TrieSearchFindNodeTest, FindLeafNodeInRangeThreeNodes) {
EXPECT_EQ(&kSimpleStringTable[10],
FindLeafNodeInRange("!baz",
&kSimpleLeafNodeTable[0],
&kSimpleLeafNodeTable[2]));
EXPECT_EQ(&kSimpleStringTable[4],
FindLeafNodeInRange("foo",
&kSimpleLeafNodeTable[0],
&kSimpleLeafNodeTable[2]));
EXPECT_EQ(&kSimpleStringTable[8],
FindLeafNodeInRange("*",
&kSimpleLeafNodeTable[0],
&kSimpleLeafNodeTable[2]));
}
} // namespace