github.com/kbehouse/nsc@v0.0.6/cmd/memresolverconfigbuilder_test.go (about) 1 /* 2 * Copyright 2018-2019 The NATS Authors 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 package cmd 17 18 import ( 19 "fmt" 20 "io/ioutil" 21 "path/filepath" 22 "testing" 23 24 "github.com/kbehouse/nsc/cmd/store" 25 "github.com/nats-io/nats-server/v2/server" 26 "github.com/stretchr/testify/require" 27 ) 28 29 func Test_MemResolverContainsStandardProperties(t *testing.T) { 30 ts := NewTestStore(t, "O") 31 defer ts.Done(t) 32 ts.AddAccount(t, "A") 33 34 builder := NewMemResolverConfigBuilder() 35 36 o, err := ts.Store.Read(store.JwtName("O")) 37 require.NoError(t, err) 38 err = builder.Add(o) 39 require.NoError(t, err) 40 41 a, err := ts.Store.Read(store.Accounts, "A", store.JwtName("A")) 42 require.NoError(t, err) 43 err = builder.Add(a) 44 require.NoError(t, err) 45 46 d, err := builder.Generate() 47 require.NoError(t, err) 48 49 conf := string(d) 50 require.Contains(t, conf, "resolver: MEMORY") 51 require.Contains(t, conf, "resolver_preload: {") 52 } 53 54 func Test_MemResolverNotContainsOperator(t *testing.T) { 55 ts := NewTestStore(t, "O") 56 defer ts.Done(t) 57 ts.AddAccount(t, "A") 58 59 builder := NewMemResolverConfigBuilder() 60 a, err := ts.Store.Read(store.Accounts, "A", store.JwtName("A")) 61 require.NoError(t, err) 62 err = builder.Add(a) 63 require.NoError(t, err) 64 65 _, err = builder.Generate() 66 require.Error(t, err) 67 require.Contains(t, err.Error(), "operator is not set") 68 } 69 70 func Test_MemResolverContainsOperator(t *testing.T) { 71 ts := NewTestStore(t, "O") 72 defer ts.Done(t) 73 ts.AddAccount(t, "A") 74 75 builder := NewMemResolverConfigBuilder() 76 77 o, err := ts.Store.Read(store.JwtName("O")) 78 require.NoError(t, err) 79 err = builder.Add(o) 80 require.NoError(t, err) 81 82 a, err := ts.Store.Read(store.Accounts, "A", store.JwtName("A")) 83 require.NoError(t, err) 84 err = builder.Add(a) 85 require.NoError(t, err) 86 87 d, err := builder.Generate() 88 require.NoError(t, err) 89 90 conf := string(d) 91 require.Contains(t, conf, string(o)) 92 } 93 94 func Test_MemResolverFiltersNonAccounts(t *testing.T) { 95 ts := NewTestStore(t, "O") 96 defer ts.Done(t) 97 ts.AddAccount(t, "A") 98 ts.AddAccount(t, "B") 99 ts.AddUser(t, "A", "ua") 100 101 builder := NewMemResolverConfigBuilder() 102 103 o, err := ts.Store.Read(store.JwtName("O")) 104 require.NoError(t, err) 105 err = builder.Add(o) 106 require.NoError(t, err) 107 108 aac, err := ts.Store.ReadAccountClaim("A") 109 require.NoError(t, err) 110 apk := aac.Subject 111 a, err := ts.Store.Read(store.Accounts, "A", store.JwtName("A")) 112 require.NoError(t, err) 113 err = builder.Add(a) 114 require.NoError(t, err) 115 116 ua, err := ts.Store.Read(store.Accounts, "A", store.Users, store.JwtName("ua")) 117 require.NoError(t, err) 118 err = builder.Add(ua) 119 require.NoError(t, err) 120 121 bac, err := ts.Store.ReadAccountClaim("B") 122 require.NoError(t, err) 123 bpk := bac.Subject 124 b, err := ts.Store.Read(store.Accounts, "B", store.JwtName("B")) 125 require.NoError(t, err) 126 err = builder.Add(b) 127 require.NoError(t, err) 128 129 d, err := builder.Generate() 130 require.NoError(t, err) 131 132 conf := string(d) 133 134 require.NotContains(t, conf, o) 135 require.NotContains(t, conf, ua) 136 require.Contains(t, conf, fmt.Sprintf(" %s: %s\n", apk, string(a))) 137 require.Contains(t, conf, fmt.Sprintf(" %s: %s\n", bpk, string(b))) 138 } 139 140 func Test_MemResolverErrorBadClaim(t *testing.T) { 141 builder := NewMemResolverConfigBuilder() 142 require.Error(t, builder.Add([]byte("bad"))) 143 } 144 145 func Test_MemResolverDir(t *testing.T) { 146 ts := NewTestStore(t, "O") 147 defer ts.Done(t) 148 ts.AddAccount(t, "A") 149 ts.AddAccount(t, "B") 150 151 out := filepath.Join(ts.Dir, "conf") 152 _, _, err := ExecuteCmd(createServerConfigCmd(), "--mem-resolver", 153 "--dir", out) 154 require.NoError(t, err) 155 require.FileExists(t, filepath.Join(out, "O.jwt")) 156 require.FileExists(t, filepath.Join(out, "A.jwt")) 157 require.FileExists(t, filepath.Join(out, "B.jwt")) 158 resolver := filepath.Join(out, "resolver.conf") 159 require.FileExists(t, resolver) 160 d, err := ioutil.ReadFile(resolver) 161 require.NoError(t, err) 162 163 contents := string(d) 164 require.Contains(t, contents, fmt.Sprintf("operator: %q", "O.jwt")) 165 ac, err := ts.Store.ReadAccountClaim("A") 166 require.NoError(t, err) 167 require.Contains(t, contents, fmt.Sprintf("%s: %q", ac.Subject, "A.jwt")) 168 169 bc, err := ts.Store.ReadAccountClaim("B") 170 require.NoError(t, err) 171 require.Contains(t, contents, fmt.Sprintf("%s: %q", bc.Subject, "B.jwt")) 172 } 173 174 func Test_MemResolverServerParse(t *testing.T) { 175 ts := NewTestStore(t, "O") 176 defer ts.Done(t) 177 ts.AddAccount(t, "A") 178 ts.AddAccount(t, "B") 179 180 serverconf := filepath.Join(ts.Dir, "server.conf") 181 182 _, _, err := ExecuteCmd(createServerConfigCmd(), "--mem-resolver", 183 "--config-file", serverconf) 184 185 require.NoError(t, err) 186 187 var opts server.Options 188 require.NoError(t, opts.ProcessConfigFile(serverconf)) 189 } 190 191 func Test_MemResolverContainsSysAccount(t *testing.T) { 192 ts := NewTestStore(t, "O") 193 defer ts.Done(t) 194 ts.AddAccount(t, "A") 195 ts.AddAccount(t, "B") 196 197 stdout, _, err := ExecuteCmd(createServerConfigCmd(), "--mem-resolver", 198 "--sys-account", "B") 199 require.NoError(t, err) 200 201 ac, err := ts.Store.ReadAccountClaim("B") 202 require.NoError(t, err) 203 require.Contains(t, stdout, fmt.Sprintf("system_account: %s", ac.Subject)) 204 }