(t *testing.T)
| 137 | } |
| 138 | |
| 139 | func TestFetcherOpenParallel(t *testing.T) { |
| 140 | size := int64(3 * 1024 * 1024) |
| 141 | content := make([]byte, size) |
| 142 | rand.New(rand.NewSource(1)).Read(content) |
| 143 | sendContentLength := true |
| 144 | |
| 145 | f := dockerFetcher{ |
| 146 | &dockerBase{ |
| 147 | repository: "nonempty", |
| 148 | limiter: nil, |
| 149 | performances: transfer.ImageResolverPerformanceSettings{ |
| 150 | ConcurrentLayerFetchBuffer: 0, |
| 151 | }, |
| 152 | }, |
| 153 | } |
| 154 | |
| 155 | cfgConcurency := func(maxConcurrentDls, chunkSize int) { |
| 156 | f.dockerBase.performances.MaxConcurrentDownloads = maxConcurrentDls |
| 157 | f.dockerBase.performances.ConcurrentLayerFetchBuffer = chunkSize |
| 158 | limiter := semaphore.NewWeighted(int64(maxConcurrentDls)) |
| 159 | f.dockerBase.limiter = limiter |
| 160 | } |
| 161 | |
| 162 | ignoreContentRange := false |
| 163 | var failTimeoutOnceAfter atomic.Int64 |
| 164 | failAfter := int64(0) |
| 165 | var forceRange []httpRange |
| 166 | s := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { |
| 167 | rng, err := parseRange(r.Header.Get("Range"), size) |
| 168 | if errors.Is(err, errNoOverlap) { |
| 169 | err = nil |
| 170 | } |
| 171 | assert.NoError(t, err) |
| 172 | if ignoreContentRange { |
| 173 | rng = nil |
| 174 | } |
| 175 | if forceRange != nil { |
| 176 | rng = forceRange |
| 177 | } |
| 178 | if failAfter > 0 && rng[0].start > failAfter { |
| 179 | rw.WriteHeader(http.StatusInternalServerError) |
| 180 | return |
| 181 | } |
| 182 | timeoutOnceAfter := failTimeoutOnceAfter.Load() |
| 183 | if timeoutOnceAfter > 0 && rng[0].start > timeoutOnceAfter { |
| 184 | failTimeoutOnceAfter.Store(0) |
| 185 | rw.WriteHeader(http.StatusRequestTimeout) |
| 186 | return |
| 187 | } |
| 188 | |
| 189 | if len(rng) == 0 { |
| 190 | if sendContentLength { |
| 191 | rw.Header().Set("content-length", strconv.Itoa(len(content))) |
| 192 | } |
| 193 | _, _ = rw.Write(content) |
| 194 | } else { |
| 195 | b := content[rng[0].start : rng[0].start+rng[0].length] |
| 196 | rw.Header().Set("content-range", rng[0].contentRange(size)) |
nothing calls this directly
no test coverage detected
searching dependent graphs…