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  // }