github.com/mvdan/u-root-coreutils@v0.0.0-20230122170626-c2eef2898555/pkg/logutil/logutil_test.go (about) 1 // Copyright 2022 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 logutil 6 7 import ( 8 "bytes" 9 "log" 10 "os" 11 "path/filepath" 12 "strings" 13 "testing" 14 ) 15 16 func TestNewFileWriter(t *testing.T) { 17 for _, tt := range []struct { 18 name string 19 dirPath string 20 filename string 21 maxSize int 22 startContent []byte 23 appendContent []byte 24 wantContent []byte 25 wantError bool 26 }{ 27 { 28 name: "append to file", 29 dirPath: "", 30 filename: "file.log", 31 maxSize: 1024, 32 startContent: []byte("foo"), 33 appendContent: []byte("bar"), 34 wantContent: []byte("foobar"), 35 wantError: false, 36 }, 37 { 38 name: "append to file too large", 39 dirPath: "", 40 filename: "file.log", 41 maxSize: -1, 42 startContent: []byte("foo"), 43 appendContent: []byte("bar"), 44 wantContent: []byte("foo"), 45 wantError: false, 46 }, 47 { 48 name: "append overflow", 49 dirPath: "", 50 filename: "file.log", 51 maxSize: 5, 52 startContent: []byte("foo"), 53 appendContent: []byte("bar"), 54 wantContent: []byte("fooba"), 55 wantError: false, 56 }, 57 { 58 name: "dir missing", 59 dirPath: "dir", 60 filename: "file.log", 61 maxSize: 1024, 62 startContent: []byte(""), 63 appendContent: []byte("bar"), 64 wantContent: []byte(""), 65 wantError: true, 66 }, 67 } { 68 dir, err := os.MkdirTemp("", "testdir") 69 if err != nil { 70 t.Errorf("TestNewFileWriter(%s): MkdirTemp errored: %v", tt.name, err) 71 } 72 defer os.RemoveAll(dir) 73 if tt.dirPath != "" { 74 dir = filepath.Join(dir, tt.dirPath) 75 } 76 if len(tt.startContent) > 0 { 77 f, err := os.Create(filepath.Join(dir, tt.filename)) 78 if err != nil { 79 t.Errorf("TestNewFileWriter(%s): Creating start file errored: %v", tt.name, err) 80 } 81 n, err := f.Write(tt.startContent) 82 if err != nil { 83 t.Errorf("TestNewFileWriter(%s): Start file errored: %v", tt.name, err) 84 } 85 if n != len(tt.startContent) { 86 t.Errorf("TestNewFileWriter(%s): Start file Write() got %v, expected %v", tt.name, n, len(tt.startContent)) 87 } 88 f.Close() 89 } 90 w, err := NewWriterToFile(tt.maxSize, filepath.Join(dir, tt.filename)) 91 if (err != nil) != tt.wantError { 92 t.Errorf("TestNewFileWriter(%s): NewWriterToFile errored: %v, expected error: %v", tt.name, err, tt.wantError) 93 } 94 if tt.wantError { 95 continue 96 } 97 n, err := w.Write(tt.appendContent) 98 if err != nil { 99 t.Errorf("TestNewFileWriter(%s): Write errored: %v", tt.name, err) 100 } 101 if n != len(tt.appendContent) { 102 t.Errorf("TestNewFileWriter(%s): Write() got %v, want %v", tt.name, n, len(tt.appendContent)) 103 } 104 105 dat, err := os.ReadFile(filepath.Join(dir, tt.filename)) 106 if err != nil { 107 t.Errorf("TestNewFileWriter(%s): ReadFile errored with: %v", tt.name, err) 108 } 109 if !bytes.Equal(dat, tt.wantContent) { 110 t.Errorf("TestNewFileWriter(%s): got %v, expected %v", tt.name, dat, tt.wantContent) 111 } 112 } 113 } 114 115 func TestTeeOutput(t *testing.T) { 116 for _, tt := range []struct { 117 name string 118 path string 119 maxSize int 120 wantContent string 121 wantError bool 122 }{ 123 { 124 name: "init dir", 125 path: "test/file.log", 126 maxSize: 1024, 127 wantContent: "foobar", 128 wantError: false, 129 }, 130 { 131 name: "empty log path", 132 path: "", 133 maxSize: 1024, 134 wantContent: "empty", 135 wantError: false, 136 }, 137 { 138 name: "simple file", 139 path: "file.log", 140 maxSize: 1024, 141 wantContent: "foobar2", 142 wantError: false, 143 }, 144 } { 145 dir, err := os.MkdirTemp("", "testdir") 146 if err != nil { 147 t.Errorf("TestTeeOutput(%s): MkdirTemp errored: %v", tt.name, err) 148 } 149 defer os.RemoveAll(dir) 150 if tt.path != "" { 151 os.Unsetenv("UROOT_LOG_PATH") 152 os.Setenv("UROOT_LOG_PATH", filepath.Join(dir, tt.path)) 153 } 154 defer os.Unsetenv("UROOT_LOG_PATH") 155 156 _, err = TeeOutput(os.Stderr, tt.maxSize) 157 if (err != nil) != tt.wantError { 158 t.Errorf("TestTeeOutput(%s): TeeOutput errored: %v, expected error: %v", tt.name, err, tt.wantError) 159 } 160 if tt.wantError { 161 continue 162 } 163 164 // Check if log tees output to file. 165 log.Print(tt.wantContent) 166 if tt.path == "" { 167 continue 168 } 169 170 dat, err := os.ReadFile(os.Getenv("UROOT_LOG_PATH")) 171 if err != nil { 172 t.Errorf("TestTeeOutput(%s): ReadFile errored with: %v", tt.name, err) 173 } 174 if !strings.Contains(string(dat), tt.wantContent) { 175 t.Errorf("TestTeeOutput(%s): got %s, expected %s to be contained", tt.name, dat, tt.wantContent) 176 } 177 } 178 }