github.com/Ilhicas/nomad@v1.0.4-0.20210304152020-e86851182bc3/nomad/state/schema_test.go (about) 1 package state 2 3 import ( 4 "testing" 5 6 memdb "github.com/hashicorp/go-memdb" 7 "github.com/hashicorp/nomad/nomad/mock" 8 "github.com/stretchr/testify/require" 9 ) 10 11 func TestStateStoreSchema(t *testing.T) { 12 schema := stateStoreSchema() 13 _, err := memdb.NewMemDB(schema) 14 if err != nil { 15 t.Fatalf("err: %v", err) 16 } 17 } 18 19 func TestState_singleRecord(t *testing.T) { 20 require := require.New(t) 21 22 const ( 23 singletonTable = "cluster_meta" 24 singletonIDIdx = "id" 25 ) 26 27 db, err := memdb.NewMemDB(&memdb.DBSchema{ 28 Tables: map[string]*memdb.TableSchema{ 29 singletonTable: clusterMetaTableSchema(), 30 }, 31 }) 32 require.NoError(err) 33 34 // numRecords in table counts all the items in the table, which is expected 35 // to always be 1 since that's the point of the singletonRecord Indexer. 36 numRecordsInTable := func() int { 37 txn := db.Txn(false) 38 defer txn.Abort() 39 40 iter, err := txn.Get(singletonTable, singletonIDIdx) 41 require.NoError(err) 42 43 num := 0 44 for item := iter.Next(); item != nil; item = iter.Next() { 45 num++ 46 } 47 return num 48 } 49 50 // setSingleton "updates" the singleton record in the singletonTable, 51 // which requires that the singletonRecord Indexer is working as 52 // expected. 53 setSingleton := func(s string) { 54 txn := db.Txn(true) 55 err := txn.Insert(singletonTable, s) 56 require.NoError(err) 57 txn.Commit() 58 } 59 60 // first retrieves the one expected entry in the singletonTable - use the 61 // numRecordsInTable helper function to make the cardinality assertion, 62 // this is just for fetching the value. 63 first := func() string { 64 txn := db.Txn(false) 65 defer txn.Abort() 66 record, err := txn.First(singletonTable, singletonIDIdx) 67 require.NoError(err) 68 s, ok := record.(string) 69 require.True(ok) 70 return s 71 } 72 73 // Ensure that multiple Insert & Commit calls result in only 74 // a single "singleton" record existing in the table. 75 76 setSingleton("one") 77 require.Equal(1, numRecordsInTable()) 78 require.Equal("one", first()) 79 80 setSingleton("two") 81 require.Equal(1, numRecordsInTable()) 82 require.Equal("two", first()) 83 84 setSingleton("three") 85 require.Equal(1, numRecordsInTable()) 86 require.Equal("three", first()) 87 } 88 89 func TestState_ScalingPolicyTargetFieldIndex_FromObject(t *testing.T) { 90 require := require.New(t) 91 92 policy := mock.ScalingPolicy() 93 policy.Target["TestField"] = "test" 94 95 // Create test indexers 96 indexersAllowMissingTrue := &ScalingPolicyTargetFieldIndex{Field: "TestField", AllowMissing: true} 97 indexersAllowMissingFalse := &ScalingPolicyTargetFieldIndex{Field: "TestField", AllowMissing: false} 98 99 // Check if box indexers can find the test field 100 ok, val, err := indexersAllowMissingTrue.FromObject(policy) 101 require.True(ok) 102 require.NoError(err) 103 require.Equal("test\x00", string(val)) 104 105 ok, val, err = indexersAllowMissingFalse.FromObject(policy) 106 require.True(ok) 107 require.NoError(err) 108 require.Equal("test\x00", string(val)) 109 110 // Check for empty field 111 policy.Target["TestField"] = "" 112 113 ok, val, err = indexersAllowMissingTrue.FromObject(policy) 114 require.True(ok) 115 require.NoError(err) 116 require.Equal("\x00", string(val)) 117 118 ok, val, err = indexersAllowMissingFalse.FromObject(policy) 119 require.True(ok) 120 require.NoError(err) 121 require.Equal("\x00", string(val)) 122 123 // Check for missing field 124 delete(policy.Target, "TestField") 125 126 ok, val, err = indexersAllowMissingTrue.FromObject(policy) 127 require.True(ok) 128 require.NoError(err) 129 require.Equal("\x00", string(val)) 130 131 ok, val, err = indexersAllowMissingFalse.FromObject(policy) 132 require.False(ok) 133 require.NoError(err) 134 require.Equal("", string(val)) 135 136 // Check for invalid input 137 ok, val, err = indexersAllowMissingTrue.FromObject("not-a-scaling-policy") 138 require.False(ok) 139 require.Error(err) 140 require.Equal("", string(val)) 141 142 ok, val, err = indexersAllowMissingFalse.FromObject("not-a-scaling-policy") 143 require.False(ok) 144 require.Error(err) 145 require.Equal("", string(val)) 146 }