diff --git a/internal/test/httptest.go b/internal/test/httptest.go index fb3c38e5..56142b94 100644 --- a/internal/test/httptest.go +++ b/internal/test/httptest.go @@ -2,12 +2,12 @@ package test import ( "context" + "crypto/rand" "encoding/json" "fmt" "github.com/GopeedLab/gopeed/pkg/base" "github.com/armon/go-socks5" "io" - "math/rand" "net" "net/http" "os" diff --git a/pkg/base/model.go b/pkg/base/model.go index 984639e7..9da7bc64 100644 --- a/pkg/base/model.go +++ b/pkg/base/model.go @@ -94,6 +94,9 @@ func (o *Options) InitSelectFiles(fileSize int) { } func (o *Options) Clone() *Options { + if o == nil { + return nil + } return &Options{ Name: o.Name, Path: o.Path, diff --git a/pkg/download/downloader.go b/pkg/download/downloader.go index f4247844..031692de 100644 --- a/pkg/download/downloader.go +++ b/pkg/download/downloader.go @@ -332,7 +332,7 @@ func (d *Downloader) CreateDirect(req *base.Request, opts *base.Options) (taskId func (d *Downloader) CreateDirectBatch(reqs []*base.Request, opts *base.Options) (taskId []string, err error) { taskIds := make([]string, 0) for _, req := range reqs { - taskId, err := d.CreateDirect(req, opts) + taskId, err := d.CreateDirect(req, opts.Clone()) if err != nil { return nil, err } @@ -492,8 +492,10 @@ func (d *Downloader) DeleteByStatues(statues []base.Status, force bool) (err err } deleteIds := make([]string, 0) + deleteTasksPtr := make([]*Task, 0) for _, task := range deleteTasks { deleteIds = append(deleteIds, task.ID) + deleteTasksPtr = append(deleteTasksPtr, task) } func() { d.lock.Lock() @@ -515,7 +517,7 @@ func (d *Downloader) DeleteByStatues(statues []base.Status, force bool) (err err } }() - for _, task := range deleteTasks { + for _, task := range deleteTasksPtr { err = d.doDelete(task, force) if err != nil { return diff --git a/pkg/download/downloader_test.go b/pkg/download/downloader_test.go index ad59d196..2e8976d8 100644 --- a/pkg/download/downloader_test.go +++ b/pkg/download/downloader_test.go @@ -5,6 +5,8 @@ import ( "github.com/GopeedLab/gopeed/pkg/base" "github.com/GopeedLab/gopeed/pkg/protocol/http" "os" + "strconv" + "strings" "sync" "testing" "time" @@ -92,16 +94,34 @@ func TestDownloader_CreateDirectBatch(t *testing.T) { if err := downloader.Setup(); err != nil { t.Fatal(err) } - defer downloader.Clear() + defer func() { + downloader.DeleteByStatues(nil, true) + downloader.Clear() + }() reqs := make([]*base.Request, 0) - for i := 0; i < 6; i++ { + fileNames := make([]string, 0) + for i := 0; i < 5; i++ { req := &base.Request{ URL: "http://" + listener.Addr().String() + "/" + test.BuildName, } reqs = append(reqs, req) + if i == 0 { + fileNames = append(fileNames, test.DownloadName) + } else { + arr := strings.Split(test.DownloadName, ".") + fileNames = append(fileNames, arr[0]+" ("+strconv.Itoa(i)+")."+arr[1]) + } } + var wg sync.WaitGroup + wg.Add(len(reqs)) + downloader.Listener(func(event *Event) { + if event.Key == EventKeyDone { + wg.Done() + } + }) + _, err := downloader.CreateDirectBatch(reqs, &base.Options{ Path: test.Dir, Name: test.DownloadName, @@ -113,10 +133,28 @@ func TestDownloader_CreateDirectBatch(t *testing.T) { t.Fatal(err) } + wg.Wait() + tasks := downloader.GetTasks() if len(tasks) != len(reqs) { - t.Errorf("CreateDirectBatch() got = %v, want %v", len(tasks), len(reqs)) + t.Errorf("CreateDirectBatch() task got = %v, want %v", len(tasks), len(reqs)) } + + nameMatchMap := make(map[string]bool) + for _, name := range fileNames { + if _, err := os.Stat(test.Dir + "/" + name); os.IsNotExist(err) { + t.Errorf("CreateDirectBatch() file not exist: %v", name) + } + for _, task := range tasks { + if name == task.Meta.Opts.Name { + nameMatchMap[task.Meta.Opts.Name] = true + } + } + } + if len(nameMatchMap) != len(reqs) { + t.Errorf("CreateDirectBatch() names got = %v, want %v", len(nameMatchMap), len(reqs)) + } + } func TestDownloader_CreateWithProxy(t *testing.T) { diff --git a/pkg/rest/server.go b/pkg/rest/server.go index 5ca23c20..3bcfb8e0 100644 --- a/pkg/rest/server.go +++ b/pkg/rest/server.go @@ -154,7 +154,7 @@ func BuildServer(startCfg *model.StartConfig) (*http.Server, net.Listener, error defer func() { if v := recover(); v != nil { err := errors.WithStack(fmt.Errorf("%v", v)) - Downloader.Logger.Error().Stack().Err(err).Msg("http server panic") + Downloader.Logger.Error().Stack().Err(err).Msgf("http server panic: %s %s", r.Method, r.RequestURI) WriteJson(w, model.NewErrorResult(err.Error(), model.CodeError)) } }() diff --git a/pkg/rest/server_test.go b/pkg/rest/server_test.go index d591afad..ff1b7f03 100644 --- a/pkg/rest/server_test.go +++ b/pkg/rest/server_test.go @@ -140,7 +140,7 @@ func TestCreateDirectTask(t *testing.T) { func TestCreateDirectTaskBatch(t *testing.T) { doTest(func() { reqs := make([]*base.Request, 0) - for i := 0; i < 6; i++ { + for i := 0; i < 5; i++ { reqs = append(reqs, createReq.Req) } taskIds := httpRequestCheckOk[[]string](http.MethodPost, "/api/v1/tasks/batch", &model.CreateTaskBatch{ @@ -583,15 +583,7 @@ func doTest(handler func()) { }() defer func() { Downloader.PauseAll() - - tasks := Downloader.GetTasks() - taskIds := make([]string, len(tasks)) - for i, task := range tasks { - taskIds[i] = task.ID - } - for _, id := range taskIds { - Downloader.Delete(id, true) - } + Downloader.DeleteByStatues(nil, true) os.RemoveAll(cfg.StorageDir) }() taskReq.URL = "http://" + fileListener.Addr().String() + "/" + test.BuildName