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 }