From f0590e7c18f2fcb762aef91eaeebefadbc2e252d Mon Sep 17 00:00:00 2001 From: Daniel Nephin Date: Wed, 31 Mar 2021 14:37:21 -0400 Subject: [PATCH] state: support additional test cases in indexer tests And add a few additional cases. --- agent/consul/state/catalog_oss_test.go | 40 +++++++++++ agent/consul/state/schema_test.go | 94 ++++++++++++++++---------- 2 files changed, 100 insertions(+), 34 deletions(-) diff --git a/agent/consul/state/catalog_oss_test.go b/agent/consul/state/catalog_oss_test.go index 70d9be30c..90c265e4a 100644 --- a/agent/consul/state/catalog_oss_test.go +++ b/agent/consul/state/catalog_oss_test.go @@ -258,6 +258,35 @@ func testIndexerTableServices() map[string]indexerTestCase { }, expected: []byte("connectname\x00"), }, + extra: []indexerTestCase{ + { + write: indexValue{ + source: &structs.ServiceNode{ + ServiceName: "ServiceName", + ServiceKind: structs.ServiceKindConnectProxy, + ServiceProxy: structs.ConnectProxyConfig{ + DestinationServiceName: "ConnectName", + }, + }, + expected: []byte("connectname\x00"), + }, + }, + { + write: indexValue{ + source: &structs.ServiceNode{ServiceName: "ServiceName"}, + expectedIndexMissing: true, + }, + }, + { + write: indexValue{ + source: &structs.ServiceNode{ + ServiceName: "ServiceName", + ServiceKind: structs.ServiceKindTerminatingGateway, + }, + expectedIndexMissing: true, + }, + }, + }, }, indexKind: { read: indexValue{ @@ -270,6 +299,17 @@ func testIndexerTableServices() map[string]indexerTestCase { }, expected: []byte("connect-proxy\x00"), }, + extra: []indexerTestCase{ + { + write: indexValue{ + source: &structs.ServiceNode{ + ServiceName: "ServiceName", + ServiceKind: structs.ServiceKindTypical, + }, + expected: []byte("\x00"), + }, + }, + }, }, } } diff --git a/agent/consul/state/schema_test.go b/agent/consul/state/schema_test.go index 9df55f09c..5b1ff585b 100644 --- a/agent/consul/state/schema_test.go +++ b/agent/consul/state/schema_test.go @@ -12,11 +12,18 @@ type indexerTestCase struct { write indexValue prefix []indexValue writeMulti indexValueMulti + // extra test cases can be added if the indexer has special handling for + // specific cases. + extra []indexerTestCase } type indexValue struct { source interface{} expected []byte + // expectedIndexMissing indicates that this test case should not produce an + // expected value. The indexer should report a required value was missing. + // This field is only relevant for the writeIndex. + expectedIndexMissing bool } type indexValueMulti struct { @@ -54,42 +61,61 @@ func TestNewDBSchema_Indexers(t *testing.T) { if !ok { t.Skip("TODO: missing test case") } - - args := []interface{}{tc.read.source} - if s, ok := tc.read.source.([]interface{}); ok { - // Indexes using memdb.CompoundIndex must be expanded to multiple args - args = s - } - - actual, err := indexer.FromArgs(args...) - require.NoError(t, err) - require.Equal(t, tc.read.expected, actual) - - if i, ok := indexer.(memdb.SingleIndexer); ok { - valid, actual, err := i.FromObject(tc.write.source) - require.NoError(t, err) - require.True(t, valid) - require.Equal(t, tc.write.expected, actual) - } - - if i, ok := indexer.(memdb.PrefixIndexer); ok { - for _, c := range tc.prefix { - t.Run("", func(t *testing.T) { - actual, err := i.PrefixFromArgs(c.source) - require.NoError(t, err) - require.Equal(t, c.expected, actual) - }) - } - } - - if i, ok := indexer.(memdb.MultiIndexer); ok { - valid, actual, err := i.FromObject(tc.writeMulti.source) - require.NoError(t, err) - require.True(t, valid) - require.Equal(t, tc.writeMulti.expected, actual) - } + tc.run(t, indexer) }) } }) } } + +func (tc indexerTestCase) run(t *testing.T, indexer memdb.Indexer) { + args := []interface{}{tc.read.source} + if s, ok := tc.read.source.([]interface{}); ok { + // Indexes using memdb.CompoundIndex must be expanded to multiple args + args = s + } + + if tc.read.source != nil { + t.Run("readIndex", func(t *testing.T) { + actual, err := indexer.FromArgs(args...) + require.NoError(t, err) + require.Equal(t, tc.read.expected, actual) + }) + } + + if i, ok := indexer.(memdb.SingleIndexer); ok { + t.Run("writeIndex", func(t *testing.T) { + valid, actual, err := i.FromObject(tc.write.source) + require.NoError(t, err) + if tc.write.expectedIndexMissing { + require.False(t, valid, "expected the indexer to produce no index value") + } else { + require.True(t, valid, "indexer was missing a required value") + require.Equal(t, tc.write.expected, actual) + } + }) + } + + if i, ok := indexer.(memdb.PrefixIndexer); ok { + for _, c := range tc.prefix { + t.Run("prefixIndex", func(t *testing.T) { + actual, err := i.PrefixFromArgs(c.source) + require.NoError(t, err) + require.Equal(t, c.expected, actual) + }) + } + } + + if i, ok := indexer.(memdb.MultiIndexer); ok { + valid, actual, err := i.FromObject(tc.writeMulti.source) + require.NoError(t, err) + require.True(t, valid) + require.Equal(t, tc.writeMulti.expected, actual) + } + + for _, extra := range tc.extra { + t.Run("extra", func(t *testing.T) { + extra.run(t, indexer) + }) + } +}