LEFT | RIGHT |
(no file at all) | |
1 // Copyright 2012 The Go Authors. All rights reserved. | 1 // Copyright 2012 The Go Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style | 2 // Use of this source code is governed by a BSD-style |
3 // license that can be found in the LICENSE file. | 3 // license that can be found in the LICENSE file. |
4 | 4 |
5 package tar | 5 package tar |
6 | 6 |
7 import ( | 7 import ( |
8 "bytes" | 8 "bytes" |
9 "io/ioutil" | 9 "io/ioutil" |
10 "os" | 10 "os" |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 t.Errorf("Header mismatch.\n got %+v\nwant %+v", rHdr, hdr) | 114 t.Errorf("Header mismatch.\n got %+v\nwant %+v", rHdr, hdr) |
115 } | 115 } |
116 rData, err := ioutil.ReadAll(tr) | 116 rData, err := ioutil.ReadAll(tr) |
117 if err != nil { | 117 if err != nil { |
118 t.Fatalf("Read: %v", err) | 118 t.Fatalf("Read: %v", err) |
119 } | 119 } |
120 if !bytes.Equal(rData, data) { | 120 if !bytes.Equal(rData, data) { |
121 t.Errorf("Data mismatch.\n got %q\nwant %q", rData, data) | 121 t.Errorf("Data mismatch.\n got %q\nwant %q", rData, data) |
122 } | 122 } |
123 } | 123 } |
| 124 |
| 125 type headerRoundTripTest struct { |
| 126 h *Header |
| 127 fm os.FileMode |
| 128 } |
| 129 |
| 130 func TestHeaderRoundTrip(t *testing.T) { |
| 131 golden := []headerRoundTripTest{ |
| 132 // regular file. |
| 133 { |
| 134 h: &Header{ |
| 135 Name: "test.txt", |
| 136 Mode: 0644 | c_ISREG, |
| 137 Size: 12, |
| 138 ModTime: time.Unix(1360600916, 0), |
| 139 Typeflag: TypeReg, |
| 140 }, |
| 141 fm: 0644, |
| 142 }, |
| 143 // hard link. |
| 144 { |
| 145 h: &Header{ |
| 146 Name: "hard.txt", |
| 147 Mode: 0644 | c_ISLNK, |
| 148 Size: 0, |
| 149 ModTime: time.Unix(1360600916, 0), |
| 150 Typeflag: TypeLink, |
| 151 }, |
| 152 fm: 0644 | os.ModeSymlink, |
| 153 }, |
| 154 // symbolic link. |
| 155 { |
| 156 h: &Header{ |
| 157 Name: "link.txt", |
| 158 Mode: 0777 | c_ISLNK, |
| 159 Size: 0, |
| 160 ModTime: time.Unix(1360600852, 0), |
| 161 Typeflag: TypeSymlink, |
| 162 }, |
| 163 fm: 0777 | os.ModeSymlink, |
| 164 }, |
| 165 // character device node. |
| 166 { |
| 167 h: &Header{ |
| 168 Name: "dev/null", |
| 169 Mode: 0666 | c_ISCHR, |
| 170 Size: 0, |
| 171 ModTime: time.Unix(1360578951, 0), |
| 172 Typeflag: TypeChar, |
| 173 }, |
| 174 fm: 0666 | os.ModeDevice | os.ModeCharDevice, |
| 175 }, |
| 176 // block device node. |
| 177 { |
| 178 h: &Header{ |
| 179 Name: "dev/sda", |
| 180 Mode: 0660 | c_ISBLK, |
| 181 Size: 0, |
| 182 ModTime: time.Unix(1360578954, 0), |
| 183 Typeflag: TypeBlock, |
| 184 }, |
| 185 fm: 0660 | os.ModeDevice, |
| 186 }, |
| 187 // directory. |
| 188 { |
| 189 h: &Header{ |
| 190 Name: "dir/", |
| 191 Mode: 0755 | c_ISDIR, |
| 192 Size: 0, |
| 193 ModTime: time.Unix(1360601116, 0), |
| 194 Typeflag: TypeDir, |
| 195 }, |
| 196 fm: 0755 | os.ModeDir, |
| 197 }, |
| 198 // fifo node. |
| 199 { |
| 200 h: &Header{ |
| 201 Name: "dev/initctl", |
| 202 Mode: 0600 | c_ISFIFO, |
| 203 Size: 0, |
| 204 ModTime: time.Unix(1360578949, 0), |
| 205 Typeflag: TypeFifo, |
| 206 }, |
| 207 fm: 0600 | os.ModeNamedPipe, |
| 208 }, |
| 209 // setuid. |
| 210 { |
| 211 h: &Header{ |
| 212 Name: "bin/su", |
| 213 Mode: 0755 | c_ISREG | c_ISUID, |
| 214 Size: 23232, |
| 215 ModTime: time.Unix(1355405093, 0), |
| 216 Typeflag: TypeReg, |
| 217 }, |
| 218 fm: 0755 | os.ModeSetuid, |
| 219 }, |
| 220 // setguid. |
| 221 { |
| 222 h: &Header{ |
| 223 Name: "group.txt", |
| 224 Mode: 0750 | c_ISREG | c_ISGID, |
| 225 Size: 0, |
| 226 ModTime: time.Unix(1360602346, 0), |
| 227 Typeflag: TypeReg, |
| 228 }, |
| 229 fm: 0750 | os.ModeSetgid, |
| 230 }, |
| 231 // sticky. |
| 232 { |
| 233 h: &Header{ |
| 234 Name: "sticky.txt", |
| 235 Mode: 0600 | c_ISREG | c_ISVTX, |
| 236 Size: 7, |
| 237 ModTime: time.Unix(1360602540, 0), |
| 238 Typeflag: TypeReg, |
| 239 }, |
| 240 fm: 0600 | os.ModeSticky, |
| 241 }, |
| 242 } |
| 243 |
| 244 for i, g := range golden { |
| 245 fi := g.h.FileInfo() |
| 246 h2, err := FileInfoHeader(fi, "") |
| 247 if err != nil { |
| 248 t.Error(err) |
| 249 continue |
| 250 } |
| 251 if got, want := h2.Name, g.h.Name; got != want { |
| 252 t.Errorf("i=%d: Name: got %v, want %v", i, got, want) |
| 253 } |
| 254 if got, want := h2.Size, g.h.Size; got != want { |
| 255 t.Errorf("i=%d: Size: got %v, want %v", i, got, want) |
| 256 } |
| 257 if got, want := h2.Mode, g.h.Mode; got != want { |
| 258 t.Errorf("i=%d: Mode: got %o, want %o", i, got, want) |
| 259 } |
| 260 if got, want := fi.Mode(), g.fm; got != want { |
| 261 t.Errorf("i=%d: fi.Mode: got %o, want %o", i, got, want) |
| 262 } |
| 263 if got, want := h2.ModTime, g.h.ModTime; got != want { |
| 264 t.Errorf("i=%d: ModTime: got %v, want %v", i, got, want) |
| 265 } |
| 266 if sysh, ok := fi.Sys().(*Header); !ok || sysh != g.h { |
| 267 t.Errorf("i=%d: Sys didn't return original *Header", i) |
| 268 } |
| 269 } |
| 270 } |
LEFT | RIGHT |