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  }