github.com/PandaGoAdmin/utils@v0.0.0-20211208134815-d5461603a00f/file_test.go (about)

     1  package kgo
     2  
     3  import (
     4  	"fmt"
     5  	"github.com/stretchr/testify/assert"
     6  	"os"
     7  	"strings"
     8  	"testing"
     9  )
    10  
    11  func TestFile_GetExt(t *testing.T) {
    12  	var ext string
    13  
    14  	ext = KFile.GetExt(fileGo)
    15  	assert.Equal(t, "go", ext)
    16  
    17  	ext = KFile.GetExt(fileGitkee)
    18  	assert.Equal(t, "gitkeep", ext)
    19  
    20  	ext = KFile.GetExt(fileSongs)
    21  	assert.Equal(t, "txt", ext)
    22  
    23  	ext = KFile.GetExt(fileNone)
    24  	assert.Empty(t, ext)
    25  }
    26  
    27  func BenchmarkFile_GetExt(b *testing.B) {
    28  	b.ResetTimer()
    29  	for i := 0; i < b.N; i++ {
    30  		KFile.GetExt(fileMd)
    31  	}
    32  }
    33  
    34  func TestFile_ReadFile(t *testing.T) {
    35  	var bs []byte
    36  	var err error
    37  
    38  	bs, err = KFile.ReadFile(fileMd)
    39  	assert.NotEmpty(t, bs)
    40  	assert.Nil(t, err)
    41  
    42  	//不存在的文件
    43  	bs, err = KFile.ReadFile(fileNone)
    44  	assert.NotNil(t, err)
    45  }
    46  
    47  func BenchmarkFile_ReadFile(b *testing.B) {
    48  	b.ResetTimer()
    49  	for i := 0; i < b.N; i++ {
    50  		_, _ = KFile.ReadFile(fileMd)
    51  	}
    52  }
    53  
    54  func TestFile_ReadInArray(t *testing.T) {
    55  	var sl []string
    56  	var err error
    57  
    58  	sl, err = KFile.ReadInArray(fileDante)
    59  	assert.Equal(t, 19568, len(sl))
    60  
    61  	//不存在的文件
    62  	sl, err = KFile.ReadInArray(fileNone)
    63  	assert.NotNil(t, err)
    64  }
    65  
    66  func BenchmarkFile_ReadInArray(b *testing.B) {
    67  	b.ResetTimer()
    68  	for i := 0; i < b.N; i++ {
    69  		_, _ = KFile.ReadInArray(fileMd)
    70  	}
    71  }
    72  
    73  func TestFile_ReadFirstLine(t *testing.T) {
    74  	var res []byte
    75  
    76  	res = KFile.ReadFirstLine(fileDante)
    77  	assert.NotEmpty(t, res)
    78  
    79  	//不存在的文件
    80  	res = KFile.ReadFirstLine(fileNone)
    81  	assert.Empty(t, res)
    82  }
    83  
    84  func BenchmarkFile_ReadFirstLine(b *testing.B) {
    85  	b.ResetTimer()
    86  	for i := 0; i < b.N; i++ {
    87  		KFile.ReadFirstLine(fileMd)
    88  	}
    89  }
    90  
    91  func TestFile_ReadLastLine(t *testing.T) {
    92  	var res []byte
    93  
    94  	res = KFile.ReadLastLine(changLog)
    95  	assert.NotEmpty(t, res)
    96  
    97  	//不存在的文件
    98  	res = KFile.ReadLastLine(fileNone)
    99  	assert.Empty(t, res)
   100  }
   101  
   102  func BenchmarkFile_ReadLastLine(b *testing.B) {
   103  	b.ResetTimer()
   104  	for i := 0; i < b.N; i++ {
   105  		KFile.ReadLastLine(fileMd)
   106  	}
   107  }
   108  
   109  func TestFile_WriteFile(t *testing.T) {
   110  	var err error
   111  
   112  	err = KFile.WriteFile(putfile, bytsHello)
   113  	assert.Nil(t, err)
   114  
   115  	//设置权限
   116  	err = KFile.WriteFile(putfile, bytsHello, 0777)
   117  	assert.Nil(t, err)
   118  
   119  	//无权限写
   120  	err = KFile.WriteFile(rootFile1, bytsHello, 0777)
   121  	if KOS.IsLinux() || KOS.IsMac() {
   122  		assert.NotNil(t, err)
   123  	}
   124  }
   125  
   126  func BenchmarkFile_WriteFile(b *testing.B) {
   127  	b.ResetTimer()
   128  	for i := 0; i < b.N; i++ {
   129  		filename := fmt.Sprintf("./testdata/file/putfile_%d", i)
   130  		_ = KFile.WriteFile(filename, bytsHello)
   131  	}
   132  }
   133  
   134  func TestFile_AppendFile(t *testing.T) {
   135  	var err error
   136  
   137  	//创建
   138  	err = KFile.AppendFile(apndfile, bytsHello)
   139  	assert.Nil(t, err)
   140  
   141  	//追加
   142  	err = KFile.AppendFile(apndfile, bytsHello)
   143  	assert.Nil(t, err)
   144  
   145  	//空路径
   146  	err = KFile.AppendFile("", bytsHello)
   147  	assert.NotNil(t, err)
   148  
   149  	//权限不足
   150  	err = KFile.AppendFile(rootFile1, bytsHello)
   151  	if KOS.IsLinux() || KOS.IsMac() {
   152  		assert.NotNil(t, err)
   153  	}
   154  }
   155  
   156  func BenchmarkFile_AppendFile(b *testing.B) {
   157  	b.ResetTimer()
   158  	for i := 0; i < b.N; i++ {
   159  		_ = KFile.AppendFile(apndfile, bytsHello)
   160  	}
   161  }
   162  
   163  func TestFile_GetMime(t *testing.T) {
   164  	var res string
   165  
   166  	res = KFile.GetMime(imgPng, false)
   167  	assert.NotEmpty(t, res)
   168  
   169  	res = KFile.GetMime(fileDante, true)
   170  	if KOS.IsWindows() {
   171  		assert.NotEmpty(t, res)
   172  	}
   173  
   174  	//不存在的文件
   175  	res = KFile.GetMime(fileNone, true)
   176  	assert.Empty(t, res)
   177  }
   178  
   179  func BenchmarkFile_GetMime_Fast(b *testing.B) {
   180  	b.ResetTimer()
   181  	for i := 0; i < b.N; i++ {
   182  		KFile.GetMime(fileMd, true)
   183  	}
   184  }
   185  
   186  func BenchmarkFile_GetMime_NoFast(b *testing.B) {
   187  	b.ResetTimer()
   188  	for i := 0; i < b.N; i++ {
   189  		KFile.GetMime(fileMd, false)
   190  	}
   191  }
   192  
   193  func TestFile_FileSize(t *testing.T) {
   194  	var res int64
   195  
   196  	res = KFile.FileSize(changLog)
   197  	assert.Greater(t, res, int64(0))
   198  
   199  	//不存在的文件
   200  	res = KFile.FileSize(fileNone)
   201  	assert.Equal(t, int64(-1), res)
   202  }
   203  
   204  func BenchmarkFile_FileSize(b *testing.B) {
   205  	b.ResetTimer()
   206  	for i := 0; i < b.N; i++ {
   207  		KFile.FileSize(fileMd)
   208  	}
   209  }
   210  
   211  func TestFile_DirSize(t *testing.T) {
   212  	var res int64
   213  
   214  	res = KFile.DirSize(dirCurr)
   215  	assert.Greater(t, res, int64(0))
   216  
   217  	//不存在的目录
   218  	res = KFile.DirSize(fileNone)
   219  	assert.Equal(t, int64(0), res)
   220  }
   221  
   222  func BenchmarkFile_DirSize(b *testing.B) {
   223  	b.ResetTimer()
   224  	for i := 0; i < b.N; i++ {
   225  		KFile.DirSize(dirTdat)
   226  	}
   227  }
   228  
   229  func TestFile_IsExist(t *testing.T) {
   230  	var res bool
   231  
   232  	res = KFile.IsExist(changLog)
   233  	assert.True(t, res)
   234  
   235  	res = KFile.IsExist(fileNone)
   236  	assert.False(t, res)
   237  }
   238  
   239  func BenchmarkFile_IsExist(b *testing.B) {
   240  	b.ResetTimer()
   241  	for i := 0; i < b.N; i++ {
   242  		KFile.IsExist(fileMd)
   243  	}
   244  }
   245  
   246  func TestFile_IsReadable(t *testing.T) {
   247  	var res bool
   248  
   249  	res = KFile.IsReadable(dirTdat)
   250  	assert.True(t, res)
   251  
   252  	//不存在的目录
   253  	res = KFile.IsReadable(fileNone)
   254  	assert.False(t, res)
   255  }
   256  
   257  func BenchmarkFile_IsReadable(b *testing.B) {
   258  	b.ResetTimer()
   259  	for i := 0; i < b.N; i++ {
   260  		KFile.IsReadable(dirTdat)
   261  	}
   262  }
   263  
   264  func TestFile_IsWritable(t *testing.T) {
   265  	var res bool
   266  
   267  	res = KFile.IsWritable(dirTdat)
   268  	assert.True(t, res)
   269  
   270  	//不存在的目录
   271  	res = KFile.IsWritable(fileNone)
   272  	assert.False(t, res)
   273  }
   274  
   275  func BenchmarkFile_IsWritable(b *testing.B) {
   276  	b.ResetTimer()
   277  	for i := 0; i < b.N; i++ {
   278  		KFile.IsWritable(dirTdat)
   279  	}
   280  }
   281  
   282  func TestFile_IsExecutable(t *testing.T) {
   283  	var res bool
   284  
   285  	res = KFile.IsExecutable(fileNone)
   286  	assert.False(t, res)
   287  }
   288  
   289  func BenchmarkFile_IsExecutable(b *testing.B) {
   290  	b.ResetTimer()
   291  	for i := 0; i < b.N; i++ {
   292  		KFile.IsExecutable(fileMd)
   293  	}
   294  }
   295  
   296  func TestFile_IsLink(t *testing.T) {
   297  	//创建链接文件
   298  	if !KFile.IsExist(fileLink) {
   299  		_ = os.Symlink(filePubPem, fileLink)
   300  	}
   301  
   302  	var res bool
   303  
   304  	res = KFile.IsLink(fileLink)
   305  	assert.True(t, res)
   306  
   307  	res = KFile.IsLink(changLog)
   308  	assert.False(t, res)
   309  }
   310  
   311  func BenchmarkFile_IsLink(b *testing.B) {
   312  	b.ResetTimer()
   313  	for i := 0; i < b.N; i++ {
   314  		KFile.IsLink(fileLink)
   315  	}
   316  }
   317  
   318  func TestFile_IsFile(t *testing.T) {
   319  	tests := []struct {
   320  		f        string
   321  		t        LkkFileType
   322  		expected bool
   323  	}{
   324  		{"", FILE_TYPE_ANY, false},
   325  		{fileNone, FILE_TYPE_ANY, false},
   326  		{fileGo, FILE_TYPE_ANY, true},
   327  		{fileMd, FILE_TYPE_LINK, false},
   328  		{fileLink, FILE_TYPE_LINK, true},
   329  		{fileLink, FILE_TYPE_REGULAR, false},
   330  		{fileGitkee, FILE_TYPE_REGULAR, true},
   331  		{fileLink, FILE_TYPE_COMMON, true},
   332  		{imgJpg, FILE_TYPE_COMMON, true},
   333  	}
   334  	for _, test := range tests {
   335  		actual := KFile.IsFile(test.f, test.t)
   336  		assert.Equal(t, test.expected, actual)
   337  	}
   338  }
   339  
   340  func BenchmarkFile_IsFile(b *testing.B) {
   341  	b.ResetTimer()
   342  	for i := 0; i < b.N; i++ {
   343  		KFile.IsFile(fileMd, FILE_TYPE_ANY)
   344  	}
   345  }
   346  
   347  func TestFile_IsDir(t *testing.T) {
   348  	var res bool
   349  
   350  	res = KFile.IsDir(fileMd)
   351  	assert.False(t, res)
   352  
   353  	res = KFile.IsDir(fileNone)
   354  	assert.False(t, res)
   355  
   356  	res = KFile.IsDir(dirTdat)
   357  	assert.True(t, res)
   358  }
   359  
   360  func BenchmarkFile_IsDir(b *testing.B) {
   361  	b.ResetTimer()
   362  	for i := 0; i < b.N; i++ {
   363  		KFile.IsDir(dirTdat)
   364  	}
   365  }
   366  
   367  func TestFile_IsBinary(t *testing.T) {
   368  	var res bool
   369  	res = KFile.IsBinary(changLog)
   370  	assert.False(t, res)
   371  
   372  	res = KFile.IsBinary(imgPng)
   373  	assert.True(t, res)
   374  }
   375  
   376  func BenchmarkFile_IsBinary(b *testing.B) {
   377  	b.ResetTimer()
   378  	for i := 0; i < b.N; i++ {
   379  		KFile.IsBinary(changLog)
   380  	}
   381  }
   382  
   383  func TestFile_IsImg(t *testing.T) {
   384  	var res bool
   385  
   386  	res = KFile.IsImg(fileMd)
   387  	assert.False(t, res)
   388  
   389  	res = KFile.IsImg(imgSvg)
   390  	assert.True(t, res)
   391  
   392  	res = KFile.IsImg(imgPng)
   393  	assert.True(t, res)
   394  }
   395  
   396  func BenchmarkFile_IsImg(b *testing.B) {
   397  	b.ResetTimer()
   398  	for i := 0; i < b.N; i++ {
   399  		KFile.IsImg(imgPng)
   400  	}
   401  }
   402  
   403  func TestFile_Mkdir(t *testing.T) {
   404  	var err error
   405  
   406  	err = KFile.Mkdir(dirNew, 0777)
   407  	assert.Nil(t, err)
   408  }
   409  
   410  func BenchmarkFile_Mkdir(b *testing.B) {
   411  	b.ResetTimer()
   412  	for i := 0; i < b.N; i++ {
   413  		dname := fmt.Sprintf(dirNew+"/tmp_%d", i)
   414  		_ = KFile.Mkdir(dname, 0777)
   415  	}
   416  }
   417  
   418  func TestFile_AbsPath(t *testing.T) {
   419  	var res string
   420  
   421  	res = KFile.AbsPath(changLog)
   422  	assert.NotEqual(t, '.', rune(res[0]))
   423  
   424  	res = KFile.AbsPath(fileNone)
   425  	assert.NotEmpty(t, res)
   426  }
   427  
   428  func BenchmarkFile_AbsPath(b *testing.B) {
   429  	b.ResetTimer()
   430  	for i := 0; i < b.N; i++ {
   431  		KFile.AbsPath(changLog)
   432  	}
   433  }
   434  
   435  func TestFile_RealPath(t *testing.T) {
   436  	var res string
   437  
   438  	res = KFile.RealPath(fileMd)
   439  	assert.NotEmpty(t, res)
   440  
   441  	res = KFile.RealPath(fileNone)
   442  	assert.Empty(t, res)
   443  }
   444  
   445  func BenchmarkFile_RealPath(b *testing.B) {
   446  	b.ResetTimer()
   447  	for i := 0; i < b.N; i++ {
   448  		KFile.RealPath(fileMd)
   449  	}
   450  }
   451  
   452  func TestFile_TouchRenameUnlink(t *testing.T) {
   453  	var res bool
   454  	var err error
   455  
   456  	res = KFile.Touch(touchfile, 2097152)
   457  	assert.True(t, res)
   458  
   459  	err = KFile.Rename(touchfile, renamefile)
   460  	assert.Nil(t, err)
   461  
   462  	err = KFile.Unlink(renamefile)
   463  	assert.Nil(t, err)
   464  }
   465  
   466  func BenchmarkFile_Touch(b *testing.B) {
   467  	b.ResetTimer()
   468  	var filename string
   469  	for i := 0; i < b.N; i++ {
   470  		filename = fmt.Sprintf(dirTouch+"/zero_%d", i)
   471  		KFile.Touch(filename, 0)
   472  	}
   473  }
   474  
   475  func BenchmarkFile_Rename(b *testing.B) {
   476  	b.ResetTimer()
   477  	var f1, f2 string
   478  	for i := 0; i < b.N; i++ {
   479  		f1 = fmt.Sprintf(dirTouch+"/zero_%d", i)
   480  		f2 = fmt.Sprintf(dirTouch+"/zero_re%d", i)
   481  		_ = KFile.Rename(f1, f2)
   482  	}
   483  }
   484  
   485  func BenchmarkFile_Unlink(b *testing.B) {
   486  	b.ResetTimer()
   487  	var filename string
   488  	for i := 0; i < b.N; i++ {
   489  		filename = fmt.Sprintf(dirTouch+"/zero_re%d", i)
   490  		_ = KFile.Unlink(filename)
   491  	}
   492  }
   493  
   494  func TestFile_CopyFile(t *testing.T) {
   495  	var res int64
   496  	var err error
   497  
   498  	//忽略已存在的
   499  	res, err = KFile.CopyFile(imgPng, imgCopy, FILE_COVER_IGNORE)
   500  	assert.Nil(t, err)
   501  
   502  	//覆盖已存在的
   503  	res, err = KFile.CopyFile(imgPng, imgCopy, FILE_COVER_ALLOW)
   504  	assert.Greater(t, res, int64(0))
   505  
   506  	//禁止覆盖
   507  	res, err = KFile.CopyFile(imgPng, imgCopy, FILE_COVER_DENY)
   508  	assert.NotNil(t, err)
   509  
   510  	//源和目标文件相同
   511  	res, err = KFile.CopyFile(imgPng, imgPng, FILE_COVER_ALLOW)
   512  	assert.Equal(t, int64(0), res)
   513  	assert.Nil(t, err)
   514  
   515  	//拷贝大文件
   516  	KFile.Touch(touchfile, 2097152)
   517  	res, err = KFile.CopyFile(touchfile, copyfile, FILE_COVER_ALLOW)
   518  
   519  	//目标为空
   520  	res, err = KFile.CopyFile(imgPng, "", FILE_COVER_ALLOW)
   521  	assert.NotNil(t, err)
   522  
   523  	//源非正常文件
   524  	res, err = KFile.CopyFile(".", "", FILE_COVER_ALLOW)
   525  	assert.NotNil(t, err)
   526  }
   527  
   528  func BenchmarkFile_CopyFile(b *testing.B) {
   529  	b.ResetTimer()
   530  	var des string
   531  	for i := 0; i < b.N; i++ {
   532  		des = fmt.Sprintf(dirCopy+"/diglett_copy_%d.png", i)
   533  		_, _ = KFile.CopyFile(imgPng, des, FILE_COVER_ALLOW)
   534  	}
   535  }
   536  
   537  func TestFile_FastCopy(t *testing.T) {
   538  	var res int64
   539  	var err error
   540  
   541  	res, err = KFile.FastCopy(imgJpg, fastcopyfile)
   542  	assert.Greater(t, res, int64(0))
   543  
   544  	//源文件不存在
   545  	res, err = KFile.FastCopy(fileNone, fastcopyfile)
   546  	assert.NotNil(t, err)
   547  
   548  	//目标为空
   549  	res, err = KFile.FastCopy(imgJpg, "")
   550  	assert.NotNil(t, err)
   551  }
   552  
   553  func BenchmarkFile_FastCopy(b *testing.B) {
   554  	b.ResetTimer()
   555  	var des string
   556  	for i := 0; i < b.N; i++ {
   557  		des = fmt.Sprintf(dirCopy+"/fast_copy_%d", i)
   558  		_, _ = KFile.FastCopy(imgJpg, des)
   559  	}
   560  }
   561  
   562  func TestFile_CopyLink(t *testing.T) {
   563  	var err error
   564  
   565  	//源和目标相同
   566  	err = KFile.CopyLink(fileLink, fileLink)
   567  	assert.Nil(t, err)
   568  
   569  	err = KFile.CopyLink(fileLink, copyLink)
   570  	assert.Nil(t, err)
   571  
   572  	//源文件不存在
   573  	err = KFile.CopyLink(fileNone, copyLink)
   574  	assert.NotNil(t, err)
   575  
   576  	//目标为空
   577  	err = KFile.CopyLink(fileLink, "")
   578  	assert.NotNil(t, err)
   579  }
   580  
   581  func BenchmarkFile_CopyLink(b *testing.B) {
   582  	b.ResetTimer()
   583  	var des string
   584  	for i := 0; i < b.N; i++ {
   585  		des = fmt.Sprintf(dirLink+"/lnk_%d.copy", i)
   586  		_ = KFile.CopyLink(fileLink, des)
   587  	}
   588  }
   589  
   590  func TestFile_CopyDir(t *testing.T) {
   591  	var res int64
   592  	var err error
   593  
   594  	//忽略已存在的
   595  	res, err = KFile.CopyDir(dirVendor, dirTdat, FILE_COVER_IGNORE)
   596  	assert.Nil(t, err)
   597  
   598  	//覆盖已存在的
   599  	res, err = KFile.CopyDir(dirVendor, dirTdat, FILE_COVER_ALLOW)
   600  	assert.Nil(t, err)
   601  
   602  	//禁止覆盖
   603  	res, err = KFile.CopyDir(dirVendor, dirTdat, FILE_COVER_DENY)
   604  	assert.Equal(t, int64(0), res)
   605  
   606  	//源和目标相同
   607  	res, err = KFile.CopyDir(dirVendor, dirVendor, FILE_COVER_ALLOW)
   608  	assert.Equal(t, int64(0), res)
   609  
   610  	//目标为空
   611  	res, err = KFile.CopyDir(dirVendor, "", FILE_COVER_ALLOW)
   612  	assert.NotNil(t, err)
   613  
   614  	//源不是目录
   615  	res, err = KFile.CopyDir(fileMd, dirTdat, FILE_COVER_ALLOW)
   616  	assert.NotNil(t, err)
   617  }
   618  
   619  func BenchmarkFile_CopyDir(b *testing.B) {
   620  	b.ResetTimer()
   621  	var des string
   622  	for i := 0; i < b.N; i++ {
   623  		des = fmt.Sprintf(dirCopy+"/copydir_%d", i)
   624  		_, _ = KFile.CopyDir(dirDoc, des, FILE_COVER_ALLOW)
   625  	}
   626  }
   627  
   628  func TestFile_DelDir(t *testing.T) {
   629  	var err error
   630  	var chk bool
   631  
   632  	//清空目录
   633  	err = KFile.DelDir(dirCopy, false)
   634  	chk = KFile.IsDir(dirCopy)
   635  	assert.Nil(t, err)
   636  	assert.True(t, chk)
   637  
   638  	//删除目录
   639  	err = KFile.DelDir(dirNew, true)
   640  	chk = KFile.IsDir(dirNew)
   641  	assert.Nil(t, err)
   642  	assert.False(t, chk)
   643  }
   644  
   645  func BenchmarkFile_DelDir(b *testing.B) {
   646  	b.ResetTimer()
   647  	var des string
   648  	for i := 0; i < b.N; i++ {
   649  		des = fmt.Sprintf(dirCopy+"/copydir_%d", i)
   650  		_ = KFile.DelDir(des, true)
   651  	}
   652  }
   653  
   654  func TestFile_Img2Base64(t *testing.T) {
   655  	var res string
   656  	var err error
   657  
   658  	//png
   659  	res, err = KFile.Img2Base64(imgPng)
   660  	assert.Nil(t, err)
   661  	assert.Contains(t, res, "png")
   662  
   663  	//jpg
   664  	res, err = KFile.Img2Base64(imgJpg)
   665  	assert.Nil(t, err)
   666  	assert.Contains(t, res, "jpg")
   667  
   668  	//非图片
   669  	res, err = KFile.Img2Base64(fileMd)
   670  	assert.NotNil(t, err)
   671  
   672  	//图片不存在
   673  	res, err = KFile.Img2Base64(fileNone)
   674  	assert.NotNil(t, err)
   675  }
   676  
   677  func BenchmarkFile_Img2Base64(b *testing.B) {
   678  	b.ResetTimer()
   679  	for i := 0; i < b.N; i++ {
   680  		_, _ = KFile.Img2Base64(imgPng)
   681  	}
   682  }
   683  
   684  func TestFile_FileTree(t *testing.T) {
   685  	var res []string
   686  
   687  	//显示全部
   688  	res = KFile.FileTree(dirVendor, FILE_TREE_ALL, true)
   689  	assert.NotEmpty(t, res)
   690  
   691  	//仅目录
   692  	res = KFile.FileTree(dirVendor, FILE_TREE_DIR, true)
   693  	assert.NotEmpty(t, res)
   694  
   695  	//仅文件
   696  	res = KFile.FileTree(dirVendor, FILE_TREE_FILE, true)
   697  	assert.NotEmpty(t, res)
   698  
   699  	//不递归
   700  	res = KFile.FileTree(dirCurr, FILE_TREE_DIR, false)
   701  	assert.GreaterOrEqual(t, len(res), 4)
   702  
   703  	//文件过滤
   704  	res = KFile.FileTree(dirCurr, FILE_TREE_FILE, true, func(s string) bool {
   705  		ext := KFile.GetExt(s)
   706  		return ext == "go"
   707  	})
   708  	assert.NotEmpty(t, res)
   709  }
   710  
   711  func BenchmarkFile_FileTree(b *testing.B) {
   712  	b.ResetTimer()
   713  	for i := 0; i < b.N; i++ {
   714  		KFile.FileTree(dirCurr, FILE_TREE_ALL, false)
   715  	}
   716  }
   717  
   718  func TestFile_FormatDir(t *testing.T) {
   719  	var res string
   720  
   721  	res = KFile.FormatDir(pathTes3)
   722  	assert.NotContains(t, res, "\\")
   723  
   724  	//win格式
   725  	res = KFile.FormatDir(pathTes2)
   726  	assert.Equal(t, 1, strings.Count(res, ":"))
   727  
   728  	//空目录
   729  	res = KFile.FormatDir("")
   730  	assert.Empty(t, res)
   731  }
   732  
   733  func BenchmarkFile_FormatDir(b *testing.B) {
   734  	b.ResetTimer()
   735  	for i := 0; i < b.N; i++ {
   736  		KFile.FormatDir(pathTes3)
   737  	}
   738  }
   739  
   740  func TestFile_FormatPath(t *testing.T) {
   741  	var res string
   742  
   743  	res = KFile.FormatPath(pathTes1)
   744  	assert.NotContains(t, res, ":")
   745  
   746  	res = KFile.FormatPath(fileGmod)
   747  	assert.Equal(t, res, fileGmod)
   748  
   749  	res = KFile.FormatPath(fileGo)
   750  	assert.Equal(t, res, fileGo)
   751  
   752  	res = KFile.FormatPath(pathTes3)
   753  	assert.NotContains(t, res, "\\")
   754  
   755  	//win格式
   756  	res = KFile.FormatPath(pathTes2)
   757  	assert.Equal(t, 1, strings.Count(res, ":"))
   758  
   759  	//空路径
   760  	res = KFile.FormatPath("")
   761  	assert.Empty(t, res)
   762  }
   763  
   764  func BenchmarkFile_FormatPath(b *testing.B) {
   765  	b.ResetTimer()
   766  	for i := 0; i < b.N; i++ {
   767  		KFile.FormatPath(pathTes2)
   768  	}
   769  }
   770  
   771  func TestFile_Md5(t *testing.T) {
   772  	var res string
   773  	var err error
   774  
   775  	res, err = KFile.Md5(fileMd, 32)
   776  	assert.NotEmpty(t, res)
   777  
   778  	res, err = KFile.Md5(fileMd, 16)
   779  	assert.Nil(t, err)
   780  
   781  	//不存在的文件
   782  	res, err = KFile.Md5(fileNone, 32)
   783  	assert.NotNil(t, err)
   784  }
   785  
   786  func BenchmarkFile_Md5(b *testing.B) {
   787  	b.ResetTimer()
   788  	for i := 0; i < b.N; i++ {
   789  		_, _ = KFile.Md5(fileMd, 32)
   790  	}
   791  }
   792  
   793  func TestFile_ShaX(t *testing.T) {
   794  	defer func() {
   795  		r := recover()
   796  		assert.NotEmpty(t, r)
   797  	}()
   798  
   799  	var res string
   800  	var err error
   801  
   802  	res, err = KFile.ShaX(fileGmod, 1)
   803  	assert.NotEmpty(t, res)
   804  
   805  	res, err = KFile.ShaX(fileGmod, 256)
   806  	assert.NotEmpty(t, res)
   807  
   808  	res, err = KFile.ShaX(fileGmod, 512)
   809  	assert.NotEmpty(t, res)
   810  
   811  	//文件不存在
   812  	res, err = KFile.ShaX(fileNone, 512)
   813  	assert.NotNil(t, err)
   814  
   815  	//err x
   816  	res, err = KFile.ShaX(fileGmod, 32)
   817  }
   818  
   819  func BenchmarkFile_ShaX(b *testing.B) {
   820  	b.ResetTimer()
   821  	for i := 0; i < b.N; i++ {
   822  		_, _ = KFile.ShaX(fileGmod, 256)
   823  	}
   824  }
   825  
   826  func TestFile_Pathinfo(t *testing.T) {
   827  	var res map[string]string
   828  
   829  	//所有信息
   830  	res = KFile.Pathinfo(imgPng, -1)
   831  	assert.Equal(t, 4, len(res))
   832  
   833  	//仅目录
   834  	res = KFile.Pathinfo(imgPng, 1)
   835  
   836  	//仅基础名(文件+扩展)
   837  	res = KFile.Pathinfo(imgPng, 2)
   838  
   839  	//仅扩展名
   840  	res = KFile.Pathinfo(imgPng, 4)
   841  
   842  	//仅文件名
   843  	res = KFile.Pathinfo(imgPng, 8)
   844  
   845  	//目录+基础名
   846  	res = KFile.Pathinfo(imgPng, 3)
   847  
   848  	//特殊类型
   849  	res = KFile.Pathinfo(fileGitkee, -1)
   850  	assert.Empty(t, res["filename"])
   851  }
   852  
   853  func BenchmarkFile_Pathinfo(b *testing.B) {
   854  	b.ResetTimer()
   855  	for i := 0; i < b.N; i++ {
   856  		KFile.Pathinfo(imgPng, -1)
   857  	}
   858  }
   859  
   860  func TestFile_Basename(t *testing.T) {
   861  	var res string
   862  
   863  	res = KFile.Basename(fileMd)
   864  	assert.Equal(t, "README.md", res)
   865  
   866  	res = KFile.Basename(fileNone)
   867  	assert.Equal(t, "none", res)
   868  
   869  	res = KFile.Basename("")
   870  	assert.NotEmpty(t, res)
   871  	assert.Equal(t, ".", res)
   872  }
   873  
   874  func BenchmarkFile_Basename(b *testing.B) {
   875  	b.ResetTimer()
   876  	for i := 0; i < b.N; i++ {
   877  		KFile.Basename(fileDante)
   878  	}
   879  }
   880  
   881  func TestFile_Dirname(t *testing.T) {
   882  	var res string
   883  
   884  	res = KFile.Dirname(changLog)
   885  	assert.Equal(t, "docs", res)
   886  
   887  	res = KFile.Dirname("")
   888  	assert.NotEmpty(t, res)
   889  	assert.Equal(t, ".", res)
   890  }
   891  
   892  func BenchmarkFile_Dirname(b *testing.B) {
   893  	b.ResetTimer()
   894  	for i := 0; i < b.N; i++ {
   895  		KFile.Dirname(fileSongs)
   896  	}
   897  }
   898  
   899  func TestFile_GetModTime(t *testing.T) {
   900  	var res int64
   901  
   902  	res = KFile.GetModTime(fileMd)
   903  	assert.Greater(t, res, int64(0))
   904  
   905  	//不存在的文件
   906  	res = KFile.GetModTime(fileNone)
   907  	assert.Equal(t, res, int64(0))
   908  
   909  	//空路径
   910  	res = KFile.GetModTime(fileNone)
   911  	assert.Equal(t, res, int64(0))
   912  }
   913  
   914  func BenchmarkFile_GetModTime(b *testing.B) {
   915  	b.ResetTimer()
   916  	for i := 0; i < b.N; i++ {
   917  		KFile.GetModTime(fileMd)
   918  	}
   919  }
   920  
   921  func TestFile_Glob(t *testing.T) {
   922  	var res []string
   923  	var err error
   924  
   925  	res, err = KFile.Glob("*test.go")
   926  	assert.NotEmpty(t, res)
   927  	assert.Nil(t, err)
   928  }
   929  
   930  func BenchmarkFile_Glob(b *testing.B) {
   931  	b.ResetTimer()
   932  	pattern := "*test.go"
   933  	for i := 0; i < b.N; i++ {
   934  		_, _ = KFile.Glob(pattern)
   935  	}
   936  }
   937  
   938  func TestFile_SafeFileName(t *testing.T) {
   939  	var res string
   940  
   941  	res = KFile.SafeFileName(pathTes4)
   942  	assert.Equal(t, `123456789-ASDF.html`, res)
   943  
   944  	res = KFile.SafeFileName(pathTes5)
   945  	assert.Equal(t, `test.go`, res)
   946  
   947  	res = KFile.SafeFileName(pathTes6)
   948  	assert.Equal(t, `Hello-World.txt`, res)
   949  
   950  	res = KFile.SafeFileName("")
   951  	assert.Equal(t, ".", res)
   952  }
   953  
   954  func BenchmarkFile_SafeFileName(b *testing.B) {
   955  	b.ResetTimer()
   956  	for i := 0; i < b.N; i++ {
   957  		KFile.SafeFileName(pathTes4)
   958  	}
   959  }
   960  
   961  func TestFile_TarGzUnTarGz(t *testing.T) {
   962  	var res1, res2 bool
   963  	var err1, err2 error
   964  	var patterns []string
   965  
   966  	//打包
   967  	patterns = []string{".*.md", ".*.yml", ".*_test.go"}
   968  	res1, err1 = KFile.TarGz(dirVendor, targzfile1, patterns...)
   969  	assert.True(t, res1)
   970  	assert.Nil(t, err1)
   971  
   972  	//解压
   973  	res2, err2 = KFile.UnTarGz(targzfile1, untarpath1)
   974  	assert.True(t, res2)
   975  	assert.Nil(t, err2)
   976  
   977  	//打包不存在的目录
   978  	res1, err1 = KFile.TarGz(fileNone, targzfile2)
   979  	assert.False(t, res1)
   980  	assert.NotNil(t, err1)
   981  
   982  	//解压非tar格式的文件
   983  	res2, err2 = KFile.UnTarGz(fileDante, untarpath1)
   984  	assert.False(t, res2)
   985  	assert.NotNil(t, err2)
   986  
   987  	//解压不存在的文件
   988  	res2, err2 = KFile.UnTarGz(fileNone, untarpath1)
   989  	assert.False(t, res2)
   990  	assert.NotNil(t, err2)
   991  }
   992  
   993  func BenchmarkFile_TarGz(b *testing.B) {
   994  	b.ResetTimer()
   995  	for i := 0; i < b.N; i++ {
   996  		dst := fmt.Sprintf(dirTdat+"/targz/test_%d.tar.gz", i)
   997  		_, _ = KFile.TarGz(dirDoc, dst)
   998  	}
   999  }
  1000  
  1001  func BenchmarkFile_UnTarGz(b *testing.B) {
  1002  	b.ResetTimer()
  1003  	var src, dst string
  1004  	for i := 0; i < b.N; i++ {
  1005  		src = fmt.Sprintf(dirTdat+"/targz/test_%d.tar.gz", i)
  1006  		dst = fmt.Sprintf(dirTdat+"/targz/test_%d", i)
  1007  		_, _ = KFile.UnTarGz(src, dst)
  1008  	}
  1009  }
  1010  
  1011  func TestFile_ChmodBatch(t *testing.T) {
  1012  	var res bool
  1013  	var tmp string
  1014  
  1015  	for i := 0; i < 10; i++ {
  1016  		tmp = fmt.Sprintf(dirChmod+"/tmp_%d", i)
  1017  		KFile.Touch(tmp, 0)
  1018  	}
  1019  
  1020  	res = KFile.ChmodBatch(dirChmod, 0766, 0755)
  1021  	assert.True(t, res)
  1022  
  1023  	//不存在的路径
  1024  	res = KFile.ChmodBatch(fileNone, 0777, 0766)
  1025  	assert.False(t, res)
  1026  }
  1027  
  1028  func BenchmarkFile_ChmodBatch(b *testing.B) {
  1029  	b.ResetTimer()
  1030  	for i := 0; i < b.N; i++ {
  1031  		KFile.ChmodBatch(dirDoc, 0777, 0766)
  1032  	}
  1033  }
  1034  
  1035  func TestFile_CountLines(t *testing.T) {
  1036  	var res int
  1037  	var err error
  1038  
  1039  	res, err = KFile.CountLines(fileDante, 0)
  1040  	assert.Equal(t, 19567, res)
  1041  	assert.Nil(t, err)
  1042  
  1043  	//非文本文件
  1044  	res, err = KFile.CountLines(imgJpg, 8)
  1045  	assert.Greater(t, res, 0)
  1046  	assert.Nil(t, err)
  1047  
  1048  	//不存在的文件
  1049  	res, err = KFile.CountLines(fileNone, 0)
  1050  	assert.Equal(t, -1, res)
  1051  	assert.NotNil(t, err)
  1052  }
  1053  
  1054  func BenchmarkFile_CountLines(b *testing.B) {
  1055  	b.ResetTimer()
  1056  	for i := 0; i < b.N; i++ {
  1057  		_, _ = KFile.CountLines(fileMd, 0)
  1058  	}
  1059  }
  1060  
  1061  func TestFile_ZipIszipUnzip(t *testing.T) {
  1062  	var res bool
  1063  	var err error
  1064  
  1065  	//空输入
  1066  	res, err = KFile.Zip(zipfile1)
  1067  	assert.False(t, res)
  1068  	assert.NotNil(t, err)
  1069  
  1070  	//源文件不存在
  1071  	res, err = KFile.Zip(zipfile1, fileNone)
  1072  	assert.False(t, res)
  1073  	assert.NotNil(t, err)
  1074  
  1075  	res, err = KFile.Zip(zipfile1, fileMd, fileGo, fileDante, dirDoc)
  1076  	assert.True(t, res)
  1077  	assert.Nil(t, err)
  1078  
  1079  	//判断
  1080  	res = KFile.IsZip(zipfile1)
  1081  	assert.True(t, res)
  1082  
  1083  	res = KFile.IsZip(fileNone)
  1084  	assert.False(t, res)
  1085  
  1086  	//解压
  1087  	res, err = KFile.UnZip(zipfile1, unzippath1)
  1088  	assert.True(t, res)
  1089  	assert.Nil(t, err)
  1090  
  1091  	//解压非zip文件
  1092  	res, err = KFile.UnZip(imgJpg, unzippath1)
  1093  	assert.False(t, res)
  1094  	assert.NotNil(t, err)
  1095  
  1096  	//解压不存在文件
  1097  	res, err = KFile.UnZip(fileNone, unzippath1)
  1098  	assert.False(t, res)
  1099  	assert.NotNil(t, err)
  1100  }
  1101  
  1102  func BenchmarkFile_Zip(b *testing.B) {
  1103  	b.ResetTimer()
  1104  	for i := 0; i < b.N; i++ {
  1105  		dst := fmt.Sprintf(dirTdat+"/zip/test_%d.zip", i)
  1106  		_, _ = KFile.Zip(dst, dirDoc)
  1107  	}
  1108  }
  1109  
  1110  func BenchmarkFile_IsZip(b *testing.B) {
  1111  	b.ResetTimer()
  1112  	for i := 0; i < b.N; i++ {
  1113  		dst := fmt.Sprintf(dirTdat+"/zip/test_%d.zip", i)
  1114  		KFile.IsZip(dst)
  1115  	}
  1116  }
  1117  
  1118  func BenchmarkFile_UnZip(b *testing.B) {
  1119  	b.ResetTimer()
  1120  	var src, dst string
  1121  	for i := 0; i < b.N; i++ {
  1122  		src = fmt.Sprintf(dirTdat+"/zip/test_%d.zip", i)
  1123  		dst = fmt.Sprintf(dirTdat+"/zip/unzip/test_%d", i)
  1124  		_, _ = KFile.UnZip(src, dst)
  1125  	}
  1126  }