RunnableComponentTests.cs
228 lines
| 6.4 KiB
| text/x-csharp
|
CSharpLexer
/ Implab.Test / RunnableComponentTests.cs
|
|
r185 | using System; | ||
| using System.Reflection; | ||||
| using System.Threading; | ||||
| using Implab.Parallels; | ||||
| using Implab.Components; | ||||
|
|
r203 | using Implab.Test.Mock; | ||
|
|
r185 | |||
| #if MONO | ||||
| using NUnit.Framework; | ||||
| using TestClassAttribute = NUnit.Framework.TestFixtureAttribute; | ||||
| using TestMethodAttribute = NUnit.Framework.TestAttribute; | ||||
|
|
r188 | using AssertFailedException = NUnit.Framework.AssertionException; | ||
|
|
r185 | #else | ||
| using Microsoft.VisualStudio.TestTools.UnitTesting; | ||||
| #endif | ||||
| namespace Implab.Test { | ||||
| [TestClass] | ||||
| public class RunnableComponentTests { | ||||
| static void ShouldThrow(Action action) { | ||||
| try { | ||||
| action(); | ||||
|
|
r188 | Assert.Fail(); | ||
| } catch (AssertFailedException) { | ||||
|
|
r185 | throw; | ||
| } catch { | ||||
| } | ||||
| } | ||||
| [TestMethod] | ||||
| public void NormalFlowTest() { | ||||
|
|
r203 | var comp = new MockRunnableComponent(false); | ||
|
|
r185 | |||
| Assert.AreEqual(ExecutionState.Created, comp.State); | ||||
|
|
r205 | comp.Initialize(); | ||
|
|
r185 | |||
| Assert.AreEqual(ExecutionState.Ready, comp.State); | ||||
| comp.Start().Join(1000); | ||||
| Assert.AreEqual(ExecutionState.Running, comp.State); | ||||
| comp.Stop().Join(1000); | ||||
| Assert.AreEqual(ExecutionState.Disposed, comp.State); | ||||
| } | ||||
| [TestMethod] | ||||
| public void InitFailTest() { | ||||
|
|
r203 | var comp = new MockRunnableComponent(false) { | ||
|
|
r185 | MockInit = () => { | ||
| throw new Exception("BAD"); | ||||
| } | ||||
| }; | ||||
| ShouldThrow(() => comp.Start()); | ||||
| ShouldThrow(() => comp.Stop()); | ||||
| Assert.AreEqual(ExecutionState.Created, comp.State); | ||||
|
|
r205 | ShouldThrow(comp.Initialize); | ||
|
|
r185 | |||
| Assert.AreEqual(ExecutionState.Failed, comp.State); | ||||
| ShouldThrow(() => comp.Start()); | ||||
| ShouldThrow(() => comp.Stop()); | ||||
| Assert.AreEqual(ExecutionState.Failed, comp.State); | ||||
| comp.Dispose(); | ||||
| Assert.AreEqual(ExecutionState.Disposed, comp.State); | ||||
| } | ||||
| [TestMethod] | ||||
| public void DisposedTest() { | ||||
|
|
r203 | var comp = new MockRunnableComponent(false); | ||
|
|
r185 | comp.Dispose(); | ||
| ShouldThrow(() => comp.Start()); | ||||
| ShouldThrow(() => comp.Stop()); | ||||
|
|
r205 | ShouldThrow(comp.Initialize); | ||
|
|
r185 | |||
| Assert.AreEqual(ExecutionState.Disposed, comp.State); | ||||
| } | ||||
| [TestMethod] | ||||
|
|
r205 | public void ShouldCallDisposeOnStop() { | ||
| var comp = new MockRunnableComponent(true); | ||||
| bool disposed = false; | ||||
|
|
r208 | comp.MockDispose = (disposing) => { | ||
|
|
r205 | disposed = true; | ||
| }; | ||||
| comp.Start().Join(1000); | ||||
| comp.Stop().Join(1000); | ||||
| ShouldThrow(() => comp.Start()); | ||||
| ShouldThrow(() => comp.Stop()); | ||||
| ShouldThrow(comp.Initialize); | ||||
| Assert.AreEqual(ExecutionState.Disposed, comp.State); | ||||
| Assert.IsTrue(disposed); | ||||
| } | ||||
| [TestMethod] | ||||
| public void ShouldNotCallDisposeOnStop() { | ||||
| var comp = new MockRunnableComponent(true, true); | ||||
| bool disposed = false; | ||||
|
|
r208 | comp.MockDispose = (disposing) => { | ||
|
|
r205 | disposed = true; | ||
| }; | ||||
| comp.Start().Join(1000); | ||||
| comp.Stop().Join(1000); | ||||
| Assert.AreEqual(ExecutionState.Ready, comp.State); | ||||
| Assert.IsFalse(disposed); | ||||
| } | ||||
| [TestMethod] | ||||
| public void SelfDisposeOnStop() { | ||||
| var comp = new MockRunnableComponent(true, true); | ||||
| bool disposed = false; | ||||
|
|
r208 | comp.MockDispose = (disposing) => { | ||
|
|
r205 | disposed = true; | ||
| }; | ||||
| comp.Start().Join(1000); | ||||
| comp.Stop().Join(1000); | ||||
| Assert.AreEqual(ExecutionState.Ready, comp.State); | ||||
| Assert.IsFalse(disposed); | ||||
| comp.MockStop = () => { | ||||
| comp.Dispose(); | ||||
| return Promise.Success; | ||||
| }; | ||||
| comp.Start().Join(1000); | ||||
| comp.Stop().Join(1000); | ||||
| Assert.AreEqual(ExecutionState.Disposed, comp.State); | ||||
| Assert.IsTrue(disposed); | ||||
| } | ||||
| [TestMethod] | ||||
|
|
r185 | public void StartCancelTest() { | ||
|
|
r203 | var comp = new MockRunnableComponent(true) { | ||
|
|
r185 | MockStart = () => PromiseHelper.Sleep(100000, 0) | ||
| }; | ||||
| var p = comp.Start(); | ||||
| Assert.AreEqual(ExecutionState.Starting, comp.State); | ||||
| p.Cancel(); | ||||
| ShouldThrow(() => p.Join(1000)); | ||||
| Assert.AreEqual(ExecutionState.Failed, comp.State); | ||||
|
|
r188 | |||
|
|
r194 | Assert.IsTrue(comp.LastError is OperationCanceledException); | ||
|
|
r185 | |||
| comp.Dispose(); | ||||
| } | ||||
| [TestMethod] | ||||
| public void StartStopTest() { | ||||
| var stop = new Signal(); | ||||
|
|
r203 | var comp = new MockRunnableComponent(true) { | ||
|
|
r185 | MockStart = () => PromiseHelper.Sleep(100000, 0), | ||
| MockStop = () => AsyncPool.RunThread(stop.Wait) | ||||
| }; | ||||
| var p1 = comp.Start(); | ||||
| var p2 = comp.Stop(); | ||||
| // should enter stopping state | ||||
| ShouldThrow(p1.Join); | ||||
| Assert.IsTrue(p1.IsCancelled); | ||||
| Assert.AreEqual(ExecutionState.Stopping, comp.State); | ||||
| stop.Set(); | ||||
| p2.Join(1000); | ||||
| Assert.AreEqual(ExecutionState.Disposed, comp.State); | ||||
| } | ||||
| [TestMethod] | ||||
| public void StartStopFailTest() { | ||||
|
|
r203 | var comp = new MockRunnableComponent(true) { | ||
|
|
r185 | MockStart = () => PromiseHelper.Sleep(100000, 0).Then(null,null,x => { throw new Exception("I'm dead"); }) | ||
| }; | ||||
| comp.Start(); | ||||
| var p = comp.Stop(); | ||||
| // if Start fails to cancel, should fail to stop | ||||
| ShouldThrow(() => p.Join(1000)); | ||||
| Assert.AreEqual(ExecutionState.Failed, comp.State); | ||||
| Assert.IsNotNull(comp.LastError); | ||||
| Assert.AreEqual("I'm dead", comp.LastError.Message); | ||||
| } | ||||
| [TestMethod] | ||||
| public void StopCancelTest() { | ||||
|
|
r203 | var comp = new MockRunnableComponent(true) { | ||
|
|
r185 | MockStop = () => PromiseHelper.Sleep(100000, 0) | ||
| }; | ||||
| comp.Start(); | ||||
| var p = comp.Stop(); | ||||
| Assert.AreEqual(ExecutionState.Stopping, comp.State); | ||||
| p.Cancel(); | ||||
| ShouldThrow(() => p.Join(1000)); | ||||
|
|
r188 | Assert.AreEqual(ExecutionState.Failed, comp.State); | ||
|
|
r194 | Assert.IsTrue(comp.LastError is OperationCanceledException); | ||
|
|
r185 | |||
| comp.Dispose(); | ||||
| } | ||||
| } | ||||
| } | ||||
