github.hscsec.cn/hashicorp/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 }