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 }