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  }