OutWit.Shared.Secrets.Conformance
1.0.0
dotnet add package OutWit.Shared.Secrets.Conformance --version 1.0.0
NuGet\Install-Package OutWit.Shared.Secrets.Conformance -Version 1.0.0
<PackageReference Include="OutWit.Shared.Secrets.Conformance" Version="1.0.0" />
<PackageVersion Include="OutWit.Shared.Secrets.Conformance" Version="1.0.0" />
<PackageReference Include="OutWit.Shared.Secrets.Conformance" />
paket add OutWit.Shared.Secrets.Conformance --version 1.0.0
#r "nuget: OutWit.Shared.Secrets.Conformance, 1.0.0"
#:package OutWit.Shared.Secrets.Conformance@1.0.0
#addin nuget:?package=OutWit.Shared.Secrets.Conformance&version=1.0.0
#tool nuget:?package=OutWit.Shared.Secrets.Conformance&version=1.0.0
OutWit.Shared.Secrets.Conformance
The conformance suite for
OutWit.Shared.Secrets.Providers
implementations: NUnit fixtures a provider's test project inherits and points at
its own store. The abstraction's promises — the status model, atomic replace,
the size and key limits, case injectivity of the platform mapping — are tested
against every implementation by that implementation's own author, rather than
restated in each one's tests.
Use
[TestFixture]
public class MyStoreConformanceTests : SecretStoreConformanceTests
{
protected override ISecretStore CreateStore() => new MyStore(...);
}
That is the whole integration: every promise runs against your store. A provider
whose Description.CanWrite is false runs the read-side tests only; the
mutation tests are skipped, not failed.
What the suite covers, and why each row is there:
| Property | Why |
|---|---|
| Store→read round-trips the same bytes | The floor |
| Store over an existing key replaces | Rotation depends on it |
Read of an absent key is NotFound, not Failed, not an exception |
The status-model conflation this subsystem exists to prevent |
| Delete of an absent key succeeds | Uninstall must be idempotent |
Delete→read is NotFound |
Untested deletes outlive uninstallers |
| The documented maximum round-trips; one byte over fails naming the limit | The figure is established here rather than trusted |
| Non-text bytes round-trip unchanged | A random 32-byte key is not a string |
| An empty secret is refused, distinctly from a missing one | "" and absent must never be confused |
| Concurrent writes leave one whole value | Atomic replace |
| Key rules: invalid throws, at-limit does not | Boundaries |
| Two keys differing only in case are two secrets | The platform mapping must be injective |
Description populated, Protection never Unknown |
A host that cannot see what it got cannot refuse it |
Write the provider-specific tests beside it: for Windows, that a different
account cannot read the entry (needs a second account — arrange for it on a
self-hosted agent rather than dropping it); for a file store, that permissions
read back correctly and a crash between write and rename leaves the previous
value; for libsecret, that no session bus yields Unavailable.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- NUnit (>= 4.6.1)
- OutWit.Shared.Secrets.Providers (>= 1.0.0)
-
net8.0
- NUnit (>= 4.6.1)
- OutWit.Shared.Secrets.Providers (>= 1.0.0)
-
net9.0
- NUnit (>= 4.6.1)
- OutWit.Shared.Secrets.Providers (>= 1.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.0 | 99 | 8/31/2026 |