func TestFlushChain(t *testing.T) { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ // Success. func() ([]byte, error) { return []byte{}, nil }, // Failure. func() ([]byte, error) { return nil, &exec.FakeExitError{1} }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, } runner := New(&fexec, ProtocolIpv4) // Success. err := runner.FlushChain(TableNAT, Chain("FOOBAR")) if err != nil { t.Errorf("expected success, got %v", err) } if fcmd.CombinedOutputCalls != 1 { t.Errorf("expected 1 CombinedOutput() call, got %d", fcmd.CombinedOutputCalls) } if !util.NewStringSet(fcmd.CombinedOutputLog[0]...).HasAll("iptables", "-t", "nat", "-F", "FOOBAR") { t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[0]) } // Failure. err = runner.FlushChain(TableNAT, Chain("FOOBAR")) if err == nil { t.Errorf("expected failure") } }
func TestEnsureIPTablesMasqRuleAlreadyExists(t *testing.T) { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ // iptables version check func() ([]byte, error) { return []byte("iptables v1.9.22"), nil }, // Success. func() ([]byte, error) { return []byte{}, nil }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ // iptables version check func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, // The second Command() call is checking the rule. Success of that exec means "done". func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, } runner := iptables.New(&fexec, dbus.NewFake(nil, nil), iptables.ProtocolIpv4) defer runner.Destroy() err := ensureIPTablesMasqRule(runner, "127.0.0.0/8") if err != nil { t.Errorf("expected success, got %v", err) } if fcmd.CombinedOutputCalls != 2 { t.Errorf("expected 2 CombinedOutput() calls, got %d", fcmd.CombinedOutputCalls) } if !sets.NewString(fcmd.CombinedOutputLog[1]...).HasAll("iptables", "-t", "nat", "-C", "POSTROUTING", "-m", "comment", "--comment", "kubelet: SNAT outbound cluster traffic", "!", "-d", "127.0.0.0/8", "-j", "MASQUERADE") { t.Errorf("wrong CombinedOutput() log, got %#v", fcmd.CombinedOutputLog[1]) } }
func TestWaitFlagNew(t *testing.T) { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ // iptables version check func() ([]byte, error) { return []byte("iptables v1.4.22"), nil }, // Success. func() ([]byte, error) { return []byte{}, nil }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, } runner := New(&fexec, dbus.NewFake(nil, nil), ProtocolIpv4) defer runner.Destroy() err := runner.DeleteChain(TableNAT, Chain("FOOBAR")) if err != nil { t.Errorf("expected success, got %v", err) } if fcmd.CombinedOutputCalls != 2 { t.Errorf("expected 2 CombinedOutput() calls, got %d", fcmd.CombinedOutputCalls) } if !sets.NewString(fcmd.CombinedOutputLog[1]...).HasAll("iptables", "-w2") { t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[1]) } if sets.NewString(fcmd.CombinedOutputLog[1]...).HasAny("-w") { t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[1]) } }
func TestDeleteRuleAlreadyExists(t *testing.T) { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ // iptables version check func() ([]byte, error) { return []byte("iptables v1.9.22"), nil }, // Status 1 on the first call. func() ([]byte, error) { return nil, &exec.FakeExitError{1} }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ // iptables version check func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, // The second Command() call is checking the rule. Failure of that exec means "does not exist". func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, } runner := New(&fexec, ProtocolIpv4) err := runner.DeleteRule(TableNAT, ChainOutput, "abc", "123") if err != nil { t.Errorf("expected success, got %v", err) } if fcmd.CombinedOutputCalls != 2 { t.Errorf("expected 2 CombinedOutput() call, got %d", fcmd.CombinedOutputCalls) } if !util.NewStringSet(fcmd.CombinedOutputLog[1]...).HasAll("iptables", "-t", "nat", "-C", "OUTPUT", "abc", "123") { t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[0]) } }
func TestDeleteRuleNew(t *testing.T) { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ // iptables version check func() ([]byte, error) { return []byte("iptables v1.9.22"), nil }, // Success on the first call. func() ([]byte, error) { return []byte{}, nil }, // Success on the second call. func() ([]byte, error) { return []byte{}, nil }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ // iptables version check func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, // The second Command() call is checking the rule. Success of that means delete it. func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, } runner := New(&fexec, ProtocolIpv4) err := runner.DeleteRule(TableNAT, ChainOutput, "abc", "123") if err != nil { t.Errorf("expected success, got %v", err) } if fcmd.CombinedOutputCalls != 3 { t.Errorf("expected 3 CombinedOutput() calls, got %d", fcmd.CombinedOutputCalls) } if !util.NewStringSet(fcmd.CombinedOutputLog[2]...).HasAll("iptables", "-t", "nat", "-D", "OUTPUT", "abc", "123") { t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[1]) } }
func TestDeleteRuleErrorCreating(t *testing.T) { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ // iptables version check func() ([]byte, error) { return []byte("iptables v1.9.22"), nil }, // Success on the first call. func() ([]byte, error) { return []byte{}, nil }, // Status 1 on the second call. func() ([]byte, error) { return nil, &exec.FakeExitError{1} }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ // iptables version check func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, // The second Command() call is checking the rule. Success of that means delete it. func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, } runner := New(&fexec, ProtocolIpv4) err := runner.DeleteRule(TableNAT, ChainOutput, "abc", "123") if err == nil { t.Errorf("expected failure") } if fcmd.CombinedOutputCalls != 3 { t.Errorf("expected 3 CombinedOutput() calls, got %d", fcmd.CombinedOutputCalls) } }
func TestEnsureRuleNew(t *testing.T) { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ // iptables version check func() ([]byte, error) { return []byte("iptables v1.9.22"), nil }, // Status 1 on the first call. func() ([]byte, error) { return nil, &exec.FakeExitError{Status: 1} }, // Success on the second call. func() ([]byte, error) { return []byte{}, nil }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ // iptables version check func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, // The second Command() call is checking the rule. Failure of that means create it. func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, } runner := New(&fexec, ProtocolIpv4) exists, err := runner.EnsureRule(Append, TableNAT, ChainOutput, "abc", "123") if err != nil { t.Errorf("expected success, got %v", err) } if exists { t.Errorf("expected exists = false") } if fcmd.CombinedOutputCalls != 3 { t.Errorf("expected 3 CombinedOutput() calls, got %d", fcmd.CombinedOutputCalls) } if !sets.NewString(fcmd.CombinedOutputLog[2]...).HasAll("iptables", "-t", "nat", "-A", "OUTPUT", "abc", "123") { t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[2]) } }
func TestEnsureRuleAlreadyExists(t *testing.T) { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ // iptables version check func() ([]byte, error) { return []byte("iptables v1.9.22"), nil }, // Success. func() ([]byte, error) { return []byte{}, nil }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ // iptables version check func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, // The second Command() call is checking the rule. Success of that exec means "done". func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, } runner := New(&fexec, dbus.NewFake(nil, nil), ProtocolIpv4) defer runner.Destroy() exists, err := runner.EnsureRule(Append, TableNAT, ChainOutput, "abc", "123") if err != nil { t.Errorf("expected success, got %v", err) } if !exists { t.Errorf("expected exists = true") } if fcmd.CombinedOutputCalls != 2 { t.Errorf("expected 2 CombinedOutput() calls, got %d", fcmd.CombinedOutputCalls) } if !sets.NewString(fcmd.CombinedOutputLog[1]...).HasAll("iptables", "-t", "nat", "-C", "OUTPUT", "abc", "123") { t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[1]) } }
func TestEnsureIPTablesMasqRuleErrorChecking(t *testing.T) { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ // iptables version check func() ([]byte, error) { return []byte("iptables v1.9.22"), nil }, // Status 2 on the first call. func() ([]byte, error) { return nil, &exec.FakeExitError{Status: 2} }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ // iptables version check func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, // The second Command() call is checking the rule. Failure of that means create it. func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, } runner := iptables.New(&fexec, dbus.NewFake(nil, nil), iptables.ProtocolIpv4) defer runner.Destroy() err := ensureIPTablesMasqRule(runner, "127.0.0.0/8") if err == nil { t.Errorf("expected failure") } if fcmd.CombinedOutputCalls != 2 { t.Errorf("expected 2 CombinedOutput() calls, got %d", fcmd.CombinedOutputCalls) } }
func TestReconcileInterfaceDoesntExist(t *testing.T) { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ func() ([]byte, error) { return []byte("\n"), nil }, func() ([]byte, error) { return []byte("\n"), nil }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, } iface := "cbr0" shaper := &tcShaper{e: &fexec, iface: iface} err := shaper.ReconcileInterface() if err != nil { t.Errorf("unexpected error: %v", err) } if fcmd.CombinedOutputCalls != 2 { t.Errorf("unexpected number of calls: %d", fcmd.CombinedOutputCalls) } for ix, output := range fcmd.CombinedOutputLog { if output[0] != "tc" { t.Errorf("unexpected command: %s", output[0]) } if output[4] != iface { t.Errorf("unexpected interface: %s, expected %s", output[4], iface) } if ix == 0 { if len(output) != 5 { t.Errorf("unexpected command: %v", output) } if output[2] != "show" { t.Errorf("unexpected action: %s", output[2]) } } if ix == 1 { if len(output) != 11 { t.Errorf("unexpected command: %v", output) } if output[2] != "add" { t.Errorf("unexpected action: %s", output[2]) } if output[7] != "1:" { t.Errorf("unexpected root class: %s", output[7]) } if output[8] != "htb" { t.Errorf("unexpected qdisc algo: %s", output[8]) } } } }
func testEnsureChain(t *testing.T, protocol Protocol) { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ // iptables version check func() ([]byte, error) { return []byte("iptables v1.9.22"), nil }, // Success. func() ([]byte, error) { return []byte{}, nil }, // Exists. func() ([]byte, error) { return nil, &exec.FakeExitError{Status: 1} }, // Failure. func() ([]byte, error) { return nil, &exec.FakeExitError{Status: 2} }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, } runner := New(&fexec, dbus.NewFake(nil, nil), protocol) defer runner.Destroy() // Success. exists, err := runner.EnsureChain(TableNAT, Chain("FOOBAR")) if err != nil { t.Errorf("expected success, got %v", err) } if exists { t.Errorf("expected exists = false") } if fcmd.CombinedOutputCalls != 2 { t.Errorf("expected 2 CombinedOutput() calls, got %d", fcmd.CombinedOutputCalls) } cmd := getIPTablesCommand(protocol) if !sets.NewString(fcmd.CombinedOutputLog[1]...).HasAll(cmd, "-t", "nat", "-N", "FOOBAR") { t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[1]) } // Exists. exists, err = runner.EnsureChain(TableNAT, Chain("FOOBAR")) if err != nil { t.Errorf("expected success, got %v", err) } if !exists { t.Errorf("expected exists = true") } // Failure. _, err = runner.EnsureChain(TableNAT, Chain("FOOBAR")) if err == nil { t.Errorf("expected failure") } }
func testEnsureChain(t *testing.T) { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ // Does not Exists func() ([]byte, error) { return nil, &exec.FakeExitError{Status: 1} }, // Success func() ([]byte, error) { return []byte{}, nil }, // Exists func() ([]byte, error) { return nil, nil }, // Does not Exists func() ([]byte, error) { return nil, &exec.FakeExitError{Status: 1} }, // Fail to create chain func() ([]byte, error) { return nil, &exec.FakeExitError{Status: 2} }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, } runner := New(&fexec) exists, err := runner.EnsureChain(TableFilter, "TEST-CHAIN") if exists { t.Errorf("expected exists = false") } if err != nil { t.Errorf("expected err = nil") } exists, err = runner.EnsureChain(TableFilter, "TEST-CHAIN") if !exists { t.Errorf("expected exists = true") } if err != nil { t.Errorf("expected err = nil") } exists, err = runner.EnsureChain(TableFilter, "TEST-CHAIN") if exists { t.Errorf("expected exists = false") } errStr := "Failed to ensure TEST-CHAIN chain: exit 2, output:" if err == nil || !strings.Contains(err.Error(), errStr) { t.Errorf("expected error: %q", errStr) } }
func TestExecConntrackTool(t *testing.T) { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ func() ([]byte, error) { return []byte("1 flow entries have been deleted"), nil }, func() ([]byte, error) { return []byte("1 flow entries have been deleted"), nil }, func() ([]byte, error) { return []byte(""), fmt.Errorf("conntrack v1.4.2 (conntrack-tools): 0 flow entries have been deleted.") }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, LookPathFunc: func(cmd string) (string, error) { return cmd, nil }, } fakeProxier := Proxier{exec: &fexec} testCases := [][]string{ {"-L", "-p", "udp"}, {"-D", "-p", "udp", "-d", "10.0.240.1"}, {"-D", "-p", "udp", "--orig-dst", "10.240.0.2", "--dst-nat", "10.0.10.2"}, } expectErr := []bool{false, false, true} for i := range testCases { err := fakeProxier.execConntrackTool(testCases[i]...) if expectErr[i] { if err == nil { t.Errorf("expected err, got %v", err) } } else { if err != nil { t.Errorf("expected success, got %v", err) } } execCmd := strings.Join(fcmd.CombinedOutputLog[i], " ") expectCmd := fmt.Sprintf("%s %s", "conntrack", strings.Join(testCases[i], " ")) if execCmd != expectCmd { t.Errorf("expect execute command: %s, but got: %s", expectCmd, execCmd) } } }
func testEnsureChain(t *testing.T, protocol Protocol) { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ // Success. func() ([]byte, error) { return []byte{}, nil }, // Exists. func() ([]byte, error) { return nil, &exec.FakeExitError{1} }, // Failure. func() ([]byte, error) { return nil, &exec.FakeExitError{2} }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, } runner := New(&fexec, protocol) // Success. exists, err := runner.EnsureChain(TableNAT, Chain("FOOBAR")) if err != nil { t.Errorf("expected success, got %v", err) } if exists { t.Errorf("expected exists = false") } if fcmd.CombinedOutputCalls != 1 { t.Errorf("expected 1 CombinedOutput() call, got %d", fcmd.CombinedOutputCalls) } cmd := getIptablesCommand(protocol) if !util.NewStringSet(fcmd.CombinedOutputLog[0]...).HasAll(cmd, "-t", "nat", "-N", "FOOBAR") { t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[0]) } // Exists. exists, err = runner.EnsureChain(TableNAT, Chain("FOOBAR")) if err != nil { t.Errorf("expected success, got %v", err) } if !exists { t.Errorf("expected exists = true") } // Failure. _, err = runner.EnsureChain(TableNAT, Chain("FOOBAR")) if err == nil { t.Errorf("expected failure") } }
func testEnsureRule(t *testing.T) { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ // Exists func() ([]byte, error) { return []byte(`Bridge table: filter Bridge chain: OUTPUT, entries: 4, policy: ACCEPT -j TEST `), nil }, // Does not Exists. func() ([]byte, error) { return []byte(`Bridge table: filter Bridge chain: TEST, entries: 0, policy: ACCEPT`), nil }, // Fail to create func() ([]byte, error) { return nil, &exec.FakeExitError{Status: 2} }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, } runner := New(&fexec) exists, err := runner.EnsureRule(Append, TableFilter, ChainOutput, "-j", "TEST") if !exists { t.Errorf("expected exists = true") } if err != nil { t.Errorf("expected err = nil") } exists, err = runner.EnsureRule(Append, TableFilter, ChainOutput, "-j", "NEXT-TEST") if exists { t.Errorf("expected exists = false") } errStr := "Failed to ensure rule: exist 2, output: " if err == nil || err.Error() != errStr { t.Errorf("expected error: %q", errStr) } }
func TestGetIptablesHasCheckCommand(t *testing.T) { testCases := []struct { Version string Err bool Expected bool }{ {"iptables v1.4.7", false, false}, {"iptables v1.4.11", false, true}, {"iptables v1.4.19.1", false, true}, {"iptables v2.0.0", false, true}, {"total junk", true, false}, } for _, testCase := range testCases { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ func() ([]byte, error) { return []byte(testCase.Version), nil }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, } check, err := getIptablesHasCheckCommand(&fexec) if (err != nil) != testCase.Err { t.Errorf("Expected error: %v, Got error: %v", testCase.Err, err) } if err == nil && testCase.Expected != check { t.Errorf("Expected result: %v, Got result: %v", testCase.Expected, check) } } }
func TestDeleteServiceConnections(t *testing.T) { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ func() ([]byte, error) { return []byte("1 flow entries have been deleted"), nil }, func() ([]byte, error) { return []byte("1 flow entries have been deleted"), nil }, func() ([]byte, error) { return []byte(""), fmt.Errorf("conntrack v1.4.2 (conntrack-tools): 0 flow entries have been deleted.") }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, LookPathFunc: func(cmd string) (string, error) { return cmd, nil }, } fakeProxier := Proxier{exec: &fexec} testCases := [][]string{ { "10.240.0.3", "10.240.0.5", }, { "10.240.0.4", }, } svcCount := 0 for i := range testCases { fakeProxier.deleteServiceConnections(testCases[i]) for _, ip := range testCases[i] { expectCommand := fmt.Sprintf("conntrack -D --orig-dst %s -p udp", ip) execCommand := strings.Join(fcmd.CombinedOutputLog[svcCount], " ") if expectCommand != execCommand { t.Errorf("Exepect comand: %s, but executed %s", expectCommand, execCommand) } svcCount += 1 } if svcCount != fexec.CommandCalls { t.Errorf("Exepect comand executed %d times, but got %d", svcCount, fexec.CommandCalls) } } }
func TestSafeFormatAndMount(t *testing.T) { tests := []struct { fstype string expectedArgs []string err error }{ { fstype: "ext4", expectedArgs: []string{"/dev/foo", "/mnt/bar"}, }, { fstype: "vfat", expectedArgs: []string{"-m", "mkfs.vfat", "/dev/foo", "/mnt/bar"}, }, { err: fmt.Errorf("test error"), }, } for _, test := range tests { var cmdOut string var argsOut []string fake := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ func(cmd string, args ...string) exec.Cmd { cmdOut = cmd argsOut = args fake := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ func() ([]byte, error) { return []byte{}, test.err }, }, } return exec.InitFakeCmd(&fake, cmd, args...) }, }, } mounter := gceSafeFormatAndMount{ runner: &fake, } err := mounter.Mount("/dev/foo", "/mnt/bar", test.fstype, nil) if test.err == nil && err != nil { t.Errorf("unexpected error: %v", err) } if test.err != nil { if err == nil { t.Errorf("unexpected non-error") } return } if cmdOut != "/usr/share/google/safe_format_and_mount" { t.Errorf("unexpected command: %s", cmdOut) } if len(argsOut) != len(test.expectedArgs) { t.Errorf("unexpected args: %v, expected: %v", argsOut, test.expectedArgs) } } }
func TestFindPairInterfaceOfContainerInterface(t *testing.T) { // there should be at least "lo" on any system interfaces, _ := net.Interfaces() validOutput := fmt.Sprintf("garbage\n peer_ifindex: %d", interfaces[0].Index) invalidOutput := fmt.Sprintf("garbage\n unknown: %d", interfaces[0].Index) tests := []struct { output string err error expectedName string expectErr bool }{ { output: validOutput, expectedName: interfaces[0].Name, }, { output: invalidOutput, expectErr: true, }, { output: validOutput, err: errors.New("error"), expectErr: true, }, } for _, test := range tests { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ func() ([]byte, error) { return []byte(test.output), test.err }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, LookPathFunc: func(file string) (string, error) { return fmt.Sprintf("/fake-bin/%s", file), nil }, } nsenterArgs := []string{"-t", "123", "-n"} name, err := findPairInterfaceOfContainerInterface(&fexec, "eth0", "123", nsenterArgs) if test.expectErr { if err == nil { t.Errorf("unexpected non-error") } } else { if err != nil { t.Errorf("unexpected error: %v", err) } } if name != test.expectedName { t.Errorf("unexpected name: %s (expected: %s)", name, test.expectedName) } } }
func TestFindCIDRClass(t *testing.T) { tests := []struct { cidr string output string expectErr bool expectedClass string expectedHandle string err error }{ { cidr: "172.17.0.2/32", output: tcFilterOutput, expectedClass: "1:1", expectedHandle: "800::800", }, { cidr: "1.2.3.4/16", output: tcFilterOutput, expectedClass: "1:2", expectedHandle: "800::801", }, { err: errors.New("test error"), expectErr: true, }, } for _, test := range tests { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ func() ([]byte, error) { return []byte(test.output), test.err }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, } shaper := &tcShaper{e: &fexec} class, handle, err := shaper.findCIDRClass(test.cidr) if test.expectErr { if err == nil { t.Errorf("unexpected non-error") } } else { if err != nil { t.Errorf("unexpected error: %v", err) } if class != test.expectedClass { t.Errorf("expected: %s, found %s", test.expectedClass, class) } if handle != test.expectedHandle { t.Errorf("expected: %s, found %s", test.expectedHandle, handle) } } } }
func testSetUp(plug volume.VolumePlugin, builder volume.Builder, t *testing.T) { var fcmd exec.FakeCmd fcmd = exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ // git clone func() ([]byte, error) { os.MkdirAll(path.Join(fcmd.Dirs[0], "kubernetes"), 0750) return []byte{}, nil }, // git checkout func() ([]byte, error) { return []byte{}, nil }, // git reset func() ([]byte, error) { return []byte{}, nil }, }, } fake := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, } g := builder.(*gitRepoVolumeBuilder) g.exec = &fake err := g.SetUp() if err != nil { t.Errorf("unexpected error: %v", err) } expectedCmds := [][]string{ {"git", "clone", g.source}, {"git", "checkout", g.revision}, {"git", "reset", "--hard"}, } if fake.CommandCalls != len(expectedCmds) { t.Errorf("unexpected command calls: expected 3, saw: %d", fake.CommandCalls) } if !reflect.DeepEqual(expectedCmds, fcmd.CombinedOutputLog) { t.Errorf("unexpected commands: %v, expected: %v", fcmd.CombinedOutputLog, expectedCmds) } expectedDirs := []string{g.GetPath(), g.GetPath() + "/kubernetes", g.GetPath() + "/kubernetes"} if len(fcmd.Dirs) != 3 || !reflect.DeepEqual(expectedDirs, fcmd.Dirs) { t.Errorf("unexpected directories: %v, expected: %v", fcmd.Dirs, expectedDirs) } }
func addTestResult(fexec *exec.FakeExec, command string, output string, err error) { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ func() ([]byte, error) { return []byte(output), err }, }, } fexec.CommandScript = append(fexec.CommandScript, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }) }
func TestSafeFormatAndMount(t *testing.T) { tests := []struct { fstype string expectedArgs []string err error }{ { fstype: "ext4", expectedArgs: []string{"/dev/foo", "/mnt/bar"}, }, { fstype: "ext3", expectedArgs: []string{"/dev/foo/blah", "/mnt/bar/blah"}, }, } for _, test := range tests { var cmdOut string var argsOut []string fake := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ func(cmd string, args ...string) exec.Cmd { cmdOut = cmd argsOut = args fake := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ func() ([]byte, error) { return []byte{}, test.err }, }, } return exec.InitFakeCmd(&fake, cmd, args...) }, }, } mounter := cinderSafeFormatAndMount{ &mount.FakeMounter{}, &fake, } err := mounter.Mount("/dev/foo", "/mnt/bar", test.fstype, nil) if test.err == nil && err != nil { t.Errorf("unexpected error: %v", err) } if test.err != nil { if err == nil { t.Errorf("unexpected non-error") } return } if cmdOut != "/bin/lsblk" { t.Errorf("unexpected command: %s", cmdOut) } if len(argsOut) != len(test.expectedArgs) { t.Errorf("unexpected args: %v, expected: %v", argsOut, test.expectedArgs) } } }
func makeFakeExec() *exec.FakeExec { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ func() ([]byte, error) { return []byte("1 flow entries have been deleted"), nil }, }, } return &exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, LookPathFunc: func(cmd string) (string, error) { return cmd, nil }, } }
func TestNextClassID(t *testing.T) { tests := []struct { output string expectErr bool expected int err error }{ { output: tcClassOutput, expected: 5, }, { output: "\n", expected: 1, }, { expected: -1, expectErr: true, err: errors.New("test error"), }, } for _, test := range tests { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ func() ([]byte, error) { return []byte(test.output), test.err }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, } shaper := &tcShaper{e: &fexec} class, err := shaper.nextClassID() if test.expectErr { if err == nil { t.Errorf("unexpected non-error") } } else { if err != nil { t.Errorf("unexpected error: %v", err) } if class != test.expected { t.Errorf("expected: %d, found %d", test.expected, class) } } } }
func addTestResult(t *testing.T, fexec *exec.FakeExec, command string, output string, err error) { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ func() ([]byte, error) { return []byte(output), err }, }, } fexec.CommandScript = append(fexec.CommandScript, func(cmd string, args ...string) exec.Cmd { execCommand := strings.Join(append([]string{cmd}, args...), " ") if execCommand != command { t.Fatalf("Unexpected command: wanted %q got %q", command, execCommand) } return exec.InitFakeCmd(&fcmd, cmd, args...) }) }
func TestDeleteChain(t *testing.T) { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ // iptables version check func() ([]byte, error) { return []byte("iptables v1.9.22"), nil }, // Success. func() ([]byte, error) { return []byte{}, nil }, // Failure. func() ([]byte, error) { return nil, &exec.FakeExitError{Status: 1} }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, } runner := New(&fexec, ProtocolIpv4) // Success. err := runner.DeleteChain(TableNAT, Chain("FOOBAR")) if err != nil { t.Errorf("expected success, got %v", err) } if fcmd.CombinedOutputCalls != 2 { t.Errorf("expected 2 CombinedOutput() calls, got %d", fcmd.CombinedOutputCalls) } if !sets.NewString(fcmd.CombinedOutputLog[1]...).HasAll("iptables", "-t", "nat", "-X", "FOOBAR") { t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[1]) } // Failure. err = runner.DeleteChain(TableNAT, Chain("FOOBAR")) if err == nil { t.Errorf("expected failure") } }
func TestCheckRuleWithoutCheckPresent(t *testing.T) { iptables_save_output := `# Generated by iptables-save v1.4.7 on Wed Oct 29 14:56:01 2014 *nat :PREROUTING ACCEPT [2136997:197881818] :POSTROUTING ACCEPT [4284525:258542680] :OUTPUT ACCEPT [5901660:357267963] -A PREROUTING -m addrtype --dst-type LOCAL -m mark --mark 0x00004000/0x00004000 -j DOCKER COMMIT # Completed on Wed Oct 29 14:56:01 2014` fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ // Success. func() ([]byte, error) { return []byte(iptables_save_output), nil }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ // The first Command() call is checking the rule. Success of that exec means "done". func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, } runner := &runner{exec: &fexec} exists, err := runner.checkRuleWithoutCheck( TableNAT, ChainPrerouting, "-m", "addrtype", "-m", "mark", "--mark", "0x4000/0x4000", "-j", "DOCKER", "--dst-type", "LOCAL") if err != nil { t.Errorf("expected success, got %v", err) } if !exists { t.Errorf("expected exists = true") } if fcmd.CombinedOutputCalls != 1 { t.Errorf("expected 1 CombinedOutput() call, got %d", fcmd.CombinedOutputCalls) } if !sets.NewString(fcmd.CombinedOutputLog[0]...).HasAll("iptables-save", "-t", "nat") { t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[0]) } }
func TestIoHandler(t *testing.T) { var fcmd exec.FakeCmd fcmd = exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ // cat func() ([]byte, error) { return []byte("Msft \nVirtual Disk \n"), nil }, }, } fake := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, } disk, err := findDiskByLun(lun, &fakeIOHandler{}, &fake) // if no disk matches lun, exit if disk != "/dev/"+devName || err != nil { t.Errorf("no data disk disk found: disk %v err %v", disk, err) } }
func TestGetCIDRs(t *testing.T) { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ func() ([]byte, error) { return []byte(tcFilterOutput), nil }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ func(cmd string, args ...string) exec.Cmd { return exec.InitFakeCmd(&fcmd, cmd, args...) }, }, } shaper := &tcShaper{e: &fexec} cidrs, err := shaper.GetCIDRs() if err != nil { t.Errorf("unexpected error: %v", err) } expectedCidrs := []string{"172.17.0.2/32", "1.2.0.0/16"} if !reflect.DeepEqual(cidrs, expectedCidrs) { t.Errorf("expected: %v, saw: %v", expectedCidrs, cidrs) } }