gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // Copyright 2025 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package assetfs
  4. import (
  5. "bytes"
  6. "io/fs"
  7. "net/http"
  8. "os"
  9. "testing"
  10. "github.com/stretchr/testify/assert"
  11. "github.com/stretchr/testify/require"
  12. )
  13. func TestEmbed(t *testing.T) {
  14. tmpDir := t.TempDir()
  15. tmpDataDir := tmpDir + "/data"
  16. _ = os.MkdirAll(tmpDataDir+"/foo/bar", 0o755)
  17. _ = os.WriteFile(tmpDataDir+"/a.txt", []byte("a"), 0o644)
  18. _ = os.WriteFile(tmpDataDir+"/foo/bar/b.txt", bytes.Repeat([]byte("a"), 1000), 0o644)
  19. _ = os.WriteFile(tmpDataDir+"/foo/c.txt", []byte("c"), 0o644)
  20. require.NoError(t, GenerateEmbedBindata(tmpDataDir, tmpDir+"/out.dat"))
  21. data, err := os.ReadFile(tmpDir + "/out.dat")
  22. require.NoError(t, err)
  23. efs := NewEmbeddedFS(data)
  24. // test a non-existing file
  25. _, err = fs.ReadFile(efs, "not exist")
  26. assert.ErrorIs(t, err, fs.ErrNotExist)
  27. // test a normal file (no compression)
  28. content, err := fs.ReadFile(efs, "a.txt")
  29. require.NoError(t, err)
  30. assert.Equal(t, "a", string(content))
  31. fi, err := fs.Stat(efs, "a.txt")
  32. require.NoError(t, err)
  33. _, ok := fi.(EmbeddedFileInfo).GetGzipContent()
  34. assert.False(t, ok)
  35. // test a compressed file
  36. content, err = fs.ReadFile(efs, "foo/bar/b.txt")
  37. require.NoError(t, err)
  38. assert.Equal(t, bytes.Repeat([]byte("a"), 1000), content)
  39. fi, err = fs.Stat(efs, "foo/bar/b.txt")
  40. require.NoError(t, err)
  41. assert.False(t, fi.Mode().IsDir())
  42. assert.True(t, fi.Mode().IsRegular())
  43. gzipContent, ok := fi.(EmbeddedFileInfo).GetGzipContent()
  44. assert.True(t, ok)
  45. assert.Greater(t, len(gzipContent), 1)
  46. assert.Less(t, len(gzipContent), 1000)
  47. // test list root directory
  48. entries, err := fs.ReadDir(efs, ".")
  49. require.NoError(t, err)
  50. assert.Len(t, entries, 2)
  51. assert.Equal(t, "a.txt", entries[0].Name())
  52. assert.False(t, entries[0].IsDir())
  53. // test list subdirectory
  54. entries, err = fs.ReadDir(efs, "foo")
  55. require.NoError(t, err)
  56. require.Len(t, entries, 2)
  57. assert.Equal(t, "bar", entries[0].Name())
  58. assert.True(t, entries[0].IsDir())
  59. assert.Equal(t, "c.txt", entries[1].Name())
  60. assert.False(t, entries[1].IsDir())
  61. // test directory mode
  62. fi, err = fs.Stat(efs, "foo")
  63. require.NoError(t, err)
  64. assert.True(t, fi.IsDir())
  65. assert.True(t, fi.Mode().IsDir())
  66. assert.False(t, fi.Mode().IsRegular())
  67. // test httpfs
  68. hfs := http.FS(efs)
  69. hf, err := hfs.Open("foo/bar/b.txt")
  70. require.NoError(t, err)
  71. hi, err := hf.Stat()
  72. require.NoError(t, err)
  73. fiEmbedded, ok := hi.(EmbeddedFileInfo)
  74. require.True(t, ok)
  75. gzipContent, ok = fiEmbedded.GetGzipContent()
  76. assert.True(t, ok)
  77. assert.Greater(t, len(gzipContent), 1)
  78. assert.Less(t, len(gzipContent), 1000)
  79. // test httpfs directory listing
  80. hf, err = hfs.Open("foo")
  81. require.NoError(t, err)
  82. dirs, err := hf.Readdir(1)
  83. require.NoError(t, err)
  84. assert.Len(t, dirs, 1)
  85. }