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 }