2
0

loglimit_test.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package worker
  2. import (
  3. "fmt"
  4. "os"
  5. "path/filepath"
  6. "testing"
  7. "time"
  8. . "github.com/smartystreets/goconvey/convey"
  9. . "github.com/tuna/tunasync/internal"
  10. )
  11. func TestLogLimiter(t *testing.T) {
  12. Convey("LogLimiter should work", t, func(ctx C) {
  13. tmpDir, _ := os.MkdirTemp("", "tunasync")
  14. tmpLogDir, err := os.MkdirTemp("", "tunasync-log")
  15. defer os.RemoveAll(tmpDir)
  16. defer os.RemoveAll(tmpLogDir)
  17. So(err, ShouldBeNil)
  18. scriptFile := filepath.Join(tmpDir, "cmd.sh")
  19. c := cmdConfig{
  20. name: "tuna-loglimit",
  21. upstreamURL: "http://mirrors.tuna.moe/",
  22. command: scriptFile,
  23. workingDir: tmpDir,
  24. logDir: tmpLogDir,
  25. logFile: filepath.Join(tmpLogDir, "latest.log"),
  26. interval: 600 * time.Second,
  27. }
  28. provider, err := newCmdProvider(c)
  29. So(err, ShouldBeNil)
  30. limiter := newLogLimiter(provider)
  31. provider.AddHook(limiter)
  32. Convey("If logs are created simply", func() {
  33. for i := 0; i < 15; i++ {
  34. fn := filepath.Join(tmpLogDir, fmt.Sprintf("%s-%d.log", provider.Name(), i))
  35. f, _ := os.Create(fn)
  36. // time.Sleep(1 * time.Second)
  37. f.Close()
  38. }
  39. matches, _ := filepath.Glob(filepath.Join(tmpLogDir, "*.log"))
  40. So(len(matches), ShouldEqual, 15)
  41. managerChan := make(chan jobMessage)
  42. semaphore := make(chan empty, 1)
  43. job := newMirrorJob(provider)
  44. scriptContent := `#!/bin/bash
  45. echo $TUNASYNC_WORKING_DIR
  46. echo $TUNASYNC_MIRROR_NAME
  47. echo $TUNASYNC_UPSTREAM_URL
  48. echo $TUNASYNC_LOG_FILE
  49. `
  50. err = os.WriteFile(scriptFile, []byte(scriptContent), 0755)
  51. So(err, ShouldBeNil)
  52. go job.Run(managerChan, semaphore)
  53. job.ctrlChan <- jobStart
  54. msg := <-managerChan
  55. So(msg.status, ShouldEqual, PreSyncing)
  56. msg = <-managerChan
  57. So(msg.status, ShouldEqual, Syncing)
  58. logFile := provider.LogFile()
  59. msg = <-managerChan
  60. So(msg.status, ShouldEqual, Success)
  61. job.ctrlChan <- jobDisable
  62. So(logFile, ShouldNotEqual, provider.LogFile())
  63. matches, _ = filepath.Glob(filepath.Join(tmpLogDir, "*.log"))
  64. So(len(matches), ShouldEqual, 10)
  65. expectedOutput := fmt.Sprintf(
  66. "%s\n%s\n%s\n%s\n",
  67. provider.WorkingDir(),
  68. provider.Name(),
  69. provider.upstreamURL,
  70. logFile,
  71. )
  72. loggedContent, err := os.ReadFile(filepath.Join(provider.LogDir(), "latest"))
  73. So(err, ShouldBeNil)
  74. So(string(loggedContent), ShouldEqual, expectedOutput)
  75. })
  76. Convey("If job failed simply", func() {
  77. managerChan := make(chan jobMessage)
  78. semaphore := make(chan empty, 1)
  79. job := newMirrorJob(provider)
  80. scriptContent := `#!/bin/bash
  81. echo $TUNASYNC_WORKING_DIR
  82. echo $TUNASYNC_MIRROR_NAME
  83. echo $TUNASYNC_UPSTREAM_URL
  84. echo $TUNASYNC_LOG_FILE
  85. sleep 5
  86. `
  87. err = os.WriteFile(scriptFile, []byte(scriptContent), 0755)
  88. So(err, ShouldBeNil)
  89. go job.Run(managerChan, semaphore)
  90. job.ctrlChan <- jobStart
  91. msg := <-managerChan
  92. So(msg.status, ShouldEqual, PreSyncing)
  93. msg = <-managerChan
  94. So(msg.status, ShouldEqual, Syncing)
  95. logFile := provider.LogFile()
  96. time.Sleep(1 * time.Second)
  97. job.ctrlChan <- jobStop
  98. msg = <-managerChan
  99. So(msg.status, ShouldEqual, Failed)
  100. job.ctrlChan <- jobDisable
  101. <-job.disabled
  102. So(logFile, ShouldNotEqual, provider.LogFile())
  103. expectedOutput := fmt.Sprintf(
  104. "%s\n%s\n%s\n%s\n",
  105. provider.WorkingDir(),
  106. provider.Name(),
  107. provider.upstreamURL,
  108. logFile,
  109. )
  110. loggedContent, err := os.ReadFile(filepath.Join(provider.LogDir(), "latest"))
  111. So(err, ShouldBeNil)
  112. So(string(loggedContent), ShouldEqual, expectedOutput)
  113. loggedContent, err = os.ReadFile(logFile + ".fail")
  114. So(err, ShouldBeNil)
  115. So(string(loggedContent), ShouldEqual, expectedOutput)
  116. })
  117. })
  118. }