github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/updater/util/unzip_nix_test.go (about) 1 // Copyright 2015 Keybase, Inc. All rights reserved. Use of 2 // this source code is governed by the included BSD license. 3 4 //go:build !windows 5 // +build !windows 6 7 package util 8 9 import ( 10 "os" 11 "os/user" 12 "path/filepath" 13 "runtime" 14 "strconv" 15 "syscall" 16 "testing" 17 "time" 18 19 "github.com/stretchr/testify/assert" 20 "github.com/stretchr/testify/require" 21 ) 22 23 // TestUnzipOtherUser checks to make sure that a zip file created from a 24 // different uid has the current uid after unpacking. 25 func TestUnzipOtherUser(t *testing.T) { 26 if runtime.GOOS == "windows" { 27 t.Skip("Unsupported on windows") 28 } 29 _, filename, _, _ := runtime.Caller(0) 30 testZipOtherUserPath := filepath.Join(filepath.Dir(filename), "../test/test-uid-503.zip") 31 destinationPath := TempPath("", "TestUnzipOtherUser.") 32 err := Unzip(testZipOtherUserPath, destinationPath, testLog) 33 require.NoError(t, err) 34 35 // Get uid, gid of current user 36 currentUser, err := user.Current() 37 require.NoError(t, err) 38 uid, err := strconv.Atoi(currentUser.Uid) 39 require.NoError(t, err) 40 41 fileInfo, err := os.Stat(filepath.Join(destinationPath, "test")) 42 require.NoError(t, err) 43 fileUID := fileInfo.Sys().(*syscall.Stat_t).Uid 44 assert.Equal(t, uid, int(fileUID)) 45 } 46 47 // TestUnzipFileModTime checks to make sure after unpacking zip file the file 48 // modification time is "now" and not the original file time. 49 func TestUnzipFileModTime(t *testing.T) { 50 // Fudge now a bit, since the timestamps below on Linux seem 51 // to happen a bit *before* now. 52 now := time.Now().Add(-time.Second) 53 t.Logf("Now: %s", now) 54 destinationPath := TempPath("", "TestUnzipFileModTime.") 55 err := Unzip(testZipPath, destinationPath, testLog) 56 require.NoError(t, err) 57 58 fileInfo, err := os.Stat(filepath.Join(destinationPath, "test")) 59 require.NoError(t, err) 60 dirMod := fileInfo.ModTime() 61 diffDir := dirMod.Sub(now) 62 t.Logf("Diff (dir): %s", diffDir) 63 assert.True(t, diffDir >= 0, "now=%s, dirtime=%s", now, dirMod) 64 65 fileInfo, err = os.Stat(filepath.Join(destinationPath, "test", "testfile")) 66 require.NoError(t, err) 67 fileMod := fileInfo.ModTime() 68 diffFile := fileMod.Sub(now) 69 t.Logf("Diff (file): %s", diffFile) 70 assert.True(t, diffFile >= 0, "now=%s, filetime=%s", now, fileMod) 71 }