Windows CI: test-unit pkg\archive step 1
Signed-off-by: John Howard <jhoward@microsoft.com>
This commit is contained in:
parent
82fe40e860
commit
e178bdf28e
2 changed files with 88 additions and 83 deletions
|
@ -850,89 +850,6 @@ func TestTarWithBlockCharFifo(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestTarWithHardLink(t *testing.T) {
|
|
||||||
origin, err := ioutil.TempDir("", "docker-test-tar-hardlink")
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
defer os.RemoveAll(origin)
|
|
||||||
if err := ioutil.WriteFile(path.Join(origin, "1"), []byte("hello world"), 0700); err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
if err := os.Link(path.Join(origin, "1"), path.Join(origin, "2")); err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
var i1, i2 uint64
|
|
||||||
if i1, err = getNlink(path.Join(origin, "1")); err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
// sanity check that we can hardlink
|
|
||||||
if i1 != 2 {
|
|
||||||
t.Skipf("skipping since hardlinks don't work here; expected 2 links, got %d", i1)
|
|
||||||
}
|
|
||||||
|
|
||||||
dest, err := ioutil.TempDir("", "docker-test-tar-hardlink-dest")
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
defer os.RemoveAll(dest)
|
|
||||||
|
|
||||||
// we'll do this in two steps to separate failure
|
|
||||||
fh, err := Tar(origin, Uncompressed)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ensure we can read the whole thing with no error, before writing back out
|
|
||||||
buf, err := ioutil.ReadAll(fh)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
bRdr := bytes.NewReader(buf)
|
|
||||||
err = Untar(bRdr, dest, &TarOptions{Compression: Uncompressed})
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if i1, err = getInode(path.Join(dest, "1")); err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
if i2, err = getInode(path.Join(dest, "2")); err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if i1 != i2 {
|
|
||||||
t.Errorf("expected matching inodes, but got %d and %d", i1, i2)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func getNlink(path string) (uint64, error) {
|
|
||||||
stat, err := os.Stat(path)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
statT, ok := stat.Sys().(*syscall.Stat_t)
|
|
||||||
if !ok {
|
|
||||||
return 0, fmt.Errorf("expected type *syscall.Stat_t, got %t", stat.Sys())
|
|
||||||
}
|
|
||||||
// We need this conversion on ARM64
|
|
||||||
return uint64(statT.Nlink), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func getInode(path string) (uint64, error) {
|
|
||||||
stat, err := os.Stat(path)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
statT, ok := stat.Sys().(*syscall.Stat_t)
|
|
||||||
if !ok {
|
|
||||||
return 0, fmt.Errorf("expected type *syscall.Stat_t, got %t", stat.Sys())
|
|
||||||
}
|
|
||||||
return statT.Ino, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func prepareUntarSourceDirectory(numberOfFiles int, targetPath string, makeLinks bool) (int, error) {
|
func prepareUntarSourceDirectory(numberOfFiles int, targetPath string, makeLinks bool) (int, error) {
|
||||||
fileData := []byte("fooo")
|
fileData := []byte("fooo")
|
||||||
for n := 0; n < numberOfFiles; n++ {
|
for n := 0; n < numberOfFiles; n++ {
|
||||||
|
|
|
@ -3,7 +3,12 @@
|
||||||
package archive
|
package archive
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
|
"path"
|
||||||
|
"syscall"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -58,3 +63,86 @@ func TestChmodTarEntry(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestTarWithHardLink(t *testing.T) {
|
||||||
|
origin, err := ioutil.TempDir("", "docker-test-tar-hardlink")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(origin)
|
||||||
|
if err := ioutil.WriteFile(path.Join(origin, "1"), []byte("hello world"), 0700); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if err := os.Link(path.Join(origin, "1"), path.Join(origin, "2")); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var i1, i2 uint64
|
||||||
|
if i1, err = getNlink(path.Join(origin, "1")); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
// sanity check that we can hardlink
|
||||||
|
if i1 != 2 {
|
||||||
|
t.Skipf("skipping since hardlinks don't work here; expected 2 links, got %d", i1)
|
||||||
|
}
|
||||||
|
|
||||||
|
dest, err := ioutil.TempDir("", "docker-test-tar-hardlink-dest")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(dest)
|
||||||
|
|
||||||
|
// we'll do this in two steps to separate failure
|
||||||
|
fh, err := Tar(origin, Uncompressed)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ensure we can read the whole thing with no error, before writing back out
|
||||||
|
buf, err := ioutil.ReadAll(fh)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
bRdr := bytes.NewReader(buf)
|
||||||
|
err = Untar(bRdr, dest, &TarOptions{Compression: Uncompressed})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if i1, err = getInode(path.Join(dest, "1")); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if i2, err = getInode(path.Join(dest, "2")); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if i1 != i2 {
|
||||||
|
t.Errorf("expected matching inodes, but got %d and %d", i1, i2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func getNlink(path string) (uint64, error) {
|
||||||
|
stat, err := os.Stat(path)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
statT, ok := stat.Sys().(*syscall.Stat_t)
|
||||||
|
if !ok {
|
||||||
|
return 0, fmt.Errorf("expected type *syscall.Stat_t, got %t", stat.Sys())
|
||||||
|
}
|
||||||
|
// We need this conversion on ARM64
|
||||||
|
return uint64(statT.Nlink), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getInode(path string) (uint64, error) {
|
||||||
|
stat, err := os.Stat(path)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
statT, ok := stat.Sys().(*syscall.Stat_t)
|
||||||
|
if !ok {
|
||||||
|
return 0, fmt.Errorf("expected type *syscall.Stat_t, got %t", stat.Sys())
|
||||||
|
}
|
||||||
|
return statT.Ino, nil
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue