open-consul/agent/consul/state/prepared_query_index_test.go

115 lines
3.0 KiB
Go

// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
package state
import (
"testing"
"github.com/hashicorp/consul/agent/structs"
)
// Indexer is a global indexer to use for tests since there is no state.
var index PreparedQueryIndex
func TestPreparedQueryIndex_FromObject(t *testing.T) {
// We shouldn't index an object we don't understand.
if ok, _, err := index.FromObject(42); ok || err == nil {
t.Fatalf("bad: ok=%v err=%v", ok, err)
}
// We shouldn't index a non-template query.
wrapped := &queryWrapper{&structs.PreparedQuery{}, nil}
if ok, _, err := index.FromObject(wrapped); ok || err != nil {
t.Fatalf("bad: ok=%v err=%v", ok, err)
}
// Create a template with an empty name.
query := &structs.PreparedQuery{
Template: structs.QueryTemplateOptions{
Type: structs.QueryTemplateTypeNamePrefixMatch,
},
}
ok, key, err := index.FromObject(&queryWrapper{query, nil})
if !ok || err != nil {
t.Fatalf("bad: ok=%v err=%v", ok, err)
}
if string(key) != "\x00" {
t.Fatalf("bad: %#v", key)
}
// Set the name and try again.
query.Name = "hello"
ok, key, err = index.FromObject(&queryWrapper{query, nil})
if !ok || err != nil {
t.Fatalf("bad: ok=%v err=%v", ok, err)
}
if string(key) != "\x00hello" {
t.Fatalf("bad: %#v", key)
}
// Make sure the index isn't case-sensitive.
query.Name = "HELLO"
ok, key, err = index.FromObject(&queryWrapper{query, nil})
if !ok || err != nil {
t.Fatalf("bad: ok=%v err=%v", ok, err)
}
if string(key) != "\x00hello" {
t.Fatalf("bad: %#v", key)
}
}
func TestPreparedQueryIndex_FromArgs(t *testing.T) {
// Only accept a single string arg.
if _, err := index.FromArgs(42); err == nil {
t.Fatalf("should be an error")
}
if _, err := index.FromArgs("hello", "world"); err == nil {
t.Fatalf("should be an error")
}
// Try an empty string.
if key, err := index.FromArgs(""); err != nil || string(key) != "\x00" {
t.Fatalf("bad: key=%#v err=%v", key, err)
}
// Try a non-empty string.
if key, err := index.FromArgs("hello"); err != nil ||
string(key) != "\x00hello" {
t.Fatalf("bad: key=%#v err=%v", key, err)
}
// Make sure index is not case-sensitive.
if key, err := index.FromArgs("HELLO"); err != nil ||
string(key) != "\x00hello" {
t.Fatalf("bad: key=%#v err=%v", key, err)
}
}
func TestPreparedQueryIndex_PrefixFromArgs(t *testing.T) {
// Only accept a single string arg.
if _, err := index.PrefixFromArgs(42); err == nil {
t.Fatalf("should be an error")
}
if _, err := index.PrefixFromArgs("hello", "world"); err == nil {
t.Fatalf("should be an error")
}
// Try an empty string.
if key, err := index.PrefixFromArgs(""); err != nil || string(key) != "\x00" {
t.Fatalf("bad: key=%#v err=%v", key, err)
}
// Try a non-empty string.
if key, err := index.PrefixFromArgs("hello"); err != nil ||
string(key) != "\x00hello" {
t.Fatalf("bad: key=%#v err=%v", key, err)
}
// Make sure index is not case-sensitive.
if key, err := index.PrefixFromArgs("HELLO"); err != nil ||
string(key) != "\x00hello" {
t.Fatalf("bad: key=%#v err=%v", key, err)
}
}