github.com/dgsb/consul@v1.4.5/command/intention/create/create_test.go (about)

     1  package create
     2  
     3  import (
     4  	"os"
     5  	"strings"
     6  	"testing"
     7  
     8  	"github.com/hashicorp/consul/agent"
     9  	"github.com/hashicorp/consul/api"
    10  	"github.com/hashicorp/consul/testutil"
    11  	"github.com/mitchellh/cli"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  func TestCommand_noTabs(t *testing.T) {
    16  	t.Parallel()
    17  	if strings.ContainsRune(New(nil).Help(), '\t') {
    18  		t.Fatal("help has tabs")
    19  	}
    20  }
    21  
    22  func TestCommand_Validation(t *testing.T) {
    23  	t.Parallel()
    24  
    25  	ui := cli.NewMockUi()
    26  	c := New(ui)
    27  
    28  	cases := map[string]struct {
    29  		args   []string
    30  		output string
    31  	}{
    32  		"-allow and -deny": {
    33  			[]string{"-allow", "-deny", "foo", "bar"},
    34  			"one of -allow",
    35  		},
    36  	}
    37  
    38  	for name, tc := range cases {
    39  		t.Run(name, func(t *testing.T) {
    40  			require := require.New(t)
    41  
    42  			c.init()
    43  
    44  			// Ensure our buffer is always clear
    45  			if ui.ErrorWriter != nil {
    46  				ui.ErrorWriter.Reset()
    47  			}
    48  			if ui.OutputWriter != nil {
    49  				ui.OutputWriter.Reset()
    50  			}
    51  
    52  			require.Equal(1, c.Run(tc.args))
    53  			output := ui.ErrorWriter.String()
    54  			require.Contains(output, tc.output)
    55  		})
    56  	}
    57  }
    58  
    59  func TestCommand(t *testing.T) {
    60  	t.Parallel()
    61  
    62  	require := require.New(t)
    63  	a := agent.NewTestAgent(t, t.Name(), ``)
    64  	defer a.Shutdown()
    65  	client := a.Client()
    66  
    67  	ui := cli.NewMockUi()
    68  	c := New(ui)
    69  
    70  	args := []string{
    71  		"-http-addr=" + a.HTTPAddr(),
    72  		"foo", "bar",
    73  	}
    74  	require.Equal(0, c.Run(args), ui.ErrorWriter.String())
    75  
    76  	ixns, _, err := client.Connect().Intentions(nil)
    77  	require.NoError(err)
    78  	require.Len(ixns, 1)
    79  	require.Equal("foo", ixns[0].SourceName)
    80  	require.Equal("bar", ixns[0].DestinationName)
    81  	require.Equal(api.IntentionActionAllow, ixns[0].Action)
    82  }
    83  
    84  func TestCommand_deny(t *testing.T) {
    85  	t.Parallel()
    86  
    87  	require := require.New(t)
    88  	a := agent.NewTestAgent(t, t.Name(), ``)
    89  	defer a.Shutdown()
    90  	client := a.Client()
    91  
    92  	ui := cli.NewMockUi()
    93  	c := New(ui)
    94  
    95  	args := []string{
    96  		"-http-addr=" + a.HTTPAddr(),
    97  		"-deny",
    98  		"foo", "bar",
    99  	}
   100  	require.Equal(0, c.Run(args), ui.ErrorWriter.String())
   101  
   102  	ixns, _, err := client.Connect().Intentions(nil)
   103  	require.NoError(err)
   104  	require.Len(ixns, 1)
   105  	require.Equal("foo", ixns[0].SourceName)
   106  	require.Equal("bar", ixns[0].DestinationName)
   107  	require.Equal(api.IntentionActionDeny, ixns[0].Action)
   108  }
   109  
   110  func TestCommand_meta(t *testing.T) {
   111  	t.Parallel()
   112  
   113  	require := require.New(t)
   114  	a := agent.NewTestAgent(t, t.Name(), ``)
   115  	defer a.Shutdown()
   116  	client := a.Client()
   117  
   118  	ui := cli.NewMockUi()
   119  	c := New(ui)
   120  
   121  	args := []string{
   122  		"-http-addr=" + a.HTTPAddr(),
   123  		"-meta", "hello=world",
   124  		"foo", "bar",
   125  	}
   126  	require.Equal(0, c.Run(args), ui.ErrorWriter.String())
   127  
   128  	ixns, _, err := client.Connect().Intentions(nil)
   129  	require.NoError(err)
   130  	require.Len(ixns, 1)
   131  	require.Equal("foo", ixns[0].SourceName)
   132  	require.Equal("bar", ixns[0].DestinationName)
   133  	require.Equal(map[string]string{"hello": "world"}, ixns[0].Meta)
   134  }
   135  
   136  func TestCommand_File(t *testing.T) {
   137  	t.Parallel()
   138  
   139  	require := require.New(t)
   140  	a := agent.NewTestAgent(t, t.Name(), ``)
   141  	defer a.Shutdown()
   142  	client := a.Client()
   143  
   144  	ui := cli.NewMockUi()
   145  	c := New(ui)
   146  
   147  	contents := `{ "SourceName": "foo", "DestinationName": "bar", "Action": "allow" }`
   148  	f := testutil.TempFile(t, "intention-create-command-file")
   149  	defer os.Remove(f.Name())
   150  	if _, err := f.WriteString(contents); err != nil {
   151  		t.Fatalf("err: %#v", err)
   152  	}
   153  
   154  	args := []string{
   155  		"-http-addr=" + a.HTTPAddr(),
   156  		"-file",
   157  		f.Name(),
   158  	}
   159  
   160  	require.Equal(0, c.Run(args), ui.ErrorWriter.String())
   161  
   162  	ixns, _, err := client.Connect().Intentions(nil)
   163  	require.NoError(err)
   164  	require.Len(ixns, 1)
   165  	require.Equal("foo", ixns[0].SourceName)
   166  	require.Equal("bar", ixns[0].DestinationName)
   167  	require.Equal(api.IntentionActionAllow, ixns[0].Action)
   168  }
   169  
   170  func TestCommand_FileNoExist(t *testing.T) {
   171  	t.Parallel()
   172  
   173  	require := require.New(t)
   174  	a := agent.NewTestAgent(t, t.Name(), ``)
   175  	defer a.Shutdown()
   176  
   177  	ui := cli.NewMockUi()
   178  	c := New(ui)
   179  
   180  	args := []string{
   181  		"-http-addr=" + a.HTTPAddr(),
   182  		"-file",
   183  		"shouldnotexist.txt",
   184  	}
   185  
   186  	require.Equal(1, c.Run(args), ui.ErrorWriter.String())
   187  	require.Contains(ui.ErrorWriter.String(), "no such file")
   188  }
   189  
   190  func TestCommand_replace(t *testing.T) {
   191  	t.Parallel()
   192  
   193  	require := require.New(t)
   194  	a := agent.NewTestAgent(t, t.Name(), ``)
   195  	defer a.Shutdown()
   196  	client := a.Client()
   197  
   198  	// Create the first
   199  	{
   200  		ui := cli.NewMockUi()
   201  		c := New(ui)
   202  
   203  		args := []string{
   204  			"-http-addr=" + a.HTTPAddr(),
   205  			"foo", "bar",
   206  		}
   207  		require.Equal(0, c.Run(args), ui.ErrorWriter.String())
   208  
   209  		ixns, _, err := client.Connect().Intentions(nil)
   210  		require.NoError(err)
   211  		require.Len(ixns, 1)
   212  		require.Equal("foo", ixns[0].SourceName)
   213  		require.Equal("bar", ixns[0].DestinationName)
   214  		require.Equal(api.IntentionActionAllow, ixns[0].Action)
   215  	}
   216  
   217  	// Don't replace, should be an error
   218  	{
   219  		ui := cli.NewMockUi()
   220  		c := New(ui)
   221  
   222  		args := []string{
   223  			"-http-addr=" + a.HTTPAddr(),
   224  			"-deny",
   225  			"foo", "bar",
   226  		}
   227  		require.Equal(1, c.Run(args), ui.ErrorWriter.String())
   228  		require.Contains(ui.ErrorWriter.String(), "duplicate")
   229  	}
   230  
   231  	// Replace it
   232  	{
   233  		ui := cli.NewMockUi()
   234  		c := New(ui)
   235  
   236  		args := []string{
   237  			"-http-addr=" + a.HTTPAddr(),
   238  			"-replace",
   239  			"-deny",
   240  			"foo", "bar",
   241  		}
   242  		require.Equal(0, c.Run(args), ui.ErrorWriter.String())
   243  
   244  		ixns, _, err := client.Connect().Intentions(nil)
   245  		require.NoError(err)
   246  		require.Len(ixns, 1)
   247  		require.Equal("foo", ixns[0].SourceName)
   248  		require.Equal("bar", ixns[0].DestinationName)
   249  		require.Equal(api.IntentionActionDeny, ixns[0].Action)
   250  	}
   251  }