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  }