github.com/kbehouse/nsc@v0.0.6/cmd/tools_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 "log" 21 "path/filepath" 22 "strings" 23 "testing" 24 "time" 25 26 nats "github.com/nats-io/nats.go" 27 "github.com/nats-io/nuid" 28 "github.com/stretchr/testify/require" 29 ) 30 31 func TestPub(t *testing.T) { 32 ts := NewTestStore(t, "O") 33 defer ts.Done(t) 34 ts.AddAccount(t, "A") 35 ts.AddUser(t, "A", "U") 36 37 // create the basic configuration 38 serverconf := filepath.Join(ts.Dir, "server.conf") 39 _, _, err := ExecuteCmd(createServerConfigCmd(), "--mem-resolver", 40 "--config-file", serverconf) 41 require.NoError(t, err) 42 43 // start a server with the config at a random port 44 ports := ts.RunServerWithConfig(t, serverconf) 45 46 // with the captured ports, regenerate the operator jwt 47 // we only need the client to update 48 _, _, err = ExecuteCmd(CreateEditOperatorCmd(), 49 "--service-url", strings.Join(ports.Nats, ",")) 50 require.NoError(t, err) 51 52 // create a conn to the server 53 nc, err := nats.Connect(strings.Join(ports.Nats, ","), 54 nats.UserCredentials(ts.KeyStore.CalcUserCredsPath("A", "U"))) 55 require.NoError(t, err) 56 defer nc.Close() 57 58 // generate a random subject/payload 59 v := nuid.Next() 60 c := make(chan *nats.Msg) 61 _, err = nc.Subscribe(v, func(m *nats.Msg) { 62 c <- m 63 }) 64 require.NoError(t, err) 65 require.NoError(t, nc.Flush()) 66 67 // pub a message 68 _, _, err = ExecuteCmd(createPubCmd(), v, v) 69 require.NoError(t, err) 70 71 control := <-c 72 require.NotNil(t, control) 73 require.Equal(t, control.Subject, v) 74 require.Equal(t, []byte(v), control.Data) 75 } 76 77 func TestSub(t *testing.T) { 78 ts := NewTestStore(t, "O") 79 defer ts.Done(t) 80 ts.AddAccount(t, "A") 81 ts.AddUser(t, "A", "U") 82 83 // create the basic configuration 84 conf := filepath.Join(ts.Dir, "server.conf") 85 _, _, err := ExecuteCmd(createServerConfigCmd(), "--mem-resolver", 86 "--config-file", conf) 87 require.NoError(t, err) 88 89 // start a server with the config at a random port 90 ports := ts.RunServerWithConfig(t, conf) 91 92 // with the captured ports, regenerate the operator jwt - we only need the client to update 93 _, _, err = ExecuteCmd(CreateEditOperatorCmd(), 94 "--service-url", strings.Join(ports.Nats, ",")) 95 require.NoError(t, err) 96 97 // generate a random subject/payload 98 v := nuid.Next() 99 100 log.SetFlags(log.LstdFlags) 101 // subscribe a message 102 type po struct { 103 stdout string 104 stderr string 105 err error 106 } 107 c := make(chan po) 108 go func() { 109 var r po 110 r.stdout, r.stderr, r.err = ExecuteCmd(createSubCmd(), "--max-messages", "1", v) 111 c <- r 112 }() 113 114 // wait for client 115 ts.WaitForClient(t, "nsc_sub", 1, 60*time.Second) 116 117 // create a conn to the server 118 creds := ts.KeyStore.CalcUserCredsPath("A", "U") 119 nc := ts.CreateClient(t, nats.UserCredentials(creds)) 120 require.NoError(t, nc.Flush()) 121 err = nc.Publish(v, []byte(v)) 122 require.NoError(t, err) 123 require.NoError(t, nc.Flush()) 124 125 select { 126 case r := <-c: 127 t.Log(r.stdout) 128 t.Log(r.stderr) 129 t.Log(r.err) 130 require.NoError(t, r.err) 131 require.Contains(t, r.stderr, fmt.Sprintf("received on [%s]: '%s'", v, v)) 132 case <-time.After(25 * time.Second): 133 t.Fatal("timed out") 134 } 135 } 136 137 func TestReq(t *testing.T) { 138 ts := NewTestStore(t, "O") 139 defer ts.Done(t) 140 ts.AddAccount(t, "A") 141 ts.AddUser(t, "A", "U") 142 143 // create the basic configuration 144 conf := filepath.Join(ts.Dir, "server.conf") 145 146 _, _, err := ExecuteCmd(createServerConfigCmd(), "--mem-resolver", 147 "--config-file", conf) 148 require.NoError(t, err) 149 150 // start a server with the config at a random port 151 ports := ts.RunServerWithConfig(t, conf) 152 153 // with the captured ports, regenerate the operator jwt - we only need the client to update 154 _, _, err = ExecuteCmd(CreateEditOperatorCmd(), 155 "--service-url", strings.Join(ports.Nats, ",")) 156 require.NoError(t, err) 157 158 // generate a random subject/payload 159 v := nuid.Next() 160 161 // create a conn to the server 162 creds := ts.KeyStore.CalcUserCredsPath("A", "U") 163 nc := ts.CreateClient(t, nats.UserCredentials(creds)) 164 require.NoError(t, nc.Flush()) 165 sub, err := nc.Subscribe(v, func(m *nats.Msg) { 166 require.NotEmpty(t, m.Reply) 167 // reply with the payload in uppercase 168 require.NoError(t, m.Respond([]byte(strings.ToUpper(string(m.Data))))) 169 }) 170 require.NoError(t, err) 171 require.NoError(t, sub.AutoUnsubscribe(1)) 172 require.NoError(t, nc.Flush()) 173 174 _, stderr, err := ExecuteCmd(createToolReqCmd(), v, v) 175 require.NoError(t, err) 176 require.Contains(t, stderr, strings.ToUpper(v)) 177 } 178 179 func TestReply(t *testing.T) { 180 ts := NewTestStore(t, "O") 181 defer ts.Done(t) 182 ts.AddAccount(t, "A") 183 ts.AddUser(t, "A", "U") 184 185 // create the basic configuration 186 conf := filepath.Join(ts.Dir, "server.conf") 187 _, _, err := ExecuteCmd(createServerConfigCmd(), "--mem-resolver", 188 "--config-file", conf) 189 require.NoError(t, err) 190 191 // start a server with the config at a random port 192 ports := ts.RunServerWithConfig(t, conf) 193 194 // with the captured ports, regenerate the operator jwt - we only need the client to update 195 _, _, err = ExecuteCmd(CreateEditOperatorCmd(), 196 "--service-url", strings.Join(ports.Nats, ",")) 197 require.NoError(t, err) 198 199 // generate a random subject/payload 200 v := nuid.Next() 201 202 // subscribe a message 203 type po struct { 204 stdout string 205 stderr string 206 err error 207 } 208 c := make(chan po) 209 go func() { 210 var r po 211 r.stdout, r.stderr, r.err = ExecuteCmd(createReplyCmd(), "--max-messages", "1", v) 212 c <- r 213 }() 214 215 // wait for client 216 ts.WaitForClient(t, "nsc_reply", 1, 60*time.Second) 217 218 // create a conn to the server 219 creds := ts.KeyStore.CalcUserCredsPath("A", "U") 220 nc := ts.CreateClient(t, nats.UserCredentials(creds)) 221 require.NoError(t, nc.Flush()) 222 223 m, err := nc.Request(v, []byte(v), 15*time.Second) 224 require.NoError(t, err) 225 require.Equal(t, v, string(m.Data)) 226 } 227 228 func Test_EncryptDecrypt(t *testing.T) { 229 ts := NewTestStore(t, "O") 230 defer ts.Done(t) 231 232 k := ts.GetOperatorPublicKey(t) 233 text := "this is a test" 234 et, err := Encrypt(k, []byte(text)) 235 require.NoError(t, err) 236 od, err := Decrypt(k, et) 237 require.NoError(t, err) 238 require.Equal(t, text, string(od)) 239 }