github.com/rck/u-root@v0.0.0-20180106144920-7eb602e381bb/cmds/readlink/readlink_test.go (about) 1 // Copyright 2017 the u-root Authors. All rights reserved 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package main 6 7 import ( 8 "bytes" 9 "fmt" 10 "os" 11 "os/exec" 12 "path/filepath" 13 "testing" 14 15 "github.com/u-root/u-root/pkg/testutil" 16 ) 17 18 type test struct { 19 flags []string 20 out string 21 stdErr string 22 exitStatus int 23 } 24 25 func TestReadlink(t *testing.T) { 26 27 // Create an empty directory 28 tmpDir, execPath := testutil.CompileInTempDir(t) 29 defer os.RemoveAll(tmpDir) 30 31 // Creating here to utilize path in tests 32 testDir := filepath.Join(tmpDir, "readLinkDir") 33 err := os.Mkdir(testDir, 0700) 34 if err != nil { 35 t.Error(err) 36 } 37 38 err = os.Chdir(testDir) 39 if err != nil { 40 t.Error(err) 41 } 42 43 var tests = []test{ 44 { 45 flags: []string{}, 46 out: "", 47 stdErr: "", 48 exitStatus: 1, 49 }, { 50 flags: []string{"-v", "f1"}, 51 out: "", 52 stdErr: "readlink f1: invalid argument\n", 53 exitStatus: 1, 54 }, { 55 flags: []string{"-f", "f2"}, 56 out: "", 57 stdErr: "", 58 exitStatus: 1, 59 }, 60 { 61 flags: []string{"f1symlink"}, 62 out: "f1\n", 63 stdErr: "", 64 exitStatus: 0, 65 }, 66 { 67 flags: []string{"multilinks"}, 68 out: fmt.Sprintf("%s/%s", testDir, "f1symlink\n"), 69 stdErr: "", 70 exitStatus: 0, 71 }, 72 { 73 flags: []string{"-v", "multilinks", "f1symlink", "f2"}, 74 out: fmt.Sprintf("%s/%sf1\n", testDir, "f1symlink\n"), 75 stdErr: "readlink f2: invalid argument\n", 76 exitStatus: 1, 77 }, 78 { 79 flags: []string{"-v", testDir}, 80 out: "", 81 stdErr: fmt.Sprintf("readlink %s: invalid argument\n", testDir), 82 exitStatus: 1, 83 }, 84 { 85 flags: []string{"-v", "foo.bar"}, 86 out: "", 87 stdErr: fmt.Sprintf("readlink foo.bar: no such file or directory\n"), 88 exitStatus: 1, 89 }, 90 } 91 // Createfiles. 92 _, err = os.Create("f1") 93 if err != nil { 94 t.Error(err) 95 } 96 97 _, err = os.Create("f2") 98 if err != nil { 99 t.Error(err) 100 } 101 102 // Create symlinks 103 f1Symlink := filepath.Join(testDir, "f1symlink") 104 err = os.Symlink("f1", f1Symlink) 105 if err != nil { 106 t.Error(err) 107 } 108 109 // Multiple links 110 multiLinks := filepath.Join(testDir, "multilinks") 111 err = os.Symlink(f1Symlink, multiLinks) 112 113 if err != nil { 114 t.Error(err) 115 } 116 117 // Table-driven testing 118 for _, tt := range tests { 119 120 var out, stdErr bytes.Buffer 121 cmd := exec.Command(execPath, tt.flags...) 122 cmd.Stdout = &out 123 cmd.Stderr = &stdErr 124 err := cmd.Run() 125 126 if out.String() != tt.out { 127 t.Errorf("stdout got:\n%s\nwant:\n%s", out.String(), tt.out) 128 } 129 130 if stdErr.String() != tt.stdErr { 131 t.Errorf("stderr got:\n%s\nwant:\n%s", stdErr.String(), tt.stdErr) 132 } 133 134 if tt.exitStatus == 0 && err != nil { 135 t.Errorf("expected to exit with %d, but exited with err %s", tt.exitStatus, err) 136 } 137 } 138 }