Fixed: Concurrent manual imports silently failing

Mark McDowall 6 years ago
parent 37054673b7
commit 46d8e5830a

@ -1,17 +1,29 @@
using System.Collections.Generic; using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using FizzWare.NBuilder;
using FluentAssertions; using FluentAssertions;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.Indexers; using NzbDrone.Core.Indexers;
using NzbDrone.Core.IndexerSearch; using NzbDrone.Core.IndexerSearch;
using NzbDrone.Core.MediaFiles.Commands; using NzbDrone.Core.MediaFiles.Commands;
using NzbDrone.Core.MediaFiles.EpisodeImport.Manual;
using NzbDrone.Core.Messaging.Commands; using NzbDrone.Core.Messaging.Commands;
using NzbDrone.Core.Update.Commands; using NzbDrone.Core.Update.Commands;
using NzbDrone.Test.Common;
namespace NzbDrone.Core.Test.Messaging.Commands namespace NzbDrone.Core.Test.Messaging.Commands
{ {
[TestFixture] [TestFixture]
public class CommandEqualityComparerFixture public class CommandEqualityComparerFixture
{ {
private string GivenRandomPath()
{
return Path.Combine(@"C:\Tesst\", Guid.NewGuid().ToString()).AsOsAgnostic();
}
[Test] [Test]
public void should_return_true_when_there_are_no_properties() public void should_return_true_when_there_are_no_properties()
{ {
@ -107,5 +119,43 @@ namespace NzbDrone.Core.Test.Messaging.Commands
CommandEqualityComparer.Instance.Equals(command1, command2).Should().BeFalse(); CommandEqualityComparer.Instance.Equals(command1, command2).Should().BeFalse();
} }
[Test]
public void should_return_true_when_commands_list_for_non_primitive_type_match()
{
var files1 = Builder<ManualImportFile>.CreateListOfSize(2)
.All()
.With(m => m.Path = GivenRandomPath())
.Build()
.ToList();
var files2 = files1.JsonClone();
var command1 = new ManualImportCommand { Files = files1 };
var command2 = new ManualImportCommand { Files = files2 };
CommandEqualityComparer.Instance.Equals(command1, command2).Should().BeTrue();
}
[Test]
public void should_return_false_when_commands_list_for_non_primitive_type_dont_match()
{
var files1 = Builder<ManualImportFile>.CreateListOfSize(2)
.All()
.With(m => m.Path = GivenRandomPath())
.Build()
.ToList();
var files2 = Builder<ManualImportFile>.CreateListOfSize(2)
.All()
.With(m => m.Path = GivenRandomPath())
.Build()
.ToList();
var command1 = new ManualImportCommand { Files = files1 };
var command2 = new ManualImportCommand { Files = files2 };
CommandEqualityComparer.Instance.Equals(command1, command2).Should().BeFalse();
}
} }
} }

@ -1,9 +1,11 @@
using System.Collections.Generic; using System;
using System.Collections.Generic;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.Qualities; using NzbDrone.Core.Qualities;
namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual
{ {
public class ManualImportFile public class ManualImportFile : IEquatable<ManualImportFile>
{ {
public string Path { get; set; } public string Path { get; set; }
public string FolderName { get; set; } public string FolderName { get; set; }
@ -11,5 +13,35 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport.Manual
public List<int> EpisodeIds { get; set; } public List<int> EpisodeIds { get; set; }
public QualityModel Quality { get; set; } public QualityModel Quality { get; set; }
public string DownloadId { get; set; } public string DownloadId { get; set; }
public bool Equals(ManualImportFile other)
{
if (other == null)
{
return false;
}
return Path.PathEquals(other.Path);
}
public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
if (obj.GetType() != GetType())
{
return false;
}
return Path.PathEquals(((ManualImportFile)obj).Path);
}
public override int GetHashCode()
{
return Path != null ? Path.GetHashCode() : 0;
}
} }
} }

@ -49,10 +49,13 @@ namespace NzbDrone.Core.Messaging.Commands
if (typeof(IEnumerable).IsAssignableFrom(xProperty.PropertyType)) if (typeof(IEnumerable).IsAssignableFrom(xProperty.PropertyType))
{ {
var xValueCollection = ((IEnumerable)xValue).Cast<object>().OrderBy(t => t); var xValueCollection = ((IEnumerable)xValue).Cast<object>();
var yValueCollection = ((IEnumerable)yValue).Cast<object>().OrderBy(t => t); var yValueCollection = ((IEnumerable)yValue).Cast<object>();
if (!xValueCollection.SequenceEqual(yValueCollection)) var xNotY = xValueCollection.Except(yValueCollection);
var yNotX = yValueCollection.Except(xValueCollection);
if (xNotY.Any() || yNotX.Any())
{ {
return false; return false;
} }

Loading…
Cancel
Save