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  }