github.com/weiwenhao/getter@v1.30.1/decompress_tar_test.go (about)

     1  package getter
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  	"path/filepath"
     7  	"runtime"
     8  	"testing"
     9  	"time"
    10  )
    11  
    12  func TestTar(t *testing.T) {
    13  	mtime := time.Unix(0, 0)
    14  	cases := []TestDecompressCase{
    15  		{
    16  			"extended_header.tar",
    17  			true,
    18  			false,
    19  			[]string{"directory/", "directory/a", "directory/b"},
    20  			"",
    21  			nil,
    22  		},
    23  		{
    24  			"implied_dir.tar",
    25  			true,
    26  			false,
    27  			[]string{"directory/", "directory/sub/", "directory/sub/a", "directory/sub/b"},
    28  			"",
    29  			nil,
    30  		},
    31  		{
    32  			"unix_time_0.tar",
    33  			true,
    34  			false,
    35  			[]string{"directory/", "directory/sub/", "directory/sub/a", "directory/sub/b"},
    36  			"",
    37  			&mtime,
    38  		},
    39  	}
    40  
    41  	for i, tc := range cases {
    42  		cases[i].Input = filepath.Join("./testdata", "decompress-tar", tc.Input)
    43  	}
    44  
    45  	TestDecompressor(t, new(TarDecompressor), cases)
    46  }
    47  
    48  // testDecompressPermissions decompresses a directory and checks the permissions of the expanded files
    49  func testDecompressorPermissions(t *testing.T, d Decompressor, input string, expected map[string]int, umask os.FileMode) {
    50  	td, err := ioutil.TempDir("", "getter")
    51  	if err != nil {
    52  		t.Fatalf("err: %s", err)
    53  	}
    54  
    55  	// Destination is always joining result so that we have a new path
    56  	dst := filepath.Join(td, "subdir", "result")
    57  
    58  	err = d.Decompress(dst, input, true, umask)
    59  	if err != nil {
    60  		t.Fatalf("err: %s", err)
    61  	}
    62  
    63  	defer os.RemoveAll(dst)
    64  
    65  	for name, mode := range expected {
    66  		fi, err := os.Stat(filepath.Join(dst, name))
    67  		if err != nil {
    68  			t.Fatalf("err: %s", err)
    69  		}
    70  
    71  		real := fi.Mode()
    72  		if real != os.FileMode(mode) {
    73  			t.Fatalf("err: %s expected mode %o got %o", name, mode, real)
    74  		}
    75  	}
    76  }
    77  
    78  func TestDecompressTarPermissions(t *testing.T) {
    79  	d := new(TarDecompressor)
    80  	input := "./test-fixtures/decompress-tar/permissions.tar"
    81  
    82  	var expected map[string]int
    83  	var masked int
    84  
    85  	if runtime.GOOS == "windows" {
    86  		expected = map[string]int{
    87  			"directory/public":  0666,
    88  			"directory/private": 0666,
    89  			"directory/exec":    0666,
    90  			"directory/setuid":  0666,
    91  		}
    92  		masked = 0666
    93  	} else {
    94  		expected = map[string]int{
    95  			"directory/public":  0666,
    96  			"directory/private": 0600,
    97  			"directory/exec":    0755,
    98  			"directory/setuid":  040000755,
    99  		}
   100  		masked = 0755
   101  	}
   102  
   103  	testDecompressorPermissions(t, d, input, expected, os.FileMode(0))
   104  
   105  	expected["directory/setuid"] = masked
   106  	testDecompressorPermissions(t, d, input, expected, os.FileMode(060000000))
   107  }