public void TestUsingThreadTest()
        {
            FakeExternalDevice device = new FakeExternalDevice();
            device.Open();

            DeviceManager manager = new DeviceManager(new[] { device });

            ThreadTest
                .AddThreadAction(device.TriggerDataReceived)
                .AddThreadAction(manager.EnableCooling)
                .Start();
        }
        public void TestSwitchOnCoolingWhilstReceivingData()
        {
            // Create an instance of a faked external hardware device
            FakeExternalDevice device = new FakeExternalDevice();
            device.Open();

            DeviceManager manager = new DeviceManager(new[] { device });

            // Force a data received from the device.
            // Locks external device lock then try to lock on syncObject in manager.
            device.TriggerDataReceived();

            // This should lock on Manager syncObject, try to lock on the external device lock.
            manager.EnableCooling();

            // Either the TriggerDataReceived call should fail to lock on the managers syncObject
            // or EnableCooling should fail to lock on the external Device's hardware lock as the other thread should
            // already have acquired the lock.
        }
        public void TestManualThreadLockTest()
        {
            FakeExternalDevice device = new FakeExternalDevice();
            device.Open();

            DeviceManager manager = new DeviceManager(new[] { device });

            ThreadStart start1 = device.TriggerDataReceived;
            ThreadStart start2 = manager.EnableCooling;

            Thread thread1 = new Thread(start1);
            thread1.Name = "Thread 1";

            Thread thread2 = new Thread(start2);
            thread2.Name = "Thread 2";

            // Start both the threads.
            // Expect thread blocking as external device locks internally then calls manager which locks internally
            // call to manager locks internally then calles external device which tries to lock internally.
            thread2.Start();
            thread1.Start();

            if (!thread1.Join(5000))
            {
                Debug.WriteLine("t1 join");
                Assert.Fail("Thread 1 timeout");
            }

            if (!thread2.Join(5000))
            {
                Debug.WriteLine("t2 join");
                Assert.Fail("Thread 2 timeout");
            }
        }