馃П Chunk is a download manager for slow and unstable servers
at main 4.6 kB view raw
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}