Fix errors shown in unit tests

This commit is contained in:
Mole
2021-03-15 08:38:23 +01:00
parent ea816e8110
commit cee33e863e
2 changed files with 70 additions and 61 deletions

View File

@@ -362,20 +362,18 @@ namespace Umbraco.Core.Scoping
}
// Decrement the lock counters on the parent if any.
lock (_dictionaryLocker)
{
ClearReadLocks(InstanceId);
ClearWriteLocks(InstanceId);
if (ParentScope is null)
{
// We're the parent scope, make sure that locks of all scopes has been cleared
if (ReadLocks.Count != 0 || WriteLocks.Count != 0)
{
throw new Exception($"All scopes has not been disposed from parent scope {InstanceId}");
}
}
}
// Lock on parent
ClearReadLocks(InstanceId);
ClearWriteLocks(InstanceId);
// if (ParentScope is null)
// {
// // We're the parent scope, make sure that locks of all scopes has been cleared
// // Since we're only reading we don't have to be in a lock
// if (ReadLocks.Count != 0 || WriteLocks.Count != 0)
// {
// throw new Exception($"All scopes has not been disposed from parent scope {InstanceId}");
// }
// }
var parent = ParentScope;
_scopeProvider.AmbientScope = parent; // might be null = this is how scopes are removed from context objects
@@ -546,18 +544,6 @@ namespace Umbraco.Core.Scoping
}
}
private void DecrementWriteLock(int lockId, Guid instanceId)
{
if (ParentScope is null)
{
WriteLocks[instanceId][lockId]--;
}
else
{
ParentScope.DecrementWriteLock(lockId, instanceId);
}
}
private void IncrementReadLock(int lockId, Guid instanceId)
{
if (ParentScope is null)
@@ -588,18 +574,6 @@ namespace Umbraco.Core.Scoping
}
}
private void DecrementReadLock(int lockId, Guid instanceId)
{
if (ParentScope is null)
{
ReadLocks[instanceId][lockId]--;
}
else
{
ParentScope.DecrementReadLock(lockId, instanceId);
}
}
private void ClearReadLocks(Guid instanceId)
{
if (ParentScope != null)
@@ -608,7 +582,17 @@ namespace Umbraco.Core.Scoping
}
else
{
ReadLocks.Remove(instanceId);
lock (_dictionaryLocker)
{
// Rest all values to 0 since the scope has been disposed
if (ReadLocks.ContainsKey(instanceId))
{
foreach (var key in ReadLocks[instanceId].Keys.ToList())
{
ReadLocks[instanceId][key] = 0;
}
}
}
}
}
@@ -620,7 +604,17 @@ namespace Umbraco.Core.Scoping
}
else
{
WriteLocks.Remove(instanceID);
lock (_dictionaryLocker)
{
if (WriteLocks.ContainsKey(instanceID))
{
foreach (var key in WriteLocks[instanceID].Keys.ToList())
{
WriteLocks[instanceID][key] = 0;
}
}
}
}
}
@@ -657,7 +651,7 @@ namespace Umbraco.Core.Scoping
{
// Check if there is any dictionary<int,int> with a key equal to lockId
// And check that the value associated with that key is greater than 0, if not it could be because a lock was requested but it failed.
return ReadLocks.Values.Where(x => x.ContainsKey(lockId)).Any(x => x[lockId] > 0);
return ReadLocks.Values.Any(x => x.ContainsKey(lockId));
}
/// <summary>
@@ -667,7 +661,7 @@ namespace Umbraco.Core.Scoping
/// <returns>>True if no scopes has obtained a write lock with the specific ID yet.</returns>
private bool HasWriteLock(int lockId)
{
return WriteLocks.Values.Where(x => x.ContainsKey(lockId)).Any(x => x[lockId] > 0);
return WriteLocks.Values.Any(x => x.ContainsKey(lockId));
}
/// <summary>
@@ -708,8 +702,9 @@ namespace Umbraco.Core.Scoping
}
catch
{
// Something went wrong and we didn't get the lock, decrement the count and throw.
DecrementReadLock(lockId, instanceId);
// Something went wrong and we didn't get the lock
// Since we at this point have determined that we haven't got any key of LockID, it's safe to completely remove it instead of decrementing.
ReadLocks[instanceId].Remove(lockId);
throw;
}
}
@@ -757,7 +752,9 @@ namespace Umbraco.Core.Scoping
}
catch
{
DecrementWriteLock(lockId, instanceId);
// Something went wrong and we didn't get the lock
// Since we at this point have determined that we haven't got any key of LockID, it's safe to completely remove it instead of decrementing.
WriteLocks[instanceId].Remove(lockId);
throw;
}
}

View File

@@ -222,8 +222,8 @@ namespace Umbraco.Tests.Scoping
}
// Since we request the ReadLock after the innerScope has been dispose, the key has been removed from the dictionary, and we fetch it again.
syntaxProviderMock.Verify(x => x.WriteLock(It.IsAny<IDatabase>(), Constants.Locks.Languages), Times.Once);
syntaxProviderMock.Verify(x => x.WriteLock(It.IsAny<IDatabase>(), Constants.Locks.ContentTree), Times.Once);
syntaxProviderMock.Verify(x => x.ReadLock(It.IsAny<IDatabase>(), Constants.Locks.Languages), Times.Once);
syntaxProviderMock.Verify(x => x.ReadLock(It.IsAny<IDatabase>(), Constants.Locks.ContentTree), Times.Once);
}
[Test]
@@ -252,8 +252,9 @@ namespace Umbraco.Tests.Scoping
Assert.AreEqual(2, realOuterScope.WriteLocks[innerScope.InstanceId][Constants.Locks.Languages]);
innerScope.Complete();
}
Assert.IsFalse(realOuterScope.WriteLocks.ContainsKey(innerscopeId));
Assert.AreEqual(2, realOuterScope.WriteLocks[realOuterScope.InstanceId][Constants.Locks.ContentTree]);
Assert.AreEqual(0, realOuterScope.WriteLocks[innerscopeId][Constants.Locks.Languages]);
Assert.AreEqual(0, realOuterScope.WriteLocks[innerscopeId][Constants.Locks.ContentTree]);
outerscope.Complete();
}
}
@@ -284,8 +285,11 @@ namespace Umbraco.Tests.Scoping
Assert.AreEqual(2, realOuterScope.ReadLocks[innerScope.InstanceId][Constants.Locks.Languages]);
innerScope.Complete();
}
Assert.IsFalse(realOuterScope.ReadLocks.ContainsKey(innerscopeId));
Assert.AreEqual(2, realOuterScope.ReadLocks[outerscope.InstanceId][Constants.Locks.ContentTree]);
Assert.AreEqual(0, realOuterScope.ReadLocks[innerscopeId][Constants.Locks.Languages]);
Assert.AreEqual(0, realOuterScope.ReadLocks[innerscopeId][Constants.Locks.ContentTree]);
outerscope.Complete();
}
}
@@ -334,18 +338,23 @@ namespace Umbraco.Tests.Scoping
innerScope2.Complete();
}
Assert.AreEqual(1, realParentScope.WriteLocks[realParentScope.InstanceId][Constants.Locks.ContentTree], $"innerScope2, parent instance, after innserScope2 disposed: {nameof(Constants.Locks.ContentTree)}");
Assert.AreEqual(1, realParentScope.WriteLocks[realParentScope.InstanceId][Constants.Locks.ContentTypes], $"innerScope2, parent instance, after innserScope2 disposed: {nameof(Constants.Locks.ContentTypes)}");
Assert.AreEqual(1, realParentScope.WriteLocks[innerScope1.InstanceId][Constants.Locks.ContentTree], $"innerScope2, innerScope1 instance, after innserScope2 disposed: {nameof(Constants.Locks.ContentTree)}");
Assert.AreEqual(1, realParentScope.WriteLocks[innerScope1.InstanceId][Constants.Locks.ContentTypes], $"innerScope2, innerScope1 instance, after innserScope2 disposed: {nameof(Constants.Locks.ContentTypes)}");
Assert.AreEqual(1, realParentScope.WriteLocks[innerScope1.InstanceId][Constants.Locks.Languages], $"innerScope2, innerScope1 instance, after innserScope2 disposed: {nameof(Constants.Locks.Languages)}");
Assert.IsFalse(realParentScope.WriteLocks.ContainsKey(innerScope2Id));
Assert.AreEqual(1, realParentScope.WriteLocks[realParentScope.InstanceId][Constants.Locks.ContentTree], $"innerScope1, parent instance, after innserScope2 disposed: {nameof(Constants.Locks.ContentTree)}");
Assert.AreEqual(1, realParentScope.WriteLocks[realParentScope.InstanceId][Constants.Locks.ContentTypes], $"innerScope1, parent instance, after innserScope2 disposed: {nameof(Constants.Locks.ContentTypes)}");
Assert.AreEqual(1, realParentScope.WriteLocks[innerScope1.InstanceId][Constants.Locks.ContentTree], $"innerScope1, innerScope1 instance, after innserScope2 disposed: {nameof(Constants.Locks.ContentTree)}");
Assert.AreEqual(1, realParentScope.WriteLocks[innerScope1.InstanceId][Constants.Locks.ContentTypes], $"innerScope1, innerScope1 instance, after innserScope2 disposed: {nameof(Constants.Locks.ContentTypes)}");
Assert.AreEqual(1, realParentScope.WriteLocks[innerScope1.InstanceId][Constants.Locks.Languages], $"innerScope1, innerScope1 instance, after innserScope2 disposed: {nameof(Constants.Locks.Languages)}");
Assert.AreEqual(0, realParentScope.WriteLocks[innerScope2Id][Constants.Locks.ContentTree], $"innerScope1, innerScope2 instance, after innserScope2 disposed: {nameof(Constants.Locks.ContentTree)}");
Assert.AreEqual(0, realParentScope.WriteLocks[innerScope2Id][Constants.Locks.MediaTypes], $"innerScope1, innerScope2 instance, after innserScope2 disposed: {nameof(Constants.Locks.MediaTypes)}");
innerScope1.Complete();
}
Assert.AreEqual(1, realParentScope.WriteLocks[realParentScope.InstanceId][Constants.Locks.ContentTree], $"parentScope after inner scopes disposed: {nameof(Constants.Locks.ContentTree)}");
Assert.AreEqual(1, realParentScope.WriteLocks[realParentScope.InstanceId][Constants.Locks.ContentTypes], $"parentScope after inner scopes disposed {nameof(Constants.Locks.ContentTypes)}");
Assert.IsFalse(realParentScope.WriteLocks.ContainsKey(innerScope1Id));
Assert.AreEqual(1, realParentScope.WriteLocks[realParentScope.InstanceId][Constants.Locks.ContentTypes], $"parentScope after inner scopes disposed: {nameof(Constants.Locks.ContentTypes)}");
Assert.AreEqual(0, realParentScope.WriteLocks[innerScope2Id][Constants.Locks.ContentTree], $"parentScope after inner scopes disposed: {nameof(Constants.Locks.ContentTree)}");
Assert.AreEqual(0, realParentScope.WriteLocks[innerScope2Id][Constants.Locks.MediaTypes], $"parentScope after inner scopes disposed: {nameof(Constants.Locks.MediaTypes)}");
Assert.AreEqual(0, realParentScope.WriteLocks[innerScope1Id][Constants.Locks.ContentTree], $"parentScope after inner scopes disposed: {nameof(Constants.Locks.ContentTree)}");
Assert.AreEqual(0, realParentScope.WriteLocks[innerScope1Id][Constants.Locks.ContentTypes], $"parentScope after inner scopes disposed: {nameof(Constants.Locks.ContentTypes)}");
Assert.AreEqual(0, realParentScope.WriteLocks[innerScope1Id][Constants.Locks.Languages], $"parentScope after inner scopes disposed: {nameof(Constants.Locks.Languages)}");
parentScope.Complete();
}
@@ -398,14 +407,17 @@ namespace Umbraco.Tests.Scoping
Assert.AreEqual(1, realParentScope.ReadLocks[innserScope1.InstanceId][Constants.Locks.ContentTree], $"innerScope1, innerScope1 instance, after innerScope2 disposed: {nameof(Constants.Locks.ContentTree)}");
Assert.AreEqual(1, realParentScope.ReadLocks[innserScope1.InstanceId][Constants.Locks.ContentTypes], $"innerScope1, innerScope1 instance, after innerScope2 disposed: {nameof(Constants.Locks.ContentTypes)}");
Assert.AreEqual(1, realParentScope.ReadLocks[innserScope1.InstanceId][Constants.Locks.Languages], $"innerScope1, innerScope1 instance, after innerScope2 disposed: {nameof(Constants.Locks.Languages)}");
Assert.IsFalse(realParentScope.ReadLocks.ContainsKey(innerScope2Id));
Assert.AreEqual(0, realParentScope.ReadLocks[innerScope2Id][Constants.Locks.ContentTree]);
Assert.AreEqual(0, realParentScope.ReadLocks[innerScope2Id][Constants.Locks.MediaTypes]);
innserScope1.Complete();
}
Assert.AreEqual(1, realParentScope.ReadLocks[realParentScope.InstanceId][Constants.Locks.ContentTree], $"parentScope after innerScope1 disposed: {nameof(Constants.Locks.ContentTree)}");
Assert.AreEqual(1, realParentScope.ReadLocks[realParentScope.InstanceId][Constants.Locks.ContentTypes], $"parentScope after innerScope1 disposed: {nameof(Constants.Locks.ContentTypes)}");
Assert.IsFalse(realParentScope.ReadLocks.ContainsKey(innerScope1Id));
Assert.AreEqual(0, realParentScope.ReadLocks[innerScope1Id][Constants.Locks.ContentTree]);
Assert.AreEqual(0, realParentScope.ReadLocks[innerScope1Id][Constants.Locks.ContentTypes]);
Assert.AreEqual(0, realParentScope.ReadLocks[innerScope1Id][Constants.Locks.Languages]);
parentScope.Complete();
}
@@ -422,7 +434,7 @@ namespace Umbraco.Tests.Scoping
var realScope = (Scope) scope;
Assert.Throws<Exception>(() => scope.WriteLock(Constants.Locks.Languages));
Assert.AreEqual(0, realScope.WriteLocks[scope.InstanceId][Constants.Locks.Languages]);
Assert.IsFalse(realScope.WriteLocks[scope.InstanceId].ContainsKey(Constants.Locks.Languages));
scope.Complete();
}
}
@@ -438,7 +450,7 @@ namespace Umbraco.Tests.Scoping
var realScope = (Scope) scope;
Assert.Throws<Exception>(() => scope.ReadLock(Constants.Locks.Languages));
Assert.AreEqual(0, realScope.ReadLocks[scope.InstanceId][Constants.Locks.Languages]);
Assert.IsFalse(realScope.ReadLocks[scope.InstanceId].ContainsKey(Constants.Locks.Languages));
scope.Complete();
}
}