github.com/opencontainers/umoci@v0.4.8-0.20240508124516-656e4836fb0d/pkg/system/utime_unix_test.go (about)

     1  /*
     2   * umoci: Umoci Modifies Open Containers' Images
     3   * Copyright (C) 2016-2020 SUSE LLC
     4   *
     5   * Licensed under the Apache License, Version 2.0 (the "License");
     6   * you may not use this file except in compliance with the License.
     7   * You may obtain a copy of the License at
     8   *
     9   *    http://www.apache.org/licenses/LICENSE-2.0
    10   *
    11   * Unless required by applicable law or agreed to in writing, software
    12   * distributed under the License is distributed on an "AS IS" BASIS,
    13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14   * See the License for the specific language governing permissions and
    15   * limitations under the License.
    16   */
    17  
    18  package system
    19  
    20  import (
    21  	"io/ioutil"
    22  	"os"
    23  	"path/filepath"
    24  	"testing"
    25  	"time"
    26  
    27  	"github.com/opencontainers/umoci/pkg/testutils"
    28  	"golang.org/x/sys/unix"
    29  )
    30  
    31  func TestLutimesFile(t *testing.T) {
    32  	var fiOld, fiNew unix.Stat_t
    33  
    34  	dir, err := ioutil.TempDir("", "umoci-system.TestLutimesFile")
    35  	if err != nil {
    36  		t.Fatal(err)
    37  	}
    38  	defer os.RemoveAll(dir)
    39  
    40  	path := filepath.Join(dir, "some file")
    41  
    42  	if err := ioutil.WriteFile(path, []byte("some contents"), 0755); err != nil {
    43  		t.Fatal(err)
    44  	}
    45  
    46  	atime := testutils.Unix(125812851, 128518257)
    47  	mtime := testutils.Unix(257172893, 995216512)
    48  
    49  	if err := unix.Lstat(path, &fiOld); err != nil {
    50  		t.Fatal(err)
    51  	}
    52  
    53  	if err := Lutimes(path, atime, mtime); err != nil {
    54  		t.Errorf("unexpected error with system.lutimes: %s", err)
    55  	}
    56  
    57  	if err := unix.Lstat(path, &fiNew); err != nil {
    58  		t.Fatal(err)
    59  	}
    60  
    61  	atimeOld := time.Unix(fiOld.Atim.Unix())
    62  	mtimeOld := time.Unix(fiOld.Mtim.Unix())
    63  	atimeNew := time.Unix(fiNew.Atim.Unix())
    64  	mtimeNew := time.Unix(fiNew.Mtim.Unix())
    65  
    66  	if atimeOld.Equal(atimeNew) {
    67  		t.Errorf("atime was not changed at all!")
    68  	}
    69  	if !atimeNew.Equal(atime) {
    70  		t.Errorf("atime was not changed to expected value: expected='%s' got='%s' old='%s'", atime, atimeNew, atimeOld)
    71  	}
    72  	if mtimeOld.Equal(mtimeNew) {
    73  		t.Errorf("mtime was not changed at all!")
    74  	}
    75  	if !mtimeNew.Equal(mtime) {
    76  		t.Errorf("mtime was not changed: expected='%s' got='%s' old='%s'", mtime, mtimeNew, mtimeOld)
    77  	}
    78  }
    79  
    80  func TestLutimesDirectory(t *testing.T) {
    81  	var fiOld, fiNew unix.Stat_t
    82  
    83  	dir, err := ioutil.TempDir("", "umoci-system.TestLutimesDirectory")
    84  	if err != nil {
    85  		t.Fatal(err)
    86  	}
    87  	defer os.RemoveAll(dir)
    88  
    89  	path := filepath.Join(dir, " a directory  ")
    90  
    91  	if err := os.Mkdir(path, 0755); err != nil {
    92  		t.Fatal(err)
    93  	}
    94  
    95  	atime := testutils.Unix(128551231, 273285257)
    96  	mtime := testutils.Unix(185726393, 752135712)
    97  
    98  	if err := unix.Lstat(path, &fiOld); err != nil {
    99  		t.Fatal(err)
   100  	}
   101  
   102  	if err := Lutimes(path, atime, mtime); err != nil {
   103  		t.Errorf("unexpected error with system.lutimes: %s", err)
   104  	}
   105  
   106  	if err := unix.Lstat(path, &fiNew); err != nil {
   107  		t.Fatal(err)
   108  	}
   109  
   110  	atimeOld := time.Unix(fiOld.Atim.Unix())
   111  	mtimeOld := time.Unix(fiOld.Mtim.Unix())
   112  	atimeNew := time.Unix(fiNew.Atim.Unix())
   113  	mtimeNew := time.Unix(fiNew.Mtim.Unix())
   114  
   115  	if atimeOld.Equal(atimeNew) {
   116  		t.Errorf("atime was not changed at all!")
   117  	}
   118  	if !atimeNew.Equal(atime) {
   119  		t.Errorf("atime was not changed to expected value: expected='%s' got='%s' old='%s'", atime, atimeNew, atimeOld)
   120  	}
   121  	if mtimeOld.Equal(mtimeNew) {
   122  		t.Errorf("mtime was not changed at all!")
   123  	}
   124  	if !mtimeNew.Equal(mtime) {
   125  		t.Errorf("mtime was not changed: expected='%s' got='%s' old='%s'", mtime, mtimeNew, mtimeOld)
   126  	}
   127  }
   128  
   129  func TestLutimesSymlink(t *testing.T) {
   130  	var fiOld, fiParentOld, fiNew, fiParentNew unix.Stat_t
   131  
   132  	dir, err := ioutil.TempDir("", "umoci-system.TestLutimesSymlink")
   133  	if err != nil {
   134  		t.Fatal(err)
   135  	}
   136  	defer os.RemoveAll(dir)
   137  
   138  	path := filepath.Join(dir, "  a symlink   ")
   139  
   140  	if err := os.Symlink(".", path); err != nil {
   141  		t.Fatal(err)
   142  	}
   143  
   144  	atime := testutils.Unix(128551231, 273285257)
   145  	mtime := testutils.Unix(185726393, 752135712)
   146  
   147  	if err := unix.Lstat(path, &fiOld); err != nil {
   148  		t.Fatal(err)
   149  	}
   150  	if err := unix.Lstat(dir, &fiParentOld); err != nil {
   151  		t.Fatal(err)
   152  	}
   153  
   154  	if err := Lutimes(path, atime, mtime); err != nil {
   155  		t.Errorf("unexpected error with system.lutimes: %s", err)
   156  	}
   157  
   158  	if err := unix.Lstat(path, &fiNew); err != nil {
   159  		t.Fatal(err)
   160  	}
   161  	if err := unix.Lstat(dir, &fiParentNew); err != nil {
   162  		t.Fatal(err)
   163  	}
   164  
   165  	atimeOld := time.Unix(fiOld.Atim.Unix())
   166  	mtimeOld := time.Unix(fiOld.Mtim.Unix())
   167  	atimeNew := time.Unix(fiNew.Atim.Unix())
   168  	mtimeNew := time.Unix(fiNew.Mtim.Unix())
   169  
   170  	if atimeOld.Equal(atimeNew) {
   171  		t.Errorf("atime was not changed at all!")
   172  	}
   173  	if !atimeNew.Equal(atime) {
   174  		t.Errorf("atime was not changed to expected value: expected='%s' got='%s' old='%s'", atime, atimeNew, atimeOld)
   175  	}
   176  	if mtimeOld.Equal(mtimeNew) {
   177  		t.Errorf("mtime was not changed at all!")
   178  	}
   179  	if !mtimeNew.Equal(mtime) {
   180  		t.Errorf("mtime was not changed: expected='%s' got='%s' old='%s'", mtime, mtimeNew, mtimeOld)
   181  	}
   182  
   183  	// Make sure that the parent directory was unchanged.
   184  	atimeParentOld := time.Unix(fiParentOld.Atim.Unix())
   185  	mtimeParentOld := time.Unix(fiParentOld.Mtim.Unix())
   186  	atimeParentNew := time.Unix(fiParentNew.Atim.Unix())
   187  	mtimeParentNew := time.Unix(fiParentNew.Mtim.Unix())
   188  
   189  	if !atimeParentOld.Equal(atimeParentNew) {
   190  		t.Errorf("parent directory atime was changed! old='%s' new='%s'", atimeParentOld, atimeParentNew)
   191  	}
   192  	if !mtimeParentOld.Equal(mtimeParentNew) {
   193  		t.Errorf("parent directory mtime was changed! old='%s' new='%s'", mtimeParentOld, mtimeParentNew)
   194  	}
   195  }
   196  
   197  func TestLutimesRelative(t *testing.T) {
   198  	var fiOld, fiParentOld, fiNew, fiParentNew unix.Stat_t
   199  
   200  	dir, err := ioutil.TempDir("", "umoci-system.TestLutimesRelative")
   201  	if err != nil {
   202  		t.Fatal(err)
   203  	}
   204  	defer os.RemoveAll(dir)
   205  
   206  	oldwd, err := os.Getwd()
   207  	if err != nil {
   208  		t.Fatal(err)
   209  	}
   210  	os.Chdir(dir)
   211  	defer os.Chdir(oldwd)
   212  
   213  	path := filepath.Join("some parent", " !! symlink here")
   214  
   215  	if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil {
   216  		t.Fatal(err)
   217  	}
   218  	if err := os.Symlink(".", path); err != nil {
   219  		t.Fatal(err)
   220  	}
   221  
   222  	atime := testutils.Unix(134858232, 258921237)
   223  	mtime := testutils.Unix(171257291, 425815288)
   224  
   225  	if err := unix.Lstat(path, &fiOld); err != nil {
   226  		t.Fatal(err)
   227  	}
   228  	if err := unix.Lstat(".", &fiParentOld); err != nil {
   229  		t.Fatal(err)
   230  	}
   231  
   232  	if err := Lutimes(path, atime, mtime); err != nil {
   233  		t.Errorf("unexpected error with system.lutimes: %s", err)
   234  	}
   235  
   236  	if err := unix.Lstat(path, &fiNew); err != nil {
   237  		t.Fatal(err)
   238  	}
   239  	if err := unix.Lstat(".", &fiParentNew); err != nil {
   240  		t.Fatal(err)
   241  	}
   242  
   243  	atimeOld := time.Unix(fiOld.Atim.Unix())
   244  	mtimeOld := time.Unix(fiOld.Mtim.Unix())
   245  	atimeNew := time.Unix(fiNew.Atim.Unix())
   246  	mtimeNew := time.Unix(fiNew.Mtim.Unix())
   247  
   248  	if atimeOld.Equal(atimeNew) {
   249  		t.Errorf("atime was not changed at all!")
   250  	}
   251  	if !atimeNew.Equal(atime) {
   252  		t.Errorf("atime was not changed to expected value: expected='%s' got='%s' old='%s'", atime, atimeNew, atimeOld)
   253  	}
   254  	if mtimeOld.Equal(mtimeNew) {
   255  		t.Errorf("mtime was not changed at all!")
   256  	}
   257  	if !mtimeNew.Equal(mtime) {
   258  		t.Errorf("mtime was not changed: expected='%s' got='%s' old='%s'", mtime, mtimeNew, mtimeOld)
   259  	}
   260  
   261  	// Make sure that the parent directory was unchanged.
   262  	atimeParentOld := time.Unix(fiParentOld.Atim.Unix())
   263  	mtimeParentOld := time.Unix(fiParentOld.Mtim.Unix())
   264  	atimeParentNew := time.Unix(fiParentNew.Atim.Unix())
   265  	mtimeParentNew := time.Unix(fiParentNew.Mtim.Unix())
   266  
   267  	if !atimeParentOld.Equal(atimeParentNew) {
   268  		t.Errorf("parent directory atime was changed! old='%s' new='%s'", atimeParentOld, atimeParentNew)
   269  	}
   270  	if !mtimeParentOld.Equal(mtimeParentNew) {
   271  		t.Errorf("parent directory mtime was changed! old='%s' new='%s'", mtimeParentOld, mtimeParentNew)
   272  	}
   273  }