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  }