public void AddBeforeAndAfterSerializationAndDeserialization() { var storage = new InMemoryStorageEngine(); var os = ObjectStore.New(storage); var l = new CAppendOnlyList <int> { 1 }; l.ToArray()[0].ShouldBe(1); os.Entangle(l); os.Persist(); os = ObjectStore.Load(storage, true); l = os.Resolve <CAppendOnlyList <int> >(); l.ToArray().Length.ShouldBe(1); l.ToArray()[0].ShouldBe(1); l.Add(2); l.ToArray().Length.ShouldBe(2); l.ToArray()[0].ShouldBe(1); l.ToArray()[1].ShouldBe(2); os.Persist(); os = ObjectStore.Load(storage, true); l = os.Resolve <CAppendOnlyList <int> >(); l.ToArray().Length.ShouldBe(2); l.ToArray()[0].ShouldBe(1); l.ToArray()[1].ShouldBe(2); }
public void DependentOperatorsAreNotDeserializedForEphemeralOperator() { var storage = new InMemoryStorageEngine(); var os = ObjectStore.New(storage); var source = new Source <int>(); var valueHolder = new ValueHolder <int>(); source.Ephemeral().CallOnEvent(valueHolder.SetValue); source.Emit(10); valueHolder.Value.ShouldBe(10); os.Entangle(source); os.Entangle(valueHolder); os.Persist(); os = ObjectStore.Load(storage, true); source = os.Resolve <Source <int> >(); valueHolder = os.Resolve <ValueHolder <int> >(); source.Emit(20); valueHolder.Value.ShouldBe(10); }
public void SerializeAndDeserializeStateWorksDetectsCircularDependencyOnDeserialization() { var storageEngine = new InMemoryStorageEngine(); var roots = new Roots2(); var serializerFactories = SerializerFactories.Default; var mps = new MapAndSerializers(serializerFactories); mps.GetOrCreateSerializerFor(roots); var p1 = new Person { Name = "Peter" }; var p2 = new Person { Name = "Ole" }; p1.Sibling = p2; p2.Sibling = p1; roots.Entangle(p1); var persister = new Persister2(storageEngine, mps); persister.DetectAndPersistChanges(); try { Deserializer2.Load(storageEngine, new Ephemerals(), serializerFactories); } catch (CircularDependencyException2 e) { e.CircularPath.Count().ShouldBe(3); } }
public void SerializeAndDeserializePersonWithParent() { var storageEngine = new InMemoryStorageEngine(); var os = ObjectStore.New(storageEngine); var parent = new Person() { Name = "Oldy", Parent = null }; var child = new Person() { Name = "Childy", Parent = parent }; os.Entangle(child); os.Persist(); os = ObjectStore.Load(storageEngine); var pChild = os.Resolve <Person>(); var pParent = pChild.Parent; pChild.Name.ShouldBe("Childy"); pParent.Name.ShouldBe("Oldy"); pParent.Parent.ShouldBeNull(); pChild.Parent = null; os.Persist(); os = ObjectStore.Load(storageEngine); pChild = os.Resolve <Person>(); pChild.Parent.ShouldBeNull(); }
public void ChangeTrackerWithAddedElementsRemovedOverSeveralSynchronizations() { var storage = new InMemoryStorageEngine(); var os = ObjectStore2.New(storage); var ctw = new ChangeTrackerWrapper(); os.Roots.Entangle(ctw); ctw.ChangeTracker.Append(1); ctw.ChangeTracker.Append(2); ctw.ChangeTracker.Append(3); ctw.ChangeTracker.Prepend(0); os.Persist(); os = ObjectStore2.Load(storage); ctw = os.Roots.Find <ChangeTrackerWrapper>(); ctw.ValuesFromHead().SequenceEqual(new[] { 0, 1, 2, 3 }).ShouldBeTrue(); ctw.ValuesFromTail().SequenceEqual(new[] { 3, 2, 1, 0 }).ShouldBeTrue(); ctw.ChangeTracker.Head.Next.Remove(); os.Persist(); os = ObjectStore2.Load(storage); ctw = os.Roots.Find <ChangeTrackerWrapper>(); ctw.ValuesFromHead().SequenceEqual(new[] { 0, 2, 3 }).ShouldBeTrue(); ctw.ValuesFromTail().SequenceEqual(new[] { 3, 2, 0 }).ShouldBeTrue(); }
public void CreatedOperatorSurvivesRestart() { var storage = new InMemoryStorageEngine(); var source = new Source <int>(); var holder = new ValueHolder(); var emitter = new ValueEmitter(source.Scan(0, (akk, i) => akk + i), holder); var store = ObjectStore.New(storage); source.Emit(1); source.Emit(2); holder.Value.ShouldBe(3); store.Entangle(source); store.Entangle(holder); store.Persist(); store = ObjectStore.Load(storage, true, new MockScheduler()); source = store.Resolve <Source <int> >(); holder = store.Resolve <ValueHolder>(); holder.Value.ShouldBe(3); source.Emit(1); holder.Value.ShouldBe(4); }
public void UntilWorksTest() { var storage = new InMemoryStorageEngine(); var executionEngine = ExecutionEngineFactory.StartNew(storage); executionEngine.Schedule(() => { var holder = new UntilTestHolder(); var task = holder.Start(); Roots.Entangle(holder); Roots.Entangle(task); return(Sync.Next()); }).Wait(); executionEngine.Dispose(); executionEngine = ExecutionEngineFactory.Continue(storage); executionEngine.Schedule(() => { var holder = Roots.Resolve <UntilTestHolder>(); holder.Stop = true; return(Roots.Resolve <CTask>()); }).Wait(); var completed = executionEngine.Schedule(() => Roots.Resolve <UntilTestHolder>().Completed).Result; completed.ShouldBe(true); }
public void CountOperatorTest() { var storage = new InMemoryStorageEngine(); var os = ObjectStore.New(storage); var source = new Source <int>(); var valueHolder = new ValueHolder <int>(); source.Count().CallOnEvent(valueHolder.SetValue); source.Emit(0); valueHolder.Value.ShouldBe(1); source.Emit(0); valueHolder.Value.ShouldBe(2); os.Entangle(source); os.Entangle(valueHolder); os.Persist(); os = ObjectStore.Load(storage); source = os.Resolve <Source <int> >(); valueHolder = os.Resolve <ValueHolder <int> >(); source.Emit(0); valueHolder.Value.ShouldBe(3); }
public void StreamOperatorsAreGarbageCollectedOnSingleSubscriptionDisposal() { var storage = new InMemoryStorageEngine(); var source = new Source <int>(); var staticNonPersistable = new StaticAndNonStaticValue(); staticNonPersistable.SetUpSubscription(source); source.Emit(25); staticNonPersistable.Value.ShouldBe(25); StaticAndNonStaticValue.StaticValue.ShouldBe(25); var store = ObjectStore.New(storage); store.Entangle(source); store.Entangle(staticNonPersistable); store.Persist(); store = ObjectStore.Load(storage, true, new MockScheduler()); source = store.Resolve <Source <int> >(); staticNonPersistable = store.Resolve <StaticAndNonStaticValue>(); source.Emit(50); staticNonPersistable.Value.ShouldBe(50); StaticAndNonStaticValue.StaticValue.ShouldBe(50); staticNonPersistable.Subscription1.Dispose(); source.Emit(100); staticNonPersistable.Value.ShouldBe(50); StaticAndNonStaticValue.StaticValue.ShouldBe(50); }
public void SerializeAndDeserializeStateWorksDetectsNonCircularDependencyOnDeserialization() { var storageEngine = new InMemoryStorageEngine(); var roots = new Roots2(); var serializerFactories = SerializerFactories.Default; var mps = new MapAndSerializers(serializerFactories); mps.GetOrCreateSerializerFor(roots); var p1 = new Person { Name = "Peter" }; var p2 = new Person { Name = "Ole" }; p1.Sibling = p2; roots.Entangle(p1); var persister = new Persister2(storageEngine, mps); persister.DetectAndPersistChanges(); var(r, _) = Deserializer2.Load(storageEngine, new Ephemerals(), serializerFactories); var p = r.Find <Person>(); p.Name.ShouldBe("Peter"); p.Sibling.Name.ShouldBe("Ole"); }
public void AddAndRemoveNonReferencingElementsFromCList() { var storage = new InMemoryStorageEngine(); var os = ObjectStore2.New(storage); var cList = new CList <string>(); cList.Add("hello"); cList.Add("world"); cList.Add("from here"); os.Roots.Entangle(cList); os.Persist(); os = ObjectStore2.Load(storage); cList = os.Roots.Find <CList <string> >(); cList.Count.ShouldBe(3); cList[0].ShouldBe("hello"); cList[1].ShouldBe("world"); cList[2].ShouldBe("from here"); cList.Remove(0); os.Persist(); os = ObjectStore2.Load(storage); cList = os.Roots.Find <CList <string> >(); cList.Count.ShouldBe(2); cList[0].ShouldBe("world"); cList[1].ShouldBe("from here"); cList.Remove(1); os.Persist(); os = ObjectStore2.Load(storage); cList = os.Roots.Find <CList <string> >(); cList.Count.ShouldBe(1); cList[0].ShouldBe("world"); cList.Add("hello"); os.Persist(); os = ObjectStore2.Load(storage); cList = os.Roots.Find <CList <string> >(); cList.Count.ShouldBe(2); cList[0].ShouldBe("world"); cList[1].ShouldBe("hello"); cList.Remove(0); cList.Remove(0); os.Persist(); os = ObjectStore2.Load(storage); cList = os.Roots.Find <CList <string> >(); cList.Count.ShouldBe(0); }
public void AddAndRemovedEntriesFromDictionary() { var storage = new InMemoryStorageEngine(); var os = ObjectStore2.New(storage); var s = new CSet <Person>(); os.Roots.Entangle(s); var peter = new Person { Name = "Peter" }; var ole = new Person { Name = "Ole", Relationship = peter }; s.Add(peter); s.Add(ole); os.Persist(); os = ObjectStore2.Load(storage); s = os.Roots.Find <CSet <Person> >(); s.Count.ShouldBe(2); peter = s.Single(p => p.Name == "Peter"); ole = s.Single(p => p.Name == "Ole"); ole.Relationship.ShouldBe(peter); s.Remove(ole); os.Persist(); os = ObjectStore2.Load(storage); s = os.Roots.Find <CSet <Person> >(); s.Count.ShouldBe(1); peter = s.Single(p => p.Name == "Peter"); s.Add(peter); s.Count.ShouldBe(1); os.Persist(); os = ObjectStore2.Load(storage); s = os.Roots.Find <CSet <Person> >(); s.Count.ShouldBe(1); peter = s.Single(p => p.Name == "Peter"); s.Remove(peter); os.Persist(); os = ObjectStore2.Load(storage); s = os.Roots.Find <CSet <Person> >(); s.Count.ShouldBe(0); }
public void AddAndRemovedEntriesFromDictionary() { var storage = new InMemoryStorageEngine(); var os = ObjectStore2.New(storage); var d = new CDictionary <string, Person>(); os.Roots.Entangle(d); d["101020"] = new Person { Name = "Peter" }; d["311209"] = new Person { Name = "Ole", Relationship = d["101020"] }; os.Persist(); os = ObjectStore2.Load(storage); d = os.Roots.Find <CDictionary <string, Person> >(); d.Count.ShouldBe(2); d["101020"].Name.ShouldBe("Peter"); d["101020"].Relationship.ShouldBeNull(); d["311209"].Name.ShouldBe("Ole"); d["311209"].Relationship.Name.ShouldBe("Peter"); d.Remove("311209"); os.Persist(); os = ObjectStore2.Load(storage); d = os.Roots.Find <CDictionary <string, Person> >(); d.Count.ShouldBe(1); d["101020"].Name.ShouldBe("Peter"); d["101020"].Relationship.ShouldBeNull(); d["311209"] = d["101020"]; os.Persist(); os = ObjectStore2.Load(storage); d = os.Roots.Find <CDictionary <string, Person> >(); d.Count.ShouldBe(2); d["101020"].ShouldBe(d["311209"]); d.Remove("101020"); d.Remove("311209"); os.Persist(); os = ObjectStore2.Load(storage); d = os.Roots.Find <CDictionary <string, Person> >(); d.Count.ShouldBe(0); }
public void SchedulerContinuesDespiteExecutingMethodDoesNotCatchingThrownException() { var storage = new InMemoryStorageEngine(); var scheduler = ExecutionEngine.ExecutionEngineFactory.StartNew(storage); scheduler.Schedule(() => throw new NotImplementedException()); var task = scheduler.Schedule(() => 1); task.Result.ShouldBe(1); scheduler.Dispose(); }
//[TestMethod] public void SentMessageIsProcessed() { var hostname = "127.0.0.1"; const int port = 10_000; var storage = new InMemoryStorageEngine(); var scheduler1 = ExecutionEngineFactory.StartNew(storage); scheduler1.Schedule(() => { var msgHandler = new MessageHandler(); var connectionListener = new ConnectionServer(hostname, port, msgHandler.Handle); Roots.Entangle(msgHandler); Roots.Entangle(connectionListener); }); var senderId = Guid.Empty; var msgSender = new TestMessageSender(hostname, port, senderId); msgSender.Connect(); msgSender.SendMessage("HELLO".GetUtf8Bytes(), 0); Thread.Sleep(1000); var messageHandler = scheduler1.Resolve <MessageHandler>().Result; var messages = messageHandler.GetMessages(); messages.Count.ShouldBe(1); messages[0].ShouldBe("HELLO"); scheduler1.Do <ConnectionServer>(c => c.Shutdown()); Thread.Sleep(1000); scheduler1.Dispose(); scheduler1 = ExecutionEngineFactory.Continue(storage); messageHandler = scheduler1.Resolve <MessageHandler>().Result; Console.WriteLine(messageHandler); msgSender = new TestMessageSender(hostname, port, senderId); msgSender.Connect(); msgSender.SendMessage("HELLO2".GetUtf8Bytes(), 1); Thread.Sleep(1000); messages = messageHandler.GetMessages(); messages.Count.ShouldBe(2); messages[0].ShouldBe("HELLO"); messages[1].ShouldBe("HELLO2"); scheduler1.Dispose(); }
public void EnqueueAndDequeueFromCQueue() { var storage = new InMemoryStorageEngine(); var os = ObjectStore2.New(storage); var cQueue = new CQueue <string>(); cQueue.Enqueue("hello"); cQueue.Enqueue("world"); cQueue.Enqueue("from here"); os.Roots.Entangle(cQueue); os.Persist(); os = ObjectStore2.Load(storage); cQueue = os.Roots.Find <CQueue <string> >(); cQueue.Count.ShouldBe(3); var dequeued = cQueue.Dequeue(); dequeued.ShouldBe("hello"); os.Persist(); os = ObjectStore2.Load(storage); cQueue = os.Roots.Find <CQueue <string> >(); cQueue.Count.ShouldBe(2); cQueue.Dequeue().ShouldBe("world"); cQueue.Dequeue().ShouldBe("from here"); cQueue.Enqueue("hello"); os.Persist(); os = ObjectStore2.Load(storage); cQueue = os.Roots.Find <CQueue <string> >(); cQueue.Count.ShouldBe(1); cQueue.Dequeue().ShouldBe("hello"); os.Persist(); os = ObjectStore2.Load(storage); cQueue = os.Roots.Find <CQueue <string> >(); cQueue.Count.ShouldBe(0); }
public void PinnedOperatorsAreNotGarbageCollected() { var storage = new InMemoryStorageEngine(); var source = new Source <int>(); var valueHolder = new ValueHolder(); var stream = source.Do(valueHolder.SetValue).Pin(); var subscriptionHolder = new SubscriptionHolder(stream); source.Emit(25); valueHolder.Value.ShouldBe(25); subscriptionHolder.Value.ShouldBe(25); var store = ObjectStore.New(storage); store.Entangle(source); store.Entangle(valueHolder); store.Entangle(subscriptionHolder); store.Persist(); store = ObjectStore.Load(storage, true, new MockScheduler()); source = store.Resolve <Source <int> >(); valueHolder = store.Resolve <ValueHolder>(); subscriptionHolder = store.Resolve <SubscriptionHolder>(); source.Emit(100); valueHolder.Value.ShouldBe(100); subscriptionHolder.Value.ShouldBe(100); subscriptionHolder.Subscription.Dispose(); source.Emit(200); valueHolder.Value.ShouldBe(200); subscriptionHolder.Value.ShouldBe(100); store.Persist(); store = ObjectStore.Load(storage, true, new MockScheduler()); source = store.Resolve <Source <int> >(); valueHolder = store.Resolve <ValueHolder>(); subscriptionHolder = store.Resolve <SubscriptionHolder>(); source.Emit(300); valueHolder.Value.ShouldBe(300); subscriptionHolder.Value.ShouldBe(100); }
public void SerializeAndDeserializeEmptyList() { var storage = new InMemoryStorageEngine(); var os = ObjectStore.New(storage); var l = new CAppendOnlyList <int>(); l.ToArray().Length.ShouldBe(0); os.Entangle(l); os.Persist(); os = ObjectStore.Load(storage, true); l = os.Resolve <CAppendOnlyList <int> >(); l.ToArray().Length.ShouldBe(0); }
public static void Do() { var storageEngine = new InMemoryStorageEngine(); var executionEngine = ExecutionEngineFactory.StartNew(storageEngine); executionEngine.Schedule(() => { var network = new Network(); var source = new Source <object>(); Roots.Entangle(source); var proposer = new PaxosProposer(source, network); _ = proposer.StartRound("hello", 0); _ = OutsideFlow(source, network); }); }
public void ChangeTrackerWithNoChangesCanBePersistedAndLoadedAgain() { var storage = new InMemoryStorageEngine(); var os = ObjectStore2.New(storage); var ctw = new ChangeTrackerWrapper(); os.Roots.Entangle(ctw); os.Persist(); os = ObjectStore2.Load(storage); ctw = os.Roots.Find <ChangeTrackerWrapper>(); ctw.ValuesFromHead().Count().ShouldBe(0); ctw.ValuesFromTail().Count().ShouldBe(0); }
public void AsyncVoidMethodCanBeSerialized() { var storage = new InMemoryStorageEngine(); var os = ObjectStore.New(storage); var a1 = new CAwaitable(); var a2 = new CAwaitable(); var tuple = new PTuple <CAwaitable, CAwaitable>(a1, a2); var value = new PValue <int>(); AsyncMethodTest(a1, a2, value); os.Entangle(tuple); os.Entangle(value); os.Persist(); os = ObjectStore.Load(storage, true); tuple = os.Resolve <PTuple <CAwaitable, CAwaitable> >(); value = os.Resolve <PValue <int> >(); value.Value.ShouldBe(-1); tuple.First.SignalCompletion(); value.Value.ShouldBe(1); os.Persist(); os = ObjectStore.Load(storage, true); tuple = os.Resolve <PTuple <CAwaitable, CAwaitable> >(); value = os.Resolve <PValue <int> >(); value.Value.ShouldBe(1); tuple.Second.SignalCompletion(); value.Value.ShouldBe(2); os.Persist(); os = ObjectStore.Load(storage, true); tuple = os.Resolve <PTuple <CAwaitable, CAwaitable> >(); value = os.Resolve <PValue <int> >(); value.Value.ShouldBe(2); }
public static void Do() { var storageEngine = new InMemoryStorageEngine(); var engine = Start(storageEngine); while (true) { Console.WriteLine("Press enter to stop"); Console.ReadLine(); engine.Dispose(); Console.WriteLine("Press enter to start"); Console.ReadLine(); engine = Continue(storageEngine); } }
public void SerializeAndDeserializeSimpleDisplayClass() { var storageEngine = new InMemoryStorageEngine(); var os = ObjectStore2.New(storageEngine); var wrapper = new Wrapper() { Text = "World" }; var greeter = wrapper.Greeter("Hello"); os.Roots.Entangle(greeter); os.Persist(); os = ObjectStore2.Load(storageEngine); greeter = os.Roots.Find <Func <string> >(); greeter().ShouldBe("Hello World"); }
public void EmptyMessageQueueCanBeSerializeAndDeserialized() { var storage = new InMemoryStorageEngine(); var c = ExecutionEngineFactory.StartNew(storage); c.Schedule(() => { var q = new MessageQueue(); Roots.Entangle(q); }); c.Sync().Wait(); c.Dispose(); c = ExecutionEngineFactory.Continue(storage); c.Schedule(Roots.Resolve <MessageQueue>); c.Sync().Wait(); }
public void SubscriptionIsDisposedAfterAwaitableCompletes() { var storage = new InMemoryStorageEngine(); var os = ObjectStore.New(storage); var source = new Source <int>(); var awaitable = new CAwaitable(); var valueHolder = new ValueHolder <int>(); source.DisposeOn(awaitable).CallOnEvent(valueHolder.SetValue); source.Emit(1); valueHolder.Value.ShouldBe(1); os.Entangle(source); os.Entangle(awaitable); os.Entangle(valueHolder); os.Persist(); os = ObjectStore.Load(storage, true); source = os.Resolve <Source <int> >(); awaitable = os.Resolve <CAwaitable>(); valueHolder = os.Resolve <ValueHolder <int> >(); source.Emit(2); valueHolder.Value.ShouldBe(2); awaitable.SignalCompletion(); source.Emit(3); valueHolder.Value.ShouldBe(2); os.Persist(); os = ObjectStore.Load(storage, true); source = os.Resolve <Source <int> >(); awaitable = os.Resolve <CAwaitable>(); valueHolder = os.Resolve <ValueHolder <int> >(); source.Emit(4); valueHolder.Value.ShouldBe(2); }
public void StreamObserversAreDeserialized() { var storage = new InMemoryStorageEngine(); var source = new Source <int>(); var valueHolder = new ValueHolder(); source.Select(_ => _).CallOnEvent(valueHolder.SetValue); var store = ObjectStore.New(storage); store.Entangle(source); store.Entangle(valueHolder); store.Persist(); store = ObjectStore.Load(storage, true, (IScheduler) new MockScheduler()); source = store.Resolve <Source <int> >(); valueHolder = store.Resolve <ValueHolder>(); source.Emit(123); valueHolder.Value.ShouldBe(123); }
public void AddAndRemoveElementsFromList() { var storage = new InMemoryStorageEngine(); var os = ObjectStore2.New(storage); var wrapper = new Wrapper(); os.Roots.Entangle(wrapper); os.Persist(); os = ObjectStore2.Load(storage); wrapper = os.Roots.Find <Wrapper>(); wrapper.List.Count.ShouldBe(0); wrapper.List.Add("hello"); wrapper.List.Add("world"); os.Persist(); os = ObjectStore2.Load(storage); wrapper = os.Roots.Find <Wrapper>(); wrapper.List.Count.ShouldBe(2); wrapper.List[0].ShouldBe("hello"); wrapper.List[1].ShouldBe("world"); wrapper.List.RemoveAt(0); os.Persist(); os = ObjectStore2.Load(storage); wrapper = os.Roots.Find <Wrapper>(); wrapper.List.Count.ShouldBe(1); wrapper.List[0].ShouldBe("world"); wrapper.List.Clear(); os.Persist(); os = ObjectStore2.Load(storage); wrapper = os.Roots.Find <Wrapper>(); wrapper.List.Count.ShouldBe(0); }
public void SerializeAndDeserializeExceptions() { var storageEngine = new InMemoryStorageEngine(); var os = ObjectStore2.New(storageEngine); var innerException = new InvalidCastException("cast was not possible"); var outerException = new ArgumentException("argument was wrong", innerException); os.Roots.Entangle(outerException); os.Persist(); os = ObjectStore2.Load(storageEngine); var e = os.Roots.Find <ArgumentException>(); e.Message.ShouldBe("argument was wrong"); var ei = (InvalidCastException)e.InnerException; ei.Message.ShouldBe("cast was not possible"); }
public void CanSerializeAndDeserializeActionWithOneParameters() { _messages = new List <string>(); Action <string> a = Say; var storageEngine = new InMemoryStorageEngine(); var os = ObjectStore2.New(storageEngine); os.Roots.Entangle(a); os.Persist(); os = ObjectStore2.Load(storageEngine); a = os.Roots.Find <Action <string> >(); a("hello world"); _messages.Count.ShouldBe(1); _messages[0].ShouldBe("hello world"); }
public void ChangeTrackerWithNodeChangedAndRemovedBeforePersisted() { var storage = new InMemoryStorageEngine(); var os = ObjectStore2.New(storage); var ctw = new ChangeTrackerWrapper(); os.Roots.Entangle(ctw); ctw.ChangeTracker.Append(1); ctw.ChangeTracker.Append(2); ctw.ChangeTracker.Head.Remove(); os.Persist(); os = ObjectStore2.Load(storage); ctw = os.Roots.Find <ChangeTrackerWrapper>(); ctw.ChangeTracker.Head.Value.ShouldBe(2); ctw.ChangeTracker.Tail.Value.ShouldBe(2); }