diff --git a/src/Orchard.Tests.Modules/Orchard.Tests.Modules.csproj b/src/Orchard.Tests.Modules/Orchard.Tests.Modules.csproj
index 49d0f16e5..3fe8e2bff 100644
--- a/src/Orchard.Tests.Modules/Orchard.Tests.Modules.csproj
+++ b/src/Orchard.Tests.Modules/Orchard.Tests.Modules.csproj
@@ -182,6 +182,7 @@
+
@@ -281,6 +282,10 @@
{5D0F00F0-26C9-4785-AD61-B85710C60EB0}
Orchard.Tags
+
+ {3f72a4e9-7b72-4260-b010-c16ec54f9baf}
+ Orchard.TaskLease
+
{CDE24A24-01D3-403C-84B9-37722E18DFB7}
Orchard.Themes
diff --git a/src/Orchard.Tests.Modules/TaskLease/DatabaseLockTests.cs b/src/Orchard.Tests.Modules/TaskLease/DatabaseLockTests.cs
new file mode 100644
index 000000000..5cf9611b8
--- /dev/null
+++ b/src/Orchard.Tests.Modules/TaskLease/DatabaseLockTests.cs
@@ -0,0 +1,66 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Autofac;
+using NUnit.Framework;
+using Orchard.Data;
+using Orchard.TaskLease.Models;
+using Orchard.TaskLease.Services;
+
+namespace Orchard.Tests.Modules.TaskLease {
+ [TestFixture]
+ public class DatabaseLockTests : DatabaseEnabledTestsBase {
+ private IRepository _databaseLockRepository;
+ private DatabaseLock _lock;
+
+ protected override IEnumerable DatabaseTypes {
+ get {
+ yield return typeof(DatabaseLockRecord);
+ }
+ }
+
+ public override void Register(ContainerBuilder builder) {
+ builder.RegisterType().AsSelf();
+ }
+
+ public override void Init() {
+ base.Init();
+
+ _databaseLockRepository = _container.Resolve>();
+ _lock = _container.Resolve();
+ }
+
+ [Test]
+ public void AcquiringLockSucceeds() {
+ var lockAcquired = _lock.TryAcquire("Test", TimeSpan.FromSeconds(60));
+
+ Assert.That(lockAcquired, Is.True);
+ Assert.That(_databaseLockRepository.Table.Count(), Is.EqualTo(1));
+ }
+
+ [Test]
+ public void DisposingRemovesLockRecord() {
+ _lock.TryAcquire("Test", TimeSpan.FromSeconds(60));
+ _lock.Dispose();
+ Assert.That(_databaseLockRepository.Table.Count(), Is.EqualTo(0));
+ }
+
+ [Test]
+ public void AcquiringLockTwiceFails() {
+ var attempt1 = _lock.TryAcquire("Test", TimeSpan.FromSeconds(60));
+ var attempt2 = _lock.TryAcquire("Test", TimeSpan.FromSeconds(60));
+
+ Assert.That(attempt1, Is.True);
+ Assert.That(attempt2, Is.False);
+ }
+
+ [Test]
+ public void AcquiringExpiredLockSucceeds() {
+ var attempt1 = _lock.TryAcquire("Test", TimeSpan.FromSeconds(60));
+ var attempt2 = _lock.TryAcquire("Test", TimeSpan.FromSeconds(-1)); // Treat the previosuly stored lock as immediately expired.
+
+ Assert.That(attempt1, Is.True);
+ Assert.That(attempt2, Is.True);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Orchard.Tests/Orchard.Framework.Tests.csproj b/src/Orchard.Tests/Orchard.Framework.Tests.csproj
index c26fc9d28..2ab1f8f73 100644
--- a/src/Orchard.Tests/Orchard.Framework.Tests.csproj
+++ b/src/Orchard.Tests/Orchard.Framework.Tests.csproj
@@ -269,6 +269,7 @@
+
diff --git a/src/Orchard.Tests/Stubs/StubMachineNameProvider.cs b/src/Orchard.Tests/Stubs/StubMachineNameProvider.cs
new file mode 100644
index 000000000..5d4b49638
--- /dev/null
+++ b/src/Orchard.Tests/Stubs/StubMachineNameProvider.cs
@@ -0,0 +1,9 @@
+using Orchard.Environment;
+
+namespace Orchard.Tests.Stubs {
+ public class StubMachineNameProvider : IMachineNameProvider {
+ public string GetMachineName() {
+ return "Orchard Machine";
+ }
+ }
+}