|
8 | 8 | "bytes"
|
9 | 9 | "internal/testenv"
|
10 | 10 | "io/ioutil"
|
| 11 | + "math" |
11 | 12 | "os"
|
12 | 13 | "path"
|
13 | 14 | "path/filepath"
|
@@ -329,3 +330,129 @@ func TestHeaderRoundTrip(t *testing.T) {
|
329 | 330 | }
|
330 | 331 | }
|
331 | 332 | }
|
| 333 | + |
| 334 | +func TestHeaderAllowedFormats(t *testing.T) { |
| 335 | + prettyFormat := func(f int) string { |
| 336 | + if f == formatUnknown { |
| 337 | + return "(formatUnknown)" |
| 338 | + } |
| 339 | + var fs []string |
| 340 | + if f&formatUSTAR > 0 { |
| 341 | + fs = append(fs, "formatUSTAR") |
| 342 | + } |
| 343 | + if f&formatPAX > 0 { |
| 344 | + fs = append(fs, "formatPAX") |
| 345 | + } |
| 346 | + if f&formatGNU > 0 { |
| 347 | + fs = append(fs, "formatGNU") |
| 348 | + } |
| 349 | + return "(" + strings.Join(fs, " | ") + ")" |
| 350 | + } |
| 351 | + |
| 352 | + vectors := []struct { |
| 353 | + header *Header // Input header |
| 354 | + paxHdrs map[string]string // Expected PAX headers that may be needed |
| 355 | + formats int // Expected formats that can encode the header |
| 356 | + }{{ |
| 357 | + header: &Header{}, |
| 358 | + formats: formatUSTAR | formatPAX | formatGNU, |
| 359 | + }, { |
| 360 | + header: &Header{Size: 077777777777}, |
| 361 | + formats: formatUSTAR | formatPAX | formatGNU, |
| 362 | + }, { |
| 363 | + header: &Header{Size: 077777777777 + 1}, |
| 364 | + paxHdrs: map[string]string{paxSize: "8589934592"}, |
| 365 | + formats: formatPAX | formatGNU, |
| 366 | + }, { |
| 367 | + header: &Header{Mode: 07777777}, |
| 368 | + formats: formatUSTAR | formatPAX | formatGNU, |
| 369 | + }, { |
| 370 | + header: &Header{Mode: 07777777 + 1}, |
| 371 | + formats: formatGNU, |
| 372 | + }, { |
| 373 | + header: &Header{Devmajor: -123}, |
| 374 | + formats: formatGNU, |
| 375 | + }, { |
| 376 | + header: &Header{Devmajor: 1<<56 - 1}, |
| 377 | + formats: formatGNU, |
| 378 | + }, { |
| 379 | + header: &Header{Devmajor: 1 << 56}, |
| 380 | + formats: formatUnknown, |
| 381 | + }, { |
| 382 | + header: &Header{Devmajor: -1 << 56}, |
| 383 | + formats: formatGNU, |
| 384 | + }, { |
| 385 | + header: &Header{Devmajor: -1<<56 - 1}, |
| 386 | + formats: formatUnknown, |
| 387 | + }, { |
| 388 | + header: &Header{Name: "用戶名", Devmajor: -1 << 56}, |
| 389 | + formats: formatUnknown, |
| 390 | + }, { |
| 391 | + header: &Header{Size: math.MaxInt64}, |
| 392 | + paxHdrs: map[string]string{paxSize: "9223372036854775807"}, |
| 393 | + formats: formatPAX | formatGNU, |
| 394 | + }, { |
| 395 | + header: &Header{Size: math.MinInt64}, |
| 396 | + paxHdrs: map[string]string{paxSize: "-9223372036854775808"}, |
| 397 | + formats: formatUnknown, |
| 398 | + }, { |
| 399 | + header: &Header{Uname: "0123456789abcdef0123456789abcdef"}, |
| 400 | + formats: formatUSTAR | formatPAX | formatGNU, |
| 401 | + }, { |
| 402 | + header: &Header{Uname: "0123456789abcdef0123456789abcdefx"}, |
| 403 | + paxHdrs: map[string]string{paxUname: "0123456789abcdef0123456789abcdefx"}, |
| 404 | + formats: formatPAX, |
| 405 | + }, { |
| 406 | + header: &Header{Name: "foobar"}, |
| 407 | + formats: formatUSTAR | formatPAX | formatGNU, |
| 408 | + }, { |
| 409 | + header: &Header{Name: strings.Repeat("a", nameSize)}, |
| 410 | + formats: formatUSTAR | formatPAX | formatGNU, |
| 411 | + }, { |
| 412 | + header: &Header{Linkname: "用戶名"}, |
| 413 | + paxHdrs: map[string]string{paxLinkpath: "用戶名"}, |
| 414 | + formats: formatPAX, |
| 415 | + }, { |
| 416 | + header: &Header{Linkname: strings.Repeat("用戶名\x00", nameSize)}, |
| 417 | + paxHdrs: map[string]string{paxLinkpath: strings.Repeat("用戶名\x00", nameSize)}, |
| 418 | + formats: formatUnknown, |
| 419 | + }, { |
| 420 | + header: &Header{Linkname: "\x00hello"}, |
| 421 | + paxHdrs: map[string]string{paxLinkpath: "\x00hello"}, |
| 422 | + formats: formatUnknown, |
| 423 | + }, { |
| 424 | + header: &Header{Uid: 07777777}, |
| 425 | + formats: formatUSTAR | formatPAX | formatGNU, |
| 426 | + }, { |
| 427 | + header: &Header{Uid: 07777777 + 1}, |
| 428 | + paxHdrs: map[string]string{paxUid: "2097152"}, |
| 429 | + formats: formatPAX | formatGNU, |
| 430 | + }, { |
| 431 | + header: &Header{Xattrs: nil}, |
| 432 | + formats: formatUSTAR | formatPAX | formatGNU, |
| 433 | + }, { |
| 434 | + header: &Header{Xattrs: map[string]string{"foo": "bar"}}, |
| 435 | + paxHdrs: map[string]string{paxXattr + "foo": "bar"}, |
| 436 | + formats: formatPAX, |
| 437 | + }, { |
| 438 | + header: &Header{Xattrs: map[string]string{"用戶名": "\x00hello"}}, |
| 439 | + paxHdrs: map[string]string{paxXattr + "用戶名": "\x00hello"}, |
| 440 | + formats: formatPAX, |
| 441 | + }, { |
| 442 | + header: &Header{ModTime: time.Unix(0, 0)}, |
| 443 | + formats: formatUSTAR | formatPAX | formatGNU, |
| 444 | + }, { |
| 445 | + header: &Header{ModTime: time.Unix(077777777777, 0)}, |
| 446 | + formats: formatUSTAR | formatPAX | formatGNU, |
| 447 | + }} |
| 448 | + |
| 449 | + for i, v := range vectors { |
| 450 | + formats, paxHdrs := v.header.allowedFormats() |
| 451 | + if formats != v.formats { |
| 452 | + t.Errorf("test %d, allowedFormats(...): got %v, want %v", i, prettyFormat(formats), prettyFormat(v.formats)) |
| 453 | + } |
| 454 | + if formats&formatPAX > 0 && !reflect.DeepEqual(paxHdrs, v.paxHdrs) && !(len(paxHdrs) == 0 && len(v.paxHdrs) == 0) { |
| 455 | + t.Errorf("test %d, allowedFormats(...):\ngot %v\nwant %s", i, paxHdrs, v.paxHdrs) |
| 456 | + } |
| 457 | + } |
| 458 | +} |
0 commit comments