199 lines
4.7 KiB
C#
199 lines
4.7 KiB
C#
|
//
|
||
|
// BackgroundWorkerTest.cs
|
||
|
//
|
||
|
// Author:
|
||
|
// Atsushi Enomoto <atsushi@ximian.com>
|
||
|
//
|
||
|
// Copyright (C) 2007 Novell, Inc.
|
||
|
//
|
||
|
|
||
|
using System;
|
||
|
using System.Threading;
|
||
|
using System.Reflection;
|
||
|
using System.ComponentModel;
|
||
|
using System.Globalization;
|
||
|
|
||
|
using NUnit.Framework;
|
||
|
|
||
|
namespace MonoTests.System.ComponentModel
|
||
|
{
|
||
|
[TestFixture]
|
||
|
public class BackgroundWorkerTest
|
||
|
{
|
||
|
ManualResetEvent m;
|
||
|
bool runworkercalled;
|
||
|
SynchronizationContext old_context;
|
||
|
|
||
|
[TestFixtureSetUp]
|
||
|
public void FixtureSetup ()
|
||
|
{
|
||
|
old_context = AsyncOperationManager.SynchronizationContext;
|
||
|
AsyncOperationManager.SynchronizationContext = new SynchronizationContext ();
|
||
|
}
|
||
|
|
||
|
[TestFixtureTearDown]
|
||
|
public void TestFixtureTearDown ()
|
||
|
{
|
||
|
AsyncOperationManager.SynchronizationContext = old_context;
|
||
|
}
|
||
|
|
||
|
[SetUp]
|
||
|
public void Setup ()
|
||
|
{
|
||
|
m = new ManualResetEvent (false);
|
||
|
runworkercalled = false;
|
||
|
}
|
||
|
|
||
|
[Test]
|
||
|
[ExpectedException (typeof (InvalidOperationException))]
|
||
|
public void ReportProgressNoReportingSupported ()
|
||
|
{
|
||
|
BackgroundWorker b = new BackgroundWorker ();
|
||
|
Assert.IsFalse (b.IsBusy, "#1");
|
||
|
b.ReportProgress (0);
|
||
|
}
|
||
|
|
||
|
[Test]
|
||
|
public void ReportProgressNonBusy ()
|
||
|
{
|
||
|
BackgroundWorker b = new BackgroundWorker ();
|
||
|
b.WorkerReportsProgress = true;
|
||
|
Assert.IsFalse (b.IsBusy, "#1");
|
||
|
b.ReportProgress (0);
|
||
|
}
|
||
|
|
||
|
[Test]
|
||
|
[ExpectedException (typeof (InvalidOperationException))]
|
||
|
public void CancelAsyncNoCancellationSupported ()
|
||
|
{
|
||
|
BackgroundWorker b = new BackgroundWorker ();
|
||
|
Assert.IsFalse (b.IsBusy, "#1");
|
||
|
b.CancelAsync ();
|
||
|
}
|
||
|
|
||
|
[Test]
|
||
|
public void CancelAsyncNonBusy ()
|
||
|
{
|
||
|
BackgroundWorker b = new BackgroundWorker ();
|
||
|
b.WorkerSupportsCancellation = true;
|
||
|
Assert.IsFalse (b.IsBusy, "#1");
|
||
|
b.CancelAsync ();
|
||
|
}
|
||
|
|
||
|
[Test]
|
||
|
public void CancelBackgroundWorker ()
|
||
|
{
|
||
|
BackgroundWorker bw = new BackgroundWorker ();
|
||
|
|
||
|
bw.WorkerSupportsCancellation = true;
|
||
|
bw.DoWork += new DoWorkEventHandler (bw_DoWork);
|
||
|
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler (bw_RunWorkerCompleted);
|
||
|
|
||
|
runworkercalled = false;
|
||
|
bw.RunWorkerAsync ("cancel");
|
||
|
|
||
|
// We don't want to hang forever if the test fails.
|
||
|
Assert.AreEqual (true, m.WaitOne (10000, false), "A");
|
||
|
|
||
|
Assert.AreEqual (true, runworkercalled, "B");
|
||
|
Assert.AreEqual (false, bw.IsBusy, "C");
|
||
|
}
|
||
|
|
||
|
void bw_RunWorkerCompleted (object sender, RunWorkerCompletedEventArgs e)
|
||
|
{
|
||
|
runworkercalled = true;
|
||
|
Assert.AreEqual (true, e.Cancelled, "A1");
|
||
|
|
||
|
try {
|
||
|
object o = e.Result;
|
||
|
Assert.Fail ("There should be an IOE for cancelling the operation");
|
||
|
}
|
||
|
catch (InvalidOperationException)
|
||
|
{ }
|
||
|
|
||
|
Assert.IsNull (e.Error, "A3");
|
||
|
|
||
|
m.Set ();
|
||
|
}
|
||
|
|
||
|
[Test]
|
||
|
public void ExceptionBackgroundWorker ()
|
||
|
{
|
||
|
BackgroundWorker bw = new BackgroundWorker ();
|
||
|
|
||
|
bw.WorkerSupportsCancellation = true;
|
||
|
bw.DoWork += new DoWorkEventHandler (bw_DoWork);
|
||
|
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler (bw_RunWorkerCompletedException);
|
||
|
|
||
|
runworkercalled = false;
|
||
|
bw.RunWorkerAsync ("exception");
|
||
|
|
||
|
// We don't want to hang forever if the test fails.
|
||
|
Assert.AreEqual (true, m.WaitOne (10000, false), "A");
|
||
|
|
||
|
Assert.AreEqual (true, runworkercalled, "B");
|
||
|
Assert.AreEqual (false, bw.IsBusy, "C");
|
||
|
}
|
||
|
|
||
|
void bw_RunWorkerCompletedException (object sender, RunWorkerCompletedEventArgs e)
|
||
|
{
|
||
|
runworkercalled = true;
|
||
|
Assert.AreEqual (false, e.Cancelled, "A1");
|
||
|
|
||
|
try
|
||
|
{
|
||
|
object o = e.Result;
|
||
|
Assert.Fail ("There should be an TargetInvocationException");
|
||
|
}
|
||
|
catch (TargetInvocationException)
|
||
|
{ }
|
||
|
|
||
|
Assert.IsNotNull (e.Error, "A3");
|
||
|
|
||
|
m.Set ();
|
||
|
}
|
||
|
|
||
|
[Test]
|
||
|
public void CompleteBackgroundWorker ()
|
||
|
{
|
||
|
BackgroundWorker bw = new BackgroundWorker ();
|
||
|
|
||
|
bw.WorkerSupportsCancellation = true;
|
||
|
bw.DoWork += new DoWorkEventHandler (bw_DoWork);
|
||
|
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler (bw_RunWorkerCompletedSuccess);
|
||
|
|
||
|
runworkercalled = false;
|
||
|
bw.RunWorkerAsync ();
|
||
|
|
||
|
// We don't want to hang forever if the test fails.
|
||
|
Assert.AreEqual (true, m.WaitOne (10000, false), "A");
|
||
|
|
||
|
Assert.AreEqual (true, runworkercalled, "B");
|
||
|
Assert.AreEqual (false, bw.IsBusy, "C");
|
||
|
}
|
||
|
|
||
|
void bw_RunWorkerCompletedSuccess (object sender, RunWorkerCompletedEventArgs e)
|
||
|
{
|
||
|
runworkercalled = true;
|
||
|
Assert.AreEqual (false, e.Cancelled, "A1");
|
||
|
|
||
|
Assert.AreEqual ("B", e.Result, "A2");
|
||
|
Assert.IsNull (e.Error, "A3");
|
||
|
|
||
|
m.Set ();
|
||
|
}
|
||
|
|
||
|
void bw_DoWork (object sender, DoWorkEventArgs e)
|
||
|
{
|
||
|
if ((string)e.Argument == "cancel") {
|
||
|
e.Cancel = true;
|
||
|
e.Result = "A";
|
||
|
} else if ((string)e.Argument == "exception") {
|
||
|
throw new ApplicationException ("Whoops!");
|
||
|
} else
|
||
|
e.Result = "B";
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|