1package structs
2
3import (
4	"testing"
5
6	"github.com/hashicorp/consul/acl"
7	"github.com/stretchr/testify/require"
8)
9
10func TestStructs_ACLCaches(t *testing.T) {
11
12	t.Run("New", func(t *testing.T) {
13
14		t.Run("Valid Sizes", func(t *testing.T) {
15			// 1 isn't valid due to a bug in golang-lru library
16			config := ACLCachesConfig{2, 2, 2, 2, 2}
17
18			cache, err := NewACLCaches(&config)
19			require.NoError(t, err)
20			require.NotNil(t, cache)
21			require.NotNil(t, cache.identities)
22			require.NotNil(t, cache.policies)
23			require.NotNil(t, cache.parsedPolicies)
24			require.NotNil(t, cache.authorizers)
25		})
26
27		t.Run("Zero Sizes", func(t *testing.T) {
28			// 1 isn't valid due to a bug in golang-lru library
29			config := ACLCachesConfig{0, 0, 0, 0, 0}
30
31			cache, err := NewACLCaches(&config)
32			require.NoError(t, err)
33			require.NotNil(t, cache)
34			require.Nil(t, cache.identities)
35			require.Nil(t, cache.policies)
36			require.Nil(t, cache.parsedPolicies)
37			require.Nil(t, cache.authorizers)
38		})
39	})
40
41	t.Run("Identities", func(t *testing.T) {
42		// 1 isn't valid due to a bug in golang-lru library
43		config := ACLCachesConfig{Identities: 4}
44
45		cache, err := NewACLCaches(&config)
46		require.NoError(t, err)
47		require.NotNil(t, cache)
48
49		cache.PutIdentity("foo", &ACLToken{})
50		entry := cache.GetIdentity("foo")
51		require.NotNil(t, entry)
52		require.NotNil(t, entry.Identity)
53	})
54
55	t.Run("Policies", func(t *testing.T) {
56		// 1 isn't valid due to a bug in golang-lru library
57		config := ACLCachesConfig{Policies: 4}
58
59		cache, err := NewACLCaches(&config)
60		require.NoError(t, err)
61		require.NotNil(t, cache)
62
63		cache.PutPolicy("foo", &ACLPolicy{})
64		entry := cache.GetPolicy("foo")
65		require.NotNil(t, entry)
66		require.NotNil(t, entry.Policy)
67	})
68
69	t.Run("ParsedPolicies", func(t *testing.T) {
70		// 1 isn't valid due to a bug in golang-lru library
71		config := ACLCachesConfig{ParsedPolicies: 4}
72
73		cache, err := NewACLCaches(&config)
74		require.NoError(t, err)
75		require.NotNil(t, cache)
76
77		cache.PutParsedPolicy("foo", &acl.Policy{})
78		entry := cache.GetParsedPolicy("foo")
79		require.NotNil(t, entry)
80		require.NotNil(t, entry.Policy)
81	})
82
83	t.Run("Authorizers", func(t *testing.T) {
84		// 1 isn't valid due to a bug in golang-lru library
85		config := ACLCachesConfig{Authorizers: 4}
86
87		cache, err := NewACLCaches(&config)
88		require.NoError(t, err)
89		require.NotNil(t, cache)
90
91		cache.PutAuthorizer("foo", acl.DenyAll())
92		entry := cache.GetAuthorizer("foo")
93		require.NotNil(t, entry)
94		require.NotNil(t, entry.Authorizer)
95		require.True(t, entry.Authorizer == acl.DenyAll())
96	})
97
98	t.Run("Roles", func(t *testing.T) {
99		// 1 isn't valid due to a bug in golang-lru library
100		config := ACLCachesConfig{Roles: 4}
101
102		cache, err := NewACLCaches(&config)
103		require.NoError(t, err)
104		require.NotNil(t, cache)
105
106		cache.PutRole("foo", &ACLRole{})
107
108		entry := cache.GetRole("foo")
109		require.NotNil(t, entry)
110		require.NotNil(t, entry.Role)
111	})
112}
113