github.com/craftyguy/u-root@v1.0.0/pkg/find/find_test.go (about)

     1  // Copyright 2015-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 find
     6  
     7  import (
     8  	"io/ioutil"
     9  	"os"
    10  	"path/filepath"
    11  	"reflect"
    12  	"strings"
    13  	"syscall"
    14  	"testing"
    15  
    16  	"github.com/u-root/u-root/pkg/uroot/util"
    17  )
    18  
    19  // TODO: I don't now where this subtesting stuff originated, I just copied it,
    20  // but it's bad practice as you can not pick individual tests.
    21  // Break this out into individual tests.
    22  func TestSimple(t *testing.T) {
    23  	type tests struct {
    24  		name  string
    25  		opts  func(*Finder) error
    26  		names []string
    27  	}
    28  
    29  	var testCases = []tests{
    30  		{
    31  			name: "basic find",
    32  			opts: func(_ *Finder) error { return nil },
    33  			names: []string{
    34  				"",
    35  				"/root",
    36  				"/root/ab",
    37  				"/root/ab/c",
    38  				"/root/ab/c/d",
    39  				"/root/ab/c/d/e",
    40  				"/root/ab/c/d/e/f",
    41  				"/root/ab/c/d/e/f/ghij",
    42  				"/root/ab/c/d/e/f/ghij/k",
    43  				"/root/ab/c/d/e/f/ghij/k/l",
    44  				"/root/ab/c/d/e/f/ghij/k/l/m",
    45  				"/root/ab/c/d/e/f/ghij/k/l/m/n",
    46  				"/root/ab/c/d/e/f/ghij/k/l/m/n/o",
    47  				"/root/ab/c/d/e/f/ghij/k/l/m/n/o/p",
    48  				"/root/ab/c/d/e/f/ghij/k/l/m/n/o/p/q",
    49  				"/root/ab/c/d/e/f/ghij/k/l/m/n/o/p/q/r",
    50  				"/root/ab/c/d/e/f/ghij/k/l/m/n/o/p/q/r/s",
    51  				"/root/ab/c/d/e/f/ghij/k/l/m/n/o/p/q/r/s/t",
    52  				"/root/ab/c/d/e/f/ghij/k/l/m/n/o/p/q/r/s/t/u",
    53  				"/root/ab/c/d/e/f/ghij/k/l/m/n/o/p/q/r/s/t/u/v",
    54  				"/root/ab/c/d/e/f/ghij/k/l/m/n/o/p/q/r/s/t/u/v/w",
    55  				"/root/ab/c/d/e/f/ghij/k/l/m/n/o/p/q/r/s/t/u/v/w/xyz",
    56  				"/root/ab/c/d/e/f/ghij/k/l/m/n/o/p/q/r/s/t/u/v/w/xyz/0777",
    57  				"/root/ab/c/d/e/f/ghij/k/l/m/n/o/p/q/r/s/t/u/v/w/xyz/file",
    58  			},
    59  		},
    60  		{
    61  			name: "just a dir",
    62  			opts: func(f *Finder) error {
    63  				f.Mode = os.ModeDir
    64  				f.ModeMask = os.ModeDir
    65  				return nil
    66  			},
    67  			names: []string{
    68  				"",
    69  				"/root",
    70  				"/root/ab",
    71  				"/root/ab/c",
    72  				"/root/ab/c/d",
    73  				"/root/ab/c/d/e",
    74  				"/root/ab/c/d/e/f",
    75  				"/root/ab/c/d/e/f/ghij",
    76  				"/root/ab/c/d/e/f/ghij/k",
    77  				"/root/ab/c/d/e/f/ghij/k/l",
    78  				"/root/ab/c/d/e/f/ghij/k/l/m",
    79  				"/root/ab/c/d/e/f/ghij/k/l/m/n",
    80  				"/root/ab/c/d/e/f/ghij/k/l/m/n/o",
    81  				"/root/ab/c/d/e/f/ghij/k/l/m/n/o/p",
    82  				"/root/ab/c/d/e/f/ghij/k/l/m/n/o/p/q",
    83  				"/root/ab/c/d/e/f/ghij/k/l/m/n/o/p/q/r",
    84  				"/root/ab/c/d/e/f/ghij/k/l/m/n/o/p/q/r/s",
    85  				"/root/ab/c/d/e/f/ghij/k/l/m/n/o/p/q/r/s/t",
    86  				"/root/ab/c/d/e/f/ghij/k/l/m/n/o/p/q/r/s/t/u",
    87  				"/root/ab/c/d/e/f/ghij/k/l/m/n/o/p/q/r/s/t/u/v",
    88  				"/root/ab/c/d/e/f/ghij/k/l/m/n/o/p/q/r/s/t/u/v/w",
    89  				"/root/ab/c/d/e/f/ghij/k/l/m/n/o/p/q/r/s/t/u/v/w/xyz",
    90  			},
    91  		},
    92  		{
    93  			name: "just a file",
    94  			opts: func(f *Finder) error {
    95  				f.Mode = 0
    96  				f.ModeMask = os.ModeType
    97  				return nil
    98  			},
    99  			names: []string{
   100  				"/root/ab/c/d/e/f/ghij/k/l/m/n/o/p/q/r/s/t/u/v/w/xyz/0777",
   101  				"/root/ab/c/d/e/f/ghij/k/l/m/n/o/p/q/r/s/t/u/v/w/xyz/file",
   102  			},
   103  		},
   104  		{
   105  			name: "file by mode",
   106  			opts: func(f *Finder) error {
   107  				f.Mode = 0444
   108  				f.ModeMask = os.ModePerm
   109  				return nil
   110  			},
   111  			names: []string{"/root/ab/c/d/e/f/ghij/k/l/m/n/o/p/q/r/s/t/u/v/w/xyz/0777"},
   112  		},
   113  		{
   114  			name: "file by name",
   115  			opts: func(f *Finder) error {
   116  				f.Pattern = "*file"
   117  				return nil
   118  			},
   119  			names: []string{"/root/ab/c/d/e/f/ghij/k/l/m/n/o/p/q/r/s/t/u/v/w/xyz/file"},
   120  		},
   121  	}
   122  	d, err := ioutil.TempDir(os.TempDir(), "u-root.cmds.find")
   123  	if err != nil {
   124  		t.Fatal(err)
   125  	}
   126  	defer os.RemoveAll(d)
   127  
   128  	// Make sure files are actually created with the permissions we ask for.
   129  	syscall.Umask(0)
   130  	var namespace = []util.Creator{
   131  		util.Dir{Name: filepath.Join(d, "root/ab/c/d/e/f/ghij/k/l/m/n/o/p/q/r/s/t/u/v/w/xyz"), Mode: 0775},
   132  		util.File{Name: filepath.Join(d, "root//ab/c/d/e/f/ghij/k/l/m/n/o/p/q/r/s/t/u/v/w/xyz/file"), Mode: 0664},
   133  		util.File{Name: filepath.Join(d, "root//ab/c/d/e/f/ghij/k/l/m/n/o/p/q/r/s/t/u/v/w/xyz/0777"), Mode: 0444},
   134  	}
   135  	for _, c := range namespace {
   136  		if err := c.Create(); err != nil {
   137  			t.Fatalf("Error creating %s: %v", c, err)
   138  		}
   139  	}
   140  
   141  	for _, tc := range testCases {
   142  		t.Run(tc.name, func(t *testing.T) {
   143  			f, err := New(func(f *Finder) error {
   144  				f.Root = d
   145  				return nil
   146  			}, tc.opts)
   147  			if err != nil {
   148  				t.Fatal(err)
   149  			}
   150  			go f.Find()
   151  
   152  			var names []string
   153  			for o := range f.Names {
   154  				if o.Err != nil {
   155  					t.Errorf("%v: got %v, want nil", o.Name, o.Err)
   156  				}
   157  				names = append(names, strings.TrimPrefix(o.Name, d))
   158  			}
   159  
   160  			if len(names) != len(tc.names) {
   161  				t.Errorf("Find output: got %d bytes, want %d bytes", len(names), len(tc.names))
   162  			}
   163  			if !reflect.DeepEqual(names, tc.names) {
   164  				t.Errorf("Find output: got %v, want %v", names, tc.names)
   165  			}
   166  		})
   167  	}
   168  }