github.phpd.cn/hashicorp/consul@v1.4.5/agent/consul/state/prepared_query_index_test.go (about)

     1  package state
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/hashicorp/consul/agent/structs"
     7  )
     8  
     9  // Indexer is a global indexer to use for tests since there is no state.
    10  var index PreparedQueryIndex
    11  
    12  func TestPreparedQueryIndex_FromObject(t *testing.T) {
    13  	// We shouldn't index an object we don't understand.
    14  	if ok, _, err := index.FromObject(42); ok || err == nil {
    15  		t.Fatalf("bad: ok=%v err=%v", ok, err)
    16  	}
    17  
    18  	// We shouldn't index a non-template query.
    19  	wrapped := &queryWrapper{&structs.PreparedQuery{}, nil}
    20  	if ok, _, err := index.FromObject(wrapped); ok || err != nil {
    21  		t.Fatalf("bad: ok=%v err=%v", ok, err)
    22  	}
    23  
    24  	// Create a template with an empty name.
    25  	query := &structs.PreparedQuery{
    26  		Template: structs.QueryTemplateOptions{
    27  			Type: structs.QueryTemplateTypeNamePrefixMatch,
    28  		},
    29  	}
    30  	ok, key, err := index.FromObject(&queryWrapper{query, nil})
    31  	if !ok || err != nil {
    32  		t.Fatalf("bad: ok=%v err=%v", ok, err)
    33  	}
    34  	if string(key) != "\x00" {
    35  		t.Fatalf("bad: %#v", key)
    36  	}
    37  
    38  	// Set the name and try again.
    39  	query.Name = "hello"
    40  	ok, key, err = index.FromObject(&queryWrapper{query, nil})
    41  	if !ok || err != nil {
    42  		t.Fatalf("bad: ok=%v err=%v", ok, err)
    43  	}
    44  	if string(key) != "\x00hello" {
    45  		t.Fatalf("bad: %#v", key)
    46  	}
    47  
    48  	// Make sure the index isn't case-sensitive.
    49  	query.Name = "HELLO"
    50  	ok, key, err = index.FromObject(&queryWrapper{query, nil})
    51  	if !ok || err != nil {
    52  		t.Fatalf("bad: ok=%v err=%v", ok, err)
    53  	}
    54  	if string(key) != "\x00hello" {
    55  		t.Fatalf("bad: %#v", key)
    56  	}
    57  }
    58  
    59  func TestPreparedQueryIndex_FromArgs(t *testing.T) {
    60  	// Only accept a single string arg.
    61  	if _, err := index.FromArgs(42); err == nil {
    62  		t.Fatalf("should be an error")
    63  	}
    64  	if _, err := index.FromArgs("hello", "world"); err == nil {
    65  		t.Fatalf("should be an error")
    66  	}
    67  
    68  	// Try an empty string.
    69  	if key, err := index.FromArgs(""); err != nil || string(key) != "\x00" {
    70  		t.Fatalf("bad: key=%#v err=%v", key, err)
    71  	}
    72  
    73  	// Try a non-empty string.
    74  	if key, err := index.FromArgs("hello"); err != nil ||
    75  		string(key) != "\x00hello" {
    76  		t.Fatalf("bad: key=%#v err=%v", key, err)
    77  	}
    78  
    79  	// Make sure index is not case-sensitive.
    80  	if key, err := index.FromArgs("HELLO"); err != nil ||
    81  		string(key) != "\x00hello" {
    82  		t.Fatalf("bad: key=%#v err=%v", key, err)
    83  	}
    84  }
    85  
    86  func TestPreparedQueryIndex_PrefixFromArgs(t *testing.T) {
    87  	// Only accept a single string arg.
    88  	if _, err := index.PrefixFromArgs(42); err == nil {
    89  		t.Fatalf("should be an error")
    90  	}
    91  	if _, err := index.PrefixFromArgs("hello", "world"); err == nil {
    92  		t.Fatalf("should be an error")
    93  	}
    94  
    95  	// Try an empty string.
    96  	if key, err := index.PrefixFromArgs(""); err != nil || string(key) != "\x00" {
    97  		t.Fatalf("bad: key=%#v err=%v", key, err)
    98  	}
    99  
   100  	// Try a non-empty string.
   101  	if key, err := index.PrefixFromArgs("hello"); err != nil ||
   102  		string(key) != "\x00hello" {
   103  		t.Fatalf("bad: key=%#v err=%v", key, err)
   104  	}
   105  
   106  	// Make sure index is not case-sensitive.
   107  	if key, err := index.PrefixFromArgs("HELLO"); err != nil ||
   108  		string(key) != "\x00hello" {
   109  		t.Fatalf("bad: key=%#v err=%v", key, err)
   110  	}
   111  }