public async Task Empty_store_has_zero_length() { using var fixture = new LogStoreFixture(); var count = await fixture.Store.GetLengthAsync(); Assert.Equal(0UL, count); }
public async Task Cannot_revoke_only_owner_grant() { var capture = new PlaintextKeyCapture("rosebud", "rosebud"); var service = new TempKeyFileService(); var publicKey = CryptoTestHarness.GenerateKeyFile(_output, capture, service); capture.Reset(); var revoke = new RevokeRole(Constants.DefaultOwnerRole, publicKey, publicKey); revoke.Sign(service, capture); Assert.True(revoke.Verify(), "revocation did not verify"); using var fixture = new LogStoreFixture(); var @default = LogEntryFactory.CreateNamespaceEntry(Constants.DefaultNamespace, default); await fixture.Store.AddEntryAsync(@default); var ontology = new MemoryOntologyLog(new OntologyEvents(), publicKey); Assert.Single(ontology.Roles[Constants.DefaultNamespace]); await fixture.Store.AddEntryAsync(LogEntryFactory.CreateEntry(revoke)); await Assert.ThrowsAsync <CannotRemoveSingleOwnerException>(() => ontology.MaterializeAsync(fixture.Store)); }
public async Task Can_append_namespace_entry_to_store_and_load_from_stream() { const string ns = "MyApp"; using var fixture = new LogStoreFixture(); var entry = LogEntryFactory.CreateEntry(new Namespace(ns)); var current = await fixture.Store.AddEntryAsync(entry); Assert.Equal(0UL, current); Assert.Equal(0UL, entry.Index); var items = 0; foreach (var item in fixture.Store.StreamEntries()) { foreach (var @object in item.Objects) { Assert.True(@object.Data is Namespace); Assert.Equal(ns, ((Namespace)@object.Data).Value); Assert.Equal(LogEntryFactory.TypeProvider.Get(typeof(Namespace)), @object.Type); Assert.Equal(LogSerializeContext.FormatVersion, @object.Version); items++; } } Assert.Equal(1, items); }
public async Task Can_stream_valid_entries() { const string ns = "MyApp"; using var fixture = new LogStoreFixture(); var one = LogEntryFactory.CreateEntry(new Namespace(ns)); var two = LogEntryFactory.CreateEntry(new Namespace(ns), one.Hash); Assert.False(one.Hash.SequenceEqual(two.Hash)); Assert.True(one.Hash.SequenceEqual(two.PreviousHash)); await fixture.Store.AddEntryAsync(one); Assert.Equal(0UL, one.Index); await fixture.Store.AddEntryAsync(two); Assert.Equal(1UL, two.Index); var count = await fixture.Store.GetLengthAsync(); Assert.Equal(2UL, count); var items = 0; foreach (var item in fixture.Store.StreamEntries()) { foreach (var @object in item.Objects) { Assert.True(@object.Data is Namespace); Assert.Equal(ns, ((Namespace)@object.Data).Value); Assert.Equal(LogEntryFactory.TypeProvider.Get(typeof(Namespace)), @object.Type); Assert.Equal(LogSerializeContext.FormatVersion, @object.Version); items++; } } Assert.Equal(2, items); }
public async Task Can_rehydrate_ontology_from_log_stream() { const string ns = "MyApp"; using var fixture = new LogStoreFixture(); var @default = LogEntryFactory.CreateNamespaceEntry(Constants.DefaultNamespace, default); await fixture.Store.AddEntryAsync(@default); var @namespace = LogEntryFactory.CreateNamespaceEntry(ns, @default.Hash); await fixture.Store.AddEntryAsync(@namespace); var schema = new Schema { Name = "Customer" }; schema.Properties.Add(new SchemaProperty { Name = "Name", Type = "string" }); await fixture.Store.AddEntryAsync(LogEntryFactory.CreateEntry(schema, @namespace.Hash)); byte[] pk; unsafe { Crypto.GenerateKeyPair(out pk, out _); } var ontology = new MemoryOntologyLog(new OntologyEvents(), pk); await ontology.MaterializeAsync(fixture.Store); Assert.Equal(2, ontology.Namespaces.Count); Assert.Equal(Constants.DefaultNamespace, ontology.Namespaces[0].Value, StringComparer.OrdinalIgnoreCase); Assert.Equal(ns, ontology.Namespaces[1].Value, StringComparer.OrdinalIgnoreCase); Assert.Single(ontology.Roles[Constants.DefaultNamespace]); Assert.Empty(ontology.Roles[ns]); }