github.com/rctl/u-root@v4.0.1-0.20190331234501-73fc0a84c4d4+incompatible/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 "io/ioutil" 11 "os" 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 tmpDir, err := ioutil.TempDir("", "ls") 27 if err != nil { 28 t.Fatal(err) 29 } 30 defer os.RemoveAll(tmpDir) 31 32 // Creating here to utilize path in tests 33 testDir := filepath.Join(tmpDir, "readLinkDir") 34 if err := os.Mkdir(testDir, 0700); err != nil { 35 t.Error(err) 36 } 37 38 if err := os.Chdir(testDir); err != nil { 39 t.Error(err) 40 } 41 42 var tests = []test{ 43 { 44 flags: []string{}, 45 out: "", 46 stdErr: "", 47 exitStatus: 1, 48 }, { 49 flags: []string{"-v", "f1"}, 50 out: "", 51 stdErr: "readlink f1: invalid argument\n", 52 exitStatus: 1, 53 }, { 54 flags: []string{"-f", "f2"}, 55 out: "", 56 stdErr: "", 57 exitStatus: 1, 58 }, 59 { 60 flags: []string{"f1symlink"}, 61 out: "f1\n", 62 stdErr: "", 63 exitStatus: 0, 64 }, 65 { 66 flags: []string{"multilinks"}, 67 out: fmt.Sprintf("%s/%s", testDir, "f1symlink\n"), 68 stdErr: "", 69 exitStatus: 0, 70 }, 71 { 72 flags: []string{"-v", "multilinks", "f1symlink", "f2"}, 73 out: fmt.Sprintf("%s/%sf1\n", testDir, "f1symlink\n"), 74 stdErr: "readlink f2: invalid argument\n", 75 exitStatus: 1, 76 }, 77 { 78 flags: []string{"-v", testDir}, 79 out: "", 80 stdErr: fmt.Sprintf("readlink %s: invalid argument\n", testDir), 81 exitStatus: 1, 82 }, 83 { 84 flags: []string{"-v", "foo.bar"}, 85 out: "", 86 stdErr: fmt.Sprintf("readlink foo.bar: no such file or directory\n"), 87 exitStatus: 1, 88 }, 89 } 90 // Createfiles. 91 _, err = os.Create("f1") 92 if err != nil { 93 t.Error(err) 94 } 95 96 _, err = os.Create("f2") 97 if err != nil { 98 t.Error(err) 99 } 100 101 // Create symlinks 102 f1Symlink := filepath.Join(testDir, "f1symlink") 103 err = os.Symlink("f1", f1Symlink) 104 if err != nil { 105 t.Error(err) 106 } 107 108 // Multiple links 109 multiLinks := filepath.Join(testDir, "multilinks") 110 err = os.Symlink(f1Symlink, multiLinks) 111 112 if err != nil { 113 t.Error(err) 114 } 115 116 // Table-driven testing 117 for _, tt := range tests { 118 var out, stdErr bytes.Buffer 119 cmd := testutil.Command(t, tt.flags...) 120 cmd.Stdout = &out 121 cmd.Stderr = &stdErr 122 err := cmd.Run() 123 124 if out.String() != tt.out { 125 t.Errorf("stdout got:\n%s\nwant:\n%s", out.String(), tt.out) 126 } 127 128 if stdErr.String() != tt.stdErr { 129 t.Errorf("stderr got:\n%s\nwant:\n%s", stdErr.String(), tt.stdErr) 130 } 131 132 if tt.exitStatus == 0 && err != nil { 133 t.Errorf("expected to exit with %d, but exited with err %s", tt.exitStatus, err) 134 } 135 } 136 } 137 138 func TestMain(m *testing.M) { 139 testutil.Run(m, main) 140 }