Skip to content

Commit db3bb60

Browse files
committed
Add unit tests for ChunkedStream.GetChunks behavior
Added four tests to ChunkedStreamTests verifying GetChunks: - Chunks are not smaller than requested size when enough data - Single chunk produced if data is smaller than chunk size - Chunking starts from current base stream position - Consistent chunk sizes for large streams, with last chunk sized to remainder These tests improve coverage and validate chunking logic.
1 parent c56e61e commit db3bb60

1 file changed

Lines changed: 107 additions & 0 deletions

File tree

Sources/EasyExtensions.Tests/ChunkedStreamTests.cs

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,5 +129,112 @@ public void Dispose_DisposesUnderlyingStream()
129129
// Assert: baseStream should be disposed and reading should throw
130130
Assert.Throws<ObjectDisposedException>(() => baseStream.ReadByte());
131131
}
132+
133+
[Test]
134+
public void GetChunks_DoesNotReturnChunksSmallerThanRequestedSize_WhenEnoughDataAvailable()
135+
{
136+
// Arrange
137+
var chunkSize = 8 * 1024 * 1024; // 8 MB
138+
var totalSize = chunkSize * 3; // exactly 3 chunks
139+
var data = Enumerable.Range(0, totalSize).Select(i => (byte)(i % 256)).ToArray();
140+
using var baseStream = new MemoryStream(data);
141+
using var chunked = new ChunkedStream(baseStream, chunkSize);
142+
143+
// Act
144+
var chunks = chunked.GetChunks().ToList();
145+
146+
// Assert
147+
Assert.That(chunks, Has.Count.EqualTo(3));
148+
for (int idx = 0; idx < chunks.Count; idx++)
149+
{
150+
using var chunk = chunks[idx];
151+
int length = (int)chunk.Length;
152+
Assert.That(length, Is.EqualTo(chunkSize), $"Chunk #{idx} length is not equal to requested chunk size");
153+
}
154+
}
155+
156+
[Test]
157+
public void GetChunks_ProducesSingleChunk_WhenDataSmallerThanChunkSize()
158+
{
159+
// Arrange
160+
var chunkSize = 8 * 1024 * 1024; // 8 MB
161+
var totalSize = 32 * 1024; // 32 KB
162+
var data = Enumerable.Range(0, totalSize).Select(i => (byte)(i % 256)).ToArray();
163+
using var baseStream = new MemoryStream(data);
164+
using var chunked = new ChunkedStream(baseStream, chunkSize);
165+
166+
// Act
167+
var chunks = chunked.GetChunks().ToList();
168+
169+
// Assert
170+
Assert.That(chunks, Has.Count.EqualTo(1));
171+
using var onlyChunk = chunks[0];
172+
Assert.That(onlyChunk.Length, Is.EqualTo(totalSize));
173+
}
174+
175+
[Test]
176+
public void GetChunks_RespectsBaseStreamPosition_StartsFromCurrentPosition()
177+
{
178+
// Arrange
179+
var totalSize = 1024 * 1024; // 1 MB
180+
var chunkSize = 64 * 1024; // 64 KB
181+
var skip = 128 * 1024; // skip first 128 KB
182+
var data = Enumerable.Range(0, totalSize).Select(i => (byte)(i % 256)).ToArray();
183+
using var baseStream = new MemoryStream(data);
184+
baseStream.Position = skip;
185+
using var chunked = new ChunkedStream(baseStream, chunkSize);
186+
187+
// Act
188+
var chunks = chunked.GetChunks().ToList();
189+
190+
// Assert
191+
var remaining = totalSize - skip;
192+
var expectedFullChunks = remaining / chunkSize;
193+
var expectedLastChunk = remaining % chunkSize;
194+
195+
Assert.That(chunks, Has.Count.EqualTo(expectedFullChunks + (expectedLastChunk > 0 ? 1 : 0)));
196+
197+
// First byte of first chunk should equal data[skip]
198+
using (var firstChunk = chunks[0])
199+
{
200+
Assert.That(firstChunk.ReadByte(), Is.EqualTo(data[skip]));
201+
}
202+
203+
// Dispose rest
204+
for (int i = 1; i < chunks.Count; i++)
205+
{
206+
chunks[i].Dispose();
207+
}
208+
}
209+
210+
[Test]
211+
public void GetChunks_ReturnsConsistentChunkSizes_ForLargeStreams()
212+
{
213+
// Arrange: create stream larger than typical buffer sizes
214+
var chunkSize = 8 * 1024 * 1024; // 8 MB
215+
var totalSize = chunkSize * 5 + chunkSize / 2; // 5.5 chunks
216+
var data = new byte[totalSize];
217+
new Random(1234).NextBytes(data);
218+
using var baseStream = new MemoryStream(data);
219+
using var chunked = new ChunkedStream(baseStream, chunkSize);
220+
221+
// Act
222+
var chunks = chunked.GetChunks().ToList();
223+
224+
// Assert
225+
Assert.That(chunks, Has.Count.EqualTo(6));
226+
for (int i = 0; i < chunks.Count; i++)
227+
{
228+
using var chunk = chunks[i];
229+
if (i < 5)
230+
{
231+
Assert.That(chunk.Length, Is.EqualTo(chunkSize));
232+
}
233+
else
234+
{
235+
Assert.That(chunk.Length, Is.EqualTo(chunkSize / 2));
236+
}
237+
}
238+
}
132239
}
133240
}

0 commit comments

Comments
 (0)