Repository navigation
Expand file tree
/
Copy pathRuntimeJournalReaderFenceTests.cs
More file actions
126 lines (114 loc) · 6.08 KB
/
Copy pathRuntimeJournalReaderFenceTests.cs
File metadata and controls
126 lines (114 loc) · 6.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
using KeyLoad.Storage;
using TUnit.Assertions.Enums;
namespace KeyLoad.UnitTests.Features.StorageRecovery;
internal sealed class RuntimeJournalReaderFenceTests
{
private const int UnsupportedReaderContract = StoreReaderContract.RuntimeJournal + 1;
[Test]
[Arguments(StoreReaderContract.Unspecified)]
[Arguments(UnsupportedReaderContract)]
public async Task AcNative002ZeroOrUnknownCapabilityRejectsWithoutFileMutation(int capability)
{
using var fixture = new RuntimeJournalReaderFixture();
using (var created = fixture.Open(fixture.CanonicalPath))
{
await Assert.That(created.Identity.MinimumReaderContract).IsEqualTo(StoreReaderContract.RuntimeJournal);
RuntimeJournalReaderFixture.WriteRuntimeRecord(created, RuntimeJournalReaderFixture.RuntimeJournalKey,
RuntimeJournalReaderFixture.RuntimeJournalValue);
}
await RuntimeJournalReaderFixture.RewriteCapabilityAsync(fixture.CanonicalPath, capability);
var before = await RuntimeJournalReaderFixture.ReadFilesAsync(fixture.CanonicalPath);
var failure = Assert.ThrowsExactly<KeyLoadException>(() =>
{
using var rejected = fixture.Open(fixture.CanonicalPath);
});
await Assert.That(failure.Code).IsEqualTo(ErrorCode.FormatUnsupported);
var after = await RuntimeJournalReaderFixture.ReadFilesAsync(fixture.CanonicalPath);
await Assert.That(after.Keys.Order(StringComparer.Ordinal)).IsEquivalentTo(before.Keys.Order(StringComparer.Ordinal),
CollectionOrdering.Matching);
foreach (var file in before)
{
await Assert.That(after[file.Key]).IsEquivalentTo(file.Value, CollectionOrdering.Matching);
}
}
[Test]
public async Task AcNative002OmittedCurrentCapabilityRejectsWithoutMutationAndRecovers()
{
using var fixture = new RuntimeJournalReaderFixture();
Guid nodeId;
using (var created = fixture.Open(fixture.CanonicalPath))
{
nodeId = created.Identity.NodeId;
RuntimeJournalReaderFixture.WriteRuntimeRecord(created, RuntimeJournalReaderFixture.RuntimeJournalKey,
RuntimeJournalReaderFixture.RuntimeJournalValue);
}
var identityPath = RuntimeJournalReaderFixture.IdentityPath(fixture.CanonicalPath);
var currentIdentity = await File.ReadAllBytesAsync(identityPath);
await RuntimeJournalReaderFixture.OmitReaderCapabilityAsync(fixture.CanonicalPath);
var before = await RuntimeJournalReaderFixture.ReadInventoryAsync(fixture.CanonicalPath);
var failure = Assert.ThrowsExactly<KeyLoadException>(() =>
{
using var rejected = fixture.Open(fixture.CanonicalPath);
});
await Assert.That(failure.Code).IsEqualTo(ErrorCode.FormatUnsupported);
await AssertInventoryUnchangedAsync(fixture.CanonicalPath, before);
await File.WriteAllBytesAsync(identityPath, currentIdentity);
using (var restored = fixture.Open(fixture.CanonicalPath))
{
await Assert.That(restored.Identity.NodeId).IsEqualTo(nodeId);
await Assert.That(restored.Identity.MinimumReaderContract).IsEqualTo(StoreReaderContract.RuntimeJournal);
await Assert.That(RuntimeJournalReaderFixture.Read(restored, RuntimeJournalReaderFixture.RuntimeJournalKey))
.IsEquivalentTo(RuntimeJournalReaderFixture.RuntimeJournalValue);
RuntimeJournalReaderFixture.WriteRuntimeRecord(restored, RuntimeJournalReaderFixture.FollowupKey,
RuntimeJournalReaderFixture.FollowupValue);
}
using var reopened = fixture.Open(fixture.CanonicalPath);
await Assert.That(reopened.Identity.NodeId).IsEqualTo(nodeId);
await Assert.That(RuntimeJournalReaderFixture.Read(reopened, RuntimeJournalReaderFixture.RuntimeJournalKey))
.IsEquivalentTo(RuntimeJournalReaderFixture.RuntimeJournalValue);
await Assert.That(RuntimeJournalReaderFixture.Read(reopened, RuntimeJournalReaderFixture.FollowupKey))
.IsEquivalentTo(RuntimeJournalReaderFixture.FollowupValue);
}
private static async Task AssertInventoryUnchangedAsync(string directory,
Dictionary<string, byte[]?> expected)
{
var actual = await RuntimeJournalReaderFixture.ReadInventoryAsync(directory);
await Assert.That(actual.Keys.Order(StringComparer.Ordinal))
.IsEquivalentTo(expected.Keys.Order(StringComparer.Ordinal), CollectionOrdering.Matching);
foreach (var (path, bytes) in expected)
{
if (bytes is null)
{
await Assert.That(actual[path]).IsNull();
}
else
{
await Assert.That(actual[path]!).IsEquivalentTo(bytes, CollectionOrdering.Matching);
}
}
}
[Test]
public async Task AcNative002UnsupportedIdentityMagicRejectsWithoutChangingNativeFiles()
{
using var fixture = new RuntimeJournalReaderFixture();
using (var created = fixture.Open(fixture.CanonicalPath))
{
RuntimeJournalReaderFixture.WriteRuntimeRecord(created, RuntimeJournalReaderFixture.RuntimeJournalKey,
RuntimeJournalReaderFixture.RuntimeJournalValue);
}
await RuntimeJournalReaderFixture.CorruptIdentityMagicAsync(fixture.CanonicalPath);
var before = await RuntimeJournalReaderFixture.ReadFilesAsync(fixture.CanonicalPath);
var failure = Assert.ThrowsExactly<KeyLoadException>(() =>
{
using var rejected = fixture.Open(fixture.CanonicalPath);
});
await Assert.That(failure.Code).IsEqualTo(ErrorCode.FormatUnsupported);
var after = await RuntimeJournalReaderFixture.ReadFilesAsync(fixture.CanonicalPath);
await Assert.That(after.Keys.Order(StringComparer.Ordinal)).IsEquivalentTo(before.Keys.Order(StringComparer.Ordinal),
CollectionOrdering.Matching);
foreach (var file in before)
{
await Assert.That(after[file.Key]).IsEquivalentTo(file.Value, CollectionOrdering.Matching);
}
}
}