Skip to content

Commit

Permalink
Merge pull request #173 from crazy-max/ci-windows
Browse files Browse the repository at this point in the history
ci: add windows to test matrix
  • Loading branch information
tonistiigi authored Feb 8, 2024
2 parents a7e6995 + 3d01fa5 commit d68510a
Show file tree
Hide file tree
Showing 12 changed files with 361 additions and 252 deletions.
7 changes: 5 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -79,11 +79,14 @@ jobs:
with:
targets: test

test-macos:
runs-on: macos-latest
test-os:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os:
- macos-latest
- windows-latest
go:
- "1.19"
- "1.20"
Expand Down
7 changes: 4 additions & 3 deletions diff_containerd.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"context"
"io"
"os"
"path/filepath"
"strings"

"github.com/tonistiigi/fsutil/types"
Expand Down Expand Up @@ -110,7 +111,7 @@ func doubleWalkDiff(ctx context.Context, changeFn ChangeFunc, a, b walkerFn, fil
if filter != nil {
filter(f2.path, &statCopy)
}
f2copy = &currentPath{path: f2.path, stat: &statCopy}
f2copy = &currentPath{path: filepath.FromSlash(f2.path), stat: &statCopy}
}
k, p := pathChange(f1, f2copy)
switch k {
Expand All @@ -127,7 +128,7 @@ func doubleWalkDiff(ctx context.Context, changeFn ChangeFunc, a, b walkerFn, fil
f1 = nil
continue
} else if rmdir == "" && f1.stat.IsDir() {
rmdir = f1.path + string(os.PathSeparator)
rmdir = f1.path + string(filepath.Separator)
} else if rmdir != "" {
rmdir = ""
}
Expand All @@ -138,7 +139,7 @@ func doubleWalkDiff(ctx context.Context, changeFn ChangeFunc, a, b walkerFn, fil
return err
}
if f1.stat.IsDir() && !f2copy.stat.IsDir() {
rmdir = f1.path + string(os.PathSeparator)
rmdir = f1.path + string(filepath.Separator)
} else if rmdir != "" {
rmdir = ""
}
Expand Down
120 changes: 8 additions & 112 deletions diskwriter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,12 @@ import (
"os"
"path/filepath"
"sync"
"syscall"
"testing"
"time"

"github.com/opencontainers/go-digest"
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"golang.org/x/sys/unix"
)

// requiresRoot skips tests that require root
Expand Down Expand Up @@ -54,12 +51,12 @@ func TestWriterSimple(t *testing.T) {
err = Walk(context.Background(), dest, nil, bufWalk(b))
assert.NoError(t, err)

assert.Equal(t, string(b.Bytes()), `dir bar
assert.Equal(t, `dir bar
file bar/foo
symlink:../foo bar/foo2
file foo
file foo2 >foo
`)
`, b.String())

}

Expand Down Expand Up @@ -91,9 +88,9 @@ func TestWriterFileToDir(t *testing.T) {
err = Walk(context.Background(), dest, nil, bufWalk(b))
assert.NoError(t, err)

assert.Equal(t, string(b.Bytes()), `dir foo
assert.Equal(t, `dir foo
file foo/bar
`)
`, b.String())
}

func TestWriterDirToFile(t *testing.T) {
Expand Down Expand Up @@ -124,8 +121,8 @@ func TestWriterDirToFile(t *testing.T) {
err = Walk(context.Background(), dest, nil, bufWalk(b))
assert.NoError(t, err)

assert.Equal(t, string(b.Bytes()), `file foo
`)
assert.Equal(t, `file foo
`, b.String())
}

func TestWalkerWriterSimple(t *testing.T) {
Expand Down Expand Up @@ -153,117 +150,16 @@ func TestWalkerWriterSimple(t *testing.T) {
err = Walk(context.Background(), dest, nil, bufWalk(b))
assert.NoError(t, err)

assert.Equal(t, string(b.Bytes()), `dir bar
assert.Equal(t, filepath.FromSlash(`dir bar
file bar/foo
symlink:../foo bar/foo2
file foo
file foo2
`)
`), b.String())

dt, err := os.ReadFile(filepath.Join(dest, "foo"))
assert.NoError(t, err)
assert.Equal(t, []byte("mydata"), dt)

}

func TestWalkerWriterAsync(t *testing.T) {
d, err := tmpDir(changeStream([]string{
"ADD foo dir",
"ADD foo/foo1 file data1",
"ADD foo/foo2 file data2",
"ADD foo/foo3 file data3",
"ADD foo/foo4 file >foo/foo3",
"ADD foo5 file data5",
}))
assert.NoError(t, err)
defer os.RemoveAll(d)

dest := t.TempDir()

dw, err := NewDiskWriter(context.TODO(), dest, DiskWriterOpt{
AsyncDataCb: newWriteToFunc(d, 300*time.Millisecond),
})
assert.NoError(t, err)

st := time.Now()

err = Walk(context.Background(), d, nil, readAsAdd(dw.HandleChange))
assert.NoError(t, err)

err = dw.Wait(context.TODO())
assert.NoError(t, err)

dt, err := os.ReadFile(filepath.Join(dest, "foo/foo3"))
assert.NoError(t, err)
assert.Equal(t, "data3", string(dt))

dt, err = os.ReadFile(filepath.Join(dest, "foo/foo4"))
assert.NoError(t, err)
assert.Equal(t, "data3", string(dt))

fi1, err := os.Lstat(filepath.Join(dest, "foo/foo3"))
assert.NoError(t, err)
fi2, err := os.Lstat(filepath.Join(dest, "foo/foo4"))
assert.NoError(t, err)
stat1, ok1 := fi1.Sys().(*syscall.Stat_t)
stat2, ok2 := fi2.Sys().(*syscall.Stat_t)
if ok1 && ok2 {
assert.Equal(t, stat1.Ino, stat2.Ino)
}

dt, err = os.ReadFile(filepath.Join(dest, "foo5"))
assert.NoError(t, err)
assert.Equal(t, "data5", string(dt))

duration := time.Since(st)
assert.True(t, duration < 500*time.Millisecond)
}

func TestWalkerWriterDevices(t *testing.T) {
requiresRoot(t)

d, err := tmpDir(changeStream([]string{
"ADD foo dir",
"ADD foo/foo1 file data1",
}))
require.NoError(t, err)

err = unix.Mknod(filepath.Join(d, "foo/block"), syscall.S_IFBLK|0600, mkdev(2, 3))
require.NoError(t, err)

err = unix.Mknod(filepath.Join(d, "foo/char"), syscall.S_IFCHR|0400, mkdev(1, 9))
require.NoError(t, err)

dest := t.TempDir()

dw, err := NewDiskWriter(context.TODO(), dest, DiskWriterOpt{
SyncDataCb: newWriteToFunc(d, 0),
})
assert.NoError(t, err)

err = Walk(context.Background(), d, nil, readAsAdd(dw.HandleChange))
assert.NoError(t, err)

err = dw.Wait(context.TODO())
assert.NoError(t, err)

fi, err := os.Lstat(filepath.Join(dest, "foo/char"))
require.NoError(t, err)

stat, ok := fi.Sys().(*syscall.Stat_t)
require.True(t, ok)

assert.Equal(t, uint64(1), stat.Rdev>>8)
assert.Equal(t, uint64(9), stat.Rdev&0xff)

fi, err = os.Lstat(filepath.Join(dest, "foo/block"))
require.NoError(t, err)

stat, ok = fi.Sys().(*syscall.Stat_t)
require.True(t, ok)

assert.Equal(t, uint64(2), stat.Rdev>>8)
assert.Equal(t, uint64(3), stat.Rdev&0xff)
}

func readAsAdd(f HandleChangeFn) filepath.WalkFunc {
Expand Down
117 changes: 117 additions & 0 deletions diskwriter_unix_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
//go:build !windows
// +build !windows

package fsutil

import (
"context"
"os"
"path/filepath"
"syscall"
"testing"
"time"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"golang.org/x/sys/unix"
)

func TestWalkerWriterAsync(t *testing.T) {
d, err := tmpDir(changeStream([]string{
"ADD foo dir",
"ADD foo/foo1 file data1",
"ADD foo/foo2 file data2",
"ADD foo/foo3 file data3",
"ADD foo/foo4 file >foo/foo3",
"ADD foo5 file data5",
}))
assert.NoError(t, err)
defer os.RemoveAll(d)

dest := t.TempDir()

dw, err := NewDiskWriter(context.TODO(), dest, DiskWriterOpt{
AsyncDataCb: newWriteToFunc(d, 300*time.Millisecond),
})
assert.NoError(t, err)

st := time.Now()

err = Walk(context.Background(), d, nil, readAsAdd(dw.HandleChange))
assert.NoError(t, err)

err = dw.Wait(context.TODO())
assert.NoError(t, err)

dt, err := os.ReadFile(filepath.Join(dest, "foo/foo3"))
assert.NoError(t, err)
assert.Equal(t, "data3", string(dt))

dt, err = os.ReadFile(filepath.Join(dest, "foo/foo4"))
assert.NoError(t, err)
assert.Equal(t, "data3", string(dt))

fi1, err := os.Lstat(filepath.Join(dest, "foo/foo3"))
assert.NoError(t, err)
fi2, err := os.Lstat(filepath.Join(dest, "foo/foo4"))
assert.NoError(t, err)
stat1, ok1 := fi1.Sys().(*syscall.Stat_t)
stat2, ok2 := fi2.Sys().(*syscall.Stat_t)
if ok1 && ok2 {
assert.Equal(t, stat1.Ino, stat2.Ino)
}

dt, err = os.ReadFile(filepath.Join(dest, "foo5"))
assert.NoError(t, err)
assert.Equal(t, "data5", string(dt))

duration := time.Since(st)
assert.True(t, duration < 500*time.Millisecond)
}

func TestWalkerWriterDevices(t *testing.T) {
requiresRoot(t)

d, err := tmpDir(changeStream([]string{
"ADD foo dir",
"ADD foo/foo1 file data1",
}))
require.NoError(t, err)

err = unix.Mknod(filepath.Join(d, "foo/block"), syscall.S_IFBLK|0600, mkdev(2, 3))
require.NoError(t, err)

err = unix.Mknod(filepath.Join(d, "foo/char"), syscall.S_IFCHR|0400, mkdev(1, 9))
require.NoError(t, err)

dest := t.TempDir()

dw, err := NewDiskWriter(context.TODO(), dest, DiskWriterOpt{
SyncDataCb: newWriteToFunc(d, 0),
})
assert.NoError(t, err)

err = Walk(context.Background(), d, nil, readAsAdd(dw.HandleChange))
assert.NoError(t, err)

err = dw.Wait(context.TODO())
assert.NoError(t, err)

fi, err := os.Lstat(filepath.Join(dest, "foo/char"))
require.NoError(t, err)

stat, ok := fi.Sys().(*syscall.Stat_t)
require.True(t, ok)

assert.Equal(t, uint64(1), stat.Rdev>>8)
assert.Equal(t, uint64(9), stat.Rdev&0xff)

fi, err = os.Lstat(filepath.Join(dest, "foo/block"))
require.NoError(t, err)

stat, ok = fi.Sys().(*syscall.Stat_t)
require.True(t, ok)

assert.Equal(t, uint64(2), stat.Rdev>>8)
assert.Equal(t, uint64(3), stat.Rdev&0xff)
}
2 changes: 1 addition & 1 deletion filter.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ func NewFilterFS(fs FS, opt *FilterOpt) (FS, error) {
}

patternChars := "*[]?^"
if os.PathSeparator != '\\' {
if filepath.Separator != '\\' {
patternChars += `\`
}

Expand Down
Loading

0 comments on commit d68510a

Please sign in to comment.