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 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 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 TestEnsureRuleErrorCreating(t *testing.T) { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ // Status 1 on the first call. func() ([]byte, error) { return nil, &exec.FakeExitError{1} }, // Status 1 on the second call. func() ([]byte, error) { return nil, &exec.FakeExitError{1} }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ // The first 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) _, err := runner.EnsureRule(TableNAT, ChainOutput, "abc", "123") if err == nil { t.Errorf("expected failure") } if fcmd.CombinedOutputCalls != 2 { t.Errorf("expected 2 CombinedOutput() calls, got %d", fcmd.CombinedOutputCalls) } }
func TestEnsureRuleNew(t *testing.T) { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ // Status 1 on the first call. func() ([]byte, error) { return nil, &exec.FakeExitError{1} }, // Success on the second call. func() ([]byte, error) { return []byte{}, nil }, }, } fexec := exec.FakeExec{ CommandScript: []exec.FakeCommandAction{ // The first 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) exists, err := runner.EnsureRule(TableNAT, ChainOutput, "abc", "123") 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) } if !util.NewStringSet(fcmd.CombinedOutputLog[1]...).HasAll("iptables", "-t", "nat", "-A", "OUTPUT", "abc", "123") { t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[1]) } }
func TestGitVolume(t *testing.T) { var fcmd exec.FakeCmd fcmd = exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ func() ([]byte, error) { os.MkdirAll(path.Join(fcmd.Dirs[0], "kubernetes"), 0750) return []byte{}, nil }, func() ([]byte, error) { return []byte{}, nil }, 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...) }, }, } dir := os.TempDir() + "/git" g := GitDir{ Source: "https://github.com/GoogleCloudPlatform/kubernetes.git", Revision: "2a30ce65c5ab586b98916d83385c5983edd353a1", PodID: "foo", RootDir: dir, Name: "test-pod", 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) } err = g.TearDown() if err != nil { t.Errorf("unexpected error: %v", err) } }
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 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 TestEnsureRuleAlreadyExists(t *testing.T) { fcmd := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ // Success. func() ([]byte, error) { return []byte{}, 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 := New(&fexec) exists, err := runner.EnsureRule(TableNAT, ChainOutput, "abc", "123") 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 !util.NewStringSet(fcmd.CombinedOutputLog[0]...).HasAll("iptables", "-t", "nat", "-C", "OUTPUT", "abc", "123") { t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[0]) } }
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, 0, "") 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 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 TestCheckRuleWithoutCheckAbsent(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 -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", "-j", "DOCKER") 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) } if !util.NewStringSet(fcmd.CombinedOutputLog[0]...).HasAll("iptables-save", "-t", "nat") { t.Errorf("wrong CombinedOutput() log, got %s", fcmd.CombinedOutputLog[0]) } }
func TestPlugin(t *testing.T) { plugMgr := volume.VolumePluginMgr{} plugMgr.InitPlugins(ProbeVolumePlugins(), volume.NewFakeVolumeHost("/tmp/fake", nil, nil)) plug, err := plugMgr.FindPluginByName("kubernetes.io/glusterfs") if err != nil { t.Errorf("Can't find the plugin by name") } spec := &api.Volume{ Name: "vol1", VolumeSource: api.VolumeSource{Glusterfs: &api.GlusterfsVolumeSource{"ep", "vol", false}}, } ep := &api.Endpoints{ObjectMeta: api.ObjectMeta{Name: "foo"}, Subsets: []api.EndpointSubset{{ Addresses: []api.EndpointAddress{{IP: "127.0.0.1"}}}}} var fcmd exec.FakeCmd fcmd = exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ // mount 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...) }, }, } builder, err := plug.(*glusterfsPlugin).newBuilderInternal(volume.NewSpecFromVolume(spec), ep, &api.ObjectReference{UID: types.UID("poduid")}, &mount.FakeMounter{}, &fake) volumePath := builder.GetPath() if err != nil { t.Errorf("Failed to make a new Builder: %v", err) } if builder == nil { t.Errorf("Got a nil Builder: %v") } path := builder.GetPath() if path != "/tmp/fake/pods/poduid/volumes/kubernetes.io~glusterfs/vol1" { t.Errorf("Got unexpected path: %s", path) } if err := builder.SetUp(); err != nil { t.Errorf("Expected success, got: %v", err) } if _, err := os.Stat(volumePath); err != nil { if os.IsNotExist(err) { t.Errorf("SetUp() failed, volume path not created: %s", volumePath) } else { t.Errorf("SetUp() failed: %v", err) } } cleaner, err := plug.(*glusterfsPlugin).newCleanerInternal("vol1", types.UID("poduid"), &mount.FakeMounter{}) if err != nil { t.Errorf("Failed to make a new Cleaner: %v", err) } if cleaner == nil { t.Errorf("Got a nil Cleaner: %v") } if err := cleaner.TearDown(); err != nil { t.Errorf("Expected success, got: %v", err) } if _, err := os.Stat(volumePath); err == nil { t.Errorf("TearDown() failed, volume path still exists: %s", volumePath) } else if !os.IsNotExist(err) { t.Errorf("SetUp() failed: %v", err) } }
func TestSafeFormatAndMount(t *testing.T) { tests := []struct { fstype string mountOptions []string execScripts []ExecArgs mountErrs []error expectedError error }{ { // Test a read only mount fstype: "ext4", mountOptions: []string{"ro"}, }, { // Test a normal mount fstype: "ext4", }, { // Test that 'file' is called and fails fstype: "ext4", mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'")}, execScripts: []ExecArgs{ {"file", []string{"-L", "--special-files", "/dev/foo"}, "ext4 filesystem", nil}, }, expectedError: fmt.Errorf("unknown filesystem type '(null)'"), }, { // Test that 'file' is called and confirms unformatted disk, format fails fstype: "ext4", mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'")}, execScripts: []ExecArgs{ {"file", []string{"-L", "--special-files", "/dev/foo"}, "data", nil}, {"mkfs.ext4", []string{"-E", "lazy_itable_init=0,lazy_journal_init=0", "-F", "/dev/foo"}, "", fmt.Errorf("formatting failed")}, }, expectedError: fmt.Errorf("formatting failed"), }, { // Test that 'file' is called and confirms unformatted disk, format passes, second mount fails fstype: "ext4", mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'"), fmt.Errorf("Still cannot mount")}, execScripts: []ExecArgs{ {"file", []string{"-L", "--special-files", "/dev/foo"}, "data", nil}, {"mkfs.ext4", []string{"-E", "lazy_itable_init=0,lazy_journal_init=0", "-F", "/dev/foo"}, "", nil}, }, expectedError: fmt.Errorf("Still cannot mount"), }, { // Test that 'file' is called and confirms unformatted disk, format passes, second mount passes fstype: "ext4", mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'"), nil}, execScripts: []ExecArgs{ {"file", []string{"-L", "--special-files", "/dev/foo"}, "data", nil}, {"mkfs.ext4", []string{"-E", "lazy_itable_init=0,lazy_journal_init=0", "-F", "/dev/foo"}, "", nil}, }, expectedError: nil, }, { // Test that 'file' is called and confirms unformatted disk, format passes, second mount passes with ext3 fstype: "ext3", mountErrs: []error{fmt.Errorf("unknown filesystem type '(null)'"), nil}, execScripts: []ExecArgs{ {"file", []string{"-L", "--special-files", "/dev/foo"}, "data", nil}, {"mkfs.ext3", []string{"-E", "lazy_itable_init=0,lazy_journal_init=0", "-F", "/dev/foo"}, "", nil}, }, expectedError: nil, }, } for _, test := range tests { commandScripts := []exec.FakeCommandAction{} for _, expected := range test.execScripts { ecmd := expected.command eargs := expected.args output := expected.output err := expected.err commandScript := func(cmd string, args ...string) exec.Cmd { if cmd != ecmd { t.Errorf("Unexpected command %s. Expecting %s", cmd, ecmd) } for j := range args { if args[j] != eargs[j] { t.Errorf("Unexpected args %v. Expecting %v", args, eargs) } } fake := exec.FakeCmd{ CombinedOutputScript: []exec.FakeCombinedOutputAction{ func() ([]byte, error) { return []byte(output), err }, }, } return exec.InitFakeCmd(&fake, cmd, args...) } commandScripts = append(commandScripts, commandScript) } fake := exec.FakeExec{ CommandScript: commandScripts, } fakeMounter := ErrorMounter{&FakeMounter{}, 0, test.mountErrs} mounter := SafeFormatAndMount{ Interface: &fakeMounter, Runner: &fake, } device := "/dev/foo" dest := "/mnt/bar" err := mounter.Mount(device, dest, test.fstype, test.mountOptions) if test.expectedError == nil { if err != nil { t.Errorf("unexpected non-error: %v", err) } // Check that something was mounted on the directory isMountPoint, err := fakeMounter.IsMountPoint(dest) if err != nil || !isMountPoint { t.Errorf("the directory was not mounted") } //check that the correct device was mounted mountedDevice, _, err := GetDeviceNameFromMount(fakeMounter.FakeMounter, dest) if err != nil || mountedDevice != device { t.Errorf("the correct device was not mounted") } } else { if err == nil || test.expectedError.Error() != err.Error() { t.Errorf("unexpected error: %v. Expecting %v", err, test.expectedError) } } } }