github.com/mvdan/u-root-coreutils@v0.0.0-20230122170626-c2eef2898555/pkg/ls/ls_linux_test.go (about)

     1  // Copyright 2021 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 ls
     6  
     7  import (
     8  	"fmt"
     9  	"os"
    10  	"os/user"
    11  	"regexp"
    12  	"strconv"
    13  	"strings"
    14  	"testing"
    15  	"time"
    16  )
    17  
    18  const lsregex string = "^([rwxSTstdcb\\-lp?]{10})\\s+(\\d+)?\\s?(\\S+)\\s+(\\S+)\\s+([0-9,]+)?\\s+(\\d+)?(\\D+)?(\\d{1,2}\\D\\d{1,2}\\D\\d{1,2})?(\\D{4})?([\\D|\\d]*)"
    19  const tDelta time.Duration = 1 * time.Second
    20  
    21  func TestFileInfo(t *testing.T) {
    22  	u, err := user.Current()
    23  	if err != nil {
    24  		t.Errorf("Failed getting current user: %q", err)
    25  	}
    26  	userid, err := strconv.ParseUint(u.Uid, 0, 32)
    27  	if err != nil {
    28  		t.Errorf("Failed to convert userid to uint64: %q", err)
    29  	}
    30  	groupid, err := strconv.ParseUint(u.Gid, 0, 32)
    31  	if err != nil {
    32  		t.Errorf("Failed to convert groud id to uint64: %q", err)
    33  	}
    34  	gidname, err := user.LookupGroupId(u.Gid)
    35  	if err != nil {
    36  		t.Errorf("Failed look up group id: %q", err)
    37  	}
    38  	fmt.Println(gidname)
    39  	for _, tt := range []struct {
    40  		name          string
    41  		filename      string
    42  		filemode      string
    43  		rdev          uint64
    44  		uid           uint32
    45  		gid           uint32
    46  		size          int64
    47  		mTime         time.Time
    48  		symlinktarget string
    49  		user          string
    50  		group         string
    51  	}{
    52  		{
    53  			name:          "SimpleFile",
    54  			filename:      "testFile-",
    55  			filemode:      "-rw-------",
    56  			rdev:          0,
    57  			uid:           uint32(userid),
    58  			gid:           uint32(groupid),
    59  			size:          0,
    60  			mTime:         time.Now(),
    61  			symlinktarget: "",
    62  			user:          u.Username,
    63  			group:         gidname.Name,
    64  		},
    65  	} {
    66  		t.Run(tt.name, func(t *testing.T) {
    67  			tmpDir := t.TempDir()
    68  			f, err := os.CreateTemp(tmpDir, tt.filename)
    69  			if err != nil {
    70  				t.Errorf("%q failed with %q", tt.name, err)
    71  			}
    72  			osfi, err := os.Stat(f.Name())
    73  			if err != nil {
    74  				t.Errorf("%q failed with %q", tt.name, err)
    75  			}
    76  			fi := FromOSFileInfo(f.Name(), osfi)
    77  
    78  			if !strings.Contains(fi.Name, tt.filename) {
    79  				t.Errorf("%q failed by name. Got: %q, Want: %q", tt.name, tt.filename, strings.TrimPrefix(fi.PrintableName(), tt.name))
    80  			}
    81  			if !strings.Contains(fi.Mode.String(), tt.filemode) {
    82  				t.Errorf("%q failed by filemode. Got: %q, Want: %q", tt.name, tt.filemode, fi.Mode.String())
    83  			}
    84  			if fi.Rdev != tt.rdev {
    85  				t.Errorf("%q failed by Rdev. Got: %q, Want: %q", tt.name, tt.rdev, fi.Rdev)
    86  			}
    87  			if fi.UID != tt.uid {
    88  				t.Errorf("%q failed by UID. Got: %q, Want: %q", tt.name, tt.uid, fi.UID)
    89  			}
    90  			if fi.GID != tt.gid {
    91  				t.Errorf("%q failed by GID. Got: %q, Want: %q", tt.name, tt.gid, fi.GID)
    92  			}
    93  			if fi.Size != tt.size {
    94  				t.Errorf("%q failed by Size. Got: %q, Want: %q", tt.name, tt.size, fi.Size)
    95  			}
    96  
    97  			if dt := tt.mTime.Sub(fi.MTime); dt < -tDelta || dt > tDelta {
    98  				t.Errorf("%q failed by MTime. Got: %q, Want: %q", tt.name, tt.mTime, fi.MTime)
    99  			}
   100  
   101  			if fi.SymlinkTarget != tt.symlinktarget {
   102  				t.Errorf("%q failed by SymlinkTarget. Got: %q, Want: %q", tt.name, tt.symlinktarget, fi.SymlinkTarget)
   103  			}
   104  
   105  			if fi.Name != fi.PrintableName() {
   106  				t.Errorf("%q failed by PrintableName. Got: %q, Want: %q", tt.name, fi.Name, fi.PrintableName())
   107  			}
   108  
   109  			if lookupUserName(fi.UID) != tt.user {
   110  				t.Errorf("%q failed by lookupUserName. Got: %q, Want: %q", tt.name, tt.user, lookupUserName(fi.UID))
   111  			}
   112  
   113  			if lookupGroupName(fi.GID) != tt.group {
   114  				t.Errorf("%q failed by lookupGroupName. Got: %q, Want: %q", tt.name, tt.group, lookupGroupName(fi.GID))
   115  			}
   116  
   117  			ls := LongStringer{
   118  				Human: true,
   119  				Name:  NameStringer{},
   120  			}
   121  			matched, err := regexp.MatchString(lsregex, ls.FileString(fi))
   122  			if err != nil {
   123  				t.Errorf("%q failed at regexp.MatchString: %q", tt.name, err)
   124  			}
   125  			if !matched {
   126  				t.Errorf("%q failed. Output of ls.FileString does not match regular expression", tt.name)
   127  			}
   128  		})
   129  	}
   130  }