mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-09 21:43:40 +00:00
os: implement file.Seek, add smoke test
This commit is contained in:
+51
-1
@@ -6,9 +6,11 @@ package os_test
|
||||
|
||||
import (
|
||||
"io"
|
||||
"io/ioutil"
|
||||
. "os"
|
||||
"runtime"
|
||||
"strings"
|
||||
"syscall"
|
||||
"testing"
|
||||
)
|
||||
|
||||
@@ -20,7 +22,7 @@ func localTmp() string {
|
||||
func newFile(testName string, t *testing.T) (f *File) {
|
||||
f, err := CreateTemp("", testName)
|
||||
if err != nil {
|
||||
t.Fatalf("TempFile %s: %s", testName, err)
|
||||
t.Fatalf("newFile %s: CreateTemp fails with %s", testName, err)
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -86,6 +88,54 @@ func checkMode(t *testing.T, path string, mode FileMode) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestSeek(t *testing.T) {
|
||||
f := newFile("TestSeek", t)
|
||||
if f == nil {
|
||||
t.Fatalf("f is nil")
|
||||
return // TODO: remove
|
||||
}
|
||||
defer Remove(f.Name())
|
||||
defer f.Close()
|
||||
|
||||
const data = "hello, world\n"
|
||||
io.WriteString(f, data)
|
||||
|
||||
type test struct {
|
||||
in int64
|
||||
whence int
|
||||
out int64
|
||||
}
|
||||
var tests = []test{
|
||||
{0, io.SeekCurrent, int64(len(data))},
|
||||
{0, io.SeekStart, 0},
|
||||
{5, io.SeekStart, 5},
|
||||
{0, io.SeekEnd, int64(len(data))},
|
||||
{0, io.SeekStart, 0},
|
||||
{-1, io.SeekEnd, int64(len(data)) - 1},
|
||||
{1 << 33, io.SeekStart, 1 << 33},
|
||||
{1 << 33, io.SeekEnd, 1<<33 + int64(len(data))},
|
||||
|
||||
// Issue 21681, Windows 4G-1, etc:
|
||||
{1<<32 - 1, io.SeekStart, 1<<32 - 1},
|
||||
{0, io.SeekCurrent, 1<<32 - 1},
|
||||
{2<<32 - 1, io.SeekStart, 2<<32 - 1},
|
||||
{0, io.SeekCurrent, 2<<32 - 1},
|
||||
}
|
||||
for i, tt := range tests {
|
||||
off, err := f.Seek(tt.in, tt.whence)
|
||||
if off != tt.out || err != nil {
|
||||
if e, ok := err.(*PathError); ok && e.Err == syscall.EINVAL && tt.out > 1<<32 && runtime.GOOS == "linux" {
|
||||
mounts, _ := ioutil.ReadFile("/proc/mounts")
|
||||
if strings.Contains(string(mounts), "reiserfs") {
|
||||
// Reiserfs rejects the big seeks.
|
||||
t.Skipf("skipping test known to fail on reiserfs; https://golang.org/issue/91")
|
||||
}
|
||||
}
|
||||
t.Errorf("#%d: Seek(%v, %v) = %v, %v want %v, nil", i, tt.in, tt.whence, off, err, tt.out)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestReadAt(t *testing.T) {
|
||||
if runtime.GOOS == "windows" {
|
||||
t.Log("TODO: implement Pread for Windows")
|
||||
|
||||
Reference in New Issue
Block a user