github.com/anth0d/nomad@v0.0.0-20221214183521-ae3a0a2cad06/command/agent/consul/namespaces_client_test.go (about) 1 package consul 2 3 import ( 4 "fmt" 5 "testing" 6 "time" 7 8 "github.com/hashicorp/nomad/ci" 9 "github.com/stretchr/testify/require" 10 ) 11 12 func TestNamespacesClient_List(t *testing.T) { 13 ci.Parallel(t) 14 15 t.Run("oss", func(t *testing.T) { 16 c := NewNamespacesClient(NewMockNamespaces(nil), NewMockAgent(Features{ 17 Enterprise: false, 18 Namespaces: false, 19 })) 20 list, err := c.List() 21 require.NoError(t, err) 22 require.Equal(t, []string{"default"}, list) // todo(shoenig): change in followup PR 23 }) 24 25 t.Run("ent without namespaces", func(t *testing.T) { 26 c := NewNamespacesClient(NewMockNamespaces(nil), NewMockAgent(Features{ 27 Enterprise: true, 28 Namespaces: false, 29 })) 30 list, err := c.List() 31 require.NoError(t, err) 32 require.Equal(t, []string{"default"}, list) // todo(shoenig): change in followup PR 33 }) 34 35 t.Run("ent with namespaces", func(t *testing.T) { 36 c := NewNamespacesClient(NewMockNamespaces([]string{"banana", "apple", "cherry"}), NewMockAgent(Features{ 37 Enterprise: true, 38 Namespaces: true, 39 })) 40 list, err := c.List() 41 require.NoError(t, err) 42 43 // remember default always exists... if enterprise and namespaces are enabled 44 require.Equal(t, []string{"apple", "banana", "cherry", "default"}, list) 45 }) 46 } 47 48 func TestNewNamespacesClient_stale(t *testing.T) { 49 ci.Parallel(t) 50 51 t.Run("ok", func(t *testing.T) { 52 now := time.Now() 53 updated := now.Add(-59 * time.Second) 54 result := stale(updated, now) 55 require.False(t, result) 56 }) 57 58 t.Run("stale", func(t *testing.T) { 59 now := time.Now() 60 updated := now.Add(-61 * time.Second) 61 result := stale(updated, now) 62 require.True(t, result) 63 }) 64 } 65 66 func TestNewNamespacesClient_allowable(t *testing.T) { 67 ci.Parallel(t) 68 69 try := func(ent, feature, enabled, exp bool, updated, now time.Time) { 70 expired := now.After(updated.Add(namespaceEnabledCacheTTL)) 71 name := fmt.Sprintf("ent:%t_feature:%t_enabled:%t_exp:%t_expired:%t", ent, feature, enabled, exp, expired) 72 t.Run(name, func(t *testing.T) { 73 c := NewNamespacesClient(NewMockNamespaces([]string{"a", "b"}), NewMockAgent(Features{ 74 Enterprise: ent, 75 Namespaces: feature, 76 })) 77 78 // put the client into the state we want 79 c.enabled = enabled 80 c.updated = updated 81 82 result := c.allowable(now) 83 require.Equal(t, exp, result) 84 require.Equal(t, exp, c.enabled) // cached value should match result 85 }) 86 } 87 88 previous := time.Now() 89 over := previous.Add(namespaceEnabledCacheTTL + 1) 90 under := previous.Add(namespaceEnabledCacheTTL - 1) 91 92 // oss, no refresh, no state change 93 try(false, false, false, false, previous, under) 94 95 // oss, refresh, no state change 96 try(false, false, false, false, previous, over) 97 98 // ent->oss, refresh, state change 99 try(false, false, true, false, previous, over) 100 101 // ent, disabled, no refresh, no state change 102 try(true, false, false, false, previous, under) 103 104 // ent, disabled, refresh, no state change 105 try(true, false, false, false, previous, over) 106 107 // ent, enabled, no refresh, no state change 108 try(true, true, true, true, previous, under) 109 110 // ent, enabled, refresh, no state change 111 try(true, true, true, true, previous, over) 112 113 // ent, disabled, refresh, state change (i.e. new license with namespaces) 114 try(true, true, false, true, previous, over) // ??? 115 116 // ent, disabled, refresh, no state change yet (i.e. new license with namespaces, still cached without) 117 try(true, true, false, false, previous, under) 118 }