github.com/jlowellwofford/u-root@v1.0.0/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  }