Skip to content

Commit 3f11b47

Browse files
committed
Merge branch '9-add-cancellationtoken-support' into 'master'
Resolve "Add CancellationToken support." Closes kaitai-io#9 See merge request marta/kaitai_struct_csharp_runtime!19
2 parents d29166e + 2547b57 commit 3f11b47

11 files changed

Lines changed: 500 additions & 222 deletions
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
using System;
2+
using System.Threading;
3+
using System.Threading.Tasks;
4+
using Xunit;
5+
6+
namespace Kaitai.Struct.Runtime.Async.Tests
7+
{
8+
public abstract class CancelableTestsBase
9+
{
10+
protected readonly CancellationToken CancellationToken;
11+
12+
protected CancelableTestsBase(bool isTestingCancellation)
13+
{
14+
CancellationToken = new CancellationToken(isTestingCancellation);
15+
}
16+
17+
protected async Task Evaluate(Func<Task> assertFunc)
18+
{
19+
if (CancellationToken.IsCancellationRequested)
20+
{
21+
await Assert.ThrowsAsync<TaskCanceledException>(assertFunc);
22+
}
23+
else
24+
{
25+
await assertFunc();
26+
}
27+
}
28+
29+
protected async Task EvaluateMaybeCancelled(Func<Task> assertFunc)
30+
{
31+
try
32+
{
33+
await assertFunc();
34+
}
35+
catch (TaskCanceledException)
36+
{
37+
}
38+
}
39+
40+
protected async Task Evaluate<TExpectedException>(Func<Task> assertFunc) where TExpectedException : Exception
41+
{
42+
try
43+
{
44+
await assertFunc();
45+
}
46+
catch (TaskCanceledException)
47+
{
48+
}
49+
catch (TExpectedException)
50+
{
51+
}
52+
}
53+
}
54+
}

Kaitai.Struct.Runtime.Async.Tests/KaitaiAsyncStreamBaseTests.cs

Lines changed: 59 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.IO;
1+
using System;
2+
using System.IO;
23
using System.IO.Pipelines;
34
using System.Threading.Tasks;
45
using Kaitai.Async;
@@ -8,17 +9,48 @@ namespace Kaitai.Struct.Runtime.Async.Tests
89
{
910
public class StreamKaitaiAsyncStreamBaseTests : KaitaiAsyncStreamBaseTests
1011
{
12+
public StreamKaitaiAsyncStreamBaseTests() : base(false)
13+
{
14+
}
15+
1116
protected override KaitaiAsyncStream Create(byte[] data) => new KaitaiAsyncStream(data);
1217
}
1318

1419
public class PipeReaderKaitaiAsyncStreamBaseTests : KaitaiAsyncStreamBaseTests
1520
{
21+
public PipeReaderKaitaiAsyncStreamBaseTests() : base(false)
22+
{
23+
}
24+
1625
protected override KaitaiAsyncStream Create(byte[] data) =>
1726
new KaitaiAsyncStream(PipeReader.Create(new MemoryStream(data)));
1827
}
1928

20-
public abstract class KaitaiAsyncStreamBaseTests
29+
public class StreamKaitaiAsyncStreamBaseCancelledTests : KaitaiAsyncStreamBaseTests
30+
{
31+
public StreamKaitaiAsyncStreamBaseCancelledTests() : base(true)
32+
{
33+
}
34+
35+
protected override KaitaiAsyncStream Create(byte[] data) => new KaitaiAsyncStream(data);
36+
}
37+
38+
public class PipeReaderKaitaiAsyncStreamBaseCancelledTests : KaitaiAsyncStreamBaseTests
2139
{
40+
public PipeReaderKaitaiAsyncStreamBaseCancelledTests() : base(true)
41+
{
42+
}
43+
44+
protected override KaitaiAsyncStream Create(byte[] data) =>
45+
new KaitaiAsyncStream(PipeReader.Create(new MemoryStream(data)));
46+
}
47+
48+
public abstract class KaitaiAsyncStreamBaseTests : CancelableTestsBase
49+
{
50+
protected KaitaiAsyncStreamBaseTests(bool isTestingCancellation) : base(isTestingCancellation)
51+
{
52+
}
53+
2254
protected abstract KaitaiAsyncStream Create(byte[] data);
2355

2456
[Theory]
@@ -35,19 +67,22 @@ public abstract class KaitaiAsyncStreamBaseTests
3567
public async Task Eof_Test(bool shouldBeEof, int streamSize, int readBitsAmount)
3668
{
3769
var kaitaiStreamSUT = Create(new byte[streamSize]);
38-
await kaitaiStreamSUT.ReadBitsIntAsync(readBitsAmount);
39-
long positionBeforeIsEof = kaitaiStreamSUT.Pos;
40-
41-
if (shouldBeEof)
70+
await EvaluateMaybeCancelled(async () =>
4271
{
43-
Assert.True(kaitaiStreamSUT.IsEof);
44-
}
45-
else
46-
{
47-
Assert.False(kaitaiStreamSUT.IsEof);
48-
}
49-
50-
Assert.Equal(positionBeforeIsEof, kaitaiStreamSUT.Pos);
72+
await kaitaiStreamSUT.ReadBitsIntAsync(readBitsAmount);
73+
long positionBeforeIsEof = kaitaiStreamSUT.Pos;
74+
75+
if (shouldBeEof)
76+
{
77+
Assert.True(kaitaiStreamSUT.IsEof);
78+
}
79+
else
80+
{
81+
Assert.False(kaitaiStreamSUT.IsEof);
82+
}
83+
84+
Assert.Equal(positionBeforeIsEof, kaitaiStreamSUT.Pos);
85+
});
5186
}
5287

5388
[Theory]
@@ -57,9 +92,12 @@ public async Task Pos_ByRead_Test(int expectedPos, int readBitsAmount)
5792
{
5893
var kaitaiStreamSUT = Create(new byte[1]);
5994

60-
await kaitaiStreamSUT.ReadBytesAsync(readBitsAmount);
95+
await EvaluateMaybeCancelled(async () =>
96+
{
97+
await kaitaiStreamSUT.ReadBytesAsync(readBitsAmount);
6198

62-
Assert.Equal(expectedPos, kaitaiStreamSUT.Pos);
99+
Assert.Equal(expectedPos, kaitaiStreamSUT.Pos);
100+
});
63101
}
64102

65103
[Theory]
@@ -69,9 +107,12 @@ public async Task Pos_BySeek_Test(int expectedPos, int position)
69107
{
70108
var kaitaiStreamSUT = Create(new byte[1]);
71109

72-
await kaitaiStreamSUT.SeekAsync(position);
110+
await EvaluateMaybeCancelled(async () =>
111+
{
112+
await kaitaiStreamSUT.SeekAsync(position);
73113

74-
Assert.Equal(expectedPos, kaitaiStreamSUT.Pos);
114+
Assert.Equal(expectedPos, kaitaiStreamSUT.Pos);
115+
});
75116
}
76117

77118
[Theory]

0 commit comments

Comments
 (0)