main_test.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. // Author: simon
  2. // Author: ynwdlxm@163.com
  3. // Date: 2025/1/26 16:53
  4. // Desc:
  5. package main
  6. import (
  7. "bytes"
  8. "fmt"
  9. "os"
  10. "path/filepath"
  11. "strings"
  12. "testing"
  13. )
  14. func TestRun(t *testing.T) {
  15. testCases := []struct {
  16. name string
  17. root string
  18. cfg config
  19. expected string
  20. }{
  21. {name: "NoFilter", root: "testdata", cfg: config{ext: "", size: 0, list: true}, expected: "testdata/dir.log\ntestdata/dir2/script.sh\n"},
  22. {"FilterExtensionMatch", "testdata", config{ext: ".log", size: 0, list: true}, "testdata/dir.log\n"},
  23. {"FilterExtensionSizeMatch", "testdata", config{ext: ".log", size: 10, list: true}, "testdata/dir.log\n"},
  24. {"FilterExtensionSizeNoMatch", "testdata", config{ext: ".log", size: 20, list: true}, ""},
  25. {"FilterExtensionNoMatch", "testdata", config{ext: ".gz", size: 0, list: true}, ""}}
  26. for _, tc := range testCases {
  27. t.Run(tc.name, func(t *testing.T) {
  28. var buffer bytes.Buffer
  29. if err := run(tc.root, &buffer, tc.cfg); err != nil {
  30. t.Fatal(err)
  31. }
  32. res := buffer.String()
  33. if tc.expected != res {
  34. t.Errorf("Expected %q, got %q instead\n", tc.expected, res)
  35. }
  36. })
  37. }
  38. }
  39. func TestRunDelExtension(t *testing.T) {
  40. testCases := []struct {
  41. name string
  42. cfg config
  43. extNoDelete string
  44. nDelete int
  45. nNoDelete int
  46. expected string
  47. }{
  48. {"DeleteExtensionNoMatch", config{ext: ".log", del: true}, ".gz", 10, 0, ""},
  49. {"DeleteExtensionMatch", config{ext: ".log", del: true}, "", 10, 0, ""},
  50. {"DeleteExtensionMixed", config{ext: ".log", del: true}, ".gz", 5, 5, ""},
  51. }
  52. // Execute RunDel test cases
  53. for _, tc := range testCases {
  54. t.Run(tc.name, func(t *testing.T) {
  55. var buffer bytes.Buffer
  56. var logBuffer bytes.Buffer
  57. tc.cfg.wLog = &logBuffer
  58. tempDir, cleanup := createTempDir(t, map[string]int{
  59. tc.cfg.ext: tc.nDelete,
  60. tc.extNoDelete: tc.nNoDelete,
  61. })
  62. defer cleanup()
  63. if err := run(tempDir, &buffer, tc.cfg); err != nil {
  64. t.Fatal(err)
  65. }
  66. res := buffer.String()
  67. if tc.expected != res {
  68. t.Errorf("Expected %q, got %q instead\n", tc.expected, res)
  69. }
  70. filesLeft, err := os.ReadDir(tempDir)
  71. if err != nil {
  72. t.Error(err)
  73. }
  74. if len(filesLeft) != tc.nNoDelete {
  75. t.Errorf("Expected %d files left, got %d instead\n", tc.nNoDelete, len(filesLeft))
  76. }
  77. expLogLines := tc.nDelete + 1
  78. lines := bytes.Split(logBuffer.Bytes(), []byte("\n"))
  79. if len(lines) != expLogLines {
  80. t.Errorf("Expected %d log lines, got %d instead\n", expLogLines, len(lines))
  81. }
  82. })
  83. }
  84. }
  85. func TestRunArchive(t *testing.T) {
  86. // Archiving test cases
  87. testCases := []struct {
  88. name string
  89. cfg config
  90. extNoArchive string
  91. nArchive int
  92. nNoArchive int
  93. }{
  94. {name: "ArchiveExtensionNoMatch", cfg: config{ext: ".log"}, extNoArchive: ".gz", nArchive: 0, nNoArchive: 10},
  95. {name: "ArchiveExtensionMatch", cfg: config{ext: ".log"}, extNoArchive: "", nArchive: 10, nNoArchive: 0},
  96. {name: "ArchiveExtensionMixed", cfg: config{ext: ".log"}, extNoArchive: ".gz", nArchive: 5, nNoArchive: 5},
  97. }
  98. // Execute RunArchive test cases
  99. for _, tc := range testCases {
  100. t.Run(tc.name, func(t *testing.T) {
  101. var buffer bytes.Buffer
  102. // Create temp dirs for RunArchive test
  103. tempDir, cleanup := createTempDir(t, map[string]int{
  104. tc.cfg.ext: tc.nArchive,
  105. tc.extNoArchive: tc.nNoArchive,
  106. })
  107. defer cleanup()
  108. archiveDir, cleanupArchive := createTempDir(t, nil)
  109. defer cleanupArchive()
  110. tc.cfg.archive = archiveDir
  111. if err := run(tempDir, &buffer, tc.cfg); err != nil {
  112. t.Fatal(err)
  113. }
  114. pattern := filepath.Join(tempDir, fmt.Sprintf("*%s", tc.cfg.ext))
  115. expFiles, err := filepath.Glob(pattern)
  116. if err != nil {
  117. t.Fatal(err)
  118. }
  119. expOut := strings.Join(expFiles, "\n")
  120. res := strings.TrimSpace(buffer.String())
  121. if expOut != res {
  122. t.Errorf("Expected %q, got %q instead\n", expOut, res)
  123. }
  124. // Validate the number of files archived
  125. filesArchived, err := os.ReadDir(archiveDir)
  126. if err != nil {
  127. t.Fatal(err)
  128. }
  129. if len(filesArchived) != tc.nArchive {
  130. t.Errorf("Expected %d files archived, got %d instead\n", tc.nNoArchive, len(filesArchived))
  131. }
  132. })
  133. }
  134. }
  135. func createTempDir(t *testing.T, files map[string]int) (dirname string, cleanup func()) {
  136. tempDir, err := os.MkdirTemp("", "walktest")
  137. if err != nil {
  138. t.Fatal(err)
  139. }
  140. for k, n := range files {
  141. for j := 1; j <= n; j++ {
  142. fName := fmt.Sprintf("field%d%s", j, k)
  143. fPath := filepath.Join(tempDir, fName)
  144. if err := os.WriteFile(fPath, []byte("dummy"), 0644); err != nil {
  145. t.Fatal(err)
  146. }
  147. }
  148. }
  149. return tempDir, func() { _ = os.RemoveAll(tempDir) }
  150. }