diff --git a/src/NzbDrone.Common.Test/Http/HttpClientFixture.cs b/src/NzbDrone.Common.Test/Http/HttpClientFixture.cs index 2c2bfc4ab..4fbd88a50 100644 --- a/src/NzbDrone.Common.Test/Http/HttpClientFixture.cs +++ b/src/NzbDrone.Common.Test/Http/HttpClientFixture.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Net; using System.Net.Http; using System.Threading; +using System.Threading.Tasks; using FluentAssertions; using Moq; using NLog; @@ -121,21 +122,21 @@ namespace NzbDrone.Common.Test.Http } [Test] - public void should_execute_simple_get() + public async Task should_execute_simple_get() { var request = new HttpRequest($"https://{_httpBinHost}/get"); - var response = Subject.Execute(request); + var response = await Subject.ExecuteAsync(request); response.Content.Should().NotBeNullOrWhiteSpace(); } [Test] - public void should_execute_https_get() + public async Task should_execute_https_get() { var request = new HttpRequest($"https://{_httpBinHost}/get"); - var response = Subject.Execute(request); + var response = await Subject.ExecuteAsync(request); response.Content.Should().NotBeNullOrWhiteSpace(); } @@ -147,47 +148,47 @@ namespace NzbDrone.Common.Test.Http Mocker.GetMock().SetupGet(x => x.CertificateValidation).Returns(validationType); var request = new HttpRequest($"https://expired.badssl.com"); - Assert.Throws(() => Subject.Execute(request)); + Assert.ThrowsAsync(async () => await Subject.ExecuteAsync(request)); ExceptionVerification.ExpectedErrors(1); } [Test] - public void bad_ssl_should_pass_if_remote_validation_disabled() + public async Task bad_ssl_should_pass_if_remote_validation_disabled() { Mocker.GetMock().SetupGet(x => x.CertificateValidation).Returns(CertificateValidationType.Disabled); var request = new HttpRequest($"https://expired.badssl.com"); - Subject.Execute(request); + await Subject.ExecuteAsync(request); ExceptionVerification.ExpectedErrors(0); } [Test] - public void should_execute_typed_get() + public async Task should_execute_typed_get() { var request = new HttpRequest($"https://{_httpBinHost}/get?test=1"); - var response = Subject.Get(request); + var response = await Subject.GetAsync(request); response.Resource.Url.EndsWith("/get?test=1"); response.Resource.Args.Should().Contain("test", "1"); } [Test] - public void should_execute_simple_post() + public async Task should_execute_simple_post() { var message = "{ my: 1 }"; var request = new HttpRequest($"https://{_httpBinHost}/post"); request.SetContent(message); - var response = Subject.Post(request); + var response = await Subject.PostAsync(request); response.Resource.Data.Should().Be(message); } [Test] - public void should_execute_post_with_content_type() + public async Task should_execute_post_with_content_type() { var message = "{ my: 1 }"; @@ -195,16 +196,16 @@ namespace NzbDrone.Common.Test.Http request.SetContent(message); request.Headers.ContentType = "application/json"; - var response = Subject.Post(request); + var response = await Subject.PostAsync(request); response.Resource.Data.Should().Be(message); } [Test] - public void should_execute_get_using_gzip() + public async Task should_execute_get_using_gzip() { var request = new HttpRequest($"https://{_httpBinHost}/gzip"); - var response = Subject.Get(request); + var response = await Subject.GetAsync(request); response.Resource.Headers["Accept-Encoding"].ToString().Should().Contain("gzip"); @@ -213,10 +214,10 @@ namespace NzbDrone.Common.Test.Http } [Test] - public void should_execute_get_using_brotli() + public async Task should_execute_get_using_brotli() { var request = new HttpRequest($"https://{_httpBinHost}/brotli"); - var response = Subject.Get(request); + var response = await Subject.GetAsync(request); response.Resource.Headers["Accept-Encoding"].ToString().Should().Contain("br"); @@ -234,7 +235,7 @@ namespace NzbDrone.Common.Test.Http { var request = new HttpRequest($"https://{_httpBinHost}/status/{statusCode}"); - var exception = Assert.Throws(() => Subject.Get(request)); + var exception = Assert.ThrowsAsync(async () => await Subject.GetAsync(request)); ((int)exception.Response.StatusCode).Should().Be(statusCode); @@ -247,7 +248,7 @@ namespace NzbDrone.Common.Test.Http var request = new HttpRequest($"https://{_httpBinHost}/status/{HttpStatusCode.NotFound}"); request.SuppressHttpErrorStatusCodes = new[] { HttpStatusCode.NotFound }; - Assert.Throws(() => Subject.Get(request)); + Assert.ThrowsAsync(async () => await Subject.GetAsync(request)); ExceptionVerification.IgnoreWarns(); } @@ -257,7 +258,7 @@ namespace NzbDrone.Common.Test.Http { var request = new HttpRequest($"https://{_httpBinHost}/status/{HttpStatusCode.NotFound}"); - var exception = Assert.Throws(() => Subject.Get(request)); + var exception = Assert.ThrowsAsync(async () => await Subject.GetAsync(request)); ExceptionVerification.ExpectedWarns(1); } @@ -268,28 +269,28 @@ namespace NzbDrone.Common.Test.Http var request = new HttpRequest($"https://{_httpBinHost}/status/{HttpStatusCode.NotFound}"); request.LogHttpError = false; - Assert.Throws(() => Subject.Get(request)); + Assert.ThrowsAsync(async () => await Subject.GetAsync(request)); ExceptionVerification.ExpectedWarns(0); } [Test] - public void should_not_follow_redirects_when_not_in_production() + public async Task should_not_follow_redirects_when_not_in_production() { var request = new HttpRequest($"https://{_httpBinHost}/redirect/1"); - Subject.Get(request); + await Subject.GetAsync(request); ExceptionVerification.ExpectedErrors(1); } [Test] - public void should_follow_redirects() + public async Task should_follow_redirects() { var request = new HttpRequest($"https://{_httpBinHost}/redirect/1"); request.AllowAutoRedirect = true; - var response = Subject.Get(request); + var response = await Subject.GetAsync(request); response.StatusCode.Should().Be(HttpStatusCode.OK); @@ -297,12 +298,12 @@ namespace NzbDrone.Common.Test.Http } [Test] - public void should_not_follow_redirects() + public async Task should_not_follow_redirects() { var request = new HttpRequest($"https://{_httpBinHost}/redirect/1"); request.AllowAutoRedirect = false; - var response = Subject.Get(request); + var response = await Subject.GetAsync(request); response.StatusCode.Should().Be(HttpStatusCode.Found); @@ -310,14 +311,14 @@ namespace NzbDrone.Common.Test.Http } [Test] - public void should_follow_redirects_to_https() + public async Task should_follow_redirects_to_https() { var request = new HttpRequestBuilder($"https://{_httpBinHost}/redirect-to") .AddQueryParam("url", $"https://sonarr.tv/") .Build(); request.AllowAutoRedirect = true; - var response = Subject.Get(request); + var response = await Subject.GetAsync(request); response.StatusCode.Should().Be(HttpStatusCode.OK); response.Content.Should().Contain("Sonarr"); @@ -331,17 +332,17 @@ namespace NzbDrone.Common.Test.Http var request = new HttpRequest($"https://{_httpBinHost}/redirect/6"); request.AllowAutoRedirect = true; - Assert.Throws(() => Subject.Get(request)); + Assert.ThrowsAsync(async () => await Subject.GetAsync(request)); ExceptionVerification.ExpectedErrors(0); } [Test] - public void should_send_user_agent() + public async Task should_send_user_agent() { var request = new HttpRequest($"https://{_httpBinHost}/get"); - var response = Subject.Get(request); + var response = await Subject.GetAsync(request); response.Resource.Headers.Should().ContainKey("User-Agent"); @@ -351,24 +352,24 @@ namespace NzbDrone.Common.Test.Http } [TestCase("Accept", "text/xml, text/rss+xml, application/rss+xml")] - public void should_send_headers(string header, string value) + public async Task should_send_headers(string header, string value) { var request = new HttpRequest($"https://{_httpBinHost}/get"); request.Headers.Add(header, value); - var response = Subject.Get(request); + var response = await Subject.GetAsync(request); response.Resource.Headers[header].ToString().Should().Be(value); } [Test] - public void should_download_file() + public async Task should_download_file() { var file = GetTempFilePath(); var url = "https://sonarr.tv/img/slider/seriesdetails.png"; - Subject.DownloadFile(url, file); + await Subject.DownloadFileAsync(url, file); File.Exists(file).Should().BeTrue(); File.Exists(file + ".part").Should().BeFalse(); @@ -379,7 +380,7 @@ namespace NzbDrone.Common.Test.Http } [Test] - public void should_download_file_with_redirect() + public async Task should_download_file_with_redirect() { var file = GetTempFilePath(); @@ -387,7 +388,7 @@ namespace NzbDrone.Common.Test.Http .AddQueryParam("url", $"https://sonarr.tv/img/slider/seriesdetails.png") .Build(); - Subject.DownloadFile(request.Url.FullUri, file); + await Subject.DownloadFileAsync(request.Url.FullUri, file); ExceptionVerification.ExpectedErrors(0); @@ -401,7 +402,7 @@ namespace NzbDrone.Common.Test.Http { var file = GetTempFilePath(); - Assert.Throws(() => Subject.DownloadFile("https://download.sonarr.tv/wrongpath", file)); + Assert.ThrowsAsync(async () => await Subject.DownloadFileAsync("https://download.sonarr.tv/wrongpath", file)); File.Exists(file).Should().BeFalse(); File.Exists(file + ".part").Should().BeFalse(); @@ -410,7 +411,7 @@ namespace NzbDrone.Common.Test.Http } [Test] - public void should_not_write_redirect_content_to_stream() + public async Task should_not_write_redirect_content_to_stream() { var file = GetTempFilePath(); @@ -420,7 +421,7 @@ namespace NzbDrone.Common.Test.Http request.AllowAutoRedirect = false; request.ResponseStream = fileStream; - var response = Subject.Get(request); + var response = await Subject.GetAsync(request); response.StatusCode.Should().Be(HttpStatusCode.Redirect); } @@ -435,12 +436,12 @@ namespace NzbDrone.Common.Test.Http } [Test] - public void should_send_cookie() + public async Task should_send_cookie() { var request = new HttpRequest($"https://{_httpBinHost}/get"); request.Cookies["my"] = "cookie"; - var response = Subject.Get(request); + var response = await Subject.GetAsync(request); response.Resource.Headers.Should().ContainKey("Cookie"); @@ -469,13 +470,13 @@ namespace NzbDrone.Common.Test.Http } [Test] - public void should_preserve_cookie_during_session() + public async Task should_preserve_cookie_during_session() { GivenOldCookie(); var request = new HttpRequest($"https://{_httpBinHost2}/get"); - var response = Subject.Get(request); + var response = await Subject.GetAsync(request); response.Resource.Headers.Should().ContainKey("Cookie"); @@ -485,30 +486,30 @@ namespace NzbDrone.Common.Test.Http } [Test] - public void should_not_send_cookie_to_other_host() + public async Task should_not_send_cookie_to_other_host() { GivenOldCookie(); var request = new HttpRequest($"https://{_httpBinHost}/get"); - var response = Subject.Get(request); + var response = await Subject.GetAsync(request); response.Resource.Headers.Should().NotContainKey("Cookie"); } [Test] - public void should_not_store_request_cookie() + public async Task should_not_store_request_cookie() { var requestGet = new HttpRequest($"https://{_httpBinHost}/get"); requestGet.Cookies.Add("my", "cookie"); requestGet.AllowAutoRedirect = false; requestGet.StoreRequestCookie = false; requestGet.StoreResponseCookie = false; - var responseGet = Subject.Get(requestGet); + var responseGet = await Subject.GetAsync(requestGet); var requestCookies = new HttpRequest($"https://{_httpBinHost}/cookies"); requestCookies.AllowAutoRedirect = false; - var responseCookies = Subject.Get(requestCookies); + var responseCookies = await Subject.GetAsync(requestCookies); responseCookies.Resource.Cookies.Should().BeEmpty(); @@ -516,18 +517,18 @@ namespace NzbDrone.Common.Test.Http } [Test] - public void should_store_request_cookie() + public async Task should_store_request_cookie() { var requestGet = new HttpRequest($"https://{_httpBinHost}/get"); requestGet.Cookies.Add("my", "cookie"); requestGet.AllowAutoRedirect = false; requestGet.StoreRequestCookie.Should().BeTrue(); requestGet.StoreResponseCookie = false; - var responseGet = Subject.Get(requestGet); + var responseGet = await Subject.GetAsync(requestGet); var requestCookies = new HttpRequest($"https://{_httpBinHost}/cookies"); requestCookies.AllowAutoRedirect = false; - var responseCookies = Subject.Get(requestCookies); + var responseCookies = await Subject.GetAsync(requestCookies); responseCookies.Resource.Cookies.Should().HaveCount(1).And.Contain("my", "cookie"); @@ -535,7 +536,7 @@ namespace NzbDrone.Common.Test.Http } [Test] - public void should_delete_request_cookie() + public async Task should_delete_request_cookie() { var requestDelete = new HttpRequest($"https://{_httpBinHost}/cookies/delete?my"); requestDelete.Cookies.Add("my", "cookie"); @@ -544,13 +545,13 @@ namespace NzbDrone.Common.Test.Http requestDelete.StoreResponseCookie = false; // Delete and redirect since that's the only way to check the internal temporary cookie container - var responseCookies = Subject.Get(requestDelete); + var responseCookies = await Subject.GetAsync(requestDelete); responseCookies.Resource.Cookies.Should().BeEmpty(); } [Test] - public void should_clear_request_cookie() + public async Task should_clear_request_cookie() { var requestSet = new HttpRequest($"https://{_httpBinHost}/cookies"); requestSet.Cookies.Add("my", "cookie"); @@ -558,7 +559,7 @@ namespace NzbDrone.Common.Test.Http requestSet.StoreRequestCookie = true; requestSet.StoreResponseCookie = false; - var responseSet = Subject.Get(requestSet); + var responseSet = await Subject.GetAsync(requestSet); var requestClear = new HttpRequest($"https://{_httpBinHost}/cookies"); requestClear.Cookies.Add("my", null); @@ -566,24 +567,24 @@ namespace NzbDrone.Common.Test.Http requestClear.StoreRequestCookie = true; requestClear.StoreResponseCookie = false; - var responseClear = Subject.Get(requestClear); + var responseClear = await Subject.GetAsync(requestClear); responseClear.Resource.Cookies.Should().BeEmpty(); } [Test] - public void should_not_store_response_cookie() + public async Task should_not_store_response_cookie() { var requestSet = new HttpRequest($"https://{_httpBinHost}/cookies/set?my=cookie"); requestSet.AllowAutoRedirect = false; requestSet.StoreRequestCookie = false; requestSet.StoreResponseCookie.Should().BeFalse(); - var responseSet = Subject.Get(requestSet); + var responseSet = await Subject.GetAsync(requestSet); var requestCookies = new HttpRequest($"https://{_httpBinHost}/cookies"); - var responseCookies = Subject.Get(requestCookies); + var responseCookies = await Subject.GetAsync(requestCookies); responseCookies.Resource.Cookies.Should().BeEmpty(); @@ -591,18 +592,18 @@ namespace NzbDrone.Common.Test.Http } [Test] - public void should_store_response_cookie() + public async Task should_store_response_cookie() { var requestSet = new HttpRequest($"https://{_httpBinHost}/cookies/set?my=cookie"); requestSet.AllowAutoRedirect = false; requestSet.StoreRequestCookie = false; requestSet.StoreResponseCookie = true; - var responseSet = Subject.Get(requestSet); + var responseSet = await Subject.GetAsync(requestSet); var requestCookies = new HttpRequest($"https://{_httpBinHost}/cookies"); - var responseCookies = Subject.Get(requestCookies); + var responseCookies = await Subject.GetAsync(requestCookies); responseCookies.Resource.Cookies.Should().HaveCount(1).And.Contain("my", "cookie"); @@ -610,13 +611,13 @@ namespace NzbDrone.Common.Test.Http } [Test] - public void should_temp_store_response_cookie() + public async Task should_temp_store_response_cookie() { var requestSet = new HttpRequest($"https://{_httpBinHost}/cookies/set?my=cookie"); requestSet.AllowAutoRedirect = true; requestSet.StoreRequestCookie = false; requestSet.StoreResponseCookie.Should().BeFalse(); - var responseSet = Subject.Get(requestSet); + var responseSet = await Subject.GetAsync(requestSet); // Set and redirect since that's the only way to check the internal temporary cookie container responseSet.Resource.Cookies.Should().HaveCount(1).And.Contain("my", "cookie"); @@ -625,7 +626,7 @@ namespace NzbDrone.Common.Test.Http } [Test] - public void should_overwrite_response_cookie() + public async Task should_overwrite_response_cookie() { var requestSet = new HttpRequest($"https://{_httpBinHost}/cookies/set?my=cookie"); requestSet.Cookies.Add("my", "oldcookie"); @@ -633,11 +634,11 @@ namespace NzbDrone.Common.Test.Http requestSet.StoreRequestCookie = false; requestSet.StoreResponseCookie = true; - var responseSet = Subject.Get(requestSet); + var responseSet = await Subject.GetAsync(requestSet); var requestCookies = new HttpRequest($"https://{_httpBinHost}/cookies"); - var responseCookies = Subject.Get(requestCookies); + var responseCookies = await Subject.GetAsync(requestCookies); responseCookies.Resource.Cookies.Should().HaveCount(1).And.Contain("my", "cookie"); @@ -645,7 +646,7 @@ namespace NzbDrone.Common.Test.Http } [Test] - public void should_overwrite_temp_response_cookie() + public async Task should_overwrite_temp_response_cookie() { var requestSet = new HttpRequest($"https://{_httpBinHost}/cookies/set?my=cookie"); requestSet.Cookies.Add("my", "oldcookie"); @@ -653,13 +654,13 @@ namespace NzbDrone.Common.Test.Http requestSet.StoreRequestCookie = true; requestSet.StoreResponseCookie = false; - var responseSet = Subject.Get(requestSet); + var responseSet = await Subject.GetAsync(requestSet); responseSet.Resource.Cookies.Should().HaveCount(1).And.Contain("my", "cookie"); var requestCookies = new HttpRequest($"https://{_httpBinHost}/cookies"); - var responseCookies = Subject.Get(requestCookies); + var responseCookies = await Subject.GetAsync(requestCookies); responseCookies.Resource.Cookies.Should().HaveCount(1).And.Contain("my", "oldcookie"); @@ -667,14 +668,14 @@ namespace NzbDrone.Common.Test.Http } [Test] - public void should_not_delete_response_cookie() + public async Task should_not_delete_response_cookie() { var requestCookies = new HttpRequest($"https://{_httpBinHost}/cookies"); requestCookies.Cookies.Add("my", "cookie"); requestCookies.AllowAutoRedirect = false; requestCookies.StoreRequestCookie = true; requestCookies.StoreResponseCookie = false; - var responseCookies = Subject.Get(requestCookies); + var responseCookies = await Subject.GetAsync(requestCookies); responseCookies.Resource.Cookies.Should().HaveCount(1).And.Contain("my", "cookie"); @@ -683,13 +684,13 @@ namespace NzbDrone.Common.Test.Http requestDelete.StoreRequestCookie = false; requestDelete.StoreResponseCookie = false; - var responseDelete = Subject.Get(requestDelete); + var responseDelete = await Subject.GetAsync(requestDelete); requestCookies = new HttpRequest($"https://{_httpBinHost}/cookies"); requestCookies.StoreRequestCookie = false; requestCookies.StoreResponseCookie = false; - responseCookies = Subject.Get(requestCookies); + responseCookies = await Subject.GetAsync(requestCookies); responseCookies.Resource.Cookies.Should().HaveCount(1).And.Contain("my", "cookie"); @@ -697,14 +698,14 @@ namespace NzbDrone.Common.Test.Http } [Test] - public void should_delete_response_cookie() + public async Task should_delete_response_cookie() { var requestCookies = new HttpRequest($"https://{_httpBinHost}/cookies"); requestCookies.Cookies.Add("my", "cookie"); requestCookies.AllowAutoRedirect = false; requestCookies.StoreRequestCookie = true; requestCookies.StoreResponseCookie = false; - var responseCookies = Subject.Get(requestCookies); + var responseCookies = await Subject.GetAsync(requestCookies); responseCookies.Resource.Cookies.Should().HaveCount(1).And.Contain("my", "cookie"); @@ -713,13 +714,13 @@ namespace NzbDrone.Common.Test.Http requestDelete.StoreRequestCookie = false; requestDelete.StoreResponseCookie = true; - var responseDelete = Subject.Get(requestDelete); + var responseDelete = await Subject.GetAsync(requestDelete); requestCookies = new HttpRequest($"https://{_httpBinHost}/cookies"); requestCookies.StoreRequestCookie = false; requestCookies.StoreResponseCookie = false; - responseCookies = Subject.Get(requestCookies); + responseCookies = await Subject.GetAsync(requestCookies); responseCookies.Resource.Cookies.Should().BeEmpty(); @@ -727,14 +728,14 @@ namespace NzbDrone.Common.Test.Http } [Test] - public void should_delete_temp_response_cookie() + public async Task should_delete_temp_response_cookie() { var requestCookies = new HttpRequest($"https://{_httpBinHost}/cookies"); requestCookies.Cookies.Add("my", "cookie"); requestCookies.AllowAutoRedirect = false; requestCookies.StoreRequestCookie = true; requestCookies.StoreResponseCookie = false; - var responseCookies = Subject.Get(requestCookies); + var responseCookies = await Subject.GetAsync(requestCookies); responseCookies.Resource.Cookies.Should().HaveCount(1).And.Contain("my", "cookie"); @@ -742,7 +743,7 @@ namespace NzbDrone.Common.Test.Http requestDelete.AllowAutoRedirect = true; requestDelete.StoreRequestCookie = false; requestDelete.StoreResponseCookie = false; - var responseDelete = Subject.Get(requestDelete); + var responseDelete = await Subject.GetAsync(requestDelete); responseDelete.Resource.Cookies.Should().BeEmpty(); @@ -760,13 +761,13 @@ namespace NzbDrone.Common.Test.Http { var request = new HttpRequest($"https://{_httpBinHost}/status/429"); - Assert.Throws(() => Subject.Get(request)); + Assert.ThrowsAsync(async () => await Subject.GetAsync(request)); ExceptionVerification.IgnoreWarns(); } [Test] - public void should_call_interceptor() + public async Task should_call_interceptor() { Mocker.SetConstant>(new[] { Mocker.GetMock().Object }); @@ -780,7 +781,7 @@ namespace NzbDrone.Common.Test.Http var request = new HttpRequest($"https://{_httpBinHost}/get"); - Subject.Get(request); + await Subject.GetAsync(request); Mocker.GetMock() .Verify(v => v.PreRequest(It.IsAny()), Times.Once()); @@ -791,7 +792,7 @@ namespace NzbDrone.Common.Test.Http [TestCase("en-US")] [TestCase("es-ES")] - public void should_parse_malformed_cloudflare_cookie(string culture) + public async Task should_parse_malformed_cloudflare_cookie(string culture) { var origCulture = Thread.CurrentThread.CurrentCulture; Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(culture); @@ -807,11 +808,11 @@ namespace NzbDrone.Common.Test.Http requestSet.AllowAutoRedirect = false; requestSet.StoreResponseCookie = true; - var responseSet = Subject.Get(requestSet); + var responseSet = await Subject.GetAsync(requestSet); var request = new HttpRequest($"https://{_httpBinHost}/get"); - var response = Subject.Get(request); + var response = await Subject.GetAsync(request); response.Resource.Headers.Should().ContainKey("Cookie"); @@ -829,7 +830,7 @@ namespace NzbDrone.Common.Test.Http } [TestCase("lang_code=en; expires=Wed, 23-Dec-2026 18:09:14 GMT; Max-Age=31536000; path=/; domain=.abc.com")] - public void should_reject_malformed_domain_cookie(string malformedCookie) + public async Task should_reject_malformed_domain_cookie(string malformedCookie) { try { @@ -839,11 +840,11 @@ namespace NzbDrone.Common.Test.Http requestSet.AllowAutoRedirect = false; requestSet.StoreResponseCookie = true; - var responseSet = Subject.Get(requestSet); + var responseSet = await Subject.GetAsync(requestSet); var request = new HttpRequest($"https://{_httpBinHost}/get"); - var response = Subject.Get(request); + var response = await Subject.GetAsync(request); response.Resource.Headers.Should().NotContainKey("Cookie"); @@ -855,12 +856,12 @@ namespace NzbDrone.Common.Test.Http } [Test] - public void should_correctly_use_basic_auth() + public async Task should_correctly_use_basic_auth() { var request = new HttpRequest($"https://{_httpBinHost}/basic-auth/username/password"); request.Credentials = new BasicNetworkCredential("username", "password"); - var response = Subject.Execute(request); + var response = await Subject.ExecuteAsync(request); response.StatusCode.Should().Be(HttpStatusCode.OK); } diff --git a/src/NzbDrone.Common/Http/Dispatchers/IHttpDispatcher.cs b/src/NzbDrone.Common/Http/Dispatchers/IHttpDispatcher.cs index 8e665ceed..a5565f26b 100644 --- a/src/NzbDrone.Common/Http/Dispatchers/IHttpDispatcher.cs +++ b/src/NzbDrone.Common/Http/Dispatchers/IHttpDispatcher.cs @@ -1,9 +1,10 @@ using System.Net; +using System.Threading.Tasks; namespace NzbDrone.Common.Http.Dispatchers { public interface IHttpDispatcher { - HttpResponse GetResponse(HttpRequest request, CookieContainer cookies); + Task GetResponseAsync(HttpRequest request, CookieContainer cookies); } } diff --git a/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs b/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs index dbabf964b..a9449efe7 100644 --- a/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs +++ b/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs @@ -43,7 +43,7 @@ namespace NzbDrone.Common.Http.Dispatchers _credentialCache = cacheManager.GetCache(typeof(ManagedHttpDispatcher), "credentialcache"); } - public HttpResponse GetResponse(HttpRequest request, CookieContainer cookies) + public async Task GetResponseAsync(HttpRequest request, CookieContainer cookies) { var requestMessage = new HttpRequestMessage(request.Method, (Uri)request.Url) { @@ -102,7 +102,7 @@ namespace NzbDrone.Common.Http.Dispatchers var httpClient = GetClient(request.Url); - using var responseMessage = httpClient.Send(requestMessage, HttpCompletionOption.ResponseHeadersRead, cts.Token); + using var responseMessage = await httpClient.SendAsync(requestMessage, HttpCompletionOption.ResponseHeadersRead, cts.Token); { byte[] data = null; @@ -110,7 +110,7 @@ namespace NzbDrone.Common.Http.Dispatchers { if (request.ResponseStream != null && responseMessage.StatusCode == HttpStatusCode.OK) { - responseMessage.Content.CopyTo(request.ResponseStream, null, cts.Token); + await responseMessage.Content.CopyToAsync(request.ResponseStream, null, cts.Token); } else { diff --git a/src/NzbDrone.Common/Http/HttpClient.cs b/src/NzbDrone.Common/Http/HttpClient.cs index 1e67641a9..0039ad9ba 100644 --- a/src/NzbDrone.Common/Http/HttpClient.cs +++ b/src/NzbDrone.Common/Http/HttpClient.cs @@ -5,6 +5,7 @@ using System.IO; using System.Linq; using System.Net; using System.Net.Http; +using System.Threading.Tasks; using NLog; using NzbDrone.Common.Cache; using NzbDrone.Common.EnvironmentInfo; @@ -25,6 +26,16 @@ namespace NzbDrone.Common.Http HttpResponse Post(HttpRequest request); HttpResponse Post(HttpRequest request) where T : new(); + + Task ExecuteAsync(HttpRequest request); + Task DownloadFileAsync(string url, string fileName); + Task GetAsync(HttpRequest request); + Task> GetAsync(HttpRequest request) + where T : new(); + Task HeadAsync(HttpRequest request); + Task PostAsync(HttpRequest request); + Task> PostAsync(HttpRequest request) + where T : new(); } public class HttpClient : IHttpClient @@ -52,11 +63,11 @@ namespace NzbDrone.Common.Http _cookieContainerCache = cacheManager.GetCache(typeof(HttpClient)); } - public HttpResponse Execute(HttpRequest request) + public virtual async Task ExecuteAsync(HttpRequest request) { var cookieContainer = InitializeRequestCookies(request); - var response = ExecuteRequest(request, cookieContainer); + var response = await ExecuteRequestAsync(request, cookieContainer); if (request.AllowAutoRedirect && response.HasHttpRedirect) { @@ -82,7 +93,7 @@ namespace NzbDrone.Common.Http request.ContentSummary = null; } - response = ExecuteRequest(request, cookieContainer); + response = await ExecuteRequestAsync(request, cookieContainer); } while (response.HasHttpRedirect); } @@ -112,6 +123,11 @@ namespace NzbDrone.Common.Http return response; } + public HttpResponse Execute(HttpRequest request) + { + return ExecuteAsync(request).GetAwaiter().GetResult(); + } + private static bool RequestRequiresForceGet(HttpStatusCode statusCode, HttpMethod requestMethod) { return statusCode switch @@ -122,7 +138,7 @@ namespace NzbDrone.Common.Http }; } - private HttpResponse ExecuteRequest(HttpRequest request, CookieContainer cookieContainer) + private async Task ExecuteRequestAsync(HttpRequest request, CookieContainer cookieContainer) { foreach (var interceptor in _requestInterceptors) { @@ -131,14 +147,14 @@ namespace NzbDrone.Common.Http if (request.RateLimit != TimeSpan.Zero) { - _rateLimitService.WaitAndPulse(request.Url.Host, request.RateLimitKey, request.RateLimit); + await _rateLimitService.WaitAndPulseAsync(request.Url.Host, request.RateLimitKey, request.RateLimit); } _logger.Trace(request); var stopWatch = Stopwatch.StartNew(); - var response = _httpDispatcher.GetResponse(request, cookieContainer); + var response = await _httpDispatcher.GetResponseAsync(request, cookieContainer); HandleResponseCookies(response, cookieContainer); @@ -246,7 +262,7 @@ namespace NzbDrone.Common.Http } } - public void DownloadFile(string url, string fileName) + public async Task DownloadFileAsync(string url, string fileName) { var fileNamePart = fileName + ".part"; @@ -261,12 +277,12 @@ namespace NzbDrone.Common.Http _logger.Debug("Downloading [{0}] to [{1}]", url, fileName); var stopWatch = Stopwatch.StartNew(); - using (var fileStream = new FileStream(fileNamePart, FileMode.Create, FileAccess.ReadWrite)) + await using (var fileStream = new FileStream(fileNamePart, FileMode.Create, FileAccess.ReadWrite)) { var request = new HttpRequest(url); request.AllowAutoRedirect = true; request.ResponseStream = fileStream; - var response = Get(request); + var response = await GetAsync(request); if (response.Headers.ContentType != null && response.Headers.ContentType.Contains("text/html")) { @@ -275,6 +291,7 @@ namespace NzbDrone.Common.Http } stopWatch.Stop(); + if (File.Exists(fileName)) { File.Delete(fileName); @@ -292,38 +309,71 @@ namespace NzbDrone.Common.Http } } - public HttpResponse Get(HttpRequest request) + public void DownloadFile(string url, string fileName) + { + // https://docs.microsoft.com/en-us/archive/msdn-magazine/2015/july/async-programming-brownfield-async-development#the-thread-pool-hack + Task.Run(() => DownloadFileAsync(url, fileName)).GetAwaiter().GetResult(); + } + + public Task GetAsync(HttpRequest request) { request.Method = HttpMethod.Get; - return Execute(request); + return ExecuteAsync(request); + } + + public HttpResponse Get(HttpRequest request) + { + return Task.Run(() => GetAsync(request)).GetAwaiter().GetResult(); + } + + public async Task> GetAsync(HttpRequest request) + where T : new() + { + var response = await GetAsync(request); + CheckResponseContentType(response); + return new HttpResponse(response); } public HttpResponse Get(HttpRequest request) where T : new() { - var response = Get(request); - CheckResponseContentType(response); - return new HttpResponse(response); + return Task.Run(() => GetAsync(request)).GetAwaiter().GetResult(); + } + + public Task HeadAsync(HttpRequest request) + { + request.Method = HttpMethod.Head; + return ExecuteAsync(request); } public HttpResponse Head(HttpRequest request) { - request.Method = HttpMethod.Head; - return Execute(request); + return Task.Run(() => HeadAsync(request)).GetAwaiter().GetResult(); + } + + public Task PostAsync(HttpRequest request) + { + request.Method = HttpMethod.Post; + return ExecuteAsync(request); } public HttpResponse Post(HttpRequest request) { - request.Method = HttpMethod.Post; - return Execute(request); + return Task.Run(() => PostAsync(request)).GetAwaiter().GetResult(); + } + + public async Task> PostAsync(HttpRequest request) + where T : new() + { + var response = await PostAsync(request); + CheckResponseContentType(response); + return new HttpResponse(response); } public HttpResponse Post(HttpRequest request) where T : new() { - var response = Post(request); - CheckResponseContentType(response); - return new HttpResponse(response); + return Task.Run(() => PostAsync(request)).GetAwaiter().GetResult(); } private void CheckResponseContentType(HttpResponse response) diff --git a/src/NzbDrone.Common/Http/HttpRequest.cs b/src/NzbDrone.Common/Http/HttpRequest.cs index c9ef99f62..b3ce190d4 100644 --- a/src/NzbDrone.Common/Http/HttpRequest.cs +++ b/src/NzbDrone.Common/Http/HttpRequest.cs @@ -16,6 +16,7 @@ namespace NzbDrone.Common.Http Method = HttpMethod.Get; Url = new HttpUri(url); Headers = new HttpHeader(); + ConnectionKeepAlive = true; AllowAutoRedirect = true; StoreRequestCookie = true; LogHttpError = true; diff --git a/src/NzbDrone.Common/TPL/RateLimitService.cs b/src/NzbDrone.Common/TPL/RateLimitService.cs index 87b0ff22f..b7cfd2e7c 100644 --- a/src/NzbDrone.Common/TPL/RateLimitService.cs +++ b/src/NzbDrone.Common/TPL/RateLimitService.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Concurrent; +using System.Threading.Tasks; using NLog; using NzbDrone.Common.Cache; using NzbDrone.Common.Extensions; @@ -10,6 +11,8 @@ namespace NzbDrone.Common.TPL { void WaitAndPulse(string key, TimeSpan interval); void WaitAndPulse(string key, string subKey, TimeSpan interval); + Task WaitAndPulseAsync(string key, TimeSpan interval); + Task WaitAndPulseAsync(string key, string subKey, TimeSpan interval); } public class RateLimitService : IRateLimitService @@ -28,7 +31,34 @@ namespace NzbDrone.Common.TPL WaitAndPulse(key, null, interval); } + public async Task WaitAndPulseAsync(string key, TimeSpan interval) + { + await WaitAndPulseAsync(key, null, interval); + } + public void WaitAndPulse(string key, string subKey, TimeSpan interval) + { + var delay = GetDelay(key, subKey, interval); + + if (delay.TotalSeconds > 0.0) + { + _logger.Trace("Rate Limit triggered, delaying '{0}' for {1:0.000} sec", key, delay.TotalSeconds); + System.Threading.Thread.Sleep(delay); + } + } + + public async Task WaitAndPulseAsync(string key, string subKey, TimeSpan interval) + { + var delay = GetDelay(key, subKey, interval); + + if (delay.TotalSeconds > 0.0) + { + _logger.Trace("Rate Limit triggered, delaying '{0}' for {1:0.000} sec", key, delay.TotalSeconds); + await Task.Delay(delay); + } + } + + private TimeSpan GetDelay(string key, string subKey, TimeSpan interval) { var waitUntil = DateTime.UtcNow.Add(interval); @@ -59,13 +89,7 @@ namespace NzbDrone.Common.TPL waitUntil -= interval; - var delay = waitUntil - DateTime.UtcNow; - - if (delay.TotalSeconds > 0.0) - { - _logger.Trace("Rate Limit triggered, delaying '{0}' for {1:0.000} sec", key, delay.TotalSeconds); - System.Threading.Thread.Sleep(delay); - } + return waitUntil - DateTime.UtcNow; } } } diff --git a/src/NzbDrone.Core.Test/Download/DownloadApprovedReportsTests/DownloadApprovedFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadApprovedReportsTests/DownloadApprovedFixture.cs index 06ccb84d1..b158fda2e 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadApprovedReportsTests/DownloadApprovedFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadApprovedReportsTests/DownloadApprovedFixture.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Threading.Tasks; using FizzWare.NBuilder; using FluentAssertions; using Moq; @@ -59,7 +60,7 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests } [Test] - public void should_download_report_if_episode_was_not_already_downloaded() + public async Task should_download_report_if_episode_was_not_already_downloaded() { var episodes = new List { GetEpisode(1) }; var remoteEpisode = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p)); @@ -67,12 +68,12 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests var decisions = new List(); decisions.Add(new DownloadDecision(remoteEpisode)); - Subject.ProcessDecisions(decisions); + await Subject.ProcessDecisions(decisions); Mocker.GetMock().Verify(v => v.DownloadReport(It.IsAny(), null), Times.Once()); } [Test] - public void should_only_download_episode_once() + public async Task should_only_download_episode_once() { var episodes = new List { GetEpisode(1) }; var remoteEpisode = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p)); @@ -81,12 +82,12 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests decisions.Add(new DownloadDecision(remoteEpisode)); decisions.Add(new DownloadDecision(remoteEpisode)); - Subject.ProcessDecisions(decisions); + await Subject.ProcessDecisions(decisions); Mocker.GetMock().Verify(v => v.DownloadReport(It.IsAny(), null), Times.Once()); } [Test] - public void should_not_download_if_any_episode_was_already_downloaded() + public async Task should_not_download_if_any_episode_was_already_downloaded() { var remoteEpisode1 = GetRemoteEpisode( new List { GetEpisode(1) }, @@ -100,12 +101,12 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests decisions.Add(new DownloadDecision(remoteEpisode1)); decisions.Add(new DownloadDecision(remoteEpisode2)); - Subject.ProcessDecisions(decisions); + await Subject.ProcessDecisions(decisions); Mocker.GetMock().Verify(v => v.DownloadReport(It.IsAny(), null), Times.Once()); } [Test] - public void should_return_downloaded_reports() + public async Task should_return_downloaded_reports() { var episodes = new List { GetEpisode(1) }; var remoteEpisode = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p)); @@ -113,11 +114,13 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests var decisions = new List(); decisions.Add(new DownloadDecision(remoteEpisode)); - Subject.ProcessDecisions(decisions).Grabbed.Should().HaveCount(1); + var result = await Subject.ProcessDecisions(decisions); + + result.Grabbed.Should().HaveCount(1); } [Test] - public void should_return_all_downloaded_reports() + public async Task should_return_all_downloaded_reports() { var remoteEpisode1 = GetRemoteEpisode( new List { GetEpisode(1) }, @@ -131,11 +134,13 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests decisions.Add(new DownloadDecision(remoteEpisode1)); decisions.Add(new DownloadDecision(remoteEpisode2)); - Subject.ProcessDecisions(decisions).Grabbed.Should().HaveCount(2); + var result = await Subject.ProcessDecisions(decisions); + + result.Grabbed.Should().HaveCount(2); } [Test] - public void should_only_return_downloaded_reports() + public async Task should_only_return_downloaded_reports() { var remoteEpisode1 = GetRemoteEpisode( new List { GetEpisode(1) }, @@ -154,11 +159,13 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests decisions.Add(new DownloadDecision(remoteEpisode2)); decisions.Add(new DownloadDecision(remoteEpisode3)); - Subject.ProcessDecisions(decisions).Grabbed.Should().HaveCount(2); + var result = await Subject.ProcessDecisions(decisions); + + result.Grabbed.Should().HaveCount(2); } [Test] - public void should_not_add_to_downloaded_list_when_download_fails() + public async Task should_not_add_to_downloaded_list_when_download_fails() { var episodes = new List { GetEpisode(1) }; var remoteEpisode = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p)); @@ -167,7 +174,11 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests decisions.Add(new DownloadDecision(remoteEpisode)); Mocker.GetMock().Setup(s => s.DownloadReport(It.IsAny(), null)).Throws(new Exception()); - Subject.ProcessDecisions(decisions).Grabbed.Should().BeEmpty(); + + var result = await Subject.ProcessDecisions(decisions); + + result.Grabbed.Should().BeEmpty(); + ExceptionVerification.ExpectedWarns(1); } @@ -182,7 +193,7 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests } [Test] - public void should_not_grab_if_pending() + public async Task should_not_grab_if_pending() { var episodes = new List { GetEpisode(1) }; var remoteEpisode = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p)); @@ -190,12 +201,12 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests var decisions = new List(); decisions.Add(new DownloadDecision(remoteEpisode, new Rejection("Failure!", RejectionType.Temporary))); - Subject.ProcessDecisions(decisions); + await Subject.ProcessDecisions(decisions); Mocker.GetMock().Verify(v => v.DownloadReport(It.IsAny(), null), Times.Never()); } [Test] - public void should_not_add_to_pending_if_episode_was_grabbed() + public async Task should_not_add_to_pending_if_episode_was_grabbed() { var episodes = new List { GetEpisode(1) }; var remoteEpisode = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p)); @@ -204,12 +215,12 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests decisions.Add(new DownloadDecision(remoteEpisode)); decisions.Add(new DownloadDecision(remoteEpisode, new Rejection("Failure!", RejectionType.Temporary))); - Subject.ProcessDecisions(decisions); + await Subject.ProcessDecisions(decisions); Mocker.GetMock().Verify(v => v.AddMany(It.IsAny>>()), Times.Never()); } [Test] - public void should_add_to_pending_even_if_already_added_to_pending() + public async Task should_add_to_pending_even_if_already_added_to_pending() { var episodes = new List { GetEpisode(1) }; var remoteEpisode = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p)); @@ -218,12 +229,12 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests decisions.Add(new DownloadDecision(remoteEpisode, new Rejection("Failure!", RejectionType.Temporary))); decisions.Add(new DownloadDecision(remoteEpisode, new Rejection("Failure!", RejectionType.Temporary))); - Subject.ProcessDecisions(decisions); + await Subject.ProcessDecisions(decisions); Mocker.GetMock().Verify(v => v.AddMany(It.IsAny>>()), Times.Once()); } [Test] - public void should_add_to_failed_if_already_failed_for_that_protocol() + public async Task should_add_to_failed_if_already_failed_for_that_protocol() { var episodes = new List { GetEpisode(1) }; var remoteEpisode = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p)); @@ -235,12 +246,12 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests Mocker.GetMock().Setup(s => s.DownloadReport(It.IsAny(), null)) .Throws(new DownloadClientUnavailableException("Download client failed")); - Subject.ProcessDecisions(decisions); + await Subject.ProcessDecisions(decisions); Mocker.GetMock().Verify(v => v.DownloadReport(It.IsAny(), null), Times.Once()); } [Test] - public void should_not_add_to_failed_if_failed_for_a_different_protocol() + public async Task should_not_add_to_failed_if_failed_for_a_different_protocol() { var episodes = new List { GetEpisode(1) }; var remoteEpisode = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p), DownloadProtocol.Usenet); @@ -253,13 +264,13 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests Mocker.GetMock().Setup(s => s.DownloadReport(It.Is(r => r.Release.DownloadProtocol == DownloadProtocol.Usenet), null)) .Throws(new DownloadClientUnavailableException("Download client failed")); - Subject.ProcessDecisions(decisions); + await Subject.ProcessDecisions(decisions); Mocker.GetMock().Verify(v => v.DownloadReport(It.Is(r => r.Release.DownloadProtocol == DownloadProtocol.Usenet), null), Times.Once()); Mocker.GetMock().Verify(v => v.DownloadReport(It.Is(r => r.Release.DownloadProtocol == DownloadProtocol.Torrent), null), Times.Once()); } [Test] - public void should_add_to_rejected_if_release_unavailable_on_indexer() + public async Task should_add_to_rejected_if_release_unavailable_on_indexer() { var episodes = new List { GetEpisode(1) }; var remoteEpisode = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p)); @@ -271,7 +282,7 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests .Setup(s => s.DownloadReport(It.IsAny(), null)) .Throws(new ReleaseUnavailableException(remoteEpisode.Release, "That 404 Error is not just a Quirk")); - var result = Subject.ProcessDecisions(decisions); + var result = await Subject.ProcessDecisions(decisions); result.Grabbed.Should().BeEmpty(); result.Rejected.Should().NotBeEmpty(); diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/TorrentBlackholeFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/TorrentBlackholeFixture.cs index 3f9ca1f70..a5642ed29 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/TorrentBlackholeFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/TorrentBlackholeFixture.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; +using System.Threading.Tasks; using FizzWare.NBuilder; using FluentAssertions; using Moq; @@ -65,7 +66,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole protected void GivenFailedDownload() { Mocker.GetMock() - .Setup(s => s.Get(It.IsAny())) + .Setup(s => s.GetAsync(It.IsAny())) .Throws(new WebException()); } @@ -143,19 +144,19 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole } [Test] - public void Download_should_download_file_if_it_doesnt_exist() + public async Task Download_should_download_file_if_it_doesnt_exist() { var remoteEpisode = CreateRemoteEpisode(); - Subject.Download(remoteEpisode, CreateIndexer()); + await Subject.Download(remoteEpisode, CreateIndexer()); - Mocker.GetMock().Verify(c => c.Get(It.Is(v => v.Url.FullUri == _downloadUrl)), Times.Once()); + Mocker.GetMock().Verify(c => c.GetAsync(It.Is(v => v.Url.FullUri == _downloadUrl)), Times.Once()); Mocker.GetMock().Verify(c => c.OpenWriteStream(_filePath), Times.Once()); - Mocker.GetMock().Verify(c => c.DownloadFile(It.IsAny(), It.IsAny()), Times.Never()); + Mocker.GetMock().Verify(c => c.DownloadFileAsync(It.IsAny(), It.IsAny()), Times.Never()); } [Test] - public void Download_should_save_magnet_if_enabled() + public async Task Download_should_save_magnet_if_enabled() { GivenMagnetFilePath(); Subject.Definition.Settings.As().SaveMagnetFiles = true; @@ -163,16 +164,16 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole var remoteEpisode = CreateRemoteEpisode(); remoteEpisode.Release.DownloadUrl = null; - Subject.Download(remoteEpisode, CreateIndexer()); + await Subject.Download(remoteEpisode, CreateIndexer()); - Mocker.GetMock().Verify(c => c.Get(It.Is(v => v.Url.FullUri == _downloadUrl)), Times.Never()); + Mocker.GetMock().Verify(c => c.GetAsync(It.Is(v => v.Url.FullUri == _downloadUrl)), Times.Never()); Mocker.GetMock().Verify(c => c.OpenWriteStream(_filePath), Times.Never()); Mocker.GetMock().Verify(c => c.OpenWriteStream(_magnetFilePath), Times.Once()); - Mocker.GetMock().Verify(c => c.DownloadFile(It.IsAny(), It.IsAny()), Times.Never()); + Mocker.GetMock().Verify(c => c.DownloadFileAsync(It.IsAny(), It.IsAny()), Times.Never()); } [Test] - public void Download_should_save_magnet_using_specified_extension() + public async Task Download_should_save_magnet_using_specified_extension() { var magnetFileExtension = ".url"; GivenMagnetFilePath(magnetFileExtension); @@ -182,12 +183,12 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole var remoteEpisode = CreateRemoteEpisode(); remoteEpisode.Release.DownloadUrl = null; - Subject.Download(remoteEpisode, CreateIndexer()); + await Subject.Download(remoteEpisode, CreateIndexer()); - Mocker.GetMock().Verify(c => c.Get(It.Is(v => v.Url.FullUri == _downloadUrl)), Times.Never()); + Mocker.GetMock().Verify(c => c.GetAsync(It.Is(v => v.Url.FullUri == _downloadUrl)), Times.Never()); Mocker.GetMock().Verify(c => c.OpenWriteStream(_filePath), Times.Never()); Mocker.GetMock().Verify(c => c.OpenWriteStream(_magnetFilePath), Times.Once()); - Mocker.GetMock().Verify(c => c.DownloadFile(It.IsAny(), It.IsAny()), Times.Never()); + Mocker.GetMock().Verify(c => c.DownloadFileAsync(It.IsAny(), It.IsAny()), Times.Never()); } [Test] @@ -197,31 +198,31 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole var remoteEpisode = CreateRemoteEpisode(); remoteEpisode.Release.DownloadUrl = null; - Assert.Throws(() => Subject.Download(remoteEpisode, CreateIndexer())); + Assert.ThrowsAsync(async () => await Subject.Download(remoteEpisode, CreateIndexer())); - Mocker.GetMock().Verify(c => c.Get(It.Is(v => v.Url.FullUri == _downloadUrl)), Times.Never()); + Mocker.GetMock().Verify(c => c.GetAsync(It.Is(v => v.Url.FullUri == _downloadUrl)), Times.Never()); Mocker.GetMock().Verify(c => c.OpenWriteStream(_filePath), Times.Never()); Mocker.GetMock().Verify(c => c.OpenWriteStream(_magnetFilePath), Times.Never()); - Mocker.GetMock().Verify(c => c.DownloadFile(It.IsAny(), It.IsAny()), Times.Never()); + Mocker.GetMock().Verify(c => c.DownloadFileAsync(It.IsAny(), It.IsAny()), Times.Never()); } [Test] - public void Download_should_prefer_torrent_over_magnet() + public async Task Download_should_prefer_torrent_over_magnet() { Subject.Definition.Settings.As().SaveMagnetFiles = true; var remoteEpisode = CreateRemoteEpisode(); - Subject.Download(remoteEpisode, CreateIndexer()); + await Subject.Download(remoteEpisode, CreateIndexer()); - Mocker.GetMock().Verify(c => c.Get(It.Is(v => v.Url.FullUri == _downloadUrl)), Times.Once()); + Mocker.GetMock().Verify(c => c.GetAsync(It.Is(v => v.Url.FullUri == _downloadUrl)), Times.Once()); Mocker.GetMock().Verify(c => c.OpenWriteStream(_filePath), Times.Once()); Mocker.GetMock().Verify(c => c.OpenWriteStream(_magnetFilePath), Times.Never()); - Mocker.GetMock().Verify(c => c.DownloadFile(It.IsAny(), It.IsAny()), Times.Never()); + Mocker.GetMock().Verify(c => c.DownloadFileAsync(It.IsAny(), It.IsAny()), Times.Never()); } [Test] - public void Download_should_replace_illegal_characters_in_title() + public async Task Download_should_replace_illegal_characters_in_title() { var illegalTitle = "Saturday Night Live - S38E08 - Jeremy Renner/Maroon 5 [SDTV]"; var expectedFilename = Path.Combine(_blackholeFolder, "Saturday Night Live - S38E08 - Jeremy Renner+Maroon 5 [SDTV]" + Path.GetExtension(_filePath)); @@ -229,11 +230,11 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole var remoteEpisode = CreateRemoteEpisode(); remoteEpisode.Release.Title = illegalTitle; - Subject.Download(remoteEpisode, CreateIndexer()); + await Subject.Download(remoteEpisode, CreateIndexer()); - Mocker.GetMock().Verify(c => c.Get(It.Is(v => v.Url.FullUri == _downloadUrl)), Times.Once()); + Mocker.GetMock().Verify(c => c.GetAsync(It.Is(v => v.Url.FullUri == _downloadUrl)), Times.Once()); Mocker.GetMock().Verify(c => c.OpenWriteStream(expectedFilename), Times.Once()); - Mocker.GetMock().Verify(c => c.DownloadFile(It.IsAny(), It.IsAny()), Times.Never()); + Mocker.GetMock().Verify(c => c.DownloadFileAsync(It.IsAny(), It.IsAny()), Times.Never()); } [Test] @@ -242,7 +243,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole var remoteEpisode = CreateRemoteEpisode(); remoteEpisode.Release.DownloadUrl = null; - Assert.Throws(() => Subject.Download(remoteEpisode, CreateIndexer())); + Assert.ThrowsAsync(async () => await Subject.Download(remoteEpisode, CreateIndexer())); } [Test] @@ -312,11 +313,13 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole } [Test] - public void should_return_null_hash() + public async Task should_return_null_hash() { var remoteEpisode = CreateRemoteEpisode(); - Subject.Download(remoteEpisode, CreateIndexer()).Should().BeNull(); + var result = await Subject.Download(remoteEpisode, CreateIndexer()); + + result.Should().BeNull(); } } } diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/UsenetBlackholeFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/UsenetBlackholeFixture.cs index 3d21af2ba..381798211 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/UsenetBlackholeFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/UsenetBlackholeFixture.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; +using System.Threading.Tasks; using FizzWare.NBuilder; using FluentAssertions; using Moq; @@ -115,19 +116,19 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole } [Test] - public void Download_should_download_file_if_it_doesnt_exist() + public async Task Download_should_download_file_if_it_doesnt_exist() { var remoteEpisode = CreateRemoteEpisode(); - Subject.Download(remoteEpisode, CreateIndexer()); + await Subject.Download(remoteEpisode, CreateIndexer()); - Mocker.GetMock().Verify(c => c.Get(It.Is(v => v.Url.FullUri == _downloadUrl)), Times.Once()); + Mocker.GetMock().Verify(c => c.GetAsync(It.Is(v => v.Url.FullUri == _downloadUrl)), Times.Once()); Mocker.GetMock().Verify(c => c.OpenWriteStream(_filePath), Times.Once()); - Mocker.GetMock().Verify(c => c.DownloadFile(It.IsAny(), It.IsAny()), Times.Never()); + Mocker.GetMock().Verify(c => c.DownloadFileAsync(It.IsAny(), It.IsAny()), Times.Never()); } [Test] - public void Download_should_replace_illegal_characters_in_title() + public async Task Download_should_replace_illegal_characters_in_title() { var illegalTitle = "Saturday Night Live - S38E08 - Jeremy Renner/Maroon 5 [SDTV]"; var expectedFilename = Path.Combine(_blackholeFolder, "Saturday Night Live - S38E08 - Jeremy Renner+Maroon 5 [SDTV]" + Path.GetExtension(_filePath)); @@ -135,11 +136,11 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole var remoteEpisode = CreateRemoteEpisode(); remoteEpisode.Release.Title = illegalTitle; - Subject.Download(remoteEpisode, CreateIndexer()); + await Subject.Download(remoteEpisode, CreateIndexer()); - Mocker.GetMock().Verify(c => c.Get(It.Is(v => v.Url.FullUri == _downloadUrl)), Times.Once()); + Mocker.GetMock().Verify(c => c.GetAsync(It.Is(v => v.Url.FullUri == _downloadUrl)), Times.Once()); Mocker.GetMock().Verify(c => c.OpenWriteStream(expectedFilename), Times.Once()); - Mocker.GetMock().Verify(c => c.DownloadFile(It.IsAny(), It.IsAny()), Times.Never()); + Mocker.GetMock().Verify(c => c.DownloadFileAsync(It.IsAny(), It.IsAny()), Times.Never()); } [Test] diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/DelugeTests/DelugeFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/DelugeTests/DelugeFixture.cs index 8998619c4..c07a72966 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/DelugeTests/DelugeFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/DelugeTests/DelugeFixture.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using FluentAssertions; using Moq; using NUnit.Framework; @@ -200,26 +201,26 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.DelugeTests } [Test] - public void Download_should_return_unique_id() + public async Task Download_should_return_unique_id() { GivenSuccessfulDownload(); var remoteEpisode = CreateRemoteEpisode(); - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().NotBeNullOrEmpty(); } [TestCase("magnet:?xt=urn:btih:ZPBPA2P6ROZPKRHK44D5OW6NHXU5Z6KR&tr=udp", "CBC2F069FE8BB2F544EAE707D75BCD3DE9DCF951")] - public void Download_should_get_hash_from_magnet_url(string magnetUrl, string expectedHash) + public async Task Download_should_get_hash_from_magnet_url(string magnetUrl, string expectedHash) { GivenSuccessfulDownload(); var remoteEpisode = CreateRemoteEpisode(); remoteEpisode.Release.DownloadUrl = magnetUrl; - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().Be(expectedHash); } diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/DownloadClientFixtureBase.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/DownloadClientFixtureBase.cs index 64b999f30..32e4a6335 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/DownloadClientFixtureBase.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/DownloadClientFixtureBase.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Threading.Tasks; using FluentAssertions; using Moq; using NLog; @@ -37,8 +38,8 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests .Returns(() => CreateRemoteEpisode()); Mocker.GetMock() - .Setup(s => s.Get(It.IsAny())) - .Returns(r => new HttpResponse(r, new HttpHeader(), Array.Empty())); + .Setup(s => s.GetAsync(It.IsAny())) + .Returns(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), Array.Empty()))); Mocker.GetMock() .Setup(v => v.RemapRemoteToLocal(It.IsAny(), It.IsAny())) diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/DownloadStationTests/TorrentDownloadStationFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/DownloadStationTests/TorrentDownloadStationFixture.cs index 47fee72f5..6bb303203 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/DownloadStationTests/TorrentDownloadStationFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/DownloadStationTests/TorrentDownloadStationFixture.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using FluentAssertions; using Moq; using NUnit.Framework; @@ -373,7 +374,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.DownloadStationTests } [Test] - public void Download_with_TvDirectory_should_force_directory() + public async Task Download_with_TvDirectory_should_force_directory() { GivenSerialNumber(); GivenTvDirectory(); @@ -381,7 +382,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.DownloadStationTests var remoteEpisode = CreateRemoteEpisode(); - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().NotBeNullOrEmpty(); @@ -390,7 +391,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.DownloadStationTests } [Test] - public void Download_with_category_should_force_directory() + public async Task Download_with_category_should_force_directory() { GivenSerialNumber(); GivenTvCategory(); @@ -398,7 +399,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.DownloadStationTests var remoteEpisode = CreateRemoteEpisode(); - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().NotBeNullOrEmpty(); @@ -407,14 +408,14 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.DownloadStationTests } [Test] - public void Download_without_TvDirectory_and_Category_should_use_default() + public async Task Download_without_TvDirectory_and_Category_should_use_default() { GivenSerialNumber(); GivenSuccessfulDownload(); var remoteEpisode = CreateRemoteEpisode(); - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().NotBeNullOrEmpty(); @@ -493,7 +494,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.DownloadStationTests .Setup(s => s.GetSerialNumber(_settings)) .Throws(new ApplicationException("Some unknown exception, HttpException or DownloadClientException")); - Assert.Throws(Is.InstanceOf(), () => Subject.Download(remoteEpisode, CreateIndexer())); + Assert.ThrowsAsync(Is.InstanceOf(), async () => await Subject.Download(remoteEpisode, CreateIndexer())); Mocker.GetMock() .Verify(v => v.AddTaskFromUrl(It.IsAny(), null, _settings), Times.Never()); diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/DownloadStationTests/UsenetDownloadStationFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/DownloadStationTests/UsenetDownloadStationFixture.cs index c60a47f5d..b8fa924e9 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/DownloadStationTests/UsenetDownloadStationFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/DownloadStationTests/UsenetDownloadStationFixture.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using FluentAssertions; using Moq; using NUnit.Framework; @@ -250,7 +251,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.DownloadStationTests } [Test] - public void Download_with_TvDirectory_should_force_directory() + public async Task Download_with_TvDirectory_should_force_directory() { GivenSerialNumber(); GivenTvDirectory(); @@ -258,7 +259,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.DownloadStationTests var remoteEpisode = CreateRemoteEpisode(); - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().NotBeNullOrEmpty(); @@ -267,7 +268,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.DownloadStationTests } [Test] - public void Download_with_category_should_force_directory() + public async Task Download_with_category_should_force_directory() { GivenSerialNumber(); GivenTvCategory(); @@ -275,7 +276,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.DownloadStationTests var remoteEpisode = CreateRemoteEpisode(); - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().NotBeNullOrEmpty(); @@ -284,14 +285,14 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.DownloadStationTests } [Test] - public void Download_without_TvDirectory_and_Category_should_use_default() + public async Task Download_without_TvDirectory_and_Category_should_use_default() { GivenSerialNumber(); GivenSuccessfulDownload(); var remoteEpisode = CreateRemoteEpisode(); - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().NotBeNullOrEmpty(); @@ -370,7 +371,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.DownloadStationTests .Setup(s => s.GetSerialNumber(_settings)) .Throws(new ApplicationException("Some unknown exception, HttpException or DownloadClientException")); - Assert.Throws(Is.InstanceOf(), () => Subject.Download(remoteEpisode, CreateIndexer())); + Assert.ThrowsAsync(Is.InstanceOf(), async () => await Subject.Download(remoteEpisode, CreateIndexer())); Mocker.GetMock() .Verify(v => v.AddTaskFromUrl(It.IsAny(), null, _settings), Times.Never()); diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/FreeboxDownloadTests/TorrentFreeboxDownloadFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/FreeboxDownloadTests/TorrentFreeboxDownloadFixture.cs index 310f80f0b..c59c02b1b 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/FreeboxDownloadTests/TorrentFreeboxDownloadFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/FreeboxDownloadTests/TorrentFreeboxDownloadFixture.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using FluentAssertions; using Moq; using NUnit.Framework; @@ -146,21 +147,21 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.FreeboxDownloadTests } [Test] - public void Download_with_DestinationDirectory_should_force_directory() + public async Task Download_with_DestinationDirectory_should_force_directory() { GivenDestinationDirectory(); GivenSuccessfulDownload(); var remoteEpisode = CreateRemoteEpisode(); - Subject.Download(remoteEpisode, CreateIndexer()); + await Subject.Download(remoteEpisode, CreateIndexer()); Mocker.GetMock() .Verify(v => v.AddTaskFromUrl(It.IsAny(), _encodedDestinationDirectory, It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Once()); } [Test] - public void Download_with_Category_should_force_directory() + public async Task Download_with_Category_should_force_directory() { GivenDownloadConfiguration(); GivenCategory(); @@ -168,21 +169,21 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.FreeboxDownloadTests var remoteEpisode = CreateRemoteEpisode(); - Subject.Download(remoteEpisode, CreateIndexer()); + await Subject.Download(remoteEpisode, CreateIndexer()); Mocker.GetMock() .Verify(v => v.AddTaskFromUrl(It.IsAny(), _encodedDefaultDestinationAndCategory, It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Once()); } [Test] - public void Download_without_DestinationDirectory_and_Category_should_use_default() + public async Task Download_without_DestinationDirectory_and_Category_should_use_default() { GivenDownloadConfiguration(); GivenSuccessfulDownload(); var remoteEpisode = CreateRemoteEpisode(); - Subject.Download(remoteEpisode, CreateIndexer()); + await Subject.Download(remoteEpisode, CreateIndexer()); Mocker.GetMock() .Verify(v => v.AddTaskFromUrl(It.IsAny(), _encodedDefaultDestination, It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Once()); @@ -190,7 +191,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.FreeboxDownloadTests [TestCase(false, false)] [TestCase(true, true)] - public void Download_should_pause_torrent_as_expected(bool addPausedSetting, bool toBePausedFlag) + public async Task Download_should_pause_torrent_as_expected(bool addPausedSetting, bool toBePausedFlag) { _settings.AddPaused = addPausedSetting; @@ -199,7 +200,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.FreeboxDownloadTests var remoteEpisode = CreateRemoteEpisode(); - Subject.Download(remoteEpisode, CreateIndexer()); + await Subject.Download(remoteEpisode, CreateIndexer()); Mocker.GetMock() .Verify(v => v.AddTaskFromUrl(It.IsAny(), It.IsAny(), toBePausedFlag, It.IsAny(), It.IsAny(), It.IsAny()), Times.Once()); @@ -213,7 +214,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.FreeboxDownloadTests [TestCase(15, (int)FreeboxDownloadPriority.Last, (int)FreeboxDownloadPriority.First, false)] [TestCase(15, (int)FreeboxDownloadPriority.First, (int)FreeboxDownloadPriority.Last, true)] [TestCase(15, (int)FreeboxDownloadPriority.Last, (int)FreeboxDownloadPriority.Last, false)] - public void Download_should_queue_torrent_first_as_expected(int ageDay, int olderPriority, int recentPriority, bool toBeQueuedFirstFlag) + public async Task Download_should_queue_torrent_first_as_expected(int ageDay, int olderPriority, int recentPriority, bool toBeQueuedFirstFlag) { _settings.OlderPriority = olderPriority; _settings.RecentPriority = recentPriority; @@ -230,7 +231,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.FreeboxDownloadTests remoteEpisode.Episodes.Add(episode); - Subject.Download(remoteEpisode, CreateIndexer()); + await Subject.Download(remoteEpisode, CreateIndexer()); Mocker.GetMock() .Verify(v => v.AddTaskFromUrl(It.IsAny(), It.IsAny(), It.IsAny(), toBeQueuedFirstFlag, It.IsAny(), It.IsAny()), Times.Once()); @@ -238,7 +239,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.FreeboxDownloadTests [TestCase(0, 0)] [TestCase(1.5, 150)] - public void Download_should_define_seed_ratio_as_expected(double? providerSeedRatio, double? expectedSeedRatio) + public async Task Download_should_define_seed_ratio_as_expected(double? providerSeedRatio, double? expectedSeedRatio) { GivenDownloadConfiguration(); GivenSuccessfulDownload(); @@ -248,7 +249,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.FreeboxDownloadTests remoteEpisode.SeedConfiguration = new TorrentSeedConfiguration(); remoteEpisode.SeedConfiguration.Ratio = providerSeedRatio; - Subject.Download(remoteEpisode, CreateIndexer()); + await Subject.Download(remoteEpisode, CreateIndexer()); Mocker.GetMock() .Verify(v => v.AddTaskFromUrl(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), expectedSeedRatio, It.IsAny()), Times.Once()); diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/HadoukenTests/HadoukenFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/HadoukenTests/HadoukenFixture.cs index dbe80b3ff..9cc35560f 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/HadoukenTests/HadoukenFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/HadoukenTests/HadoukenFixture.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using FluentAssertions; using Moq; using NUnit.Framework; @@ -103,8 +104,8 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.HadoukenTests protected void GivenSuccessfulDownload() { Mocker.GetMock() - .Setup(s => s.Get(It.IsAny())) - .Returns(r => new HttpResponse(r, new HttpHeader(), new byte[1000])); + .Setup(s => s.GetAsync(It.IsAny())) + .Returns(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), new byte[1000]))); Mocker.GetMock() .Setup(s => s.AddTorrentUri(It.IsAny(), It.IsAny())) @@ -196,13 +197,13 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.HadoukenTests } [Test] - public void Download_should_return_unique_id() + public async Task Download_should_return_unique_id() { GivenSuccessfulDownload(); var remoteEpisode = CreateRemoteEpisode(); - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().NotBeNullOrEmpty(); } @@ -277,7 +278,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.HadoukenTests } [Test] - public void Download_from_magnet_link_should_return_hash_uppercase() + public async Task Download_from_magnet_link_should_return_hash_uppercase() { var remoteEpisode = CreateRemoteEpisode(); @@ -286,13 +287,13 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.HadoukenTests Mocker.GetMock() .Setup(v => v.AddTorrentUri(It.IsAny(), It.IsAny())); - var result = Subject.Download(remoteEpisode, CreateIndexer()); + var result = await Subject.Download(remoteEpisode, CreateIndexer()); Assert.IsFalse(result.Any(c => char.IsLower(c))); } [Test] - public void Download_from_torrent_file_should_return_hash_uppercase() + public async Task Download_from_torrent_file_should_return_hash_uppercase() { var remoteEpisode = CreateRemoteEpisode(); @@ -300,7 +301,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.HadoukenTests .Setup(v => v.AddTorrentFile(It.IsAny(), It.IsAny())) .Returns("hash"); - var result = Subject.Download(remoteEpisode, CreateIndexer()); + var result = await Subject.Download(remoteEpisode, CreateIndexer()); Assert.IsFalse(result.Any(c => char.IsLower(c))); } diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/NzbVortexTests/NzbVortexFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/NzbVortexTests/NzbVortexFixture.cs index 70b2cb784..1aee0559f 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/NzbVortexTests/NzbVortexFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/NzbVortexTests/NzbVortexFixture.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using FluentAssertions; using Moq; using NUnit.Framework; @@ -200,13 +201,13 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.NzbVortexTests } [Test] - public void Download_should_return_unique_id() + public async Task Download_should_return_unique_id() { GivenSuccessfulDownload(); var remoteEpisode = CreateRemoteEpisode(); - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().NotBeNullOrEmpty(); } @@ -218,7 +219,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.NzbVortexTests var remoteEpisode = CreateRemoteEpisode(); - Assert.Throws(() => Subject.Download(remoteEpisode, CreateIndexer())); + Assert.ThrowsAsync(async () => await Subject.Download(remoteEpisode, CreateIndexer())); } [Test] diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/NzbgetTests/NzbgetFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/NzbgetTests/NzbgetFixture.cs index cb086a27e..8091cd8d5 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/NzbgetTests/NzbgetFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/NzbgetTests/NzbgetFixture.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using FizzWare.NBuilder; using FluentAssertions; using Moq; @@ -340,13 +341,13 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.NzbgetTests } [Test] - public void Download_should_return_unique_id() + public async Task Download_should_return_unique_id() { GivenSuccessfulDownload(); var remoteEpisode = CreateRemoteEpisode(); - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().NotBeNullOrEmpty(); } @@ -358,7 +359,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.NzbgetTests var remoteEpisode = CreateRemoteEpisode(); - Assert.Throws(() => Subject.Download(remoteEpisode, CreateIndexer())); + Assert.ThrowsAsync(async () => await Subject.Download(remoteEpisode, CreateIndexer())); } [Test] diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/PneumaticProviderFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/PneumaticProviderFixture.cs index fd5853f76..d2d206bd6 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/PneumaticProviderFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/PneumaticProviderFixture.cs @@ -1,6 +1,7 @@ using System; using System.IO; using System.Net; +using System.Threading.Tasks; using FizzWare.NBuilder; using Moq; using NLog; @@ -66,15 +67,15 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests private void WithFailedDownload() { - Mocker.GetMock().Setup(c => c.DownloadFile(It.IsAny(), It.IsAny())).Throws(new WebException()); + Mocker.GetMock().Setup(c => c.DownloadFileAsync(It.IsAny(), It.IsAny())).Throws(new WebException()); } [Test] - public void should_download_file_if_it_doesnt_exist() + public async Task should_download_file_if_it_doesnt_exist() { - Subject.Download(_remoteEpisode, _indexer); + await Subject.Download(_remoteEpisode, _indexer); - Mocker.GetMock().Verify(c => c.DownloadFile(_nzbUrl, _nzbPath), Times.Once()); + Mocker.GetMock().Verify(c => c.DownloadFileAsync(_nzbUrl, _nzbPath), Times.Once()); } [Test] @@ -82,7 +83,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests { WithFailedDownload(); - Assert.Throws(() => Subject.Download(_remoteEpisode, _indexer)); + Assert.ThrowsAsync(async () => await Subject.Download(_remoteEpisode, _indexer)); } [Test] @@ -91,7 +92,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests _remoteEpisode.Release.Title = "30 Rock - Season 1"; _remoteEpisode.ParsedEpisodeInfo.FullSeason = true; - Assert.Throws(() => Subject.Download(_remoteEpisode, _indexer)); + Assert.ThrowsAsync(async () => await Subject.Download(_remoteEpisode, _indexer)); } [Test] @@ -101,15 +102,15 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests } [Test] - public void should_replace_illegal_characters_in_title() + public async Task should_replace_illegal_characters_in_title() { var illegalTitle = "Saturday Night Live - S38E08 - Jeremy Renner/Maroon 5 [SDTV]"; var expectedFilename = Path.Combine(_pneumaticFolder, "Saturday Night Live - S38E08 - Jeremy Renner+Maroon 5 [SDTV].nzb"); _remoteEpisode.Release.Title = illegalTitle; - Subject.Download(_remoteEpisode, _indexer); + await Subject.Download(_remoteEpisode, _indexer); - Mocker.GetMock().Verify(c => c.DownloadFile(It.IsAny(), expectedFilename), Times.Once()); + Mocker.GetMock().Verify(c => c.DownloadFileAsync(It.IsAny(), expectedFilename), Times.Once()); } } } diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/QBittorrentTests/QBittorrentFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/QBittorrentTests/QBittorrentFixture.cs index 4d4ef2399..ac701268b 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/QBittorrentTests/QBittorrentFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/QBittorrentTests/QBittorrentFixture.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Threading.Tasks; using FluentAssertions; using Moq; using NUnit.Framework; @@ -449,26 +450,26 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests } [Test] - public void Download_should_return_unique_id() + public async Task Download_should_return_unique_id() { GivenSuccessfulDownload(); var remoteEpisode = CreateRemoteEpisode(); - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().NotBeNullOrEmpty(); } [TestCase("magnet:?xt=urn:btih:ZPBPA2P6ROZPKRHK44D5OW6NHXU5Z6KR&tr=udp", "CBC2F069FE8BB2F544EAE707D75BCD3DE9DCF951")] - public void Download_should_get_hash_from_magnet_url(string magnetUrl, string expectedHash) + public async Task Download_should_get_hash_from_magnet_url(string magnetUrl, string expectedHash) { GivenSuccessfulDownload(); var remoteEpisode = CreateRemoteEpisode(); remoteEpisode.Release.DownloadUrl = magnetUrl; - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().Be(expectedHash); } @@ -483,7 +484,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests var remoteEpisode = CreateRemoteEpisode(); remoteEpisode.Release.DownloadUrl = "magnet:?xt=urn:btih:ZPBPA2P6ROZPKRHK44D5OW6NHXU5Z6KR"; - Assert.Throws(() => Subject.Download(remoteEpisode, CreateIndexer())); + Assert.ThrowsAsync(async () => await Subject.Download(remoteEpisode, CreateIndexer())); } [Test] @@ -496,28 +497,28 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests var remoteEpisode = CreateRemoteEpisode(); remoteEpisode.Release.DownloadUrl = "magnet:?xt=urn:btih:ZPBPA2P6ROZPKRHK44D5OW6NHXU5Z6KR&tr=udp://abc"; - Assert.DoesNotThrow(() => Subject.Download(remoteEpisode, CreateIndexer())); + Assert.DoesNotThrowAsync(async () => await Subject.Download(remoteEpisode, CreateIndexer())); Mocker.GetMock() .Verify(s => s.AddTorrentFromUrl(It.IsAny(), It.IsAny(), It.IsAny()), Times.Once()); } [Test] - public void Download_should_set_top_priority() + public async Task Download_should_set_top_priority() { GivenHighPriority(); GivenSuccessfulDownload(); var remoteEpisode = CreateRemoteEpisode(); - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); Mocker.GetMock() .Verify(v => v.MoveTorrentToTopInQueue(It.IsAny(), It.IsAny()), Times.Once()); } [Test] - public void Download_should_not_fail_if_top_priority_not_available() + public async Task Download_should_not_fail_if_top_priority_not_available() { GivenHighPriority(); GivenSuccessfulDownload(); @@ -528,7 +529,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests var remoteEpisode = CreateRemoteEpisode(); - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().NotBeNullOrEmpty(); @@ -555,27 +556,27 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests } [Test] - public void Download_should_handle_http_redirect_to_magnet() + public async Task Download_should_handle_http_redirect_to_magnet() { GivenRedirectToMagnet(); GivenSuccessfulDownload(); var remoteEpisode = CreateRemoteEpisode(); - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().NotBeNullOrEmpty(); } [Test] - public void Download_should_handle_http_redirect_to_torrent() + public async Task Download_should_handle_http_redirect_to_torrent() { GivenRedirectToTorrent(); GivenSuccessfulDownload(); var remoteEpisode = CreateRemoteEpisode(); - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().NotBeNullOrEmpty(); } diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/RTorrentTests/RTorrentFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/RTorrentTests/RTorrentFixture.cs index 655edd3ee..bdf8f6d05 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/RTorrentTests/RTorrentFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/RTorrentTests/RTorrentFixture.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using FluentAssertions; using Moq; using NUnit.Framework; @@ -111,13 +112,13 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.RTorrentTests } [Test] - public void Download_should_return_unique_id() + public async Task Download_should_return_unique_id() { GivenSuccessfulDownload(); var remoteEpisode = CreateRemoteEpisode(); - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().NotBeNullOrEmpty(); } diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/SabnzbdTests/SabnzbdFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/SabnzbdTests/SabnzbdFixture.cs index 57d0efbd0..2c955bd39 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/SabnzbdTests/SabnzbdFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/SabnzbdTests/SabnzbdFixture.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using FizzWare.NBuilder; using FluentAssertions; using Moq; @@ -300,27 +301,27 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.SabnzbdTests } [TestCase("[ TOWN ]-[ http://www.town.ag ]-[ ANIME ]-[Usenet Provider >> http://www.ssl- <<] - [Commie] Aldnoah Zero 18 [234C8FC7]", "[ TOWN ]-[ http-++www.town.ag ]-[ ANIME ]-[Usenet Provider http-++www.ssl- ] - [Commie] Aldnoah Zero 18 [234C8FC7].nzb")] - public void Download_should_use_clean_title(string title, string filename) + public async Task Download_should_use_clean_title(string title, string filename) { GivenSuccessfulDownload(); var remoteEpisode = CreateRemoteEpisode(); remoteEpisode.Release.Title = title; - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); Mocker.GetMock() .Verify(v => v.DownloadNzb(It.IsAny(), filename, It.IsAny(), It.IsAny(), It.IsAny()), Times.Once()); } [Test] - public void Download_should_return_unique_id() + public async Task Download_should_return_unique_id() { GivenSuccessfulDownload(); var remoteEpisode = CreateRemoteEpisode(); - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().NotBeNullOrEmpty(); } @@ -353,7 +354,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.SabnzbdTests } [Test] - public void Download_should_use_sabRecentTvPriority_when_recentEpisode_is_true() + public async Task Download_should_use_sabRecentTvPriority_when_recentEpisode_is_true() { Mocker.GetMock() .Setup(s => s.DownloadNzb(It.IsAny(), It.IsAny(), It.IsAny(), (int)SabnzbdPriority.High, It.IsAny())) @@ -366,7 +367,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.SabnzbdTests .Build() .ToList(); - Subject.Download(remoteEpisode, CreateIndexer()); + await Subject.Download(remoteEpisode, CreateIndexer()); Mocker.GetMock() .Verify(v => v.DownloadNzb(It.IsAny(), It.IsAny(), It.IsAny(), (int)SabnzbdPriority.High, It.IsAny()), Times.Once()); diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/TransmissionTests/TransmissionFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/TransmissionTests/TransmissionFixture.cs index 04402fb10..9d3cb6ef3 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/TransmissionTests/TransmissionFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/TransmissionTests/TransmissionFixture.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using FluentAssertions; using Moq; using NUnit.Framework; @@ -55,26 +56,26 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.TransmissionTests } [Test] - public void Download_should_return_unique_id() + public async Task Download_should_return_unique_id() { GivenSuccessfulDownload(); var remoteEpisode = CreateRemoteEpisode(); - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().NotBeNullOrEmpty(); } [Test] - public void Download_with_TvDirectory_should_force_directory() + public async Task Download_with_TvDirectory_should_force_directory() { GivenTvDirectory(); GivenSuccessfulDownload(); var remoteEpisode = CreateRemoteEpisode(); - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().NotBeNullOrEmpty(); @@ -83,14 +84,14 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.TransmissionTests } [Test] - public void Download_with_category_should_force_directory() + public async Task Download_with_category_should_force_directory() { GivenTvCategory(); GivenSuccessfulDownload(); var remoteEpisode = CreateRemoteEpisode(); - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().NotBeNullOrEmpty(); @@ -99,7 +100,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.TransmissionTests } [Test] - public void Download_with_category_should_not_have_double_slashes() + public async Task Download_with_category_should_not_have_double_slashes() { GivenTvCategory(); GivenSuccessfulDownload(); @@ -108,7 +109,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.TransmissionTests var remoteEpisode = CreateRemoteEpisode(); - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().NotBeNullOrEmpty(); @@ -117,13 +118,13 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.TransmissionTests } [Test] - public void Download_without_TvDirectory_and_Category_should_use_default() + public async Task Download_without_TvDirectory_and_Category_should_use_default() { GivenSuccessfulDownload(); var remoteEpisode = CreateRemoteEpisode(); - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().NotBeNullOrEmpty(); @@ -132,14 +133,14 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.TransmissionTests } [TestCase("magnet:?xt=urn:btih:ZPBPA2P6ROZPKRHK44D5OW6NHXU5Z6KR&tr=udp", "CBC2F069FE8BB2F544EAE707D75BCD3DE9DCF951")] - public void Download_should_get_hash_from_magnet_url(string magnetUrl, string expectedHash) + public async Task Download_should_get_hash_from_magnet_url(string magnetUrl, string expectedHash) { GivenSuccessfulDownload(); var remoteEpisode = CreateRemoteEpisode(); remoteEpisode.Release.DownloadUrl = magnetUrl; - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().Be(expectedHash); } diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/UTorrentTests/UTorrentFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/UTorrentTests/UTorrentFixture.cs index 32c2fe2e2..35b54a7b7 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/UTorrentTests/UTorrentFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/UTorrentTests/UTorrentFixture.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using FluentAssertions; using Moq; using NUnit.Framework; @@ -228,13 +229,13 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.UTorrentTests } [Test] - public void Download_should_return_unique_id() + public async Task Download_should_return_unique_id() { GivenSuccessfulDownload(); var remoteEpisode = CreateRemoteEpisode(); - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().NotBeNullOrEmpty(); } @@ -252,14 +253,14 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.UTorrentTests // Proxy.GetTorrents does not return original url. So item has to be found via magnet url. [TestCase("magnet:?xt=urn:btih:ZPBPA2P6ROZPKRHK44D5OW6NHXU5Z6KR&tr=udp", "CBC2F069FE8BB2F544EAE707D75BCD3DE9DCF951")] - public void Download_should_get_hash_from_magnet_url(string magnetUrl, string expectedHash) + public async Task Download_should_get_hash_from_magnet_url(string magnetUrl, string expectedHash) { GivenSuccessfulDownload(); var remoteEpisode = CreateRemoteEpisode(); remoteEpisode.Release.DownloadUrl = magnetUrl; - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().Be(expectedHash); } @@ -350,27 +351,27 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.UTorrentTests } [Test] - public void Download_should_handle_http_redirect_to_magnet() + public async Task Download_should_handle_http_redirect_to_magnet() { GivenRedirectToMagnet(); GivenSuccessfulDownload(); var remoteEpisode = CreateRemoteEpisode(); - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().NotBeNullOrEmpty(); } [Test] - public void Download_should_handle_http_redirect_to_torrent() + public async Task Download_should_handle_http_redirect_to_torrent() { GivenRedirectToTorrent(); GivenSuccessfulDownload(); var remoteEpisode = CreateRemoteEpisode(); - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().NotBeNullOrEmpty(); } diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/VuzeTests/VuzeFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/VuzeTests/VuzeFixture.cs index 5d06ba0a7..38602f71d 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/VuzeTests/VuzeFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/VuzeTests/VuzeFixture.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using FluentAssertions; using Moq; using NUnit.Framework; @@ -63,26 +64,26 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.VuzeTests } [Test] - public void Download_should_return_unique_id() + public async Task Download_should_return_unique_id() { GivenSuccessfulDownload(); var remoteEpisode = CreateRemoteEpisode(); - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().NotBeNullOrEmpty(); } [Test] - public void Download_with_TvDirectory_should_force_directory() + public async Task Download_with_TvDirectory_should_force_directory() { GivenTvDirectory(); GivenSuccessfulDownload(); var remoteEpisode = CreateRemoteEpisode(); - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().NotBeNullOrEmpty(); @@ -91,14 +92,14 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.VuzeTests } [Test] - public void Download_with_category_should_force_directory() + public async Task Download_with_category_should_force_directory() { GivenTvCategory(); GivenSuccessfulDownload(); var remoteEpisode = CreateRemoteEpisode(); - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().NotBeNullOrEmpty(); @@ -107,7 +108,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.VuzeTests } [Test] - public void Download_with_category_should_not_have_double_slashes() + public async Task Download_with_category_should_not_have_double_slashes() { GivenTvCategory(); GivenSuccessfulDownload(); @@ -116,7 +117,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.VuzeTests var remoteEpisode = CreateRemoteEpisode(); - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().NotBeNullOrEmpty(); @@ -125,13 +126,13 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.VuzeTests } [Test] - public void Download_without_TvDirectory_and_Category_should_use_default() + public async Task Download_without_TvDirectory_and_Category_should_use_default() { GivenSuccessfulDownload(); var remoteEpisode = CreateRemoteEpisode(); - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().NotBeNullOrEmpty(); @@ -140,14 +141,14 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.VuzeTests } [TestCase("magnet:?xt=urn:btih:ZPBPA2P6ROZPKRHK44D5OW6NHXU5Z6KR&tr=udp", "CBC2F069FE8BB2F544EAE707D75BCD3DE9DCF951")] - public void Download_should_get_hash_from_magnet_url(string magnetUrl, string expectedHash) + public async Task Download_should_get_hash_from_magnet_url(string magnetUrl, string expectedHash) { GivenSuccessfulDownload(); var remoteEpisode = CreateRemoteEpisode(); remoteEpisode.Release.DownloadUrl = magnetUrl; - var id = Subject.Download(remoteEpisode, CreateIndexer()); + var id = await Subject.Download(remoteEpisode, CreateIndexer()); id.Should().Be(expectedHash); } diff --git a/src/NzbDrone.Core.Test/Download/DownloadServiceFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadServiceFixture.cs index 8666c81ac..d2653a71d 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadServiceFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadServiceFixture.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Net; +using System.Threading.Tasks; using FizzWare.NBuilder; using Moq; using NUnit.Framework; @@ -78,23 +79,23 @@ namespace NzbDrone.Core.Test.Download } [Test] - public void Download_report_should_publish_on_grab_event() + public async Task Download_report_should_publish_on_grab_event() { var mock = WithUsenetClient(); mock.Setup(s => s.Download(It.IsAny(), It.IsAny())); - Subject.DownloadReport(_parseResult, null); + await Subject.DownloadReport(_parseResult, null); VerifyEventPublished(); } [Test] - public void Download_report_should_grab_using_client() + public async Task Download_report_should_grab_using_client() { var mock = WithUsenetClient(); mock.Setup(s => s.Download(It.IsAny(), It.IsAny())); - Subject.DownloadReport(_parseResult, null); + await Subject.DownloadReport(_parseResult, null); mock.Verify(s => s.Download(It.IsAny(), It.IsAny()), Times.Once()); } @@ -106,7 +107,7 @@ namespace NzbDrone.Core.Test.Download mock.Setup(s => s.Download(It.IsAny(), It.IsAny())) .Throws(new WebException()); - Assert.Throws(() => Subject.DownloadReport(_parseResult, null)); + Assert.ThrowsAsync(async () => await Subject.DownloadReport(_parseResult, null)); VerifyEventNotPublished(); } @@ -121,7 +122,7 @@ namespace NzbDrone.Core.Test.Download throw new ReleaseDownloadException(v.Release, "Error", new WebException()); }); - Assert.Throws(() => Subject.DownloadReport(_parseResult, null)); + Assert.ThrowsAsync(async () => await Subject.DownloadReport(_parseResult, null)); Mocker.GetMock() .Verify(v => v.RecordFailure(It.IsAny(), It.IsAny()), Times.Once()); @@ -141,7 +142,7 @@ namespace NzbDrone.Core.Test.Download throw new ReleaseDownloadException(v.Release, "Error", new TooManyRequestsException(request, response)); }); - Assert.Throws(() => Subject.DownloadReport(_parseResult, null)); + Assert.ThrowsAsync(async () => await Subject.DownloadReport(_parseResult, null)); Mocker.GetMock() .Verify(v => v.RecordFailure(It.IsAny(), TimeSpan.FromMinutes(5.0)), Times.Once()); @@ -161,7 +162,7 @@ namespace NzbDrone.Core.Test.Download throw new ReleaseDownloadException(v.Release, "Error", new TooManyRequestsException(request, response)); }); - Assert.Throws(() => Subject.DownloadReport(_parseResult, null)); + Assert.ThrowsAsync(async () => await Subject.DownloadReport(_parseResult, null)); Mocker.GetMock() .Verify(v => v.RecordFailure(It.IsAny(), @@ -175,7 +176,7 @@ namespace NzbDrone.Core.Test.Download mock.Setup(s => s.Download(It.IsAny(), It.IsAny())) .Throws(new DownloadClientException("Some Error")); - Assert.Throws(() => Subject.DownloadReport(_parseResult, null)); + Assert.ThrowsAsync(async () => await Subject.DownloadReport(_parseResult, null)); Mocker.GetMock() .Verify(v => v.RecordFailure(It.IsAny(), It.IsAny()), Times.Never()); @@ -191,7 +192,7 @@ namespace NzbDrone.Core.Test.Download throw new ReleaseUnavailableException(v.Release, "Error", new WebException()); }); - Assert.Throws(() => Subject.DownloadReport(_parseResult, null)); + Assert.ThrowsAsync(async () => await Subject.DownloadReport(_parseResult, null)); Mocker.GetMock() .Verify(v => v.RecordFailure(It.IsAny(), It.IsAny()), Times.Never()); @@ -200,14 +201,14 @@ namespace NzbDrone.Core.Test.Download [Test] public void should_not_attempt_download_if_client_isnt_configured() { - Assert.Throws(() => Subject.DownloadReport(_parseResult, null)); + Assert.ThrowsAsync(async () => await Subject.DownloadReport(_parseResult, null)); Mocker.GetMock().Verify(c => c.Download(It.IsAny(), It.IsAny()), Times.Never()); VerifyEventNotPublished(); } [Test] - public void should_attempt_download_even_if_client_is_disabled() + public async Task should_attempt_download_even_if_client_is_disabled() { var mockUsenet = WithUsenetClient(); @@ -222,7 +223,7 @@ namespace NzbDrone.Core.Test.Download } }); - Subject.DownloadReport(_parseResult, null); + await Subject.DownloadReport(_parseResult, null); Mocker.GetMock().Verify(c => c.GetBlockedProviders(), Times.Never()); mockUsenet.Verify(c => c.Download(It.IsAny(), It.IsAny()), Times.Once()); @@ -230,26 +231,26 @@ namespace NzbDrone.Core.Test.Download } [Test] - public void should_send_download_to_correct_usenet_client() + public async Task should_send_download_to_correct_usenet_client() { var mockTorrent = WithTorrentClient(); var mockUsenet = WithUsenetClient(); - Subject.DownloadReport(_parseResult, null); + await Subject.DownloadReport(_parseResult, null); mockTorrent.Verify(c => c.Download(It.IsAny(), It.IsAny()), Times.Never()); mockUsenet.Verify(c => c.Download(It.IsAny(), It.IsAny()), Times.Once()); } [Test] - public void should_send_download_to_correct_torrent_client() + public async Task should_send_download_to_correct_torrent_client() { var mockTorrent = WithTorrentClient(); var mockUsenet = WithUsenetClient(); _parseResult.Release.DownloadProtocol = DownloadProtocol.Torrent; - Subject.DownloadReport(_parseResult, null); + await Subject.DownloadReport(_parseResult, null); mockTorrent.Verify(c => c.Download(It.IsAny(), It.IsAny()), Times.Once()); mockUsenet.Verify(c => c.Download(It.IsAny(), It.IsAny()), Times.Never()); diff --git a/src/NzbDrone.Core.Test/IndexerSearchTests/ReleaseSearchServiceFixture.cs b/src/NzbDrone.Core.Test/IndexerSearchTests/ReleaseSearchServiceFixture.cs index 6a7c04f8f..a2b77ab7d 100644 --- a/src/NzbDrone.Core.Test/IndexerSearchTests/ReleaseSearchServiceFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerSearchTests/ReleaseSearchServiceFixture.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Globalization; using System.Linq; +using System.Threading.Tasks; using FizzWare.NBuilder; using FluentAssertions; using Moq; @@ -110,37 +111,37 @@ namespace NzbDrone.Core.Test.IndexerSearchTests _mockIndexer.Setup(v => v.Fetch(It.IsAny())) .Callback(s => result.Add(s)) - .Returns(new List()); + .Returns(Task.FromResult>(new List())); _mockIndexer.Setup(v => v.Fetch(It.IsAny())) .Callback(s => result.Add(s)) - .Returns(new List()); + .Returns(Task.FromResult>(new List())); _mockIndexer.Setup(v => v.Fetch(It.IsAny())) .Callback(s => result.Add(s)) - .Returns(new List()); + .Returns(Task.FromResult>(new List())); _mockIndexer.Setup(v => v.Fetch(It.IsAny())) .Callback(s => result.Add(s)) - .Returns(new List()); + .Returns(Task.FromResult>(new List())); _mockIndexer.Setup(v => v.Fetch(It.IsAny())) .Callback(s => result.Add(s)) - .Returns(new List()); + .Returns(Task.FromResult>(new List())); _mockIndexer.Setup(v => v.Fetch(It.IsAny())) .Callback(s => result.Add(s)) - .Returns(new List()); + .Returns(Task.FromResult>(new List())); _mockIndexer.Setup(v => v.Fetch(It.IsAny())) .Callback(s => result.Add(s)) - .Returns(new List()); + .Returns(Task.FromResult>(new List())); return result; } [Test] - public void Tags_IndexerTags_SeriesNoTags_IndexerNotIncluded() + public async Task Tags_IndexerTags_SeriesNoTags_IndexerNotIncluded() { _mockIndexer.SetupGet(s => s.Definition).Returns(new IndexerDefinition { @@ -152,7 +153,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests var allCriteria = WatchForSearchCriteria(); - Subject.EpisodeSearch(_xemEpisodes.First(), true, false); + await Subject.EpisodeSearch(_xemEpisodes.First(), true, false); var criteria = allCriteria.OfType().ToList(); @@ -160,7 +161,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests } [Test] - public void Tags_IndexerNoTags_SeriesTags_IndexerIncluded() + public async Task Tags_IndexerNoTags_SeriesTags_IndexerIncluded() { _mockIndexer.SetupGet(s => s.Definition).Returns(new IndexerDefinition { @@ -181,7 +182,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests var allCriteria = WatchForSearchCriteria(); - Subject.EpisodeSearch(_xemEpisodes.First(), true, false); + await Subject.EpisodeSearch(_xemEpisodes.First(), true, false); var criteria = allCriteria.OfType().ToList(); @@ -189,7 +190,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests } [Test] - public void Tags_IndexerAndSeriesTagsMatch_IndexerIncluded() + public async Task Tags_IndexerAndSeriesTagsMatch_IndexerIncluded() { _mockIndexer.SetupGet(s => s.Definition).Returns(new IndexerDefinition { @@ -211,7 +212,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests var allCriteria = WatchForSearchCriteria(); - Subject.EpisodeSearch(_xemEpisodes.First(), true, false); + await Subject.EpisodeSearch(_xemEpisodes.First(), true, false); var criteria = allCriteria.OfType().ToList(); @@ -219,7 +220,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests } [Test] - public void Tags_IndexerAndSeriesTagsMismatch_IndexerNotIncluded() + public async Task Tags_IndexerAndSeriesTagsMismatch_IndexerNotIncluded() { _mockIndexer.SetupGet(s => s.Definition).Returns(new IndexerDefinition { @@ -241,7 +242,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests var allCriteria = WatchForSearchCriteria(); - Subject.EpisodeSearch(_xemEpisodes.First(), true, false); + await Subject.EpisodeSearch(_xemEpisodes.First(), true, false); var criteria = allCriteria.OfType().ToList(); @@ -249,13 +250,13 @@ namespace NzbDrone.Core.Test.IndexerSearchTests } [Test] - public void scene_episodesearch() + public async Task scene_episodesearch() { WithEpisodes(); var allCriteria = WatchForSearchCriteria(); - Subject.EpisodeSearch(_xemEpisodes.First(), true, false); + await Subject.EpisodeSearch(_xemEpisodes.First(), true, false); var criteria = allCriteria.OfType().ToList(); @@ -265,13 +266,13 @@ namespace NzbDrone.Core.Test.IndexerSearchTests } [Test] - public void scene_seasonsearch() + public async Task scene_seasonsearch() { WithEpisodes(); var allCriteria = WatchForSearchCriteria(); - Subject.SeasonSearch(_xemSeries.Id, 1, false, false, true, false); + await Subject.SeasonSearch(_xemSeries.Id, 1, false, false, true, false); var criteria = allCriteria.OfType().ToList(); @@ -280,13 +281,13 @@ namespace NzbDrone.Core.Test.IndexerSearchTests } [Test] - public void scene_seasonsearch_should_search_multiple_seasons() + public async Task scene_seasonsearch_should_search_multiple_seasons() { WithEpisodes(); var allCriteria = WatchForSearchCriteria(); - Subject.SeasonSearch(_xemSeries.Id, 2, false, false, true, false); + await Subject.SeasonSearch(_xemSeries.Id, 2, false, false, true, false); var criteria = allCriteria.OfType().ToList(); @@ -296,13 +297,13 @@ namespace NzbDrone.Core.Test.IndexerSearchTests } [Test] - public void scene_seasonsearch_should_search_single_episode_if_possible() + public async Task scene_seasonsearch_should_search_single_episode_if_possible() { WithEpisodes(); var allCriteria = WatchForSearchCriteria(); - Subject.SeasonSearch(_xemSeries.Id, 4, false, false, true, false); + await Subject.SeasonSearch(_xemSeries.Id, 4, false, false, true, false); var criteria1 = allCriteria.OfType().ToList(); var criteria2 = allCriteria.OfType().ToList(); @@ -316,13 +317,13 @@ namespace NzbDrone.Core.Test.IndexerSearchTests } [Test] - public void scene_seasonsearch_should_use_seasonnumber_if_no_scene_number_is_available() + public async Task scene_seasonsearch_should_use_seasonnumber_if_no_scene_number_is_available() { WithEpisodes(); var allCriteria = WatchForSearchCriteria(); - Subject.SeasonSearch(_xemSeries.Id, 7, false, false, true, false); + await Subject.SeasonSearch(_xemSeries.Id, 7, false, false, true, false); var criteria = allCriteria.OfType().ToList(); @@ -331,7 +332,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests } [Test] - public void season_search_for_anime_should_search_for_each_monitored_episode() + public async Task season_search_for_anime_should_search_for_each_monitored_episode() { WithEpisodes(); _xemSeries.SeriesType = SeriesTypes.Anime; @@ -340,7 +341,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests var seasonNumber = 1; var allCriteria = WatchForSearchCriteria(); - Subject.SeasonSearch(_xemSeries.Id, seasonNumber, true, false, true, false); + await Subject.SeasonSearch(_xemSeries.Id, seasonNumber, true, false, true, false); var criteria = allCriteria.OfType().ToList(); @@ -348,7 +349,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests } [Test] - public void season_search_for_anime_should_not_search_for_unmonitored_episodes() + public async Task season_search_for_anime_should_not_search_for_unmonitored_episodes() { WithEpisodes(); _xemSeries.SeriesType = SeriesTypes.Anime; @@ -358,7 +359,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests var seasonNumber = 1; var allCriteria = WatchForSearchCriteria(); - Subject.SeasonSearch(_xemSeries.Id, seasonNumber, false, true, true, false); + await Subject.SeasonSearch(_xemSeries.Id, seasonNumber, false, true, true, false); var criteria = allCriteria.OfType().ToList(); @@ -366,7 +367,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests } [Test] - public void season_search_for_anime_should_not_search_for_unaired_episodes() + public async Task season_search_for_anime_should_not_search_for_unaired_episodes() { WithEpisodes(); _xemSeries.SeriesType = SeriesTypes.Anime; @@ -376,7 +377,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests var seasonNumber = 1; var allCriteria = WatchForSearchCriteria(); - Subject.SeasonSearch(_xemSeries.Id, seasonNumber, false, false, true, false); + await Subject.SeasonSearch(_xemSeries.Id, seasonNumber, false, false, true, false); var criteria = allCriteria.OfType().ToList(); @@ -384,7 +385,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests } [Test] - public void season_search_for_anime_should_not_search_for_episodes_with_files() + public async Task season_search_for_anime_should_not_search_for_episodes_with_files() { WithEpisodes(); _xemSeries.SeriesType = SeriesTypes.Anime; @@ -393,7 +394,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests var seasonNumber = 1; var allCriteria = WatchForSearchCriteria(); - Subject.SeasonSearch(_xemSeries.Id, seasonNumber, true, false, true, false); + await Subject.SeasonSearch(_xemSeries.Id, seasonNumber, true, false, true, false); var criteria = allCriteria.OfType().ToList(); @@ -401,7 +402,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests } [Test] - public void season_search_for_anime_should_set_isSeasonSearch_flag() + public async Task season_search_for_anime_should_set_isSeasonSearch_flag() { WithEpisodes(); _xemSeries.SeriesType = SeriesTypes.Anime; @@ -410,7 +411,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests var seasonNumber = 1; var allCriteria = WatchForSearchCriteria(); - Subject.SeasonSearch(_xemSeries.Id, seasonNumber, true, false, true, false); + await Subject.SeasonSearch(_xemSeries.Id, seasonNumber, true, false, true, false); var criteria = allCriteria.OfType().ToList(); @@ -419,7 +420,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests } [Test] - public void season_search_for_anime_should_search_for_each_monitored_season() + public async Task season_search_for_anime_should_search_for_each_monitored_season() { WithEpisodes(); _xemSeries.SeriesType = SeriesTypes.Anime; @@ -428,7 +429,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests var seasonNumber = 1; var allCriteria = WatchForSearchCriteria(); - Subject.SeasonSearch(_xemSeries.Id, seasonNumber, true, false, true, false); + await Subject.SeasonSearch(_xemSeries.Id, seasonNumber, true, false, true, false); var criteria = allCriteria.OfType().ToList(); @@ -437,7 +438,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests } [Test] - public void season_search_for_anime_should_not_search_for_unmonitored_season() + public async Task season_search_for_anime_should_not_search_for_unmonitored_season() { WithEpisodes(); _xemSeries.SeriesType = SeriesTypes.Anime; @@ -447,7 +448,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests var seasonNumber = 1; var allCriteria = WatchForSearchCriteria(); - Subject.SeasonSearch(_xemSeries.Id, seasonNumber, false, true, true, false); + await Subject.SeasonSearch(_xemSeries.Id, seasonNumber, false, true, true, false); var criteria = allCriteria.OfType().ToList(); @@ -455,7 +456,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests } [Test] - public void season_search_for_anime_should_not_search_for_unaired_season() + public async Task season_search_for_anime_should_not_search_for_unaired_season() { WithEpisodes(); _xemSeries.SeriesType = SeriesTypes.Anime; @@ -465,7 +466,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests var seasonNumber = 1; var allCriteria = WatchForSearchCriteria(); - Subject.SeasonSearch(_xemSeries.Id, seasonNumber, false, false, true, false); + await Subject.SeasonSearch(_xemSeries.Id, seasonNumber, false, false, true, false); var criteria = allCriteria.OfType().ToList(); @@ -473,7 +474,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests } [Test] - public void season_search_for_anime_should_not_search_for_season_with_files() + public async Task season_search_for_anime_should_not_search_for_season_with_files() { WithEpisodes(); _xemSeries.SeriesType = SeriesTypes.Anime; @@ -482,7 +483,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests var seasonNumber = 1; var allCriteria = WatchForSearchCriteria(); - Subject.SeasonSearch(_xemSeries.Id, seasonNumber, true, false, true, false); + await Subject.SeasonSearch(_xemSeries.Id, seasonNumber, true, false, true, false); var criteria = allCriteria.OfType().ToList(); @@ -490,7 +491,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests } [Test] - public void season_search_for_daily_should_search_multiple_years() + public async Task season_search_for_daily_should_search_multiple_years() { WithEpisode(1, 1, null, null, "2005-12-30"); WithEpisode(1, 2, null, null, "2005-12-31"); @@ -500,7 +501,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests var allCriteria = WatchForSearchCriteria(); - Subject.SeasonSearch(_xemSeries.Id, 1, false, false, true, false); + await Subject.SeasonSearch(_xemSeries.Id, 1, false, false, true, false); var criteria = allCriteria.OfType().ToList(); @@ -510,7 +511,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests } [Test] - public void season_search_for_daily_should_search_single_episode_if_possible() + public async Task season_search_for_daily_should_search_single_episode_if_possible() { WithEpisode(1, 1, null, null, "2005-12-30"); WithEpisode(1, 2, null, null, "2005-12-31"); @@ -519,7 +520,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests var allCriteria = WatchForSearchCriteria(); - Subject.SeasonSearch(_xemSeries.Id, 1, false, false, true, false); + await Subject.SeasonSearch(_xemSeries.Id, 1, false, false, true, false); var criteria1 = allCriteria.OfType().ToList(); var criteria2 = allCriteria.OfType().ToList(); @@ -532,7 +533,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests } [Test] - public void season_search_for_daily_should_not_search_for_unmonitored_episodes() + public async Task season_search_for_daily_should_not_search_for_unmonitored_episodes() { WithEpisode(1, 1, null, null, "2005-12-30"); WithEpisode(1, 2, null, null, "2005-12-31"); @@ -542,7 +543,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests var allCriteria = WatchForSearchCriteria(); - Subject.SeasonSearch(_xemSeries.Id, 1, false, true, true, false); + await Subject.SeasonSearch(_xemSeries.Id, 1, false, true, true, false); var criteria1 = allCriteria.OfType().ToList(); var criteria2 = allCriteria.OfType().ToList(); @@ -552,13 +553,13 @@ namespace NzbDrone.Core.Test.IndexerSearchTests } [Test] - public void getscenenames_should_use_seasonnumber_if_no_scene_seasonnumber_is_available() + public async Task getscenenames_should_use_seasonnumber_if_no_scene_seasonnumber_is_available() { WithEpisodes(); var allCriteria = WatchForSearchCriteria(); - Subject.SeasonSearch(_xemSeries.Id, 7, false, false, true, false); + await Subject.SeasonSearch(_xemSeries.Id, 7, false, false, true, false); Mocker.GetMock() .Verify(v => v.FindByTvdbId(_xemSeries.Id), Times.Once()); diff --git a/src/NzbDrone.Core.Test/IndexerSearchTests/SeriesSearchServiceFixture.cs b/src/NzbDrone.Core.Test/IndexerSearchTests/SeriesSearchServiceFixture.cs index 7e826c421..ab6ab0755 100644 --- a/src/NzbDrone.Core.Test/IndexerSearchTests/SeriesSearchServiceFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerSearchTests/SeriesSearchServiceFixture.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using FluentAssertions; using Moq; using NUnit.Framework; @@ -33,11 +34,11 @@ namespace NzbDrone.Core.Test.IndexerSearchTests Mocker.GetMock() .Setup(s => s.SeasonSearch(_series.Id, It.IsAny(), false, false, true, false)) - .Returns(new List()); + .Returns(Task.FromResult(new List())); Mocker.GetMock() .Setup(s => s.ProcessDecisions(It.IsAny>())) - .Returns(new ProcessedDecisions(new List(), new List(), new List())); + .Returns(Task.FromResult(new ProcessedDecisions(new List(), new List(), new List()))); } [Test] @@ -69,7 +70,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests Mocker.GetMock() .Setup(s => s.SeasonSearch(_series.Id, It.IsAny(), false, true, true, false)) - .Returns(new List()) + .Returns(Task.FromResult(new List())) .Callback((seriesId, seasonNumber, missingOnly, monitoredOnly, userInvokedSearch, interactiveSearch) => seasonOrder.Add(seasonNumber)); Subject.Execute(new SeriesSearchCommand { SeriesId = _series.Id, Trigger = CommandTrigger.Manual }); diff --git a/src/NzbDrone.Core.Test/IndexerTests/BroadcastheNetTests/BroadcastheNetFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/BroadcastheNetTests/BroadcastheNetFixture.cs index 8b95bb560..cc69c6d01 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/BroadcastheNetTests/BroadcastheNetFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/BroadcastheNetTests/BroadcastheNetFixture.cs @@ -1,6 +1,7 @@ using System; using System.Linq; using System.Net.Http; +using System.Threading.Tasks; using FluentAssertions; using Moq; using NUnit.Framework; @@ -27,15 +28,15 @@ namespace NzbDrone.Core.Test.IndexerTests.BroadcastheNetTests } [Test] - public void should_parse_recent_feed_from_BroadcastheNet() + public async Task should_parse_recent_feed_from_BroadcastheNet() { var recentFeed = ReadAllText(@"Files/Indexers/BroadcastheNet/RecentFeed.json"); Mocker.GetMock() - .Setup(o => o.Execute(It.Is(v => v.Method == HttpMethod.Post))) - .Returns(r => new HttpResponse(r, new HttpHeader(), recentFeed)); + .Setup(o => o.ExecuteAsync(It.Is(v => v.Method == HttpMethod.Post))) + .Returns(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed))); - var releases = Subject.FetchRecent(); + var releases = await Subject.FetchRecent(); releases.Should().HaveCount(2); releases.First().Should().BeOfType(); @@ -72,13 +73,13 @@ namespace NzbDrone.Core.Test.IndexerTests.BroadcastheNetTests } [Test] - public void should_back_off_on_bad_request() + public async Task should_back_off_on_bad_request() { Mocker.GetMock() - .Setup(v => v.Execute(It.IsAny())) - .Returns(r => new HttpResponse(r, new HttpHeader(), Array.Empty(), System.Net.HttpStatusCode.BadRequest)); + .Setup(v => v.ExecuteAsync(It.IsAny())) + .Returns(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), Array.Empty(), System.Net.HttpStatusCode.BadRequest))); - var results = Subject.FetchRecent(); + var results = await Subject.FetchRecent(); results.Should().BeEmpty(); @@ -88,13 +89,13 @@ namespace NzbDrone.Core.Test.IndexerTests.BroadcastheNetTests } [Test] - public void should_back_off_and_report_api_key_invalid() + public async Task should_back_off_and_report_api_key_invalid() { Mocker.GetMock() - .Setup(v => v.Execute(It.IsAny())) - .Returns(r => new HttpResponse(r, new HttpHeader(), Array.Empty(), System.Net.HttpStatusCode.Unauthorized)); + .Setup(v => v.ExecuteAsync(It.IsAny())) + .Returns(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), Array.Empty(), System.Net.HttpStatusCode.Unauthorized))); - var results = Subject.FetchRecent(); + var results = await Subject.FetchRecent(); results.Should().BeEmpty(); @@ -104,13 +105,13 @@ namespace NzbDrone.Core.Test.IndexerTests.BroadcastheNetTests } [Test] - public void should_back_off_on_unknown_method() + public async Task should_back_off_on_unknown_method() { Mocker.GetMock() - .Setup(v => v.Execute(It.IsAny())) - .Returns(r => new HttpResponse(r, new HttpHeader(), Array.Empty(), System.Net.HttpStatusCode.NotFound)); + .Setup(v => v.ExecuteAsync(It.IsAny())) + .Returns(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), Array.Empty(), System.Net.HttpStatusCode.NotFound))); - var results = Subject.FetchRecent(); + var results = await Subject.FetchRecent(); results.Should().BeEmpty(); @@ -120,13 +121,13 @@ namespace NzbDrone.Core.Test.IndexerTests.BroadcastheNetTests } [Test] - public void should_back_off_api_limit_reached() + public async Task should_back_off_api_limit_reached() { Mocker.GetMock() - .Setup(v => v.Execute(It.IsAny())) - .Returns(r => new HttpResponse(r, new HttpHeader(), Array.Empty(), System.Net.HttpStatusCode.ServiceUnavailable)); + .Setup(v => v.ExecuteAsync(It.IsAny())) + .Returns(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), Array.Empty(), System.Net.HttpStatusCode.ServiceUnavailable))); - var results = Subject.FetchRecent(); + var results = await Subject.FetchRecent(); results.Should().BeEmpty(); @@ -136,7 +137,7 @@ namespace NzbDrone.Core.Test.IndexerTests.BroadcastheNetTests } [Test] - public void should_replace_https_http_as_needed() + public async Task should_replace_https_http_as_needed() { var recentFeed = ReadAllText(@"Files/Indexers/BroadcastheNet/RecentFeed.json"); @@ -145,10 +146,10 @@ namespace NzbDrone.Core.Test.IndexerTests.BroadcastheNetTests recentFeed = recentFeed.Replace("http:", "https:"); Mocker.GetMock() - .Setup(o => o.Execute(It.Is(v => v.Method == HttpMethod.Post))) - .Returns(r => new HttpResponse(r, new HttpHeader(), recentFeed)); + .Setup(o => o.ExecuteAsync(It.Is(v => v.Method == HttpMethod.Post))) + .Returns(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed))); - var releases = Subject.FetchRecent(); + var releases = await Subject.FetchRecent(); releases.Should().HaveCount(2); releases.First().Should().BeOfType(); diff --git a/src/NzbDrone.Core.Test/IndexerTests/FanzubTests/FanzubFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/FanzubTests/FanzubFixture.cs index da80f870c..f07bc4ad8 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/FanzubTests/FanzubFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/FanzubTests/FanzubFixture.cs @@ -1,6 +1,7 @@ using System; using System.Linq; using System.Net.Http; +using System.Threading.Tasks; using FluentAssertions; using Moq; using NUnit.Framework; @@ -25,15 +26,15 @@ namespace NzbDrone.Core.Test.IndexerTests.FanzubTests } [Test] - public void should_parse_recent_feed_from_fanzub() + public async Task should_parse_recent_feed_from_fanzub() { var recentFeed = ReadAllText(@"Files/Indexers/Fanzub/fanzub.xml"); Mocker.GetMock() - .Setup(o => o.Execute(It.Is(v => v.Method == HttpMethod.Get))) - .Returns(r => new HttpResponse(r, new HttpHeader(), recentFeed)); + .Setup(o => o.ExecuteAsync(It.Is(v => v.Method == HttpMethod.Get))) + .Returns(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed))); - var releases = Subject.FetchRecent(); + var releases = await Subject.FetchRecent(); releases.Should().HaveCount(3); diff --git a/src/NzbDrone.Core.Test/IndexerTests/FileListTests/FileListFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/FileListTests/FileListFixture.cs index 732825188..995332eca 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/FileListTests/FileListFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/FileListTests/FileListFixture.cs @@ -1,6 +1,7 @@ using System; using System.Linq; using System.Net.Http; +using System.Threading.Tasks; using FluentAssertions; using Moq; using NUnit.Framework; @@ -26,15 +27,15 @@ namespace NzbDrone.Core.Test.IndexerTests.FileListTests } [Test] - public void should_parse_recent_feed_from_FileList() + public async Task should_parse_recent_feed_from_FileList() { var recentFeed = ReadAllText(@"Files/Indexers/FileList/RecentFeed.json"); Mocker.GetMock() - .Setup(o => o.Execute(It.Is(v => v.Method == HttpMethod.Get))) - .Returns(r => new HttpResponse(r, new HttpHeader(), recentFeed)); + .Setup(o => o.ExecuteAsync(It.Is(v => v.Method == HttpMethod.Get))) + .Returns(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed))); - var releases = Subject.FetchRecent(); + var releases = await Subject.FetchRecent(); releases.Should().HaveCount(2); releases.First().Should().BeOfType(); diff --git a/src/NzbDrone.Core.Test/IndexerTests/HDBitsTests/HDBitsFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/HDBitsTests/HDBitsFixture.cs index 766df7d31..4332131d9 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/HDBitsTests/HDBitsFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/HDBitsTests/HDBitsFixture.cs @@ -2,6 +2,7 @@ using System; using System.Linq; using System.Net.Http; using System.Text; +using System.Threading.Tasks; using FluentAssertions; using Moq; using NUnit.Framework; @@ -30,15 +31,15 @@ namespace NzbDrone.Core.Test.IndexerTests.HDBitsTests [TestCase("Files/Indexers/HdBits/RecentFeedLongIDs.json")] [TestCase("Files/Indexers/HdBits/RecentFeedStringIDs.json")] - public void should_parse_recent_feed_from_HDBits(string fileName) + public async Task should_parse_recent_feed_from_HDBits(string fileName) { var responseJson = ReadAllText(fileName); Mocker.GetMock() - .Setup(o => o.Execute(It.Is(v => v.Method == HttpMethod.Post))) - .Returns(r => new HttpResponse(r, new HttpHeader(), responseJson)); + .Setup(o => o.ExecuteAsync(It.Is(v => v.Method == HttpMethod.Post))) + .Returns(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), responseJson))); - var torrents = Subject.FetchRecent(); + var torrents = await Subject.FetchRecent(); torrents.Should().HaveCount(2); torrents.First().Should().BeOfType(); @@ -59,15 +60,15 @@ namespace NzbDrone.Core.Test.IndexerTests.HDBitsTests } [Test] - public void should_warn_on_wrong_passkey() + public async Task should_warn_on_wrong_passkey() { var responseJson = new { status = 5, message = "Invalid authentication credentials" }.ToJson(); Mocker.GetMock() - .Setup(v => v.Execute(It.IsAny())) - .Returns(r => new HttpResponse(r, new HttpHeader(), Encoding.UTF8.GetBytes(responseJson))); + .Setup(v => v.ExecuteAsync(It.IsAny())) + .Returns(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), Encoding.UTF8.GetBytes(responseJson)))); - var torrents = Subject.FetchRecent(); + var torrents = await Subject.FetchRecent(); torrents.Should().BeEmpty(); diff --git a/src/NzbDrone.Core.Test/IndexerTests/IPTorrentsTests/IPTorrentsFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/IPTorrentsTests/IPTorrentsFixture.cs index e022ca389..0bf21ffc0 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/IPTorrentsTests/IPTorrentsFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/IPTorrentsTests/IPTorrentsFixture.cs @@ -1,6 +1,7 @@ using System; using System.Linq; using System.Net.Http; +using System.Threading.Tasks; using FluentAssertions; using Moq; using NUnit.Framework; @@ -84,15 +85,15 @@ namespace NzbDrone.Core.Test.IndexerTests.IPTorrentsTests } [Test] - public void should_parse_recent_feed_from_IPTorrents() + public async Task should_parse_recent_feed_from_IPTorrents() { var recentFeed = ReadAllText(@"Files/Indexers/IPTorrents/IPTorrents.xml"); Mocker.GetMock() - .Setup(o => o.Execute(It.Is(v => v.Method == HttpMethod.Get))) - .Returns(r => new HttpResponse(r, new HttpHeader(), recentFeed)); + .Setup(o => o.ExecuteAsync(It.Is(v => v.Method == HttpMethod.Get))) + .Returns(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed))); - var releases = Subject.FetchRecent(); + var releases = await Subject.FetchRecent(); releases.Should().HaveCount(5); releases.First().Should().BeOfType(); diff --git a/src/NzbDrone.Core.Test/IndexerTests/NewznabTests/NewznabFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/NewznabTests/NewznabFixture.cs index b67d35c64..eb3caf37f 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/NewznabTests/NewznabFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/NewznabTests/NewznabFixture.cs @@ -2,6 +2,7 @@ using System; using System.Linq; using System.Net; using System.Net.Http; +using System.Threading.Tasks; using FluentAssertions; using Moq; using NUnit.Framework; @@ -40,15 +41,15 @@ namespace NzbDrone.Core.Test.IndexerTests.NewznabTests } [Test] - public void should_parse_recent_feed_from_newznab_nzb_su() + public async Task should_parse_recent_feed_from_newznab_nzb_su() { var recentFeed = ReadAllText(@"Files/Indexers/Newznab/newznab_nzb_su.xml"); Mocker.GetMock() - .Setup(o => o.Execute(It.Is(v => v.Method == HttpMethod.Get))) - .Returns(r => new HttpResponse(r, new HttpHeader(), recentFeed)); + .Setup(o => o.ExecuteAsync(It.Is(v => v.Method == HttpMethod.Get))) + .Returns(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed))); - var releases = Subject.FetchRecent(); + var releases = await Subject.FetchRecent(); releases.Should().HaveCount(100); @@ -66,15 +67,15 @@ namespace NzbDrone.Core.Test.IndexerTests.NewznabTests } [Test] - public void should_parse_recent_feed_from_newznab_animetosho() + public async Task should_parse_recent_feed_from_newznab_animetosho() { var recentFeed = ReadAllText(@"Files/Indexers/Torznab/torznab_animetosho.xml"); Mocker.GetMock() - .Setup(o => o.Execute(It.Is(v => v.Method == HttpMethod.Get))) - .Returns(r => new HttpResponse(r, new HttpHeader(), recentFeed)); + .Setup(o => o.ExecuteAsync(It.Is(v => v.Method == HttpMethod.Get))) + .Returns(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed))); - var releases = Subject.FetchRecent(); + var releases = await Subject.FetchRecent(); releases.Should().HaveCount(1); @@ -112,7 +113,7 @@ namespace NzbDrone.Core.Test.IndexerTests.NewznabTests } [Test] - public void should_record_indexer_failure_if_caps_throw() + public async Task should_record_indexer_failure_if_caps_throw() { var request = new HttpRequest("http://my.indexer.com"); var response = new HttpResponse(request, new HttpHeader(), Array.Empty(), (HttpStatusCode)429); @@ -125,7 +126,9 @@ namespace NzbDrone.Core.Test.IndexerTests.NewznabTests _caps.MaxPageSize = 30; _caps.DefaultPageSize = 25; - Subject.FetchRecent().Should().BeEmpty(); + var releases = await Subject.FetchRecent(); + + releases.Should().BeEmpty(); Mocker.GetMock() .Verify(v => v.RecordFailure(It.IsAny(), TimeSpan.FromMinutes(5.0)), Times.Once()); diff --git a/src/NzbDrone.Core.Test/IndexerTests/NyaaTests/NyaaFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/NyaaTests/NyaaFixture.cs index eea7d7012..5f42b5012 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/NyaaTests/NyaaFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/NyaaTests/NyaaFixture.cs @@ -1,6 +1,7 @@ using System; using System.Linq; using System.Net.Http; +using System.Threading.Tasks; using FluentAssertions; using Moq; using NUnit.Framework; @@ -58,15 +59,15 @@ namespace NzbDrone.Core.Test.IndexerTests.NyaaTests }*/ [Test] - public void should_parse_2021_recent_feed_from_Nyaa() + public async Task should_parse_2021_recent_feed_from_Nyaa() { var recentFeed = ReadAllText(@"Files/Indexers/Nyaa/Nyaa2021.xml"); Mocker.GetMock() - .Setup(o => o.Execute(It.Is(v => v.Method == HttpMethod.Get))) - .Returns(r => new HttpResponse(r, new HttpHeader(), recentFeed)); + .Setup(o => o.ExecuteAsync(It.Is(v => v.Method == HttpMethod.Get))) + .Returns(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed))); - var releases = Subject.FetchRecent(); + var releases = await Subject.FetchRecent(); releases.Should().HaveCount(3); releases.First().Should().BeOfType(); diff --git a/src/NzbDrone.Core.Test/IndexerTests/SeasonSearchFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/SeasonSearchFixture.cs index 394d01526..28f31e3a7 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/SeasonSearchFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/SeasonSearchFixture.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Net.Http; +using System.Threading.Tasks; using FizzWare.NBuilder; using Moq; using NUnit.Framework; @@ -23,8 +24,8 @@ namespace NzbDrone.Core.Test.IndexerTests _series = Builder.CreateNew().Build(); Mocker.GetMock() - .Setup(o => o.Execute(It.Is(v => v.Method == HttpMethod.Get))) - .Returns(r => new HttpResponse(r, new HttpHeader(), "")); + .Setup(o => o.ExecuteAsync(It.Is(v => v.Method == HttpMethod.Get))) + .Returns(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), ""))); } private void WithIndexer(bool paging, int resultCount) @@ -67,7 +68,7 @@ namespace NzbDrone.Core.Test.IndexerTests Subject.Fetch(new SeasonSearchCriteria { Series = _series, SceneTitles = new List { _series.Title } }); - Mocker.GetMock().Verify(v => v.Execute(It.IsAny()), Times.Once()); + Mocker.GetMock().Verify(v => v.ExecuteAsync(It.IsAny()), Times.Once()); } [Test] @@ -77,7 +78,7 @@ namespace NzbDrone.Core.Test.IndexerTests Subject.Fetch(new SeasonSearchCriteria { Series = _series, SceneTitles = new List { _series.Title } }); - Mocker.GetMock().Verify(v => v.Execute(It.IsAny()), Times.Once()); + Mocker.GetMock().Verify(v => v.ExecuteAsync(It.IsAny()), Times.Once()); } [Test] @@ -87,7 +88,7 @@ namespace NzbDrone.Core.Test.IndexerTests Subject.Fetch(new SeasonSearchCriteria { Series = _series, SceneTitles = new List { _series.Title } }); - Mocker.GetMock().Verify(v => v.Execute(It.IsAny()), Times.Exactly(10)); + Mocker.GetMock().Verify(v => v.ExecuteAsync(It.IsAny()), Times.Exactly(10)); } } } diff --git a/src/NzbDrone.Core.Test/IndexerTests/TorrentRssIndexerTests/TestTorrentRssIndexer.cs b/src/NzbDrone.Core.Test/IndexerTests/TorrentRssIndexerTests/TestTorrentRssIndexer.cs index 17d60e25b..d969c5653 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/TorrentRssIndexerTests/TestTorrentRssIndexer.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/TorrentRssIndexerTests/TestTorrentRssIndexer.cs @@ -21,8 +21,8 @@ namespace NzbDrone.Core.Test.IndexerTests.TorrentRssIndexerTests public List TestPublic() { var result = new List(); - this.SetupNLog(); // Enable this to enable trace logging with nlog for debugging purposes - Test(result); + SetupNLog(); // Enable this to enable trace logging with nlog for debugging purposes + Test(result).GetAwaiter().GetResult(); return result; } diff --git a/src/NzbDrone.Core.Test/IndexerTests/TorrentRssIndexerTests/TorrentRssIndexerFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/TorrentRssIndexerTests/TorrentRssIndexerFixture.cs index 506e8ad18..e25421379 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/TorrentRssIndexerTests/TorrentRssIndexerFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/TorrentRssIndexerTests/TorrentRssIndexerFixture.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Threading.Tasks; using FluentAssertions; using Moq; using NUnit.Framework; @@ -34,17 +35,21 @@ namespace NzbDrone.Core.Test.IndexerTests.TorrentRssIndexerTests { var recentFeed = ReadAllText(@"Files/Indexers/" + rssXmlFile); + Mocker.GetMock() + .Setup(o => o.ExecuteAsync(It.IsAny())) + .Returns(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed))); + Mocker.GetMock() .Setup(o => o.Execute(It.IsAny())) .Returns(r => new HttpResponse(r, new HttpHeader(), recentFeed)); } [Test] - public void should_parse_recent_feed_from_ImmortalSeed() + public async Task should_parse_recent_feed_from_ImmortalSeed() { GivenRecentFeedResponse("TorrentRss/ImmortalSeed.xml"); - var releases = Subject.FetchRecent(); + var releases = await Subject.FetchRecent(); releases.Should().HaveCount(50); releases.First().Should().BeOfType(); @@ -66,11 +71,11 @@ namespace NzbDrone.Core.Test.IndexerTests.TorrentRssIndexerTests } [Test] - public void should_parse_recent_feed_from_Ezrss() + public async Task should_parse_recent_feed_from_Ezrss() { GivenRecentFeedResponse("TorrentRss/Ezrss.xml"); - var releases = Subject.FetchRecent(); + var releases = await Subject.FetchRecent(); releases.Should().HaveCount(3); releases.First().Should().BeOfType(); @@ -92,13 +97,13 @@ namespace NzbDrone.Core.Test.IndexerTests.TorrentRssIndexerTests } [Test] - public void should_parse_recent_feed_from_ShowRSS_info() + public async Task should_parse_recent_feed_from_ShowRSS_info() { Subject.Definition.Settings.As().AllowZeroSize = true; GivenRecentFeedResponse("TorrentRss/ShowRSS.info.xml"); - var releases = Subject.FetchRecent(); + var releases = await Subject.FetchRecent(); releases.Should().HaveCount(5); releases.First().Should().BeOfType(); @@ -120,13 +125,13 @@ namespace NzbDrone.Core.Test.IndexerTests.TorrentRssIndexerTests } [Test] - public void should_parse_recent_feed_from_Doki() + public async Task should_parse_recent_feed_from_Doki() { Subject.Definition.Settings.As().AllowZeroSize = true; GivenRecentFeedResponse("TorrentRss/Doki.xml"); - var releases = Subject.FetchRecent(); + var releases = await Subject.FetchRecent(); releases.Should().HaveCount(5); releases.First().Should().BeOfType(); @@ -148,11 +153,11 @@ namespace NzbDrone.Core.Test.IndexerTests.TorrentRssIndexerTests } [Test] - public void should_parse_recent_feed_from_ExtraTorrents() + public async Task should_parse_recent_feed_from_ExtraTorrents() { GivenRecentFeedResponse("TorrentRss/ExtraTorrents.xml"); - var releases = Subject.FetchRecent(); + var releases = await Subject.FetchRecent(); releases.Should().HaveCount(5); releases.First().Should().BeOfType(); @@ -174,11 +179,11 @@ namespace NzbDrone.Core.Test.IndexerTests.TorrentRssIndexerTests } [Test] - public void should_parse_recent_feed_from_LimeTorrents() + public async Task should_parse_recent_feed_from_LimeTorrents() { GivenRecentFeedResponse("TorrentRss/LimeTorrents.xml"); - var releases = Subject.FetchRecent(); + var releases = await Subject.FetchRecent(); releases.Should().HaveCount(5); releases.First().Should().BeOfType(); @@ -200,11 +205,11 @@ namespace NzbDrone.Core.Test.IndexerTests.TorrentRssIndexerTests } [Test] - public void should_parse_recent_feed_from_AnimeTosho_without_size() + public async Task should_parse_recent_feed_from_AnimeTosho_without_size() { GivenRecentFeedResponse("TorrentRss/AnimeTosho_NoSize.xml"); - var releases = Subject.FetchRecent(); + var releases = await Subject.FetchRecent(); releases.Should().HaveCount(2); releases.First().Should().BeOfType(); @@ -226,11 +231,11 @@ namespace NzbDrone.Core.Test.IndexerTests.TorrentRssIndexerTests } [Test] - public void should_parse_multi_enclosure_from_AnimeTosho() + public async Task should_parse_multi_enclosure_from_AnimeTosho() { GivenRecentFeedResponse("TorrentRss/AnimeTosho_NoSize.xml"); - var releases = Subject.FetchRecent(); + var releases = await Subject.FetchRecent(); releases.Should().HaveCount(2); releases.Last().Should().BeOfType(); @@ -243,11 +248,11 @@ namespace NzbDrone.Core.Test.IndexerTests.TorrentRssIndexerTests } [Test] - public void should_parse_recent_feed_from_AlphaRatio() + public async Task should_parse_recent_feed_from_AlphaRatio() { GivenRecentFeedResponse("TorrentRss/AlphaRatio.xml"); - var releases = Subject.FetchRecent(); + var releases = await Subject.FetchRecent(); releases.Should().HaveCount(2); releases.Last().Should().BeOfType(); @@ -260,12 +265,12 @@ namespace NzbDrone.Core.Test.IndexerTests.TorrentRssIndexerTests } [Test] - public void should_parse_recent_feed_from_EveolutionWorld_without_size() + public async Task should_parse_recent_feed_from_EveolutionWorld_without_size() { Subject.Definition.Settings.As().AllowZeroSize = true; GivenRecentFeedResponse("TorrentRss/EvolutionWorld.xml"); - var releases = Subject.FetchRecent(); + var releases = await Subject.FetchRecent(); releases.Should().HaveCount(2); releases.First().Should().BeOfType(); @@ -287,11 +292,13 @@ namespace NzbDrone.Core.Test.IndexerTests.TorrentRssIndexerTests } [Test] - public void should_record_indexer_failure_if_unsupported_feed() + public async Task should_record_indexer_failure_if_unsupported_feed() { GivenRecentFeedResponse("TorrentRss/invalid/TorrentDay_NoPubDate.xml"); - Subject.FetchRecent().Should().BeEmpty(); + var releases = await Subject.FetchRecent(); + + releases.Should().BeEmpty(); Mocker.GetMock() .Verify(v => v.RecordFailure(It.IsAny(), TimeSpan.Zero), Times.Once()); diff --git a/src/NzbDrone.Core.Test/IndexerTests/TorrentleechTests/TorrentleechFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/TorrentleechTests/TorrentleechFixture.cs index ddbcb635f..8a45d7389 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/TorrentleechTests/TorrentleechFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/TorrentleechTests/TorrentleechFixture.cs @@ -1,6 +1,7 @@ using System; using System.Linq; using System.Net.Http; +using System.Threading.Tasks; using FluentAssertions; using Moq; using NUnit.Framework; @@ -26,15 +27,15 @@ namespace NzbDrone.Core.Test.IndexerTests.TorrentleechTests } [Test] - public void should_parse_recent_feed_from_Torrentleech() + public async Task should_parse_recent_feed_from_Torrentleech() { var recentFeed = ReadAllText(@"Files/Indexers/Torrentleech/Torrentleech.xml"); Mocker.GetMock() - .Setup(o => o.Execute(It.Is(v => v.Method == HttpMethod.Get))) - .Returns(r => new HttpResponse(r, new HttpHeader(), recentFeed)); + .Setup(o => o.ExecuteAsync(It.Is(v => v.Method == HttpMethod.Get))) + .Returns(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed))); - var releases = Subject.FetchRecent(); + var releases = await Subject.FetchRecent(); releases.Should().HaveCount(5); releases.First().Should().BeOfType(); diff --git a/src/NzbDrone.Core.Test/IndexerTests/TorznabTests/TorznabFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/TorznabTests/TorznabFixture.cs index 63f47cf5e..0768e1e6e 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/TorznabTests/TorznabFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/TorznabTests/TorznabFixture.cs @@ -1,6 +1,7 @@ using System; using System.Linq; using System.Net.Http; +using System.Threading.Tasks; using FizzWare.NBuilder; using FluentAssertions; using Moq; @@ -44,15 +45,15 @@ namespace NzbDrone.Core.Test.IndexerTests.TorznabTests } [Test] - public void should_parse_recent_feed_from_torznab_hdaccess_net() + public async Task should_parse_recent_feed_from_torznab_hdaccess_net() { var recentFeed = ReadAllText(@"Files/Indexers/Torznab/torznab_hdaccess_net.xml"); Mocker.GetMock() - .Setup(o => o.Execute(It.Is(v => v.Method == HttpMethod.Get))) - .Returns(r => new HttpResponse(r, new HttpHeader(), recentFeed)); + .Setup(o => o.ExecuteAsync(It.Is(v => v.Method == HttpMethod.Get))) + .Returns(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed))); - var releases = Subject.FetchRecent(); + var releases = await Subject.FetchRecent(); releases.Should().HaveCount(5); @@ -75,15 +76,15 @@ namespace NzbDrone.Core.Test.IndexerTests.TorznabTests } [Test] - public void should_parse_recent_feed_from_torznab_tpb() + public async Task should_parse_recent_feed_from_torznab_tpb() { var recentFeed = ReadAllText(@"Files/Indexers/Torznab/torznab_tpb.xml"); Mocker.GetMock() - .Setup(o => o.Execute(It.Is(v => v.Method == HttpMethod.Get))) - .Returns(r => new HttpResponse(r, new HttpHeader(), recentFeed)); + .Setup(o => o.ExecuteAsync(It.Is(v => v.Method == HttpMethod.Get))) + .Returns(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed))); - var releases = Subject.FetchRecent(); + var releases = await Subject.FetchRecent(); releases.Should().HaveCount(5); @@ -105,15 +106,15 @@ namespace NzbDrone.Core.Test.IndexerTests.TorznabTests } [Test] - public void should_parse_recent_feed_from_torznab_animetosho() + public async Task should_parse_recent_feed_from_torznab_animetosho() { var recentFeed = ReadAllText(@"Files/Indexers/Torznab/torznab_animetosho.xml"); Mocker.GetMock() - .Setup(o => o.Execute(It.Is(v => v.Method == HttpMethod.Get))) - .Returns(r => new HttpResponse(r, new HttpHeader(), recentFeed)); + .Setup(o => o.ExecuteAsync(It.Is(v => v.Method == HttpMethod.Get))) + .Returns(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed))); - var releases = Subject.FetchRecent(); + var releases = await Subject.FetchRecent(); releases.Should().HaveCount(2); @@ -173,8 +174,8 @@ namespace NzbDrone.Core.Test.IndexerTests.TorznabTests (Subject.Definition.Settings as TorznabSettings).BaseUrl = baseUrl; Mocker.GetMock() - .Setup(o => o.Execute(It.Is(v => v.Method == HttpMethod.Get))) - .Returns(r => new HttpResponse(r, new HttpHeader(), recentFeed)); + .Setup(o => o.ExecuteAsync(It.Is(v => v.Method == HttpMethod.Get))) + .Returns(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed))); var result = new NzbDroneValidationResult(Subject.Test()); result.IsValid.Should().BeTrue(); @@ -188,8 +189,8 @@ namespace NzbDrone.Core.Test.IndexerTests.TorznabTests var recentFeed = ReadAllText(@"Files/Indexers/Torznab/torznab_tpb.xml"); Mocker.GetMock() - .Setup(o => o.Execute(It.Is(v => v.Method == HttpMethod.Get))) - .Returns(r => new HttpResponse(r, new HttpHeader(), recentFeed)); + .Setup(o => o.ExecuteAsync(It.Is(v => v.Method == HttpMethod.Get))) + .Returns(r => Task.FromResult(new HttpResponse(r, new HttpHeader(), recentFeed))); (Subject.Definition.Settings as TorznabSettings).ApiPath = apiPath; diff --git a/src/NzbDrone.Core/Download/Clients/Pneumatic/Pneumatic.cs b/src/NzbDrone.Core/Download/Clients/Pneumatic/Pneumatic.cs index 4a2ba37b9..f531778d1 100644 --- a/src/NzbDrone.Core/Download/Clients/Pneumatic/Pneumatic.cs +++ b/src/NzbDrone.Core/Download/Clients/Pneumatic/Pneumatic.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Threading.Tasks; using FluentValidation.Results; using NLog; using NzbDrone.Common.Disk; @@ -32,7 +33,7 @@ namespace NzbDrone.Core.Download.Clients.Pneumatic public override DownloadProtocol Protocol => DownloadProtocol.Usenet; - public override string Download(RemoteEpisode remoteEpisode, IIndexer indexer) + public override async Task Download(RemoteEpisode remoteEpisode, IIndexer indexer) { var url = remoteEpisode.Release.DownloadUrl; var title = remoteEpisode.Release.Title; @@ -48,7 +49,7 @@ namespace NzbDrone.Core.Download.Clients.Pneumatic var nzbFile = Path.Combine(Settings.NzbFolder, title + ".nzb"); _logger.Debug("Downloading NZB from: {0} to: {1}", url, nzbFile); - _httpClient.DownloadFile(url, nzbFile); + await _httpClient.DownloadFileAsync(url, nzbFile); _logger.Debug("NZB Download succeeded, saved to: {0}", nzbFile); diff --git a/src/NzbDrone.Core/Download/DownloadClientBase.cs b/src/NzbDrone.Core/Download/DownloadClientBase.cs index 985a918b7..c87e30fc0 100644 --- a/src/NzbDrone.Core/Download/DownloadClientBase.cs +++ b/src/NzbDrone.Core/Download/DownloadClientBase.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Threading.Tasks; using FluentValidation.Results; using NLog; using NzbDrone.Common.Disk; @@ -58,7 +59,7 @@ namespace NzbDrone.Core.Download get; } - public abstract string Download(RemoteEpisode remoteEpisode, IIndexer indexer); + public abstract Task Download(RemoteEpisode remoteEpisode, IIndexer indexer); public abstract IEnumerable GetItems(); public virtual DownloadClientItem GetImportItem(DownloadClientItem item, DownloadClientItem previousImportAttempt) diff --git a/src/NzbDrone.Core/Download/DownloadService.cs b/src/NzbDrone.Core/Download/DownloadService.cs index d07041ad5..3032f4394 100644 --- a/src/NzbDrone.Core/Download/DownloadService.cs +++ b/src/NzbDrone.Core/Download/DownloadService.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using NLog; using NzbDrone.Common.EnsureThat; using NzbDrone.Common.Extensions; @@ -16,7 +17,7 @@ namespace NzbDrone.Core.Download { public interface IDownloadService { - void DownloadReport(RemoteEpisode remoteEpisode, int? downloadClientId); + Task DownloadReport(RemoteEpisode remoteEpisode, int? downloadClientId); } public class DownloadService : IDownloadService @@ -49,7 +50,7 @@ namespace NzbDrone.Core.Download _logger = logger; } - public void DownloadReport(RemoteEpisode remoteEpisode, int? downloadClientId) + public async Task DownloadReport(RemoteEpisode remoteEpisode, int? downloadClientId) { var filterBlockedClients = remoteEpisode.Release.PendingReleaseReason == PendingReleaseReason.DownloadClientUnavailable; @@ -59,10 +60,10 @@ namespace NzbDrone.Core.Download ? _downloadClientProvider.Get(downloadClientId.Value) : _downloadClientProvider.GetDownloadClient(remoteEpisode.Release.DownloadProtocol, remoteEpisode.Release.IndexerId, filterBlockedClients, tags); - DownloadReport(remoteEpisode, downloadClient); + await DownloadReport(remoteEpisode, downloadClient); } - private void DownloadReport(RemoteEpisode remoteEpisode, IDownloadClient downloadClient) + private async Task DownloadReport(RemoteEpisode remoteEpisode, IDownloadClient downloadClient) { Ensure.That(remoteEpisode.Series, () => remoteEpisode.Series).IsNotNull(); Ensure.That(remoteEpisode.Episodes, () => remoteEpisode.Episodes).HasItems(); @@ -81,7 +82,7 @@ namespace NzbDrone.Core.Download if (remoteEpisode.Release.DownloadUrl.IsNotNullOrWhiteSpace() && !remoteEpisode.Release.DownloadUrl.StartsWith("magnet:")) { var url = new HttpUri(remoteEpisode.Release.DownloadUrl); - _rateLimitService.WaitAndPulse(url.Host, TimeSpan.FromSeconds(2)); + await _rateLimitService.WaitAndPulseAsync(url.Host, TimeSpan.FromSeconds(2)); } IIndexer indexer = null; @@ -94,7 +95,7 @@ namespace NzbDrone.Core.Download string downloadClientId; try { - downloadClientId = downloadClient.Download(remoteEpisode, indexer); + downloadClientId = await downloadClient.Download(remoteEpisode, indexer); _downloadClientStatusService.RecordSuccess(downloadClient.Definition.Id); _indexerStatusService.RecordSuccess(remoteEpisode.Release.IndexerId); } diff --git a/src/NzbDrone.Core/Download/IDownloadClient.cs b/src/NzbDrone.Core/Download/IDownloadClient.cs index 262591ebc..34899c5c8 100644 --- a/src/NzbDrone.Core/Download/IDownloadClient.cs +++ b/src/NzbDrone.Core/Download/IDownloadClient.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Threading.Tasks; using NzbDrone.Core.Indexers; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.ThingiProvider; @@ -8,7 +9,7 @@ namespace NzbDrone.Core.Download public interface IDownloadClient : IProvider { DownloadProtocol Protocol { get; } - string Download(RemoteEpisode remoteEpisode, IIndexer indexer); + Task Download(RemoteEpisode remoteEpisode, IIndexer indexer); IEnumerable GetItems(); DownloadClientItem GetImportItem(DownloadClientItem item, DownloadClientItem previousImportAttempt); void RemoveItem(DownloadClientItem item, bool deleteData); diff --git a/src/NzbDrone.Core/Download/ProcessDownloadDecisions.cs b/src/NzbDrone.Core/Download/ProcessDownloadDecisions.cs index 0eb26c2ec..3cab28655 100644 --- a/src/NzbDrone.Core/Download/ProcessDownloadDecisions.cs +++ b/src/NzbDrone.Core/Download/ProcessDownloadDecisions.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using NLog; using NzbDrone.Core.DecisionEngine; using NzbDrone.Core.Download.Clients; @@ -12,7 +13,7 @@ namespace NzbDrone.Core.Download { public interface IProcessDownloadDecisions { - ProcessedDecisions ProcessDecisions(List decisions); + Task ProcessDecisions(List decisions); } public class ProcessDownloadDecisions : IProcessDownloadDecisions @@ -33,7 +34,7 @@ namespace NzbDrone.Core.Download _logger = logger; } - public ProcessedDecisions ProcessDecisions(List decisions) + public async Task ProcessDecisions(List decisions) { var qualifiedReports = GetQualifiedReports(decisions); var prioritizedDecisions = _prioritizeDownloadDecision.PrioritizeDecisions(qualifiedReports); @@ -73,7 +74,7 @@ namespace NzbDrone.Core.Download try { _logger.Trace("Grabbing from Indexer {0} at priority {1}.", remoteEpisode.Release.Indexer, remoteEpisode.Release.IndexerPriority); - _downloadService.DownloadReport(remoteEpisode, null); + await _downloadService.DownloadReport(remoteEpisode, null); grabbed.Add(report); } catch (ReleaseUnavailableException) diff --git a/src/NzbDrone.Core/Download/TorrentClientBase.cs b/src/NzbDrone.Core/Download/TorrentClientBase.cs index 9dc903a25..a1e921872 100644 --- a/src/NzbDrone.Core/Download/TorrentClientBase.cs +++ b/src/NzbDrone.Core/Download/TorrentClientBase.cs @@ -1,5 +1,6 @@ using System; using System.Net; +using System.Threading.Tasks; using MonoTorrent; using NLog; using NzbDrone.Common.Disk; @@ -41,7 +42,7 @@ namespace NzbDrone.Core.Download protected abstract string AddFromMagnetLink(RemoteEpisode remoteEpisode, string hash, string magnetLink); protected abstract string AddFromTorrentFile(RemoteEpisode remoteEpisode, string hash, string filename, byte[] fileContent); - public override string Download(RemoteEpisode remoteEpisode, IIndexer indexer) + public override async Task Download(RemoteEpisode remoteEpisode, IIndexer indexer) { var torrentInfo = remoteEpisode.Release as TorrentInfo; @@ -68,7 +69,7 @@ namespace NzbDrone.Core.Download { try { - return DownloadFromWebUrl(remoteEpisode, indexer, torrentUrl); + return await DownloadFromWebUrl(remoteEpisode, indexer, torrentUrl); } catch (Exception ex) { @@ -114,14 +115,14 @@ namespace NzbDrone.Core.Download if (torrentUrl.IsNotNullOrWhiteSpace()) { - return DownloadFromWebUrl(remoteEpisode, indexer, torrentUrl); + return await DownloadFromWebUrl(remoteEpisode, indexer, torrentUrl); } } return null; } - private string DownloadFromWebUrl(RemoteEpisode remoteEpisode, IIndexer indexer, string torrentUrl) + private async Task DownloadFromWebUrl(RemoteEpisode remoteEpisode, IIndexer indexer, string torrentUrl) { byte[] torrentFile = null; @@ -132,7 +133,7 @@ namespace NzbDrone.Core.Download request.Headers.Accept = "application/x-bittorrent"; request.AllowAutoRedirect = false; - var response = _httpClient.Get(request); + var response = await _httpClient.GetAsync(request); if (response.StatusCode == HttpStatusCode.MovedPermanently || response.StatusCode == HttpStatusCode.Found || @@ -151,7 +152,7 @@ namespace NzbDrone.Core.Download request.Url += new HttpUri(locationHeader); - return DownloadFromWebUrl(remoteEpisode, indexer, request.Url.ToString()); + return await DownloadFromWebUrl(remoteEpisode, indexer, request.Url.ToString()); } throw new WebException("Remote website tried to redirect without providing a location."); diff --git a/src/NzbDrone.Core/Download/UsenetClientBase.cs b/src/NzbDrone.Core/Download/UsenetClientBase.cs index 8bd815201..319f3ad5a 100644 --- a/src/NzbDrone.Core/Download/UsenetClientBase.cs +++ b/src/NzbDrone.Core/Download/UsenetClientBase.cs @@ -1,4 +1,5 @@ using System.Net; +using System.Threading.Tasks; using NLog; using NzbDrone.Common.Disk; using NzbDrone.Common.Http; @@ -34,7 +35,7 @@ namespace NzbDrone.Core.Download protected abstract string AddFromNzbFile(RemoteEpisode remoteEpisode, string filename, byte[] fileContent); - public override string Download(RemoteEpisode remoteEpisode, IIndexer indexer) + public override async Task Download(RemoteEpisode remoteEpisode, IIndexer indexer) { var url = remoteEpisode.Release.DownloadUrl; var filename = FileNameBuilder.CleanFileName(remoteEpisode.Release.Title) + ".nzb"; @@ -45,7 +46,10 @@ namespace NzbDrone.Core.Download { var request = indexer?.GetDownloadRequest(url) ?? new HttpRequest(url); request.RateLimitKey = remoteEpisode?.Release?.IndexerId.ToString(); - nzbData = _httpClient.Get(request).ResponseData; + + var response = await _httpClient.GetAsync(request); + + nzbData = response.ResponseData; _logger.Debug("Downloaded nzb for episode '{0}' finished ({1} bytes from {2})", remoteEpisode.Release.Title, nzbData.Length, url); } diff --git a/src/NzbDrone.Core/IndexerSearch/EpisodeSearchService.cs b/src/NzbDrone.Core/IndexerSearch/EpisodeSearchService.cs index 13883ed0b..b4ee4932f 100644 --- a/src/NzbDrone.Core/IndexerSearch/EpisodeSearchService.cs +++ b/src/NzbDrone.Core/IndexerSearch/EpisodeSearchService.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using NLog; using NzbDrone.Common.Extensions; using NzbDrone.Common.Instrumentation.Extensions; @@ -39,7 +40,7 @@ namespace NzbDrone.Core.IndexerSearch _logger = logger; } - private void SearchForBulkEpisodes(List episodes, bool monitoredOnly, bool userInvokedSearch) + private async Task SearchForBulkEpisodes(List episodes, bool monitoredOnly, bool userInvokedSearch) { _logger.ProgressInfo("Performing search for {0} episodes", episodes.Count); var downloadedCount = 0; @@ -70,7 +71,7 @@ namespace NzbDrone.Core.IndexerSearch { try { - decisions = _releaseSearchService.SeasonSearch(seriesId, seasonNumber, groupEpisodes, monitoredOnly, userInvokedSearch, false); + decisions = await _releaseSearchService.SeasonSearch(seriesId, seasonNumber, groupEpisodes, monitoredOnly, userInvokedSearch, false); } catch (Exception ex) { @@ -84,7 +85,7 @@ namespace NzbDrone.Core.IndexerSearch try { - decisions = _releaseSearchService.EpisodeSearch(episode, userInvokedSearch, false); + decisions = await _releaseSearchService.EpisodeSearch(episode, userInvokedSearch, false); } catch (Exception ex) { @@ -93,7 +94,7 @@ namespace NzbDrone.Core.IndexerSearch } } - var processed = _processDownloadDecisions.ProcessDecisions(decisions); + var processed = await _processDownloadDecisions.ProcessDecisions(decisions); downloadedCount += processed.Grabbed.Count; } @@ -110,8 +111,8 @@ namespace NzbDrone.Core.IndexerSearch { foreach (var episodeId in message.EpisodeIds) { - var decisions = _releaseSearchService.EpisodeSearch(episodeId, message.Trigger == CommandTrigger.Manual, false); - var processed = _processDownloadDecisions.ProcessDecisions(decisions); + var decisions = _releaseSearchService.EpisodeSearch(episodeId, message.Trigger == CommandTrigger.Manual, false).GetAwaiter().GetResult(); + var processed = _processDownloadDecisions.ProcessDecisions(decisions).GetAwaiter().GetResult(); _logger.ProgressInfo("Episode search completed. {0} reports downloaded.", processed.Grabbed.Count); } @@ -156,7 +157,7 @@ namespace NzbDrone.Core.IndexerSearch var queue = _queueService.GetQueue().Where(q => q.Episode != null).Select(q => q.Episode.Id); var missing = episodes.Where(e => !queue.Contains(e.Id)).ToList(); - SearchForBulkEpisodes(missing, monitored, message.Trigger == CommandTrigger.Manual); + SearchForBulkEpisodes(missing, monitored, message.Trigger == CommandTrigger.Manual).GetAwaiter().GetResult(); } public void Execute(CutoffUnmetEpisodeSearchCommand message) @@ -190,7 +191,7 @@ namespace NzbDrone.Core.IndexerSearch var queue = _queueService.GetQueue().Where(q => q.Episode != null).Select(q => q.Episode.Id); var cutoffUnmet = episodes.Where(e => !queue.Contains(e.Id)).ToList(); - SearchForBulkEpisodes(cutoffUnmet, monitored, message.Trigger == CommandTrigger.Manual); + SearchForBulkEpisodes(cutoffUnmet, monitored, message.Trigger == CommandTrigger.Manual).GetAwaiter().GetResult(); } } } diff --git a/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs b/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs index 6b7de029a..de905efed 100644 --- a/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs +++ b/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs @@ -6,7 +6,6 @@ using System.Threading.Tasks; using NLog; using NzbDrone.Common.Extensions; using NzbDrone.Common.Instrumentation.Extensions; -using NzbDrone.Common.TPL; using NzbDrone.Core.DataAugmentation.Scene; using NzbDrone.Core.DecisionEngine; using NzbDrone.Core.Exceptions; @@ -20,10 +19,10 @@ namespace NzbDrone.Core.IndexerSearch { public interface ISearchForReleases { - List EpisodeSearch(int episodeId, bool userInvokedSearch, bool interactiveSearch); - List EpisodeSearch(Episode episode, bool userInvokedSearch, bool interactiveSearch); - List SeasonSearch(int seriesId, int seasonNumber, bool missingOnly, bool monitoredOnly, bool userInvokedSearch, bool interactiveSearch); - List SeasonSearch(int seriesId, int seasonNumber, List episodes, bool monitoredOnly, bool userInvokedSearch, bool interactiveSearch); + Task> EpisodeSearch(int episodeId, bool userInvokedSearch, bool interactiveSearch); + Task> EpisodeSearch(Episode episode, bool userInvokedSearch, bool interactiveSearch); + Task> SeasonSearch(int seriesId, int seasonNumber, bool missingOnly, bool monitoredOnly, bool userInvokedSearch, bool interactiveSearch); + Task> SeasonSearch(int seriesId, int seasonNumber, List episodes, bool monitoredOnly, bool userInvokedSearch, bool interactiveSearch); } public class ReleaseSearchService : ISearchForReleases @@ -50,14 +49,14 @@ namespace NzbDrone.Core.IndexerSearch _logger = logger; } - public List EpisodeSearch(int episodeId, bool userInvokedSearch, bool interactiveSearch) + public async Task> EpisodeSearch(int episodeId, bool userInvokedSearch, bool interactiveSearch) { var episode = _episodeService.GetEpisode(episodeId); - return EpisodeSearch(episode, userInvokedSearch, interactiveSearch); + return await EpisodeSearch(episode, userInvokedSearch, interactiveSearch); } - public List EpisodeSearch(Episode episode, bool userInvokedSearch, bool interactiveSearch) + public async Task> EpisodeSearch(Episode episode, bool userInvokedSearch, bool interactiveSearch) { var series = _seriesService.GetSeries(episode.SeriesId); @@ -69,7 +68,7 @@ namespace NzbDrone.Core.IndexerSearch throw new SearchFailedException("Air date is missing"); } - return SearchDaily(series, episode, false, userInvokedSearch, interactiveSearch); + return await SearchDaily(series, episode, false, userInvokedSearch, interactiveSearch); } if (series.SeriesType == SeriesTypes.Anime) @@ -79,22 +78,22 @@ namespace NzbDrone.Core.IndexerSearch episode.AbsoluteEpisodeNumber == null) { // Search for special episodes in season 0 that don't have absolute episode numbers - return SearchSpecial(series, new List { episode }, false, userInvokedSearch, interactiveSearch); + return await SearchSpecial(series, new List { episode }, false, userInvokedSearch, interactiveSearch); } - return SearchAnime(series, episode, false, userInvokedSearch, interactiveSearch); + return await SearchAnime(series, episode, false, userInvokedSearch, interactiveSearch); } if (episode.SeasonNumber == 0) { // Search for special episodes in season 0 - return SearchSpecial(series, new List { episode }, false, userInvokedSearch, interactiveSearch); + return await SearchSpecial(series, new List { episode }, false, userInvokedSearch, interactiveSearch); } - return SearchSingle(series, episode, false, userInvokedSearch, interactiveSearch); + return await SearchSingle(series, episode, false, userInvokedSearch, interactiveSearch); } - public List SeasonSearch(int seriesId, int seasonNumber, bool missingOnly, bool monitoredOnly, bool userInvokedSearch, bool interactiveSearch) + public async Task> SeasonSearch(int seriesId, int seasonNumber, bool missingOnly, bool monitoredOnly, bool userInvokedSearch, bool interactiveSearch) { var episodes = _episodeService.GetEpisodesBySeason(seriesId, seasonNumber); @@ -103,21 +102,21 @@ namespace NzbDrone.Core.IndexerSearch episodes = episodes.Where(e => !e.HasFile).ToList(); } - return SeasonSearch(seriesId, seasonNumber, episodes, monitoredOnly, userInvokedSearch, interactiveSearch); + return await SeasonSearch(seriesId, seasonNumber, episodes, monitoredOnly, userInvokedSearch, interactiveSearch); } - public List SeasonSearch(int seriesId, int seasonNumber, List episodes, bool monitoredOnly, bool userInvokedSearch, bool interactiveSearch) + public async Task> SeasonSearch(int seriesId, int seasonNumber, List episodes, bool monitoredOnly, bool userInvokedSearch, bool interactiveSearch) { var series = _seriesService.GetSeries(seriesId); if (series.SeriesType == SeriesTypes.Anime) { - return SearchAnimeSeason(series, episodes, monitoredOnly, userInvokedSearch, interactiveSearch); + return await SearchAnimeSeason(series, episodes, monitoredOnly, userInvokedSearch, interactiveSearch); } if (series.SeriesType == SeriesTypes.Daily) { - return SearchDailySeason(series, episodes, monitoredOnly, userInvokedSearch, interactiveSearch); + return await SearchDailySeason(series, episodes, monitoredOnly, userInvokedSearch, interactiveSearch); } var mappings = GetSceneSeasonMappings(series, episodes); @@ -129,7 +128,7 @@ namespace NzbDrone.Core.IndexerSearch if (mapping.SeasonNumber == 0) { // search for special episodes in season 0 - downloadDecisions.AddRange(SearchSpecial(series, mapping.Episodes, monitoredOnly, userInvokedSearch, interactiveSearch)); + downloadDecisions.AddRange(await SearchSpecial(series, mapping.Episodes, monitoredOnly, userInvokedSearch, interactiveSearch)); continue; } @@ -139,7 +138,7 @@ namespace NzbDrone.Core.IndexerSearch searchSpec.SeasonNumber = mapping.SeasonNumber; searchSpec.EpisodeNumber = mapping.EpisodeMapping.EpisodeNumber; - var decisions = Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec); + var decisions = await Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec); downloadDecisions.AddRange(decisions); } else @@ -147,7 +146,7 @@ namespace NzbDrone.Core.IndexerSearch var searchSpec = Get(series, mapping, monitoredOnly, userInvokedSearch, interactiveSearch); searchSpec.SeasonNumber = mapping.SeasonNumber; - var decisions = Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec); + var decisions = await Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec); downloadDecisions.AddRange(decisions); } } @@ -315,7 +314,7 @@ namespace NzbDrone.Core.IndexerSearch } } - private List SearchSingle(Series series, Episode episode, bool monitoredOnly, bool userInvokedSearch, bool interactiveSearch) + private async Task> SearchSingle(Series series, Episode episode, bool monitoredOnly, bool userInvokedSearch, bool interactiveSearch) { var mappings = GetSceneEpisodeMappings(series, episode); @@ -327,23 +326,23 @@ namespace NzbDrone.Core.IndexerSearch searchSpec.SeasonNumber = mapping.SeasonNumber; searchSpec.EpisodeNumber = mapping.EpisodeNumber; - var decisions = Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec); + var decisions = await Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec); downloadDecisions.AddRange(decisions); } return DeDupeDecisions(downloadDecisions); } - private List SearchDaily(Series series, Episode episode, bool monitoredOnly, bool userInvokedSearch, bool interactiveSearch) + private async Task> SearchDaily(Series series, Episode episode, bool monitoredOnly, bool userInvokedSearch, bool interactiveSearch) { var airDate = DateTime.ParseExact(episode.AirDate, Episode.AIR_DATE_FORMAT, CultureInfo.InvariantCulture); var searchSpec = Get(series, new List { episode }, monitoredOnly, userInvokedSearch, interactiveSearch); searchSpec.AirDate = airDate; - return Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec); + return await Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec); } - private List SearchAnime(Series series, Episode episode, bool monitoredOnly, bool userInvokedSearch, bool interactiveSearch, bool isSeasonSearch = false) + private async Task> SearchAnime(Series series, Episode episode, bool monitoredOnly, bool userInvokedSearch, bool interactiveSearch, bool isSeasonSearch = false) { var searchSpec = Get(series, new List { episode }, monitoredOnly, userInvokedSearch, interactiveSearch); @@ -353,10 +352,10 @@ namespace NzbDrone.Core.IndexerSearch searchSpec.EpisodeNumber = episode.SceneEpisodeNumber ?? episode.EpisodeNumber; searchSpec.AbsoluteEpisodeNumber = episode.SceneAbsoluteEpisodeNumber ?? episode.AbsoluteEpisodeNumber ?? 0; - return Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec); + return await Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec); } - private List SearchSpecial(Series series, List episodes, bool monitoredOnly, bool userInvokedSearch, bool interactiveSearch) + private async Task> SearchSpecial(Series series, List episodes, bool monitoredOnly, bool userInvokedSearch, bool interactiveSearch) { var downloadDecisions = new List(); @@ -367,7 +366,7 @@ namespace NzbDrone.Core.IndexerSearch .SelectMany(e => searchSpec.CleanSceneTitles.Select(title => title + " " + SearchCriteriaBase.GetCleanSceneTitle(e.Title))) .ToArray(); - downloadDecisions.AddRange(Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec)); + downloadDecisions.AddRange(await Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec)); // Search for each episode by season/episode number as well foreach (var episode in episodes) @@ -378,13 +377,13 @@ namespace NzbDrone.Core.IndexerSearch continue; } - downloadDecisions.AddRange(SearchSingle(series, episode, monitoredOnly, userInvokedSearch, interactiveSearch)); + downloadDecisions.AddRange(await SearchSingle(series, episode, monitoredOnly, userInvokedSearch, interactiveSearch)); } return DeDupeDecisions(downloadDecisions); } - private List SearchAnimeSeason(Series series, List episodes, bool monitoredOnly, bool userInvokedSearch, bool interactiveSearch) + private async Task> SearchAnimeSeason(Series series, List episodes, bool monitoredOnly, bool userInvokedSearch, bool interactiveSearch) { var downloadDecisions = new List(); @@ -406,19 +405,19 @@ namespace NzbDrone.Core.IndexerSearch { searchSpec.SeasonNumber = season.SeasonNumber; - var decisions = Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec); + var decisions = await Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec); downloadDecisions.AddRange(decisions); } foreach (var episode in episodesToSearch) { - downloadDecisions.AddRange(SearchAnime(series, episode, monitoredOnly, userInvokedSearch, interactiveSearch, true)); + downloadDecisions.AddRange(await SearchAnime(series, episode, monitoredOnly, userInvokedSearch, interactiveSearch, true)); } return DeDupeDecisions(downloadDecisions); } - private List SearchDailySeason(Series series, List episodes, bool monitoredOnly, bool userInvokedSearch, bool interactiveSearch) + private async Task> SearchDailySeason(Series series, List episodes, bool monitoredOnly, bool userInvokedSearch, bool interactiveSearch) { var downloadDecisions = new List(); @@ -438,11 +437,11 @@ namespace NzbDrone.Core.IndexerSearch var searchSpec = Get(series, yearEpisodes, monitoredOnly, userInvokedSearch, interactiveSearch); searchSpec.Year = yearGroup.Key; - downloadDecisions.AddRange(Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec)); + downloadDecisions.AddRange(await Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec)); } else { - downloadDecisions.AddRange(SearchDaily(series, yearEpisodes.First(), monitoredOnly, userInvokedSearch, interactiveSearch)); + downloadDecisions.AddRange(await SearchDaily(series, yearEpisodes.First(), monitoredOnly, userInvokedSearch, interactiveSearch)); } } @@ -506,7 +505,7 @@ namespace NzbDrone.Core.IndexerSearch return spec; } - private List Dispatch(Func> searchAction, SearchCriteriaBase criteriaBase) + private async Task> Dispatch(Func>> searchAction, SearchCriteriaBase criteriaBase) { var indexers = criteriaBase.InteractiveSearch ? _indexerFactory.InteractiveSearchEnabled() : @@ -515,36 +514,13 @@ namespace NzbDrone.Core.IndexerSearch // Filter indexers to untagged indexers and indexers with intersecting tags indexers = indexers.Where(i => i.Definition.Tags.Empty() || i.Definition.Tags.Intersect(criteriaBase.Series.Tags).Any()).ToList(); - var reports = new List(); - _logger.ProgressInfo("Searching indexers for {0}. {1} active indexers", criteriaBase, indexers.Count); - var taskList = new List(); - var taskFactory = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.None); + var tasks = indexers.Select(indexer => DispatchIndexer(searchAction, indexer, criteriaBase)); - foreach (var indexer in indexers) - { - var indexerLocal = indexer; + var batch = await Task.WhenAll(tasks); - taskList.Add(taskFactory.StartNew(() => - { - try - { - var indexerReports = searchAction(indexerLocal); - - lock (reports) - { - reports.AddRange(indexerReports); - } - } - catch (Exception e) - { - _logger.Error(e, "Error while searching for {0}", criteriaBase); - } - }).LogExceptions()); - } - - Task.WaitAll(taskList.ToArray()); + var reports = batch.SelectMany(x => x).ToList(); _logger.Debug("Total of {0} reports were found for {1} from {2} indexers", reports.Count, criteriaBase, indexers.Count); @@ -561,6 +537,20 @@ namespace NzbDrone.Core.IndexerSearch return _makeDownloadDecision.GetSearchDecision(reports, criteriaBase).ToList(); } + private async Task> DispatchIndexer(Func>> searchAction, IIndexer indexer, SearchCriteriaBase criteriaBase) + { + try + { + return await searchAction(indexer); + } + catch (Exception ex) + { + _logger.Error(ex, "Error while searching for {0}", criteriaBase); + } + + return Array.Empty(); + } + private List DeDupeDecisions(List decisions) { // De-dupe reports by guid so duplicate results aren't returned. Pick the one with the least rejections and higher indexer priority. diff --git a/src/NzbDrone.Core/IndexerSearch/SeasonSearchService.cs b/src/NzbDrone.Core/IndexerSearch/SeasonSearchService.cs index bfd4d2b1c..1a2b76f7a 100644 --- a/src/NzbDrone.Core/IndexerSearch/SeasonSearchService.cs +++ b/src/NzbDrone.Core/IndexerSearch/SeasonSearchService.cs @@ -22,8 +22,8 @@ namespace NzbDrone.Core.IndexerSearch public void Execute(SeasonSearchCommand message) { - var decisions = _releaseSearchService.SeasonSearch(message.SeriesId, message.SeasonNumber, false, true, message.Trigger == CommandTrigger.Manual, false); - var processed = _processDownloadDecisions.ProcessDecisions(decisions); + var decisions = _releaseSearchService.SeasonSearch(message.SeriesId, message.SeasonNumber, false, true, message.Trigger == CommandTrigger.Manual, false).GetAwaiter().GetResult(); + var processed = _processDownloadDecisions.ProcessDecisions(decisions).GetAwaiter().GetResult(); _logger.ProgressInfo("Season search completed. {0} reports downloaded.", processed.Grabbed.Count); } diff --git a/src/NzbDrone.Core/IndexerSearch/SeriesSearchService.cs b/src/NzbDrone.Core/IndexerSearch/SeriesSearchService.cs index 86db0dae1..4f4f6b9ad 100644 --- a/src/NzbDrone.Core/IndexerSearch/SeriesSearchService.cs +++ b/src/NzbDrone.Core/IndexerSearch/SeriesSearchService.cs @@ -49,8 +49,9 @@ namespace NzbDrone.Core.IndexerSearch foreach (var episode in episodes) { - var decisions = _releaseSearchService.EpisodeSearch(episode, userInvokedSearch, false); - downloadedCount += _processDownloadDecisions.ProcessDecisions(decisions).Grabbed.Count; + var decisions = _releaseSearchService.EpisodeSearch(episode, userInvokedSearch, false).GetAwaiter().GetResult(); + var processDecisions = _processDownloadDecisions.ProcessDecisions(decisions).GetAwaiter().GetResult(); + downloadedCount += processDecisions.Grabbed.Count; } } else @@ -63,8 +64,9 @@ namespace NzbDrone.Core.IndexerSearch continue; } - var decisions = _releaseSearchService.SeasonSearch(message.SeriesId, season.SeasonNumber, false, true, userInvokedSearch, false); - downloadedCount += _processDownloadDecisions.ProcessDecisions(decisions).Grabbed.Count; + var decisions = _releaseSearchService.SeasonSearch(message.SeriesId, season.SeasonNumber, false, true, userInvokedSearch, false).GetAwaiter().GetResult(); + var processDecisions = _processDownloadDecisions.ProcessDecisions(decisions).GetAwaiter().GetResult(); + downloadedCount += processDecisions.Grabbed.Count; } } diff --git a/src/NzbDrone.Core/Indexers/FetchAndParseRssService.cs b/src/NzbDrone.Core/Indexers/FetchAndParseRssService.cs index 460f63e13..373e6998a 100644 --- a/src/NzbDrone.Core/Indexers/FetchAndParseRssService.cs +++ b/src/NzbDrone.Core/Indexers/FetchAndParseRssService.cs @@ -3,13 +3,12 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using NLog; -using NzbDrone.Common.TPL; using NzbDrone.Core.Parser.Model; namespace NzbDrone.Core.Indexers { public interface IFetchAndParseRss { - List Fetch(); + Task> Fetch(); } public class FetchAndParseRssService : IFetchAndParseRss @@ -23,54 +22,42 @@ namespace NzbDrone.Core.Indexers _logger = logger; } - public List Fetch() + public async Task> Fetch() { - var result = new List(); - var indexers = _indexerFactory.RssEnabled(); if (!indexers.Any()) { _logger.Warn("No available indexers. check your configuration."); - return result; + + return new List(); } _logger.Debug("Available indexers {0}", indexers.Count); - var taskList = new List(); - var taskFactory = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.None); + var tasks = indexers.Select(FetchIndexer); - foreach (var indexer in indexers) - { - var indexerLocal = indexer; + var batch = await Task.WhenAll(tasks); - var task = taskFactory.StartNew(() => - { - try - { - var indexerReports = indexerLocal.FetchRecent(); - - lock (result) - { - _logger.Debug("Found {0} from {1}", indexerReports.Count, indexer.Name); - - result.AddRange(indexerReports); - } - } - catch (Exception e) - { - _logger.Error(e, "Error during RSS Sync"); - } - }).LogExceptions(); - - taskList.Add(task); - } - - Task.WaitAll(taskList.ToArray()); + var result = batch.SelectMany(x => x).ToList(); _logger.Debug("Found {0} reports", result.Count); return result; } + + private async Task> FetchIndexer(IIndexer indexer) + { + try + { + return await indexer.FetchRecent(); + } + catch (Exception ex) + { + _logger.Error(ex, "Error during RSS Sync"); + } + + return Array.Empty(); + } } } diff --git a/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs b/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs index cc33df756..f22b1d223 100644 --- a/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs +++ b/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs @@ -40,81 +40,81 @@ namespace NzbDrone.Core.Indexers _httpClient = httpClient; } - public override IList FetchRecent() + public override Task> FetchRecent() { if (!SupportsRss) { - return Array.Empty(); + return Task.FromResult>(Array.Empty()); } return FetchReleases(g => g.GetRecentRequests(), true); } - public override IList Fetch(SingleEpisodeSearchCriteria searchCriteria) + public override Task> Fetch(SingleEpisodeSearchCriteria searchCriteria) { if (!SupportsSearch) { - return Array.Empty(); + return Task.FromResult>(Array.Empty()); } return FetchReleases(g => g.GetSearchRequests(searchCriteria)); } - public override IList Fetch(SeasonSearchCriteria searchCriteria) + public override Task> Fetch(SeasonSearchCriteria searchCriteria) { if (!SupportsSearch) { - return Array.Empty(); + return Task.FromResult>(Array.Empty()); } return FetchReleases(g => g.GetSearchRequests(searchCriteria)); } - public override IList Fetch(DailyEpisodeSearchCriteria searchCriteria) + public override Task> Fetch(DailyEpisodeSearchCriteria searchCriteria) { if (!SupportsSearch) { - return Array.Empty(); + return Task.FromResult>(Array.Empty()); } return FetchReleases(g => g.GetSearchRequests(searchCriteria)); } - public override IList Fetch(DailySeasonSearchCriteria searchCriteria) + public override Task> Fetch(DailySeasonSearchCriteria searchCriteria) { if (!SupportsSearch) { - return Array.Empty(); + return Task.FromResult>(Array.Empty()); } return FetchReleases(g => g.GetSearchRequests(searchCriteria)); } - public override IList Fetch(AnimeEpisodeSearchCriteria searchCriteria) + public override Task> Fetch(AnimeEpisodeSearchCriteria searchCriteria) { if (!SupportsSearch) { - return Array.Empty(); + return Task.FromResult>(Array.Empty()); } return FetchReleases(g => g.GetSearchRequests(searchCriteria)); } - public override IList Fetch(AnimeSeasonSearchCriteria searchCriteria) + public override Task> Fetch(AnimeSeasonSearchCriteria searchCriteria) { if (!SupportsSearch) { - return Array.Empty(); + return Task.FromResult>(Array.Empty()); } return FetchReleases(g => g.GetSearchRequests(searchCriteria)); } - public override IList Fetch(SpecialEpisodeSearchCriteria searchCriteria) + public override Task> Fetch(SpecialEpisodeSearchCriteria searchCriteria) { if (!SupportsSearch) { - return Array.Empty(); + return Task.FromResult>(Array.Empty()); } return FetchReleases(g => g.GetSearchRequests(searchCriteria)); @@ -125,7 +125,7 @@ namespace NzbDrone.Core.Indexers return new HttpRequest(link); } - protected virtual IList FetchReleases(Func pageableRequestChainSelector, bool isRecent = false) + protected virtual async Task> FetchReleases(Func pageableRequestChainSelector, bool isRecent = false) { var releases = new List(); var url = string.Empty; @@ -157,7 +157,7 @@ namespace NzbDrone.Core.Indexers { url = request.Url.FullUri; - var page = FetchPage(request, parser); + var page = await FetchPage(request, parser); pagedReleases.AddRange(page); @@ -321,9 +321,9 @@ namespace NzbDrone.Core.Indexers return PageSize != 0 && page.Count >= PageSize; } - protected virtual IList FetchPage(IndexerRequest request, IParseIndexerResponse parser) + protected virtual async Task> FetchPage(IndexerRequest request, IParseIndexerResponse parser) { - var response = FetchIndexerResponse(request); + var response = await FetchIndexerResponse(request); try { @@ -337,7 +337,7 @@ namespace NzbDrone.Core.Indexers } } - protected virtual IndexerResponse FetchIndexerResponse(IndexerRequest request) + protected virtual async Task FetchIndexerResponse(IndexerRequest request) { _logger.Debug("Downloading Feed " + request.HttpRequest.ToString(false)); @@ -348,15 +348,17 @@ namespace NzbDrone.Core.Indexers request.HttpRequest.RateLimitKey = Definition.Id.ToString(); - return new IndexerResponse(request, _httpClient.Execute(request.HttpRequest)); + var response = await _httpClient.ExecuteAsync(request.HttpRequest); + + return new IndexerResponse(request, response); } - protected override void Test(List failures) + protected override async Task Test(List failures) { - failures.AddIfNotNull(TestConnection()); + failures.AddIfNotNull(await TestConnection()); } - protected virtual ValidationFailure TestConnection() + protected virtual async Task TestConnection() { try { @@ -369,7 +371,7 @@ namespace NzbDrone.Core.Indexers return new ValidationFailure(string.Empty, "No rss feed query available. This may be an issue with the indexer or your indexer category settings."); } - var releases = FetchPage(firstRequest, parser); + var releases = await FetchPage(firstRequest, parser); if (releases.Empty()) { diff --git a/src/NzbDrone.Core/Indexers/IIndexer.cs b/src/NzbDrone.Core/Indexers/IIndexer.cs index e593e9ba8..801d03ccc 100644 --- a/src/NzbDrone.Core/Indexers/IIndexer.cs +++ b/src/NzbDrone.Core/Indexers/IIndexer.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Threading.Tasks; using NzbDrone.Common.Http; using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.Parser.Model; @@ -12,14 +13,14 @@ namespace NzbDrone.Core.Indexers bool SupportsSearch { get; } DownloadProtocol Protocol { get; } - IList FetchRecent(); - IList Fetch(SeasonSearchCriteria searchCriteria); - IList Fetch(SingleEpisodeSearchCriteria searchCriteria); - IList Fetch(DailyEpisodeSearchCriteria searchCriteria); - IList Fetch(DailySeasonSearchCriteria searchCriteria); - IList Fetch(AnimeEpisodeSearchCriteria searchCriteria); - IList Fetch(AnimeSeasonSearchCriteria searchCriteria); - IList Fetch(SpecialEpisodeSearchCriteria searchCriteria); + Task> FetchRecent(); + Task> Fetch(SeasonSearchCriteria searchCriteria); + Task> Fetch(SingleEpisodeSearchCriteria searchCriteria); + Task> Fetch(DailyEpisodeSearchCriteria searchCriteria); + Task> Fetch(DailySeasonSearchCriteria searchCriteria); + Task> Fetch(AnimeEpisodeSearchCriteria searchCriteria); + Task> Fetch(AnimeSeasonSearchCriteria searchCriteria); + Task> Fetch(SpecialEpisodeSearchCriteria searchCriteria); HttpRequest GetDownloadRequest(string link); } } diff --git a/src/NzbDrone.Core/Indexers/IndexerBase.cs b/src/NzbDrone.Core/Indexers/IndexerBase.cs index 8613dd233..07680e0c3 100644 --- a/src/NzbDrone.Core/Indexers/IndexerBase.cs +++ b/src/NzbDrone.Core/Indexers/IndexerBase.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using FluentValidation.Results; using NLog; using NzbDrone.Common.Http; @@ -67,20 +68,19 @@ namespace NzbDrone.Core.Indexers protected TSettings Settings => (TSettings)Definition.Settings; - public abstract IList FetchRecent(); - public abstract IList Fetch(SeasonSearchCriteria searchCriteria); - public abstract IList Fetch(SingleEpisodeSearchCriteria searchCriteria); - public abstract IList Fetch(DailyEpisodeSearchCriteria searchCriteria); - public abstract IList Fetch(DailySeasonSearchCriteria searchCriteria); - public abstract IList Fetch(AnimeEpisodeSearchCriteria searchCriteria); - public abstract IList Fetch(AnimeSeasonSearchCriteria searchCriteria); - public abstract IList Fetch(SpecialEpisodeSearchCriteria searchCriteria); + public abstract Task> FetchRecent(); + public abstract Task> Fetch(SeasonSearchCriteria searchCriteria); + public abstract Task> Fetch(SingleEpisodeSearchCriteria searchCriteria); + public abstract Task> Fetch(DailyEpisodeSearchCriteria searchCriteria); + public abstract Task> Fetch(DailySeasonSearchCriteria searchCriteria); + public abstract Task> Fetch(AnimeEpisodeSearchCriteria searchCriteria); + public abstract Task> Fetch(AnimeSeasonSearchCriteria searchCriteria); + public abstract Task> Fetch(SpecialEpisodeSearchCriteria searchCriteria); public abstract HttpRequest GetDownloadRequest(string link); protected virtual IList CleanupReleases(IEnumerable releases) { var result = releases.DistinctBy(v => v.Guid).ToList(); - var settings = Definition.Settings as IIndexerSettings; result.ForEach(c => { @@ -100,7 +100,7 @@ namespace NzbDrone.Core.Indexers try { - Test(failures); + Test(failures).GetAwaiter().GetResult(); } catch (Exception ex) { @@ -111,7 +111,7 @@ namespace NzbDrone.Core.Indexers return new ValidationResult(failures); } - protected abstract void Test(List failures); + protected abstract Task Test(List failures); public override string ToString() { diff --git a/src/NzbDrone.Core/Indexers/Newznab/Newznab.cs b/src/NzbDrone.Core/Indexers/Newznab/Newznab.cs index 356cab397..16bbe72c6 100644 --- a/src/NzbDrone.Core/Indexers/Newznab/Newznab.cs +++ b/src/NzbDrone.Core/Indexers/Newznab/Newznab.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using FluentValidation.Results; using NLog; using NzbDrone.Common.Extensions; @@ -98,9 +99,10 @@ namespace NzbDrone.Core.Indexers.Newznab return settings; } - protected override void Test(List failures) + protected override async Task Test(List failures) { - base.Test(failures); + await base.Test(failures); + if (failures.HasErrors()) { return; diff --git a/src/NzbDrone.Core/Indexers/RssSyncService.cs b/src/NzbDrone.Core/Indexers/RssSyncService.cs index 8f4a07a04..46e0c0707 100644 --- a/src/NzbDrone.Core/Indexers/RssSyncService.cs +++ b/src/NzbDrone.Core/Indexers/RssSyncService.cs @@ -1,4 +1,5 @@ using System.Linq; +using System.Threading.Tasks; using NLog; using NzbDrone.Common.Instrumentation.Extensions; using NzbDrone.Core.DecisionEngine; @@ -39,16 +40,16 @@ namespace NzbDrone.Core.Indexers _logger = logger; } - private ProcessedDecisions Sync() + private async Task Sync() { _logger.ProgressInfo("Starting RSS Sync"); - var rssReleases = _rssFetcherAndParser.Fetch(); + var rssReleases = await _rssFetcherAndParser.Fetch(); var pendingReleases = _pendingReleaseService.GetPending(); var reports = rssReleases.Concat(pendingReleases).ToList(); var decisions = _downloadDecisionMaker.GetRssDecision(reports); - var processed = _processDownloadDecisions.ProcessDecisions(decisions); + var processed = await _processDownloadDecisions.ProcessDecisions(decisions); var message = string.Format("RSS Sync Completed. Reports found: {0}, Reports grabbed: {1}", reports.Count, processed.Grabbed.Count); @@ -64,7 +65,7 @@ namespace NzbDrone.Core.Indexers public void Execute(RssSyncCommand message) { - var processed = Sync(); + var processed = Sync().GetAwaiter().GetResult(); var grabbedOrPending = processed.Grabbed.Concat(processed.Pending).ToList(); _eventAggregator.PublishEvent(new RssSyncCompleteEvent(processed)); diff --git a/src/NzbDrone.Core/Indexers/Torznab/Torznab.cs b/src/NzbDrone.Core/Indexers/Torznab/Torznab.cs index ab5f85a85..978d4b186 100644 --- a/src/NzbDrone.Core/Indexers/Torznab/Torznab.cs +++ b/src/NzbDrone.Core/Indexers/Torznab/Torznab.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using FluentValidation.Results; using NLog; using NzbDrone.Common.Extensions; @@ -91,9 +92,10 @@ namespace NzbDrone.Core.Indexers.Torznab return settings; } - protected override void Test(List failures) + protected override async Task Test(List failures) { - base.Test(failures); + await base.Test(failures); + if (failures.HasErrors()) { return; diff --git a/src/NzbDrone.Host/Bootstrap.cs b/src/NzbDrone.Host/Bootstrap.cs index 1a07ae1f2..36443b308 100644 --- a/src/NzbDrone.Host/Bootstrap.cs +++ b/src/NzbDrone.Host/Bootstrap.cs @@ -155,7 +155,7 @@ namespace NzbDrone.Host }); builder.ConfigureKestrel(serverOptions => { - serverOptions.AllowSynchronousIO = true; + serverOptions.AllowSynchronousIO = false; serverOptions.Limits.MaxRequestBodySize = null; }); builder.UseStartup(); diff --git a/src/Sonarr.Api.V3/Indexers/ReleaseController.cs b/src/Sonarr.Api.V3/Indexers/ReleaseController.cs index 64ca2e2d0..e1d9c9f50 100644 --- a/src/Sonarr.Api.V3/Indexers/ReleaseController.cs +++ b/src/Sonarr.Api.V3/Indexers/ReleaseController.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Threading.Tasks; using FluentValidation; using Microsoft.AspNetCore.Mvc; using NLog; @@ -67,7 +68,7 @@ namespace Sonarr.Api.V3.Indexers [HttpPost] [Consumes("application/json")] - public object DownloadRelease(ReleaseResource release) + public async Task DownloadRelease(ReleaseResource release) { var remoteEpisode = _remoteEpisodeCache.Find(GetCacheKey(release)); @@ -156,7 +157,7 @@ namespace Sonarr.Api.V3.Indexers throw new NzbDroneClientException(HttpStatusCode.NotFound, "Unable to parse episodes in the release"); } - _downloadService.DownloadReport(remoteEpisode, release.DownloadClientId); + await _downloadService.DownloadReport(remoteEpisode, release.DownloadClientId); } catch (ReleaseDownloadException ex) { @@ -169,26 +170,26 @@ namespace Sonarr.Api.V3.Indexers [HttpGet] [Produces("application/json")] - public List GetReleases(int? seriesId, int? episodeId, int? seasonNumber) + public async Task> GetReleases(int? seriesId, int? episodeId, int? seasonNumber) { if (episodeId.HasValue) { - return GetEpisodeReleases(episodeId.Value); + return await GetEpisodeReleases(episodeId.Value); } if (seriesId.HasValue && seasonNumber.HasValue) { - return GetSeasonReleases(seriesId.Value, seasonNumber.Value); + return await GetSeasonReleases(seriesId.Value, seasonNumber.Value); } - return GetRss(); + return await GetRss(); } - private List GetEpisodeReleases(int episodeId) + private async Task> GetEpisodeReleases(int episodeId) { try { - var decisions = _releaseSearchService.EpisodeSearch(episodeId, true, true); + var decisions = await _releaseSearchService.EpisodeSearch(episodeId, true, true); var prioritizedDecisions = _prioritizeDownloadDecision.PrioritizeDecisions(decisions); return MapDecisions(prioritizedDecisions); @@ -204,11 +205,11 @@ namespace Sonarr.Api.V3.Indexers } } - private List GetSeasonReleases(int seriesId, int seasonNumber) + private async Task> GetSeasonReleases(int seriesId, int seasonNumber) { try { - var decisions = _releaseSearchService.SeasonSearch(seriesId, seasonNumber, false, false, true, true); + var decisions = await _releaseSearchService.SeasonSearch(seriesId, seasonNumber, false, false, true, true); var prioritizedDecisions = _prioritizeDownloadDecision.PrioritizeDecisions(decisions); return MapDecisions(prioritizedDecisions); @@ -224,9 +225,9 @@ namespace Sonarr.Api.V3.Indexers } } - private List GetRss() + private async Task> GetRss() { - var reports = _rssFetcherAndParser.Fetch(); + var reports = await _rssFetcherAndParser.Fetch(); var decisions = _downloadDecisionMaker.GetRssDecision(reports); var prioritizedDecisions = _prioritizeDownloadDecision.PrioritizeDecisions(decisions); diff --git a/src/Sonarr.Api.V3/Indexers/ReleasePushController.cs b/src/Sonarr.Api.V3/Indexers/ReleasePushController.cs index f49c803ff..17358edd4 100644 --- a/src/Sonarr.Api.V3/Indexers/ReleasePushController.cs +++ b/src/Sonarr.Api.V3/Indexers/ReleasePushController.cs @@ -62,7 +62,7 @@ namespace Sonarr.Api.V3.Indexers lock (PushLock) { decisions = _downloadDecisionMaker.GetRssDecision(new List { info }); - _downloadDecisionProcessor.ProcessDecisions(decisions); + _downloadDecisionProcessor.ProcessDecisions(decisions).GetAwaiter().GetResult(); } var firstDecision = decisions.FirstOrDefault(); diff --git a/src/Sonarr.Api.V3/Queue/QueueActionController.cs b/src/Sonarr.Api.V3/Queue/QueueActionController.cs index e8d0bfaad..f4fe953e7 100644 --- a/src/Sonarr.Api.V3/Queue/QueueActionController.cs +++ b/src/Sonarr.Api.V3/Queue/QueueActionController.cs @@ -1,3 +1,4 @@ +using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using NzbDrone.Core.Download; using NzbDrone.Core.Download.Pending; @@ -20,7 +21,7 @@ namespace Sonarr.Api.V3.Queue } [HttpPost("grab/{id:int}")] - public object Grab(int id) + public async Task Grab(int id) { var pendingRelease = _pendingReleaseService.FindPendingQueueItem(id); @@ -29,14 +30,14 @@ namespace Sonarr.Api.V3.Queue throw new NotFoundException(); } - _downloadService.DownloadReport(pendingRelease.RemoteEpisode, null); + await _downloadService.DownloadReport(pendingRelease.RemoteEpisode, null); return new { }; } [HttpPost("grab/bulk")] [Consumes("application/json")] - public object Grab([FromBody] QueueBulkResource resource) + public async Task Grab([FromBody] QueueBulkResource resource) { foreach (var id in resource.Ids) { @@ -47,7 +48,7 @@ namespace Sonarr.Api.V3.Queue throw new NotFoundException(); } - _downloadService.DownloadReport(pendingRelease.RemoteEpisode, null); + await _downloadService.DownloadReport(pendingRelease.RemoteEpisode, null); } return new { };