馃П Chunk is a download manager for slow and unstable servers
1package chunk
2
3import (
4 "os"
5 "path/filepath"
6 "sync"
7 "testing"
8)
9
10func TestProgress_FromScratch(t *testing.T) {
11 tmp := t.TempDir()
12 name := filepath.Join(tmp, "chunk.zip")
13 p, err := newProgress(name, tmp, "https://test.etc/chunk.zip", 5, 3, false)
14 if err != nil {
15 t.Errorf("expected no error creating the progress, got %s", err)
16 }
17 if err := p.done(1, 3); err != nil {
18 t.Errorf("expected no error marking chunk as done, got %s", err)
19 }
20 for i := range 3 {
21 got, err := p.shouldDownload(i)
22 if err != nil {
23 t.Errorf("expected no error checking if chunk %d should be downloaded, got %s", i, err)
24 }
25 if i == 1 {
26 if got {
27 t.Errorf("expected chunk %d to be downloaded", i)
28 }
29 } else {
30 if !got {
31 t.Errorf("expected chunk %d not to be downloaded", i)
32 }
33 }
34 }
35 if err := p.close(); err != nil {
36 t.Errorf("expected no errors saving the progress file, got %s", err)
37 }
38 if _, err := os.ReadFile(p.path); err != nil {
39 t.Errorf("expected no errors reading the progress file, got %s", err)
40 }
41}
42
43func TestProgress_ParallelComplete(t *testing.T) {
44 tmp := t.TempDir()
45 name := filepath.Join(tmp, "chunk.zip")
46 p, err := newProgress(name, tmp, "https://test.etc/chunk.zip", 5, 2048, false)
47 if err != nil {
48 t.Errorf("expected no error creating the progress, got %s", err)
49 }
50 var wg sync.WaitGroup
51 errs := make(chan error)
52 for i := range 2048 {
53 wg.Add(1)
54 go func(i int) {
55 defer wg.Done()
56 errs <- p.done(i, 2048)
57 }(i)
58 }
59 for range 2048 {
60 err := <-errs
61 if err != nil {
62 t.Errorf("expected no error marking chunk as done, got %s", err)
63 }
64 }
65 close(errs)
66 if err := p.close(); err != nil {
67 t.Errorf("expected no errors removing the progress file, got %s", err)
68 }
69 if _, err := os.ReadFile(p.path); !os.IsNotExist(err) {
70 t.Errorf("expected progress file not to exist, rediong it returned error %s", err)
71 }
72}
73
74func TestProgress_FromFile(t *testing.T) {
75 tmp := t.TempDir()
76 name := filepath.Join(tmp, "chunk.zip")
77 old, err := newProgress(name, tmp, "https://test.etc/chunk.zip", 5, 3, false)
78 if err != nil {
79 t.Errorf("expected no error creating the old progress, got %s", err)
80 }
81 if err := old.done(1, 3); err != nil {
82 t.Errorf("failed to mark chunk done: %v", err)
83 }
84 if err := old.close(); err != nil {
85 t.Errorf("failed to close progress: %v", err)
86 }
87
88 p, err := newProgress(name, tmp, "https://test.etc/chunk.zip", 5, 3, false)
89 if err != nil {
90 t.Errorf("expected no error creating the progress, got %s", err)
91 }
92 for i := range 3 {
93 got, err := p.shouldDownload(i)
94 if err != nil {
95 t.Errorf("expected no error checking if chunk %d should be downloaded, got %s", i, err)
96 }
97 if i == 1 {
98 if got {
99 t.Errorf("expected chunk %d to be downloaded", i)
100 }
101 } else {
102 if !got {
103 t.Errorf("expected chunk %d not to be downloaded", i)
104 }
105 }
106 }
107 if err := p.close(); err != nil {
108 t.Errorf("expected no errors saving the progress file, got %s", err)
109 }
110 if _, err := os.ReadFile(p.path); err != nil {
111 t.Errorf("expected no errors reading the progress file, got %s", err)
112 }
113}
114
115func TestProgress_FromFileWithInvalidChunkSize(t *testing.T) {
116 tmp := t.TempDir()
117 name := filepath.Join(tmp, "chunk.zip")
118 old, err := newProgress(name, tmp, "https://test.etc/chunk.zip", 5, 3, false)
119 if err != nil {
120 t.Errorf("expected no error creating the old progress, got %s", err)
121 }
122 if err := old.done(1, 3); err != nil {
123 t.Errorf("failed to mark chunk done: %v", err)
124 }
125 if err := old.close(); err != nil {
126 t.Errorf("failed to close progress: %v", err)
127 }
128
129 if _, err := newProgress(name, tmp, "https://test.etc/chunk.zip", 10, 3, false); err == nil {
130 t.Error("expected error creating the progress with different chunk size")
131 }
132}
133
134func TestProgress_FromFileWithRestart(t *testing.T) {
135 tmp := t.TempDir()
136 name := filepath.Join(tmp, "chunk.zip")
137 old, err := newProgress(name, tmp, "https://test.etc/chunk.zip", 5, 3, false)
138 if err != nil {
139 t.Errorf("expected no error creating the old progress, got %s", err)
140 }
141 if err := old.done(1, 3); err != nil {
142 t.Errorf("failed to mark chunk done: %v", err)
143 }
144 if err := old.close(); err != nil {
145 t.Errorf("failed to close progress: %v", err)
146 }
147
148 p, err := newProgress(name, tmp, "https://test.etc/chunk.zip", 10, 3, true)
149 if err != nil {
150 t.Errorf("expected no error creating the progress, got %s", err)
151 }
152 for i := range 3 {
153 got, err := p.shouldDownload(i)
154 if err != nil {
155 t.Errorf("expected no error checking if chunk %d should be downloaded, got %s", i, err)
156 }
157 if !got {
158 t.Errorf("expected chunk %d not to be downloaded", i)
159 }
160 }
161}