github.com/jurelou/go-magic@v0.0.0-20230518182705-f2995a311800/magic_test.go (about) 1 package magic 2 3 // func TestNew(t *testing.T) { 4 // var mgc *Magic 5 6 // var n int 7 // var err error 8 // var p []string 9 // var v string 10 11 // mgc, err = New() 12 // if err != nil { 13 // t.Fatalf("unable to create new Magic type: %s", err.Error()) 14 // } 15 16 // func(v interface{}) { 17 // if _, ok := v.(*Magic); !ok { 18 // t.Fatalf("not a Magic type: %s", reflect.TypeOf(v).String()) 19 // } 20 // }(mgc) 21 22 // n = Version() 23 24 // if n >= 519 { 25 // formatDirectory = "new-format" 26 // } 27 28 // genuineMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png.magic")) 29 // brokenMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png-broken.magic")) 30 31 // mgc.Close() 32 33 // _, err = New(Load("does/not/exist")) 34 35 // v = "magic: could not find any valid magic files!" 36 // if n < 518 && n >= 514 { 37 // // A few releases of libmagic were having issues. 38 // v = "magic: no magic files loaded" 39 // } else if n < 0 { 40 // // Older version of libmagic reports same error differently. 41 // v = "magic: could not find any magic files!" 42 // } 43 44 // if err == nil { 45 // t.Errorf("value given {%v}, want {%v}", err.Error(), nil) 46 // } 47 48 // if ok := compareStrings(err.Error(), v); !ok { 49 // t.Errorf("value given {%q}, want {%q}", err.Error(), v) 50 // } 51 52 // mgc, err = New(Load(genuineMagicFile)) 53 // if err != nil { 54 // t.Errorf("value given \"%T\", should be empty", err) 55 // } 56 57 // // Current path should change accordingly ... 58 // p, _ = mgc.Paths() 59 60 // if ok := compareStrings(p[0], genuineMagicFile); !ok { 61 // t.Errorf("value given %q, want %q", p[0], genuineMagicFile) 62 // } 63 64 // mgc.Close() 65 66 // _, err = New(Load(brokenMagicFile)) 67 68 // v = "magic: line 1: No current entry for continuation" 69 // if n < 518 && n >= 514 { 70 // // A few releases of libmagic were having issues. 71 // v = "magic: no magic files loaded" 72 // } else if n < 0 { 73 // // Older version of libmagic reports same error differently. 74 // v = "magic: No current entry for continuation" 75 // } 76 77 // if err == nil { 78 // t.Errorf("value given \"%T\", should not be empty", err) 79 // } 80 81 // if ok := compareStrings(err.Error(), v); !ok { 82 // t.Errorf("value given {%q}, want {%q}", err.Error(), v) 83 // } 84 // } 85 86 // func TestMagic_Close(t *testing.T) { 87 // mgc, _ := New() 88 89 // var cookie reflect.Value 90 91 // magic := reflect.ValueOf(mgc).Elem().FieldByName("magic").Elem() 92 93 // cookie = magic.FieldByName("cookie").Elem() 94 // if ok := cookie.IsValid(); !ok { 95 // t.Errorf("value given %v, want %v", ok, true) 96 // } 97 98 // mgc.Close() 99 100 // // Should be NULL (at C level) as magic_close() will free underlying Magic database. 101 // cookie = magic.FieldByName("cookie").Elem() 102 // if ok := cookie.IsValid(); ok { 103 // t.Errorf("value given %v, want %v", ok, false) 104 // } 105 106 // // Should be a no-op ... 107 // mgc.Close() 108 // } 109 110 // func TestMagic_IsClosed(t *testing.T) { 111 // mgc, _ := New() 112 113 // if ok := mgc.IsClosed(); ok { 114 // t.Errorf("value given %v, want %v", ok, false) 115 // } 116 117 // mgc.Close() 118 119 // if ok := mgc.IsClosed(); !ok { 120 // t.Errorf("value given %v, want %v", ok, true) 121 // } 122 // } 123 124 // func TestMagic_String(t *testing.T) { 125 // mgc, _ := New() 126 127 // magic := reflect.ValueOf(mgc).Elem().FieldByName("magic").Elem() 128 // path := magic.FieldByName("paths") 129 // cookie := magic.FieldByName("cookie").Elem().UnsafeAddr() 130 131 // // Get whatever the underlying default path is ... 132 // paths := make([]string, path.Len()) 133 // for i := 0; i < path.Len(); i++ { 134 // paths[i] = path.Index(i).String() 135 // } 136 137 // var v string 138 139 // v = fmt.Sprintf("Magic{flags:%d paths:%v cookie:0x%x open:%t}", 0, paths, cookie, true) 140 // if ok := compareStrings(mgc.String(), v); !ok { 141 // t.Errorf("value given %q, want %q", mgc.String(), v) 142 // } 143 144 // mgc.Close() 145 146 // v = fmt.Sprintf("Magic{flags:%d paths:%v cookie:0x%x open:%t}", 0, []string{}, 0, false) 147 // if ok := compareStrings(mgc.String(), v); !ok { 148 // t.Errorf("value given %q, want %q", mgc.String(), v) 149 // } 150 // } 151 152 // func TestMagic_Paths(t *testing.T) { 153 // var mgc *Magic 154 // var rv []string 155 156 // mgc, _ = New() 157 // mgc.Close() 158 159 // _, err := mgc.Paths() 160 161 // v := "magic: Magic library is not open" 162 // if ok := compareStrings(err.Error(), v); !ok { 163 // t.Errorf("value given %q, want %q", err.Error(), v) 164 // } 165 166 // mgc, _ = New() 167 168 // rv, _ = mgc.Paths() 169 // if len(rv) == 0 { 170 // t.Fatalf("value given \"%T\", should not be empty", rv) 171 // } 172 173 // mgc.Close() 174 175 // // Setting "MAGIC" here breaks tests later as it will be persistent 176 // // between different tests, sadly needed to be disabled for the time 177 // // being. 178 // // 179 // // p, err := os.Getwd() 180 // // if err != nil { 181 // // t.Fatal("unable to get current and/or working directory") 182 // // } 183 // // 184 // // p = path.Clean(path.Join(p, "fixtures")) 185 // // if err = os.Setenv("MAGIC", p); err != nil { 186 // // t.Fatalf("unable to set \"MAGIC\" environment variable to %q", p) 187 // // } 188 // // 189 // // v, _ = mgc.Path() 190 // // if ok := compareStrings(v[0], p); !ok { 191 // // t.Errorf("value given %q, want %q", v[0], p) 192 // // } 193 194 // // Test Magic.Load() affecting Magic.Path() as well. But that requires 195 // // working os.Clearenv() which is yet to be implemented as per 196 // // http://golang.org/src/pkg/syscall/env_unix.go?s=1772:1787#L101 197 198 // mgc, _ = open() 199 // defer func() { 200 // mgc.close() 201 // }() 202 203 // rv, _ = mgc.Paths() 204 // if len(rv) == 0 { 205 // t.Fatalf("value given \"%T\", should not be empty", rv) 206 // } 207 // } 208 209 // func TestMagic_Paths_Environment(t *testing.T) { 210 // } 211 212 // func TestMagic_Parameter(t *testing.T) { 213 // } 214 215 // func TestMagic_SetParameter(t *testing.T) { 216 // } 217 218 // func TestMagic_Flags(t *testing.T) { 219 // var mgc *Magic 220 221 // mgc, _ = New() 222 // mgc.Close() 223 224 // _, err := mgc.Flags() 225 226 // v := "magic: Magic library is not open" 227 // if ok := compareStrings(err.Error(), v); !ok { 228 // t.Errorf("value given %q, want %q", err.Error(), v) 229 // } 230 231 // mgc, _ = New() 232 // defer mgc.Close() 233 234 // mgc.SetFlags(MIME) 235 236 // flags := MIME_TYPE | MIME_ENCODING 237 // if v, _ := mgc.Flags(); v != flags { 238 // t.Errorf("value given 0x%06x, want 0x%06x", v, flags) 239 // } 240 // } 241 242 // func TestMagic_SetFlags(t *testing.T) { 243 // var mgc *Magic 244 245 // var err error 246 // var actual, errno int 247 // var v string 248 249 // mgc, _ = New() 250 // mgc.Close() 251 252 // err = mgc.SetFlags(0) 253 254 // v = "magic: Magic library is not open" 255 // if ok := compareStrings(err.Error(), v); !ok { 256 // t.Errorf("value given %q, want %q", err.Error(), v) 257 // } 258 259 // mgc, _ = New() 260 // defer mgc.Close() 261 262 // var flagsTests = []struct { 263 // broken bool 264 // errno int 265 // expected int 266 // given int 267 // }{ 268 // // Test lower boundary limit. 269 // {true, 22, 0x000000, -0xfffffff}, 270 // // Genuine flags ... 271 // {false, 0, 0x000000, 0x000000}, // Flag: NONE 272 // {false, 0, 0x000010, 0x000010}, // Flag: MIME_TYPE 273 // {false, 0, 0x000400, 0x000400}, // Flag: MIME_ENCODING 274 // {false, 0, 0x000410, 0x000410}, // Flag: MIME_TYPE, MIME_ENCODING 275 // // Test upper boundary limit. 276 // {true, 22, 0x000410, 0xffffffff}, 277 // } 278 279 // for _, tt := range flagsTests { 280 // err = mgc.SetFlags(tt.given) 281 // actual, _ = mgc.Flags() 282 // if err != nil && tt.broken { 283 // errno = err.(*Error).Errno 284 // if actual != tt.expected || errno != tt.errno { 285 // t.Errorf("value given {0x%06x %d}, want {0x%06x %d}", actual, errno, tt.expected, tt.errno) 286 // continue 287 // } 288 // } 289 // if actual != tt.expected { 290 // t.Errorf("value given 0x%06x, want 0x%06x", actual, tt.expected) 291 // } 292 // } 293 294 // err = mgc.SetFlags(0xffffffff) 295 296 // v = "magic: unknown or invalid flag specified" 297 // if ok := compareStrings(err.Error(), v); !ok { 298 // t.Errorf("value given %q, want %q", err.Error(), v) 299 // } 300 // } 301 302 // func TestMagic_FlagsSlice(t *testing.T) { 303 // var mgc *Magic 304 305 // mgc, _ = New() 306 // mgc.Close() 307 308 // _, err := mgc.FlagsSlice() 309 310 // v := "magic: Magic library is not open" 311 // if ok := compareStrings(err.Error(), v); !ok { 312 // t.Errorf("value given %q, want %q", err.Error(), v) 313 // } 314 315 // mgc, _ = New() 316 // defer mgc.Close() 317 318 // var actual []int 319 320 // var flagsSliceTests = []struct { 321 // given int 322 // expected []int 323 // }{ 324 // {0x000000, []int{0x000000}}, // Flag: NONE 325 // {0x000001, []int{0x000001}}, // Flag: DEBUG 326 // {0x000201, []int{0x000001, 0x000200}}, // Flag: DEBUG, ERROR 327 // {0x000022, []int{0x000002, 0x000020}}, // Flag: SYMLINK, CONTINUE 328 // {0x000410, []int{0x000010, 0x000400}}, // Flag: MIME_TTYPE, MIME_ENCODING 329 // } 330 331 // for _, tt := range flagsSliceTests { 332 // mgc.SetFlags(tt.given) 333 334 // actual, _ = mgc.FlagsSlice() 335 // if ok := reflect.DeepEqual(actual, tt.expected); !ok { 336 // t.Errorf("value given %v, want %v", actual, tt.expected) 337 // } 338 // } 339 // } 340 341 // func TestMagic_Load(t *testing.T) { 342 // var mgc *Magic 343 344 // var n int 345 // var rv bool 346 // var err error 347 // var p []string 348 // var v string 349 350 // mgc, _ = New() 351 // mgc.Close() 352 353 // _, err = mgc.Load("does/not/exist") 354 355 // v = "magic: Magic library is not open" 356 // if ok := compareStrings(err.Error(), v); !ok { 357 // t.Errorf("value given %q, want %q", err.Error(), v) 358 // } 359 360 // mgc, _ = New() 361 // n = Version() 362 363 // if n >= 519 { 364 // formatDirectory = "new-format" 365 // } 366 367 // genuineMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png.magic")) 368 // brokenMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png-broken.magic")) 369 370 // rv, err = mgc.Load("does/not/exist") 371 372 // v = "magic: could not find any valid magic files!" 373 // if n < 0 { 374 // // A few releases of libmagic were having issues. 375 // v = "magic: could not find any magic files!" 376 // } 377 378 // if err == nil { 379 // t.Errorf("value given {%v \"%v\"}, want {%v %q}", rv, err, false, v) 380 // } 381 382 // if ok := compareStrings(err.Error(), v); !ok { 383 // t.Errorf("value given {%v %q}, want {%v %q}", rv, err.Error(), false, v) 384 // } 385 386 // // XXX(krzysztof): Currently, certain versions of libmagic API will *never* 387 // // clear an error once there is one, therefore a whole new session has to be 388 // // created in order to clear it. Unless upstream fixes this bad design choice, 389 // // there is nothing to do about it, sadly. 390 // mgc.Close() 391 392 // mgc, _ = New() 393 394 // rv, err = mgc.Load(genuineMagicFile) 395 // if err != nil { 396 // t.Errorf("value given {%v \"%v\"}, want {%v %q}", rv, err, true, "") 397 // } 398 399 // // Current path should change accordingly ... 400 // p, _ = mgc.Paths() 401 402 // if ok := compareStrings(p[0], genuineMagicFile); !ok { 403 // t.Errorf("value given %q, want %q", p[0], genuineMagicFile) 404 // } 405 406 // rv, err = mgc.Load(brokenMagicFile) 407 408 // v = "magic: line 1: No current entry for continuation" 409 // if n < 0 { 410 // // Older version of libmagic reports same error differently. 411 // v = "magic: No current entry for continuation" 412 // } 413 414 // if err == nil { 415 // t.Errorf("value given {%v \"%v\"}, want {%v %q}", rv, err, false, v) 416 // } 417 418 // if ok := compareStrings(err.Error(), v); !ok { 419 // t.Errorf("value given {%v %q}, want {%v %q}", rv, err.Error(), false, v) 420 // } 421 422 // // Since there was an error, path should remain the same. 423 // p, _ = mgc.Paths() 424 // if ok := compareStrings(p[0], genuineMagicFile); !ok { 425 // t.Errorf("value given %q, want %q", p[0], genuineMagicFile) 426 // } 427 428 // mgc.Close() 429 // } 430 431 // func TestMagic_LoadBuffers(t *testing.T) { 432 // } 433 434 // func TestMagic_Load_Environment(t *testing.T) { 435 // } 436 437 // func TestMagic_Compile(t *testing.T) { 438 // var mgc *Magic 439 440 // var n int 441 // var rv bool 442 // var err error 443 // var genuine, broken, v string 444 445 // mgc, _ = New() 446 // mgc.Close() 447 448 // _, err = mgc.Compile("does/not/exist") 449 450 // v = "magic: Magic library is not open" 451 // if ok := compareStrings(err.Error(), v); !ok { 452 // t.Errorf("value given %q, want %q", err.Error(), v) 453 // } 454 455 // clean := func() { 456 // files, _ := filepath.Glob("*.mgc") 457 // for _, f := range files { 458 // os.Remove(f) 459 // } 460 // } 461 462 // mgc, _ = New() 463 // n = Version() 464 465 // if n >= 519 { 466 // formatDirectory = "new-format" 467 // } 468 469 // genuineMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png.magic")) 470 // brokenMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png-broken.magic")) 471 472 // rv, err = mgc.Compile("does/not/exist") 473 474 // v = "magic: could not find any valid magic files!" 475 // if n < 0 { 476 // // A few releases of libmagic were having issues. 477 // v = "magic: could not find any magic files!" 478 // } 479 480 // if err == nil { 481 // t.Errorf("value given {%v \"%v\"}, want {%v %q}", rv, err, false, v) 482 // } 483 484 // if ok := compareStrings(err.Error(), v); !ok { 485 // t.Errorf("value given {%v %q}, want {%v %q}", rv, err.Error(), false, v) 486 // } 487 488 // // See comment in TestMagic_Load() ... 489 // mgc.Close() 490 491 // wd, err := os.Getwd() 492 // if err != nil { 493 // t.Fatal("unable to get current and/or working directory") 494 // } 495 496 // mgc, _ = New() 497 // defer mgc.Close() 498 499 // os.Chdir(path.Join(wd, path.Join(fixturesDirectory, formatDirectory))) 500 // defer func() { 501 // clean() 502 // os.Chdir(wd) 503 // }() 504 505 // clean() 506 507 // _, genuine = path.Split(genuineMagicFile) 508 // _, broken = path.Split(brokenMagicFile) 509 510 // // Re-define as we are no longer in top-level directory ... 511 // genuine = path.Clean(path.Join(".", genuine)) 512 // broken = path.Clean(path.Join(".", broken)) 513 514 // rv, err = mgc.Compile(genuine) 515 // if err != nil { 516 // t.Errorf("value given {%v \"%v\"}, want {%v %q}", rv, err, true, "") 517 // } 518 519 // compiledMagicFile := fmt.Sprintf("%s.mgc", genuine) 520 521 // stat, err := os.Stat(compiledMagicFile) 522 // if stat == nil && err != nil { 523 // x := os.IsNotExist(err) 524 // t.Errorf("value given {%v %q}, want {%v %q}", x, err.Error(), false, "") 525 // } 526 527 // // Assuming that success would yield a non-zero size compiled Magic file ... 528 // if stat != nil && err == nil { 529 // x := os.IsNotExist(err) 530 // if s := stat.Size(); s < 5 { 531 // t.Errorf("value given {%v %d}, want {%v > %d}", x, s, false, 5) 532 // } 533 534 // buffer := make([]byte, 5) 535 536 // // Header (8 bytes) of the compiled Magic file should be: 1c 04 1e f1 08 00 00 00 537 // // on any little-endian architecture. Where the 5th byte always denotes which version 538 // // of the Magic database is it. 539 // expected := []byte{0x1c, 0x04, 0x1e, 0xf1} 540 541 // f, err := os.Open(compiledMagicFile) 542 // if err != nil { 543 // t.Fatalf("unable to open file `%s'", compiledMagicFile) 544 // } 545 // f.Read(buffer) 546 // f.Close() 547 548 // last := buffer[len(buffer)-1:][0] // Get version only ... 549 // buffer = buffer[:len(buffer)-1] 550 551 // ok := bytes.Equal(buffer, expected) 552 // if !ok || last == 0 { 553 // t.Errorf("value given {0x%x 0x%02x}, want {0x%x > 0x%02x}", buffer, last, expected, 0) 554 // } 555 // } 556 557 // rv, err = mgc.Compile(broken) 558 559 // v = "magic: line 1: No current entry for continuation" 560 // if n < 518 && n >= 514 { 561 // // A few releases of libmagic were having issues. 562 // v = "magic: no magic files loaded" 563 // } else if n < 0 { 564 // // Older version of libmagic reports same error differently. 565 // v = "magic: No current entry for continuation" 566 // } 567 568 // if err == nil { 569 // t.Errorf("value given {%v \"%v\"}, want {%v %q}", rv, err, false, v) 570 // } 571 572 // if ok := compareStrings(err.Error(), v); !ok { 573 // t.Errorf("value given {%v %q}, want {%v %q}", rv, err.Error(), false, v) 574 // } 575 // } 576 577 // func TestMagic_Check(t *testing.T) { 578 // var mgc *Magic 579 580 // var n int 581 // var rv bool 582 // var err error 583 // var v string 584 585 // mgc, _ = New() 586 // mgc.Close() 587 588 // _, err = mgc.Check("does/not/exist") 589 590 // v = "magic: Magic library is not open" 591 // if ok := compareStrings(err.Error(), v); !ok { 592 // t.Errorf("value given %q, want %q", err.Error(), v) 593 // } 594 595 // mgc, _ = New() 596 // n = Version() 597 598 // if n >= 519 { 599 // formatDirectory = "new-format" 600 // } 601 602 // genuineMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png.magic")) 603 // brokenMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png-broken.magic")) 604 605 // rv, err = mgc.Check("does/not/exist") 606 607 // v = "magic: could not find any valid magic files!" 608 // if n < 0 { 609 // // A few releases of libmagic were having issues. 610 // v = "magic: could not find any magic files!" 611 // } 612 613 // if err == nil { 614 // t.Errorf("value given {%v \"%v\"}, want {%v %q}", rv, err, false, v) 615 // } 616 617 // if ok := compareStrings(err.Error(), v); !ok { 618 // t.Errorf("value given {%v %q}, want {%v %q}", rv, err.Error(), false, v) 619 // } 620 621 // // See comment in TestMagic_Load() ... 622 // mgc.Close() 623 624 // mgc, _ = New() 625 // defer mgc.Close() 626 627 // rv, err = mgc.Check(genuineMagicFile) 628 // if err != nil { 629 // t.Errorf("value given {%v \"%v\"}, want {%v %q}", rv, err, true, "") 630 // } 631 632 // rv, err = mgc.Check(brokenMagicFile) 633 634 // v = "magic: line 1: No current entry for continuation" 635 // if n < 518 && n >= 514 { 636 // // A few releases of libmagic were having issues. 637 // v = "magic: no magic files loaded" 638 // } else if n < 0 { 639 // // Older version of libmagic reports same error differently. 640 // v = "magic: No current entry for continuation" 641 // } 642 643 // if err == nil { 644 // t.Errorf("value given {%v \"%v\"}, want {%v %q}", rv, err, false, v) 645 // } 646 647 // if ok := compareStrings(err.Error(), v); !ok { 648 // t.Errorf("value given {%v %q}, want {%v %q}", rv, err.Error(), false, v) 649 // } 650 // } 651 652 // func TestMagic_File(t *testing.T) { 653 // var mgc *Magic 654 655 // var ok bool 656 // var err error 657 // var v, rv string 658 659 // mgc, _ = New() 660 // mgc.Close() 661 662 // _, err = mgc.File("does/not/exist") 663 664 // v = "magic: Magic library is not open" 665 // if ok := compareStrings(err.Error(), v); !ok { 666 // t.Errorf("value given %q, want %q", err.Error(), v) 667 // } 668 669 // mgc, _ = New() 670 // defer mgc.Close() 671 672 // if n := Version(); n >= 519 { 673 // formatDirectory = "new-format" 674 // } 675 676 // genuineMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png.magic")) 677 // fakeMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png-fake.magic")) 678 679 // mgc.SetFlags(NONE) 680 // mgc.Load(genuineMagicFile) 681 682 // rv, _ = mgc.File(sampleImageFile) 683 684 // v = "PNG image data, 1634 x 2224, 8-bit/color RGBA, non-interlaced" 685 // if ok = compareStrings(rv, v); !ok { 686 // t.Errorf("value given %q, want %q", rv, v) 687 // } 688 689 // mgc.SetFlags(MIME) 690 691 // rv, _ = mgc.File(sampleImageFile) 692 693 // v = "image/png; charset=binary" 694 // if ok = compareStrings(rv, v); !ok { 695 // t.Errorf("value given %q, want %q", rv, v) 696 // } 697 698 // mgc.SetFlags(NONE) 699 // mgc.Load(fakeMagicFile) 700 701 // rv, _ = mgc.File(sampleImageFile) 702 703 // v = "Go Gopher image, 1634 x 2224, 8-bit/color RGBA, non-interlaced" 704 // if ok = compareStrings(rv, v); !ok { 705 // t.Errorf("value given %q, want %q", rv, v) 706 // } 707 708 // mgc.SetFlags(MIME) 709 710 // rv, _ = mgc.File(sampleImageFile) 711 712 // v = "image/x-go-gopher; charset=binary" 713 // if ok = compareStrings(rv, v); !ok { 714 // t.Errorf("value given %q, want %q", rv, v) 715 // } 716 717 // mgc.SetFlags(NONE) 718 719 // // We expect no error to be risen at this time. 720 // rv, err = mgc.File("does/not/exist") 721 // if err != nil { 722 // t.Errorf("value given %q, want %q", rv, v) 723 // } 724 725 // // Return value contains the error message as per the IEEE 1003.1 standard. 726 // v = "cannot open `does/not/exist' (No such file or directory)" 727 // if ok = compareStrings(rv, v); !ok { 728 // t.Errorf("value given %q, want %q", rv, v) 729 // } 730 731 // // Now we expect an error to be risen. 732 // mgc.SetFlags(ERROR) 733 734 // _, err = mgc.File("does/not/exist") 735 736 // v = "magic: cannot stat `does/not/exist' (No such file or directory)" 737 // if ok = compareStrings(err.Error(), v); !ok { 738 // t.Errorf("value given %q, want %q", err.Error(), v) 739 // } 740 // } 741 742 // func TestMagic_Buffer(t *testing.T) { 743 // var mgc *Magic 744 745 // var f *os.File 746 747 // var ok bool 748 // var err error 749 // var v, rv string 750 751 // mgc, _ = New() 752 // mgc.Close() 753 754 // _, err = mgc.Buffer([]byte{}) 755 756 // v = "magic: Magic library is not open" 757 // if ok := compareStrings(err.Error(), v); !ok { 758 // t.Errorf("value given %q, want %q", err.Error(), v) 759 // } 760 761 // mgc, _ = New() 762 // defer mgc.Close() 763 764 // if n := Version(); n >= 519 { 765 // formatDirectory = "new-format" 766 // } 767 768 // genuineMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png.magic")) 769 // fakeMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png-fake.magic")) 770 771 // buffer := &bytes.Buffer{} 772 773 // image := func() { 774 // f, err = os.Open(sampleImageFile) 775 // if err != nil { 776 // t.Fatalf("unable to open file `%s'", sampleImageFile) 777 // } 778 // io.Copy(buffer, f) 779 // f.Close() 780 // } 781 782 // image() 783 784 // mgc.SetFlags(NONE) 785 // mgc.Load(genuineMagicFile) 786 787 // rv, err = mgc.Buffer(buffer.Bytes()) 788 789 // v = "PNG image data, 1634 x 2224, 8-bit/color RGBA, non-interlaced" 790 // if ok = compareStrings(rv, v); !ok { 791 // t.Errorf("value given %q, want %q", rv, v) 792 // } 793 794 // mgc.SetFlags(MIME) 795 796 // rv, err = mgc.Buffer(buffer.Bytes()) 797 798 // v = "image/png; charset=binary" 799 // if ok = compareStrings(rv, v); !ok { 800 // t.Errorf("value given %q, want %q", rv, v) 801 // } 802 803 // mgc.SetFlags(NONE) 804 // mgc.Load(fakeMagicFile) 805 806 // rv, err = mgc.Buffer(buffer.Bytes()) 807 808 // v = "Go Gopher image, 1634 x 2224, 8-bit/color RGBA, non-interlaced" 809 // if ok = compareStrings(rv, v); !ok { 810 // t.Errorf("value given %q, want %q", rv, v) 811 // } 812 813 // mgc.SetFlags(MIME) 814 815 // rv, err = mgc.Buffer(buffer.Bytes()) 816 817 // v = "image/x-go-gopher; charset=binary" 818 // if ok = compareStrings(rv, v); !ok { 819 // t.Errorf("value given %q, want %q", rv, v) 820 // } 821 822 // buffer.Reset() 823 // buffer.WriteString("Hello, 世界") 824 825 // rv, err = mgc.Buffer(buffer.Bytes()) 826 827 // v = "text/plain; charset=utf-8" 828 // if ok = compareStrings(rv, v); !ok { 829 // t.Errorf("value given %q, want %q", rv, v) 830 // } 831 832 // mgc.SetFlags(NONE) 833 834 // buffer.Reset() 835 // buffer.WriteString("#!/bin/bash\n\n") 836 837 // rv, err = mgc.Buffer(buffer.Bytes()) 838 839 // // This is correct since custom Magic database was loaded, 840 // // libmagic does not have enough know-how to correctly 841 // // identify Bash scripts. 842 // v = "ASCII text" 843 // if ok = compareStrings(rv, v); !ok { 844 // t.Errorf("value given %q, want %q", rv, v) 845 // } 846 847 // // Load two custom Magic databases now, one of which has 848 // // correct magic to detect Bash shell scripts. 849 // mgc.Load(genuineMagicFile, shellMagicFile) 850 851 // rv, err = mgc.Buffer(buffer.Bytes()) 852 853 // v = "Bourne-Again shell script, ASCII text executable" 854 // if ok = compareStrings(rv, v); !ok { 855 // t.Errorf("value given %q, want %q", rv, v) 856 // } 857 858 // buffer.Reset() 859 860 // // Re-load Gopher PNG image ... 861 // image() 862 863 // rv, err = mgc.Buffer(buffer.Bytes()) 864 865 // v = "PNG image data, 1634 x 2224, 8-bit/color RGBA, non-interlaced" 866 // if ok = compareStrings(rv, v); !ok { 867 // t.Errorf("value given %q, want %q", rv, v) 868 // } 869 870 // buffer.Reset() 871 // buffer.WriteString("#!/bin/sh\n\n") 872 873 // rv, err = mgc.Buffer(buffer.Bytes()) 874 875 // // Quite redundant, but fun ... 876 // v = "POSIX shell script, ASCII text executable" 877 // if ok = compareStrings(rv, v); !ok { 878 // t.Errorf("value given %q, want %q", rv, v) 879 // } 880 881 // buffer.Reset() 882 // buffer.Write([]byte{0x0}) 883 884 // rv, err = mgc.Buffer(buffer.Bytes()) 885 886 // v = "very short file (no magic)" 887 // if ok = compareStrings(rv, v); !ok { 888 // t.Errorf("value given %q, want %q", rv, v) 889 // } 890 891 // buffer.Reset() 892 893 // defer func() { 894 // r := recover() 895 // if r == nil { 896 // t.Error("did not panic") 897 // return 898 // } 899 // v = "runtime error: index out of range [0] with length 0" 900 // if ok := compareStrings(r.(error).Error(), v); !ok { 901 // t.Errorf("value given %q, want %q", r.(error).Error(), v) 902 // return 903 // } 904 // }() 905 906 // // Will panic ... 907 // mgc.Buffer(buffer.Bytes()) 908 // } 909 910 // func TestMagic_Descriptor(t *testing.T) { 911 // var mgc *Magic 912 913 // var f *os.File 914 915 // var n int 916 // var ok bool 917 // var err error 918 // var v, rv string 919 920 // mgc, _ = New() 921 // mgc.Close() 922 923 // _, err = mgc.Descriptor(0) 924 925 // v = "magic: Magic library is not open" 926 // if ok := compareStrings(err.Error(), v); !ok { 927 // t.Errorf("value given %q, want %q", err.Error(), v) 928 // } 929 930 // mgc, _ = New() 931 // defer mgc.Close() 932 933 // n = Version() 934 935 // if n >= 519 { 936 // formatDirectory = "new-format" 937 // } 938 939 // genuineMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png.magic")) 940 941 // fakeMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png-fake.magic")) 942 943 // // Sadly, the function `const char* magic_descriptor(struct magic_set*, int)', 944 // // which is a part of libmagic will *kindly* close file referenced by given 945 // // file descriptor for us, and so we have to re-open each time. This only 946 // // concerns certain versions of libmagic, but its better to stay on the 947 // // safe side ... 948 // file := func() { 949 // f, err = os.Open(sampleImageFile) 950 // if err != nil { 951 // t.Fatalf("unable to open file `%s'", sampleImageFile) 952 // } 953 // } 954 955 // file() 956 957 // mgc.SetFlags(NONE) 958 // mgc.Load(genuineMagicFile) 959 960 // rv, err = mgc.Descriptor(f.Fd()) 961 962 // v = "PNG image data, 1634 x 2224, 8-bit/color RGBA, non-interlaced" 963 // if ok = compareStrings(rv, v); !ok { 964 // t.Errorf("value given %q, want %q", rv, v) 965 // } 966 967 // f.Close() 968 // file() 969 970 // mgc.SetFlags(MIME) 971 972 // rv, err = mgc.Descriptor(f.Fd()) 973 974 // v = "image/png; charset=binary" 975 // if ok = compareStrings(rv, v); !ok { 976 // t.Errorf("value given %q, want %q", rv, v) 977 // } 978 979 // f.Close() 980 // file() 981 982 // mgc.SetFlags(NONE) 983 // mgc.Load(fakeMagicFile) 984 985 // rv, err = mgc.Descriptor(f.Fd()) 986 987 // v = "Go Gopher image, 1634 x 2224, 8-bit/color RGBA, non-interlaced" 988 // if ok = compareStrings(rv, v); !ok { 989 // t.Errorf("value given %q, want %q", rv, v) 990 // } 991 992 // f.Close() 993 // file() 994 // mgc.SetFlags(MIME) 995 996 // rv, err = mgc.Descriptor(f.Fd()) 997 998 // v = "image/x-go-gopher; charset=binary" 999 // if ok = compareStrings(rv, v); !ok { 1000 // t.Errorf("value given %q, want %q", rv, v) 1001 // } 1002 1003 // f.Close() 1004 1005 // _, err = mgc.Descriptor(f.Fd()) 1006 1007 // v = "magic: bad file descriptor" 1008 // if ok = compareStrings(err.Error(), v); !ok { 1009 // t.Errorf("value given %q, want %q", err.Error(), v) 1010 // } 1011 1012 // // Reading from standard input (0) will yield no data in this case. 1013 // rv, err = mgc.Descriptor(0) 1014 1015 // v = "application/x-empty; charset=binary" 1016 // if n := Version(); n < 515 { 1017 // // Older version of libmagic reports same error differently. 1018 // v = "application/x-empty" 1019 // } 1020 1021 // if ok = compareStrings(rv, v); !ok { 1022 // t.Errorf("value given %q, want %q", rv, v) 1023 // } 1024 // } 1025 1026 // func TestMagic_Separator(t *testing.T) { 1027 // mgc, _ := New() 1028 // defer mgc.Close() 1029 1030 // var flags int 1031 // var rv string 1032 // var actual []string 1033 1034 // n := Version() 1035 1036 // v := []string{"Bourne-Again shell script text executable", "a /bin/bash script, ASCII text executable", "data"} 1037 // if n < 524 || n > 536 { 1038 // // Some older version of libmagic reported this correctly, and latest 1039 // // version of libmagic has been fixed so it does not try to report text 1040 // // files as "data" any more, albeit it returns an extra separator entry 1041 // // which causes an extra entry to be added. 1042 // v = []string{"Bourne-Again shell script text executable", "a /bin/bash script, ASCII text executable"} 1043 // } 1044 // if n > 533 && n < 535 { 1045 // v = []string{"Bourne-Again shell script text executable", "a /bin/bash script, ASCII text executable", ""} 1046 // } 1047 1048 // var separatorTests = []struct { 1049 // flags int 1050 // expected []string 1051 // }{ 1052 // // Flag: MAGIC_NONE 1053 // {0x000000, []string{"Bourne-Again shell script, ASCII text executable"}}, 1054 // // Flag: MAGIC_CONTINUE 1055 // {0x000020, v}, 1056 // // Flag: MIME_ENCODING 1057 // {0x000400, []string{"us-ascii"}}, 1058 // // Flag: MIME_TYPE, MIME_ENCODING 1059 // {0x000410, []string{"text/x-shellscript; charset=us-ascii"}}, 1060 // } 1061 1062 // buffer := []byte("#!/bin/bash\n\n") 1063 // mgc.Load(shellMagicFile) 1064 1065 // for _, tt := range separatorTests { 1066 // mgc.SetFlags(tt.flags) 1067 1068 // rv, _ = mgc.Buffer(buffer) 1069 // flags, _ = mgc.Flags() 1070 1071 // actual = strings.Split(rv, Separator) 1072 // if ok := reflect.DeepEqual(actual, tt.expected); !ok || flags != tt.flags { 1073 // t.Errorf("value given {0x%x %v}, want {0x%x %v}", flags, actual, tt.flags, tt.expected) 1074 // } 1075 // } 1076 // } 1077 1078 // func Test_open(t *testing.T) { 1079 // mgc, _ := open() 1080 // defer func() { 1081 // mgc.close() 1082 // }() 1083 1084 // func(v interface{}) { 1085 // if _, ok := v.(*Magic); !ok { 1086 // t.Fatalf("not a Magic type: %s", reflect.TypeOf(v).String()) 1087 // } 1088 // }(mgc) 1089 1090 // magic := reflect.ValueOf(mgc).Elem().FieldByName("magic").Elem() 1091 // path := magic.FieldByName("paths") 1092 // cookie := magic.FieldByName("cookie").Elem().UnsafeAddr() 1093 1094 // if path.Kind() != reflect.Slice || path.Len() > 0 { 1095 // t.Errorf("value given {%v ?}, want {%v %d}", path.Kind(), reflect.Slice, 0) 1096 // } 1097 1098 // if reflect.ValueOf(cookie).Kind() != reflect.Uintptr || cookie == 0 { 1099 // t.Errorf("value given {%v 0x%x}, want {%v > %d}", reflect.ValueOf(cookie).Kind(), cookie, reflect.Uintptr, 0) 1100 // } 1101 // } 1102 1103 // func Test_close(t *testing.T) { 1104 // mgc, _ := open() 1105 // mgc.close() 1106 1107 // value := reflect.ValueOf(mgc).Elem().FieldByName("magic") 1108 // path := value.Elem().FieldByName("paths") 1109 // cookie := value.Elem().FieldByName("cookie").Elem() 1110 1111 // if path.Kind() != reflect.Slice || path.Len() > 0 { 1112 // t.Errorf("value given {%v ?}, want {%v %d}", path.Kind(), reflect.Slice, 0) 1113 // } 1114 1115 // // Should be NULL (at C level) as magic_close() will free underlying Magic database. 1116 // if ok := cookie.IsValid(); ok { 1117 // t.Errorf("value given %v, want %v", ok, false) 1118 // } 1119 // } 1120 1121 // func TestOpen(t *testing.T) { 1122 // var mgc *Magic 1123 1124 // var n int 1125 // var ok bool 1126 // var err error 1127 // var rv, v string 1128 1129 // n = Version() 1130 1131 // err = Open(nil) 1132 1133 // v = "magic: not a function or nil pointer" 1134 // if ok := compareStrings(err.Error(), v); !ok { 1135 // t.Errorf("value given %q, want %q", err.Error(), v) 1136 // } 1137 1138 // err = Open(func(m *Magic) error { 1139 // m.Load("does/not/exist") 1140 // // There should be an error originating from magic.New() 1141 // // which is wrapped inside magic.Open(). 1142 // return nil 1143 // }) 1144 1145 // v = "magic: could not find any valid magic files!" 1146 // if n < 518 && n >= 514 { 1147 // // A few releases of libmagic were having issues. 1148 // v = "magic: no magic files loaded" 1149 // } else if n < 0 { 1150 // // Older version of libmagic reports same error differently. 1151 // v = "magic: could not find any magic files!" 1152 // } 1153 1154 // if ok := compareStrings(err.Error(), v); !ok { 1155 // t.Errorf("value given %q, want %q", err.Error(), v) 1156 // } 1157 1158 // if n >= 519 { 1159 // formatDirectory = "new-format" 1160 // } 1161 1162 // genuineMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png.magic")) 1163 1164 // err = Open(func(m *Magic) error { 1165 // m.Load(genuineMagicFile) 1166 // a, b := m.File(sampleImageFile) 1167 // rv = a // Pass outside the closure for verification. 1168 // return b // Or return nil here ... 1169 // }) 1170 1171 // if err != nil { 1172 // if ok := compareStrings(err.Error(), v); !ok { 1173 // t.Errorf("value given {%v %q}, want {%v %q}", rv, err.Error(), false, v) 1174 // } 1175 // } 1176 1177 // v = "PNG image data, 1634 x 2224, 8-bit/color RGBA, non-interlaced" 1178 // if ok = compareStrings(rv, v); !ok { 1179 // t.Errorf("value given %q, want %q", rv, v) 1180 // } 1181 1182 // err = Open(func(m *Magic) error { 1183 // // A canary value to test error propagation ... 1184 // panic("123abc456") 1185 // }) 1186 1187 // v = "magic: 123abc456" 1188 // if ok = compareStrings(err.Error(), v); !ok { 1189 // t.Errorf("value given %q, want %q", err.Error(), v) 1190 // } 1191 1192 // _ = Open(func(m *Magic) error { 1193 // mgc = m // Pass outside the closure ... 1194 // return nil 1195 // }) 1196 1197 // magic := reflect.ValueOf(mgc).Elem().FieldByName("magic").Elem() 1198 // cookie := magic.FieldByName("cookie").Elem() 1199 1200 // // Should be NULL (at C level) as magic_close() will free underlying Magic database. 1201 // if ok := cookie.IsValid(); ok { 1202 // t.Errorf("value given %v, want %v", ok, false) 1203 // } 1204 // } 1205 1206 // func TestCompile(t *testing.T) { 1207 // var rv bool 1208 // var err error 1209 // var genuine, broken, v string 1210 1211 // clean := func() { 1212 // files, _ := filepath.Glob("*.mgc") 1213 // for _, f := range files { 1214 // os.Remove(f) 1215 // } 1216 // } 1217 1218 // n := Version() 1219 1220 // _, err = Compile("does/not/exist") 1221 1222 // v = "magic: could not find any valid magic files!" 1223 // if n < 518 && n >= 514 { 1224 // // A few releases of libmagic were having issues. 1225 // v = "magic: no magic files loaded" 1226 // } else if n < 0 { 1227 // // Older version of libmagic reports same error differently. 1228 // v = "magic: could not find any magic files!" 1229 // } 1230 1231 // if err == nil { 1232 // t.Errorf("value given {%v \"%v\"}, want {%v %q}", rv, err, false, v) 1233 // } 1234 1235 // if ok := compareStrings(err.Error(), v); !ok && !rv { 1236 // t.Errorf("value given {%v %q}, want {%v %q}", rv, err.Error(), false, v) 1237 // } 1238 1239 // wd, err := os.Getwd() 1240 // if err != nil { 1241 // t.Fatal("unable to get current and/or working directory") 1242 // } 1243 1244 // os.Chdir(path.Join(wd, path.Join(fixturesDirectory, formatDirectory))) 1245 // defer func() { 1246 // clean() 1247 // os.Chdir(wd) 1248 // }() 1249 1250 // clean() 1251 1252 // if n >= 519 { 1253 // formatDirectory = "new-format" 1254 // } 1255 1256 // genuineMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png.magic")) 1257 // brokenMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png-broken.magic")) 1258 1259 // _, genuine = path.Split(genuineMagicFile) 1260 // _, broken = path.Split(brokenMagicFile) 1261 1262 // // Re-define as we are no longer in top-level directory ... 1263 // genuine = path.Clean(path.Join(".", genuine)) 1264 // broken = path.Clean(path.Join(".", broken)) 1265 1266 // rv, err = Compile(genuine) 1267 // if err != nil { 1268 // t.Errorf("value given {%v \"%v\"}, want {%v %q}", rv, err, true, "") 1269 // } 1270 1271 // rv, err = Compile(broken) 1272 1273 // v = "magic: line 1: No current entry for continuation" 1274 // if n < 518 && n >= 514 { 1275 // // A few releases of libmagic were having issues. 1276 // v = "magic: no magic files loaded" 1277 // } else if n < 0 { 1278 // // Older version of libmagic reports same error differently. 1279 // v = "magic: No current entry for continuation" 1280 // } 1281 1282 // if err == nil { 1283 // t.Errorf("value given {%v \"%v\"}, want {%v %q}", rv, err, false, v) 1284 // } 1285 1286 // if ok := compareStrings(err.Error(), v); !ok { 1287 // t.Errorf("value given {%v %q}, want {%v %q}", rv, err.Error(), false, v) 1288 // } 1289 // } 1290 1291 // func TestCheck(t *testing.T) { 1292 // var rv bool 1293 // var err error 1294 // var v string 1295 1296 // n := Version() 1297 1298 // _, err = Check("does/not/exist") 1299 1300 // v = "magic: could not find any valid magic files!" 1301 // if n < 518 && n >= 514 { 1302 // // A few releases of libmagic were having issues. 1303 // v = "magic: no magic files loaded" 1304 // } else if n < 0 { 1305 // // Older version of libmagic reports same error differently. 1306 // v = "magic: could not find any magic files!" 1307 // } 1308 1309 // if err == nil { 1310 // t.Errorf("value given {%v \"%v\"}, want {%v %q}", rv, err, false, v) 1311 // } 1312 1313 // if ok := compareStrings(err.Error(), v); !ok { 1314 // t.Errorf("value given {%v %q}, want {%v %q}", rv, err.Error(), false, v) 1315 // } 1316 1317 // if n >= 519 { 1318 // formatDirectory = "new-format" 1319 // } 1320 1321 // genuineMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png.magic")) 1322 // brokenMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png-broken.magic")) 1323 1324 // rv, err = Check(genuineMagicFile) 1325 // if err != nil { 1326 // t.Errorf("value given {%v \"%v\"}, want {%v %q}", rv, err, true, "") 1327 // } 1328 1329 // rv, err = Check(brokenMagicFile) 1330 1331 // v = "magic: line 1: No current entry for continuation" 1332 // if n < 518 && n >= 514 { 1333 // // A few releases of libmagic were having issues. 1334 // v = "magic: no magic files loaded" 1335 // } else if n < 0 { 1336 // // Older version of libmagic reports same error differently. 1337 // v = "magic: No current entry for continuation" 1338 // } 1339 1340 // if err == nil { 1341 // t.Errorf("value given {%v \"%v\"}, want {%v %q}", rv, err, false, v) 1342 // } 1343 1344 // if ok := compareStrings(err.Error(), v); !ok { 1345 // t.Errorf("value given {%v %q}, want {%v %q}", rv, err.Error(), false, v) 1346 // } 1347 // } 1348 1349 // func TestVersion(t *testing.T) { 1350 // v := Version() 1351 // if reflect.ValueOf(v).Kind() != reflect.Int || v <= 0 { 1352 // t.Errorf("value given {%v %d}, want {%v > %d}", reflect.ValueOf(v).Kind(), v, reflect.Int, 0) 1353 // } 1354 // } 1355 1356 // func TestVersionString(t *testing.T) { 1357 // rv := Version() 1358 1359 // s := VersionString() 1360 // if reflect.ValueOf(s).Kind() != reflect.String || s == "" { 1361 // t.Errorf("value given {%v %d}, want {%v > %d}", reflect.ValueOf(s).Kind(), len(s), reflect.String, 0) 1362 // } 1363 1364 // v := fmt.Sprintf("%d.%02d", rv/100, rv%100) 1365 // if ok := compareStrings(s, v); !ok { 1366 // t.Errorf("value given %q, want %q", s, v) 1367 // } 1368 // } 1369 1370 // func TestVersionSlice(t *testing.T) { 1371 // rv := Version() 1372 1373 // s := VersionSlice() 1374 // if reflect.ValueOf(s).Kind() != reflect.Slice || len(s) == 0 { 1375 // t.Errorf("value given {%v %d}, want {%v > %d}", reflect.ValueOf(s).Kind(), len(s), reflect.Slice, 0) 1376 // } 1377 1378 // v := []int{rv / 100, rv % 100} 1379 // if ok := reflect.DeepEqual(s, v); !ok { 1380 // t.Errorf("value given %v, want %v", s, v) 1381 // } 1382 // } 1383 1384 // func TestFileMime(t *testing.T) { 1385 // var ok bool 1386 // var err error 1387 // var v, rv string 1388 1389 // n := Version() 1390 1391 // _, err = FileMime(sampleImageFile, "does/not/exist") 1392 1393 // v = "magic: could not find any valid magic files!" 1394 // if n < 518 && n >= 514 { 1395 // // A few releases of libmagic were having issues. 1396 // v = "magic: no magic files loaded" 1397 // } else if n < 0 { 1398 // // Older version of libmagic reports same error differently. 1399 // v = "magic: could not find any magic files!" 1400 // } 1401 1402 // if ok := compareStrings(err.Error(), v); !ok { 1403 // t.Errorf("value given %q, want %q", err.Error(), v) 1404 // } 1405 1406 // if n >= 519 { 1407 // formatDirectory = "new-format" 1408 // } 1409 1410 // genuineMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png.magic")) 1411 // brokenMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png-broken.magic")) 1412 // fakeMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png-fake.magic")) 1413 1414 // rv, err = FileMime("does/not/exist", genuineMagicFile) 1415 // if rv == "" && err != nil { 1416 // v = "magic: cannot open `does/not/exist' (No such file or directory)" 1417 // if ok := compareStrings(err.Error(), v); !ok { 1418 // t.Errorf("value given {%v %q}, want {%v %q}", rv, err.Error(), "", v) 1419 // } 1420 // } 1421 1422 // rv, _ = FileMime(sampleImageFile, genuineMagicFile) 1423 1424 // v = "image/png; charset=binary" 1425 // if ok = compareStrings(rv, v); !ok { 1426 // t.Errorf("value given %q, want %q", rv, v) 1427 // } 1428 1429 // rv, _ = FileMime(sampleImageFile, fakeMagicFile) 1430 // v = "image/x-go-gopher; charset=binary" 1431 // if ok = compareStrings(rv, v); !ok { 1432 // t.Errorf("value given %q, want %q", rv, v) 1433 // } 1434 1435 // rv, err = FileMime(sampleImageFile, brokenMagicFile) 1436 // if rv == "" && err != nil { 1437 // n := Version() 1438 1439 // v = "magic: line 1: No current entry for continuation" 1440 // if n < 518 && n >= 514 { 1441 // // A few releases of libmagic were having issues. 1442 // v = "magic: no magic files loaded" 1443 // } else if n < 0 { 1444 // // Older version of libmagic reports same error differently. 1445 // v = "magic: No current entry for continuation" 1446 // } 1447 1448 // if ok := compareStrings(err.Error(), v); !ok { 1449 // t.Errorf("value given {%v %q}, want {%v %q}", rv, err.Error(), false, v) 1450 // } 1451 // } 1452 // } 1453 1454 // func TestFileType(t *testing.T) { 1455 // var ok bool 1456 // var err error 1457 // var v, rv string 1458 1459 // n := Version() 1460 1461 // _, err = FileType(sampleImageFile, "does/not/exist") 1462 1463 // v = "magic: could not find any valid magic files!" 1464 // if n < 518 && n >= 514 { 1465 // // A few releases of libmagic were having issues. 1466 // v = "magic: no magic files loaded" 1467 // } else if n < 0 { 1468 // // Older version of libmagic reports same error differently. 1469 // v = "magic: could not find any magic files!" 1470 // } 1471 1472 // if ok := compareStrings(err.Error(), v); !ok { 1473 // t.Errorf("value given %q, want %q", err.Error(), v) 1474 // } 1475 1476 // if n >= 519 { 1477 // formatDirectory = "new-format" 1478 // } 1479 1480 // genuineMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png.magic")) 1481 // brokenMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png-broken.magic")) 1482 // fakeMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png-fake.magic")) 1483 1484 // rv, err = FileType("does/not/exist", genuineMagicFile) 1485 // if rv == "" && err != nil { 1486 // v = "magic: cannot open `does/not/exist' (No such file or directory)" 1487 // if ok := compareStrings(err.Error(), v); !ok { 1488 // t.Errorf("value given {%v %q}, want {%v %q}", rv, err.Error(), "", v) 1489 // } 1490 // } 1491 1492 // rv, _ = FileType(sampleImageFile, genuineMagicFile) 1493 // v = "image/png" 1494 // if ok = compareStrings(rv, v); !ok { 1495 // t.Errorf("value given %q, want %q", rv, v) 1496 // } 1497 1498 // rv, _ = FileType(sampleImageFile, fakeMagicFile) 1499 // v = "image/x-go-gopher" 1500 // if ok = compareStrings(rv, v); !ok { 1501 // t.Errorf("value given %q, want %q", rv, v) 1502 // } 1503 1504 // rv, _ = FileType(sampleImageFile, brokenMagicFile) 1505 // if rv == "" && err != nil { 1506 // n := Version() 1507 1508 // v = "magic: line 1: No current entry for continuation" 1509 // if n < 518 && n >= 514 { 1510 // // A few releases of libmagic were having issues. 1511 // v = "magic: no magic files loaded" 1512 // } else if n < 0 { 1513 // // Older version of libmagic reports same error differently. 1514 // v = "magic: No current entry for continuation" 1515 // } 1516 1517 // if ok := compareStrings(err.Error(), v); !ok { 1518 // t.Errorf("value given {%v %q}, want {%v %q}", rv, err.Error(), false, v) 1519 // } 1520 // } 1521 // } 1522 1523 // func TestFileEncoding(t *testing.T) { 1524 // var ok bool 1525 // var err error 1526 // var v, rv string 1527 1528 // n := Version() 1529 1530 // _, err = FileEncoding(sampleImageFile, "does/not/exist") 1531 1532 // v = "magic: could not find any valid magic files!" 1533 // if n < 518 && n >= 514 { 1534 // // A few releases of libmagic were having issues. 1535 // v = "magic: no magic files loaded" 1536 // } else if n < 0 { 1537 // // Older version of libmagic reports same error differently. 1538 // v = "magic: could not find any magic files!" 1539 // } 1540 1541 // if ok := compareStrings(err.Error(), v); !ok { 1542 // t.Errorf("value given %q, want %q", err.Error(), v) 1543 // } 1544 1545 // if n >= 519 { 1546 // formatDirectory = "new-format" 1547 // } 1548 1549 // genuineMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png.magic")) 1550 // brokenMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png-broken.magic")) 1551 // fakeMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png-fake.magic")) 1552 1553 // rv, err = FileEncoding("does/not/exist", genuineMagicFile) 1554 // if rv == "" && err != nil { 1555 // v = "magic: cannot open `does/not/exist' (No such file or directory)" 1556 // if ok := compareStrings(err.Error(), v); !ok { 1557 // t.Errorf("value given {%v %q}, want {%v %q}", rv, err.Error(), "", v) 1558 // } 1559 // } 1560 1561 // v = "binary" // Binary data will always have this encoding. 1562 1563 // rv, _ = FileEncoding(sampleImageFile, genuineMagicFile) 1564 // if ok = compareStrings(rv, v); !ok { 1565 // t.Errorf("value given %q, want %q", rv, v) 1566 // } 1567 1568 // rv, _ = FileEncoding(sampleImageFile, fakeMagicFile) 1569 // if ok = compareStrings(rv, v); !ok { 1570 // t.Errorf("value given %q, want %q", rv, v) 1571 // } 1572 1573 // rv, _ = FileEncoding(sampleImageFile, brokenMagicFile) 1574 // if rv == "" && err != nil { 1575 // n := Version() 1576 1577 // v = "magic: line 1: No current entry for continuation" 1578 // if n < 518 && n >= 514 { 1579 // // A few releases of libmagic were having issues. 1580 // v = "magic: no magic files loaded" 1581 // } else if n < 0 { 1582 // // Older version of libmagic reports same error differently. 1583 // v = "magic: No current entry for continuation" 1584 // } 1585 1586 // if ok := compareStrings(err.Error(), v); !ok { 1587 // t.Errorf("value given {%v %q}, want {%v %q}", rv, err.Error(), false, v) 1588 // } 1589 // } 1590 // } 1591 1592 // func TestBufferMime(t *testing.T) { 1593 // var ok bool 1594 // var err error 1595 // var v, rv string 1596 1597 // n := Version() 1598 1599 // _, err = BufferMime([]byte{}, "does/not/exist") 1600 1601 // v = "magic: could not find any valid magic files!" 1602 // if n < 518 && n >= 514 { 1603 // // A few releases of libmagic were having issues. 1604 // v = "magic: no magic files loaded" 1605 // } else if n < 0 { 1606 // // Older version of libmagic reports same error differently. 1607 // v = "magic: could not find any magic files!" 1608 // } 1609 1610 // if ok := compareStrings(err.Error(), v); !ok { 1611 // t.Errorf("value given %q, want %q", err.Error(), v) 1612 // } 1613 1614 // if n >= 519 { 1615 // formatDirectory = "new-format" 1616 // } 1617 1618 // genuineMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png.magic")) 1619 // fakeMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png-fake.magic")) 1620 1621 // buffer := &bytes.Buffer{} 1622 1623 // f, err := os.Open(sampleImageFile) 1624 // if err != nil { 1625 // t.Fatalf("unable to open file `%s'", sampleImageFile) 1626 // } 1627 // io.Copy(buffer, f) 1628 // f.Close() 1629 1630 // rv, _ = BufferMime(buffer.Bytes(), genuineMagicFile) 1631 1632 // v = "image/png; charset=binary" 1633 // if ok = compareStrings(rv, v); !ok { 1634 // t.Errorf("value given %q, want %q", rv, v) 1635 // } 1636 1637 // rv, _ = BufferMime(buffer.Bytes(), fakeMagicFile) 1638 1639 // v = "image/x-go-gopher; charset=binary" 1640 // if ok = compareStrings(rv, v); !ok { 1641 // t.Errorf("value given %q, want %q", rv, v) 1642 // } 1643 1644 // buffer.Reset() 1645 // buffer.WriteString("Hello, 世界") 1646 1647 // rv, _ = BufferMime(buffer.Bytes()) 1648 1649 // v = "text/plain; charset=utf-8" 1650 // if ok = compareStrings(rv, v); !ok { 1651 // t.Errorf("value given %q, want %q", rv, v) 1652 // } 1653 1654 // buffer.Reset() 1655 // buffer.WriteString("#!/bin/bash\n\n") 1656 1657 // rv, _ = BufferMime(buffer.Bytes()) 1658 1659 // v = "text/x-shellscript; charset=us-ascii" 1660 // if ok = compareStrings(rv, v); !ok { 1661 // t.Errorf("value given %q, want %q", rv, v) 1662 // } 1663 1664 // buffer.Reset() 1665 // buffer.Write([]byte{0x0}) 1666 1667 // rv, _ = BufferMime(buffer.Bytes()) 1668 1669 // v = "application/octet-stream; charset=binary" 1670 // if n := Version(); n < 515 { 1671 // // A few releases of libmagic were having issues. 1672 // v = "application/octet-stream" 1673 // } 1674 1675 // if ok = compareStrings(rv, v); !ok { 1676 // t.Errorf("value given %q, want %q", rv, v) 1677 // } 1678 1679 // buffer.Reset() 1680 1681 // defer func() { 1682 // r := recover() 1683 // if r == nil { 1684 // t.Error("did not panic") 1685 // return 1686 // } 1687 1688 // v = "runtime error: index out of range [0] with length 0" 1689 // if ok := compareStrings(r.(error).Error(), v); !ok { 1690 // t.Errorf("value given %q, want %q", r.(error).Error(), v) 1691 // return 1692 // } 1693 // }() 1694 1695 // // Will panic ... 1696 // BufferMime(buffer.Bytes()) 1697 // } 1698 1699 // func TestBufferType(t *testing.T) { 1700 // var ok bool 1701 // var err error 1702 // var v, rv string 1703 1704 // n := Version() 1705 1706 // _, err = BufferType([]byte{}, "does/not/exist") 1707 1708 // v = "magic: could not find any valid magic files!" 1709 // if n < 518 && n >= 514 { 1710 // // A few releases of libmagic were having issues. 1711 // v = "magic: no magic files loaded" 1712 // } else if n < 0 { 1713 // // Older version of libmagic reports same error differently. 1714 // v = "magic: could not find any magic files!" 1715 // } 1716 1717 // if ok := compareStrings(err.Error(), v); !ok { 1718 // t.Errorf("value given %q, want %q", err.Error(), v) 1719 // } 1720 1721 // if n >= 519 { 1722 // formatDirectory = "new-format" 1723 // } 1724 1725 // genuineMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png.magic")) 1726 // fakeMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png-fake.magic")) 1727 1728 // buffer := &bytes.Buffer{} 1729 1730 // f, err := os.Open(sampleImageFile) 1731 // if err != nil { 1732 // t.Fatalf("unable to open file `%s'", sampleImageFile) 1733 // } 1734 // io.Copy(buffer, f) 1735 // f.Close() 1736 1737 // rv, _ = BufferType(buffer.Bytes(), genuineMagicFile) 1738 1739 // v = "image/png" 1740 // if ok = compareStrings(rv, v); !ok { 1741 // t.Errorf("value given %q, want %q", rv, v) 1742 // } 1743 1744 // rv, _ = BufferType(buffer.Bytes(), fakeMagicFile) 1745 1746 // v = "image/x-go-gopher" 1747 // if ok = compareStrings(rv, v); !ok { 1748 // t.Errorf("value given %q, want %q", rv, v) 1749 // } 1750 1751 // buffer.Reset() 1752 // buffer.WriteString("Hello, 世界") 1753 1754 // rv, _ = BufferType(buffer.Bytes()) 1755 1756 // v = "text/plain" 1757 // if ok = compareStrings(rv, v); !ok { 1758 // t.Errorf("value given %q, want %q", rv, v) 1759 // } 1760 1761 // buffer.Reset() 1762 // buffer.WriteString("#!/bin/bash\n\n") 1763 1764 // rv, _ = BufferType(buffer.Bytes()) 1765 1766 // v = "text/x-shellscript" 1767 // if ok = compareStrings(rv, v); !ok { 1768 // t.Errorf("value given %q, want %q", rv, v) 1769 // } 1770 1771 // buffer.Reset() 1772 // buffer.Write([]byte{0x0}) 1773 1774 // rv, _ = BufferType(buffer.Bytes()) 1775 1776 // v = "application/octet-stream" 1777 // if ok = compareStrings(rv, v); !ok { 1778 // t.Errorf("value given %q, want %q", rv, v) 1779 // } 1780 1781 // buffer.Reset() 1782 1783 // defer func() { 1784 // r := recover() 1785 // if r == nil { 1786 // t.Error("did not panic") 1787 // return 1788 // } 1789 // v = "runtime error: index out of range [0] with length 0" 1790 // if ok := compareStrings(r.(error).Error(), v); !ok { 1791 // t.Errorf("value given %q, want %q", r.(error).Error(), v) 1792 // return 1793 // } 1794 // }() 1795 1796 // // Will panic ... 1797 // BufferType(buffer.Bytes()) 1798 // } 1799 1800 // func TestBufferEncoding(t *testing.T) { 1801 // var ok bool 1802 // var err error 1803 // var v, rv string 1804 1805 // n := Version() 1806 1807 // _, err = BufferEncoding([]byte{}, "does/not/exist") 1808 1809 // v = "magic: could not find any valid magic files!" 1810 // if n < 518 && n >= 514 { 1811 // // A few releases of libmagic were having issues. 1812 // v = "magic: no magic files loaded" 1813 // } else if n < 0 { 1814 // // Older version of libmagic reports same error differently. 1815 // v = "magic: could not find any magic files!" 1816 // } 1817 1818 // if ok := compareStrings(err.Error(), v); !ok { 1819 // t.Errorf("value given %q, want %q", err.Error(), v) 1820 // } 1821 1822 // if n >= 519 { 1823 // formatDirectory = "new-format" 1824 // } 1825 1826 // genuineMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png.magic")) 1827 // fakeMagicFile := path.Clean(path.Join(fixturesDirectory, formatDirectory, "png-fake.magic")) 1828 1829 // buffer := &bytes.Buffer{} 1830 1831 // f, err := os.Open(sampleImageFile) 1832 // if err != nil { 1833 // t.Fatalf("unable to open file `%s'", sampleImageFile) 1834 // } 1835 // io.Copy(buffer, f) 1836 // f.Close() 1837 1838 // rv, _ = BufferEncoding(buffer.Bytes(), genuineMagicFile) 1839 1840 // v = "binary" 1841 // if ok = compareStrings(rv, v); !ok { 1842 // t.Errorf("value given %q, want %q", rv, v) 1843 // } 1844 1845 // rv, _ = BufferEncoding(buffer.Bytes(), fakeMagicFile) 1846 1847 // v = "binary" 1848 // if ok = compareStrings(rv, v); !ok { 1849 // t.Errorf("value given %q, want %q", rv, v) 1850 // } 1851 1852 // buffer.Reset() 1853 // buffer.WriteString("Hello, 世界") 1854 1855 // rv, _ = BufferEncoding(buffer.Bytes()) 1856 1857 // v = "utf-8" 1858 // if ok = compareStrings(rv, v); !ok { 1859 // t.Errorf("value given %q, want %q", rv, v) 1860 // } 1861 1862 // buffer.Reset() 1863 // buffer.WriteString("#!/bin/bash\n\n") 1864 1865 // rv, _ = BufferEncoding(buffer.Bytes()) 1866 1867 // v = "us-ascii" 1868 // if ok = compareStrings(rv, v); !ok { 1869 // t.Errorf("value given %q, want %q", rv, v) 1870 // } 1871 1872 // buffer.Reset() 1873 // buffer.Write([]byte{0x0}) 1874 1875 // rv, _ = BufferEncoding(buffer.Bytes()) 1876 1877 // v = "" // Should be empty ... 1878 // if ok = compareStrings(rv, v); ok { 1879 // t.Errorf("value given %q, want %q", rv, v) 1880 // } 1881 1882 // buffer.Reset() 1883 1884 // defer func() { 1885 // r := recover() 1886 // if r == nil { 1887 // t.Error("did not panic") 1888 // return 1889 // } 1890 // v = "runtime error: index out of range [0] with length 0" 1891 // if ok := compareStrings(r.(error).Error(), v); !ok { 1892 // t.Errorf("value given %q, want %q", r.(error).Error(), v) 1893 // return 1894 // } 1895 // }() 1896 1897 // // Will panic ... 1898 // BufferEncoding(buffer.Bytes()) 1899 // }