Example #1
0
        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));
        }
Example #3
0
        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);
        }
Example #4
0
        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]);
        }