github.com/mvdan/u-root-coreutils@v0.0.0-20230122170626-c2eef2898555/cmds/core/rm/rm_test.go (about)

     1  // Copyright 2012 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  	"log"
    10  	"os"
    11  	"path/filepath"
    12  	"strings"
    13  	"testing"
    14  )
    15  
    16  func setup(t *testing.T) string {
    17  	d := t.TempDir()
    18  	fbody := []byte("Go is cool!")
    19  	for _, f := range []struct {
    20  		name  string
    21  		mode  os.FileMode
    22  		isdir bool
    23  	}{
    24  		{
    25  			name:  "hi",
    26  			mode:  0o755,
    27  			isdir: true,
    28  		},
    29  		{
    30  			name: "hi/one.txt",
    31  			mode: 0o666,
    32  		},
    33  		{
    34  			name: "hi/two.txt",
    35  			mode: 0o777,
    36  		},
    37  		{
    38  			name: "go.txt",
    39  			mode: 0o555,
    40  		},
    41  	} {
    42  		var (
    43  			err      error
    44  			filepath = filepath.Join(d, f.name)
    45  		)
    46  		if f.isdir {
    47  			err = os.Mkdir(filepath, f.mode)
    48  		} else {
    49  			err = os.WriteFile(filepath, fbody, f.mode)
    50  		}
    51  		if err != nil {
    52  			t.Fatal(err)
    53  		}
    54  	}
    55  	return d
    56  }
    57  
    58  func TestRm(t *testing.T) {
    59  	for _, tt := range []struct {
    60  		name        string
    61  		file        string
    62  		interactive bool
    63  		iString     string
    64  		verbose     bool
    65  		recursive   bool
    66  		force       bool
    67  		want        string
    68  	}{
    69  		{
    70  			name: "no args",
    71  			file: "",
    72  			want: usage,
    73  		},
    74  		{
    75  			name: "rm one file",
    76  			file: "go.txt",
    77  			want: "",
    78  		},
    79  		{
    80  			name:    "rm one file verbose",
    81  			file:    "go.txt",
    82  			verbose: true,
    83  			want:    "",
    84  		},
    85  		{
    86  			name: "fail to rm one file",
    87  			file: "go",
    88  			want: "no such file or directory",
    89  		},
    90  		{
    91  			name:  "fail to rm one file forced to trigger continue",
    92  			file:  "go",
    93  			force: true,
    94  			want:  "",
    95  		},
    96  		{
    97  			name:        "rm one file interactive",
    98  			file:        "go",
    99  			interactive: true,
   100  			iString:     "y\n",
   101  			want:        "",
   102  		},
   103  		{
   104  			name:        "rm one file interactive continue triggered",
   105  			file:        "go",
   106  			interactive: true,
   107  			iString:     "\n",
   108  			want:        "",
   109  		},
   110  		{
   111  			name:      "rm dir recursivly",
   112  			file:      "hi",
   113  			recursive: true,
   114  		},
   115  		{
   116  			name: "rm dir not recursivly",
   117  			file: "hi",
   118  			want: "directory not empty",
   119  		},
   120  	} {
   121  		d := setup(t)
   122  
   123  		t.Run(tt.name, func(t *testing.T) {
   124  			var file []string
   125  
   126  			*interactive = tt.interactive
   127  			*verbose = tt.verbose
   128  			*recursive = tt.recursive
   129  			*force = tt.force
   130  
   131  			buf := &bytes.Buffer{}
   132  			log.SetOutput(buf)
   133  			buf.WriteString(tt.iString)
   134  
   135  			if tt.file != "" {
   136  				file = []string{filepath.Join(d, tt.file)}
   137  			}
   138  			if err := rm(buf, file); err != nil {
   139  				if !strings.Contains(err.Error(), tt.want) {
   140  					t.Errorf("rm() = %q, want to contain: %q", err.Error(), tt.want)
   141  				}
   142  			}
   143  		})
   144  	}
   145  }