webtask_test.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. // Copyright (C) 2024 Nicola Murino
  2. //
  3. // This program is free software: you can redistribute it and/or modify
  4. // it under the terms of the GNU Affero General Public License as published
  5. // by the Free Software Foundation, version 3.
  6. //
  7. // This program is distributed in the hope that it will be useful,
  8. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. // GNU Affero General Public License for more details.
  11. //
  12. // You should have received a copy of the GNU Affero General Public License
  13. // along with this program. If not, see <https://www.gnu.org/licenses/>.
  14. package httpd
  15. import (
  16. "testing"
  17. "time"
  18. "github.com/rs/xid"
  19. "github.com/stretchr/testify/assert"
  20. "github.com/stretchr/testify/require"
  21. "github.com/drakkan/sftpgo/v2/internal/util"
  22. )
  23. func TestMemoryWebTaskManager(t *testing.T) {
  24. mgr := newWebTaskManager(0)
  25. m, ok := mgr.(*memoryTaskManager)
  26. require.True(t, ok)
  27. task := webTaskData{
  28. ID: xid.New().String(),
  29. User: defeaultUsername,
  30. Timestamp: time.Now().Add(-1 * time.Hour).UnixMilli(),
  31. Status: 0,
  32. }
  33. task1 := webTaskData{
  34. ID: xid.New().String(),
  35. User: defeaultUsername,
  36. Timestamp: time.Now().UnixMilli(),
  37. Status: 0,
  38. }
  39. err := m.Add(task)
  40. require.NoError(t, err)
  41. err = m.Add(task1)
  42. require.NoError(t, err)
  43. taskGet, err := m.Get(task.ID)
  44. require.NoError(t, err)
  45. require.Equal(t, task, taskGet)
  46. m.Cleanup()
  47. _, err = m.Get(task.ID)
  48. require.ErrorIs(t, err, util.ErrNotFound)
  49. taskGet, err = m.Get(task1.ID)
  50. require.NoError(t, err)
  51. require.Equal(t, task1, taskGet)
  52. task1.Timestamp = time.Now().Add(-1 * time.Hour).UnixMilli()
  53. err = m.Add(task1)
  54. require.NoError(t, err)
  55. m.Cleanup()
  56. _, err = m.Get(task.ID)
  57. require.ErrorIs(t, err, util.ErrNotFound)
  58. // test keep alive task
  59. oldMgr := webTaskMgr
  60. webTaskMgr = mgr
  61. done := make(chan bool)
  62. go keepAliveTask(task, done, 50*time.Millisecond)
  63. time.Sleep(120 * time.Millisecond)
  64. close(done)
  65. taskGet, err = m.Get(task.ID)
  66. require.NoError(t, err)
  67. assert.Greater(t, taskGet.Timestamp, task.Timestamp)
  68. m.Cleanup()
  69. _, err = m.Get(task.ID)
  70. require.NoError(t, err)
  71. err = m.Add(task)
  72. require.NoError(t, err)
  73. m.Cleanup()
  74. _, err = m.Get(task.ID)
  75. require.ErrorIs(t, err, util.ErrNotFound)
  76. webTaskMgr = oldMgr
  77. }
  78. func TestDbWebTaskManager(t *testing.T) {
  79. if !isSharedProviderSupported() {
  80. t.Skip("this test it is not available with this provider")
  81. }
  82. mgr := newWebTaskManager(1)
  83. m, ok := mgr.(*dbTaskManager)
  84. require.True(t, ok)
  85. task := webTaskData{
  86. ID: xid.New().String(),
  87. User: defeaultUsername,
  88. Timestamp: time.Now().Add(-1 * time.Hour).UnixMilli(),
  89. Status: 0,
  90. }
  91. err := m.Add(task)
  92. require.NoError(t, err)
  93. taskGet, err := m.Get(task.ID)
  94. require.NoError(t, err)
  95. require.Equal(t, task, taskGet)
  96. m.Cleanup()
  97. _, err = m.Get(task.ID)
  98. require.ErrorIs(t, err, util.ErrNotFound)
  99. err = m.Add(task)
  100. require.NoError(t, err)
  101. // test keep alive task
  102. oldMgr := webTaskMgr
  103. webTaskMgr = mgr
  104. done := make(chan bool)
  105. go keepAliveTask(task, done, 50*time.Millisecond)
  106. time.Sleep(120 * time.Millisecond)
  107. close(done)
  108. taskGet, err = m.Get(task.ID)
  109. require.NoError(t, err)
  110. assert.Greater(t, taskGet.Timestamp, task.Timestamp)
  111. m.Cleanup()
  112. _, err = m.Get(task.ID)
  113. require.NoError(t, err)
  114. err = m.Add(task)
  115. require.NoError(t, err)
  116. m.Cleanup()
  117. _, err = m.Get(task.ID)
  118. require.ErrorIs(t, err, util.ErrNotFound)
  119. webTaskMgr = oldMgr
  120. }