github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/pipes/file/file_test.go (about)

     1  package file
     2  
     3  import (
     4  	"fmt"
     5  	"math/rand"
     6  	"os"
     7  	"strings"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/lmorg/murex/lang/types"
    12  	"github.com/lmorg/murex/test/count"
    13  )
    14  
    15  func init() {
    16  	rand.Seed(time.Now().UnixNano())
    17  }
    18  
    19  func TestSetDataType(t *testing.T) {
    20  	count.Tests(t, 3)
    21  
    22  	filename := fmt.Sprintf("%s-%d.test", t.Name(), rand.Int())
    23  
    24  	f, err := NewFile(filename)
    25  	if err != nil {
    26  		t.Errorf(err.Error())
    27  	}
    28  
    29  	defer func() {
    30  		err = os.Remove(filename)
    31  		if err != nil {
    32  			t.Errorf("Unable to delete '%s' (please do this manually): %s", filename, err.Error())
    33  		}
    34  	}()
    35  
    36  	f.SetDataType("foo")
    37  	dt := f.GetDataType()
    38  	if dt != types.Null {
    39  		t.Errorf("Data should be %s: '%s'", types.Null, dt)
    40  	}
    41  
    42  	f.SetDataType("bar")
    43  	dt = f.GetDataType()
    44  	if dt != types.Null {
    45  		t.Errorf("Data type still should be %s: '%s'", types.Null, dt)
    46  	}
    47  }
    48  
    49  func TestSetOpenClose(t *testing.T) {
    50  	count.Tests(t, 2)
    51  
    52  	filename := fmt.Sprintf("%s-%d.test", t.Name(), rand.Int())
    53  
    54  	f, err := NewFile(filename)
    55  	if err != nil {
    56  		t.Errorf(err.Error())
    57  	}
    58  
    59  	defer func() {
    60  		err = os.Remove(filename)
    61  		if err != nil {
    62  			t.Errorf("Unable to delete '%s' (please do this manually): %s", filename, err.Error())
    63  		}
    64  	}()
    65  
    66  	f.Open()
    67  	f.Close()
    68  }
    69  
    70  func TestSetCloseError1(t *testing.T) {
    71  	count.Tests(t, 1)
    72  
    73  	filename := fmt.Sprintf("%s-%d.test", t.Name(), rand.Int())
    74  
    75  	f, err := NewFile(filename)
    76  	if err != nil {
    77  		t.Errorf(err.Error())
    78  	}
    79  
    80  	defer func() {
    81  		err = os.Remove(filename)
    82  		if err != nil {
    83  			t.Errorf("Unable to delete '%s' (please do this manually): %s", filename, err.Error())
    84  		}
    85  	}()
    86  
    87  	defer func() {
    88  		if r := recover(); r == nil {
    89  			t.Error("expecting a panic due to more closed dependant than open")
    90  		}
    91  	}()
    92  
    93  	f.Close()
    94  }
    95  
    96  func TestSetOpenCloseError(t *testing.T) {
    97  	count.Tests(t, 3)
    98  
    99  	filename := fmt.Sprintf("%s-%d.test", t.Name(), rand.Int())
   100  
   101  	f, err := NewFile(filename)
   102  	if err != nil {
   103  		t.Errorf(err.Error())
   104  	}
   105  
   106  	defer func() {
   107  		err = os.Remove(filename)
   108  		if err != nil {
   109  			t.Errorf("Unable to delete '%s' (please do this manually): %s", filename, err.Error())
   110  		}
   111  	}()
   112  
   113  	f.Open()
   114  	f.Close()
   115  
   116  	defer func() {
   117  		if r := recover(); r == nil {
   118  			t.Error("expecting a panic due to more closed dependant than open")
   119  		}
   120  	}()
   121  
   122  	f.Close()
   123  }
   124  
   125  func TestSetForceClose(t *testing.T) {
   126  	count.Tests(t, 3)
   127  
   128  	filename := fmt.Sprintf("%s-%d.test", t.Name(), rand.Int())
   129  
   130  	f, err := NewFile(filename)
   131  	if err != nil {
   132  		t.Errorf(err.Error())
   133  	}
   134  
   135  	defer func() {
   136  		err = os.Remove(filename)
   137  		if err != nil {
   138  			t.Errorf("Unable to delete '%s' (please do this manually): %s", filename, err.Error())
   139  		}
   140  	}()
   141  
   142  	f.ForceClose()
   143  }
   144  
   145  func TestSetOpenForceClose(t *testing.T) {
   146  	count.Tests(t, 3)
   147  
   148  	filename := fmt.Sprintf("%s-%d.test", t.Name(), rand.Int())
   149  
   150  	f, err := NewFile(filename)
   151  	if err != nil {
   152  		t.Errorf(err.Error())
   153  	}
   154  
   155  	defer func() {
   156  		err = os.Remove(filename)
   157  		if err != nil {
   158  			t.Errorf("Unable to delete '%s' (please do this manually): %s", filename, err.Error())
   159  		}
   160  	}()
   161  
   162  	f.Open()
   163  	f.ForceClose()
   164  }
   165  
   166  func TestSetWriteStat(t *testing.T) {
   167  	count.Tests(t, 4)
   168  
   169  	filename := fmt.Sprintf("%s-%d.test", t.Name(), rand.Int())
   170  
   171  	f, err := NewFile(filename)
   172  	if err != nil {
   173  		t.Errorf(err.Error())
   174  	}
   175  
   176  	defer func() {
   177  		err = os.Remove(filename)
   178  		if err != nil {
   179  			t.Errorf("Unable to delete '%s' (please do this manually): %s", filename, err.Error())
   180  		}
   181  	}()
   182  
   183  	f.Open()
   184  	i, err := f.Write([]byte("12345"))
   185  	if err != nil {
   186  		t.Error(err.Error())
   187  	}
   188  	w, r := f.Stats()
   189  	f.Close()
   190  
   191  	if i != 5 || r != 0 || w != 5 {
   192  		t.Error("Stats reporting incorrect values:")
   193  		t.Logf("  i: %d, expected: 5", i)
   194  		t.Logf("  r: %d, expected: 0", r)
   195  		t.Logf("  w: %d, expected: 5", w)
   196  	}
   197  }
   198  
   199  func TestSetWritelnStat(t *testing.T) {
   200  	count.Tests(t, 4)
   201  
   202  	filename := fmt.Sprintf("%s-%d.test", t.Name(), rand.Int())
   203  
   204  	f, err := NewFile(filename)
   205  	if err != nil {
   206  		t.Errorf(err.Error())
   207  	}
   208  
   209  	defer func() {
   210  		err = os.Remove(filename)
   211  		if err != nil {
   212  			t.Errorf("Unable to delete '%s' (please do this manually): %s", filename, err.Error())
   213  		}
   214  	}()
   215  
   216  	f.Open()
   217  	i, err := f.Writeln([]byte("12345"))
   218  	if err != nil {
   219  		t.Error(err.Error())
   220  	}
   221  	w, r := f.Stats()
   222  	f.Close()
   223  
   224  	if i != 6 || r != 0 || w != 6 {
   225  		t.Error("Stats reporting incorrect values:")
   226  		t.Logf("  i: %d, expected: 6", i)
   227  		t.Logf("  r: %d, expected: 0", r)
   228  		t.Logf("  w: %d, expected: 6", w)
   229  	}
   230  }
   231  
   232  func TestSetWriteAfterClose(t *testing.T) {
   233  	count.Tests(t, 3)
   234  
   235  	filename := fmt.Sprintf("%s-%d.test", t.Name(), rand.Int())
   236  
   237  	f, err := NewFile(filename)
   238  	if err != nil {
   239  		t.Errorf(err.Error())
   240  	}
   241  
   242  	defer func() {
   243  		err = os.Remove(filename)
   244  		if err != nil {
   245  			t.Errorf("Unable to delete '%s' (please do this manually): %s", filename, err.Error())
   246  		}
   247  	}()
   248  
   249  	f.Open()
   250  	f.Close()
   251  	i, err := f.Write([]byte("12345"))
   252  	if i != 0 || err == nil ||
   253  		(err != nil && !strings.Contains(err.Error(), "closed pipe")) {
   254  		t.Error("Call should error:")
   255  		t.Logf("  i:   %d", i)
   256  		t.Logf("  err: %v", err)
   257  	}
   258  }
   259  
   260  func TestSetWritelnAfterClose(t *testing.T) {
   261  	count.Tests(t, 3)
   262  
   263  	filename := fmt.Sprintf("%s-%d.test", t.Name(), rand.Int())
   264  
   265  	f, err := NewFile(filename)
   266  	if err != nil {
   267  		t.Errorf(err.Error())
   268  	}
   269  
   270  	defer func() {
   271  		err = os.Remove(filename)
   272  		if err != nil {
   273  			t.Errorf("Unable to delete '%s' (please do this manually): %s", filename, err.Error())
   274  		}
   275  	}()
   276  
   277  	f.Open()
   278  	f.Close()
   279  	i, err := f.Writeln([]byte("12345"))
   280  	if i != 0 || err == nil ||
   281  		(err != nil && !strings.Contains(err.Error(), "closed pipe")) {
   282  		t.Error("Call should error:")
   283  		t.Logf("  i:   %d", i)
   284  		t.Logf("  err: %v", err)
   285  	}
   286  }