Skip to content

Commit 66bd872

Browse files
authored
Do not throw exception on empty error object (#21431)
Fixes #21428
1 parent 9596b48 commit 66bd872

File tree

3 files changed

+207
-1
lines changed

3 files changed

+207
-1
lines changed

sdk/keyvault/Azure.Security.KeyVault.Administration/src/RestoreOperationInternal.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ await _client.GetSelectiveKeyRestoreDetailsAsync(Id, cancellationToken).Configur
215215
_requestFailedException = new RequestFailedException("Unexpected Failure.", ex);
216216
throw _requestFailedException;
217217
}
218-
if (_value != null && EndTime.HasValue && Error != null)
218+
if (_value != null && EndTime.HasValue && Error?.Code != null)
219219
{
220220
_requestFailedException = new RequestFailedException($"{Error.Message}\nInnerError: {Error.InnerError}\nCode: {Error.Code}");
221221
throw _requestFailedException;

sdk/keyvault/Azure.Security.KeyVault.Administration/tests/RestoreOperationTests.cs

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33

44
using System;
55
using System.Threading;
6+
using System.Threading.Tasks;
7+
using Azure.Core.TestFramework;
68
using Azure.Security.KeyVault.Administration.Models;
9+
using Azure.Security.KeyVault.Tests;
710
using Moq;
811
using NUnit.Framework;
912

@@ -121,5 +124,105 @@ public void ValueThrowsWhenOperationIsNotComplete()
121124
Assert.That(operation.StartTime, Is.EqualTo(incompleteRestore.StartTime));
122125
Assert.That(operation.EndTime, Is.EqualTo(incompleteRestore.EndTime));
123126
}
127+
128+
[Test]
129+
public async Task ValueDoesNotThrowOnNullError()
130+
{
131+
DateTimeOffset endTime = DateTimeOffset.FromUnixTimeSeconds(1622154174);
132+
133+
var transport = new MockTransport(
134+
new MockResponse(200)
135+
.WithContent($@"{{
136+
""jobId"": ""{JobId}"",
137+
""status"": ""Succeeded"",
138+
""startTime"": 1622154134,
139+
""endTime"": {endTime.ToUnixTimeSeconds()},
140+
""error"": null
141+
}}"));
142+
143+
var client = new KeyVaultBackupClient(
144+
new Uri("https://localhost"),
145+
new MockCredential(),
146+
new KeyVaultAdministrationClientOptions
147+
{
148+
Transport = transport,
149+
});
150+
151+
var operation = new KeyVaultRestoreOperation(client, JobId);
152+
153+
Response response = await operation.UpdateStatusAsync();
154+
Assert.AreEqual(200, response.Status);
155+
156+
KeyVaultRestoreResult result = operation.Value;
157+
Assert.AreEqual(endTime, result.EndTime);
158+
}
159+
160+
[Test]
161+
public async Task ValueDoesNotThrowOnEmptyError()
162+
{
163+
DateTimeOffset endTime = DateTimeOffset.FromUnixTimeSeconds(1622154174);
164+
165+
var transport = new MockTransport(
166+
new MockResponse(200)
167+
.WithContent($@"{{
168+
""jobId"": ""{JobId}"",
169+
""status"": ""Succeeded"",
170+
""startTime"": 1622154134,
171+
""endTime"": {endTime.ToUnixTimeSeconds()},
172+
""error"": {{}}
173+
}}"));
174+
175+
var client = new KeyVaultBackupClient(
176+
new Uri("https://localhost"),
177+
new MockCredential(),
178+
new KeyVaultAdministrationClientOptions
179+
{
180+
Transport = transport,
181+
});
182+
183+
var operation = new KeyVaultRestoreOperation(client, JobId);
184+
185+
Response response = await operation.UpdateStatusAsync();
186+
Assert.AreEqual(200, response.Status);
187+
188+
KeyVaultRestoreResult result = operation.Value;
189+
Assert.AreEqual(endTime, result.EndTime);
190+
}
191+
192+
[Test]
193+
public async Task ValueDoesNotThrowOnErrorNullProperties()
194+
{
195+
DateTimeOffset endTime = DateTimeOffset.FromUnixTimeSeconds(1622154174);
196+
197+
var transport = new MockTransport(
198+
new MockResponse(200)
199+
.WithContent($@"{{
200+
""jobId"": ""{JobId}"",
201+
""status"": ""Succeeded"",
202+
""startTime"": 1622154134,
203+
""endTime"": {endTime.ToUnixTimeSeconds()},
204+
""error"": {{
205+
""code"": null,
206+
""innererror"": null,
207+
""message"": null
208+
}}
209+
}}"));
210+
211+
var client = new KeyVaultBackupClient(
212+
new Uri("https://localhost"),
213+
new MockCredential(),
214+
new KeyVaultAdministrationClientOptions
215+
{
216+
Transport = transport,
217+
});
218+
219+
var operation = new KeyVaultRestoreOperation(client, JobId);
220+
221+
Response response = await operation.UpdateStatusAsync();
222+
Assert.AreEqual(200, response.Status);
223+
224+
KeyVaultRestoreResult result = operation.Value;
225+
Assert.AreEqual(endTime, result.EndTime);
226+
}
124227
}
125228
}

sdk/keyvault/Azure.Security.KeyVault.Administration/tests/SelectiveKeyRestoreOperationTests.cs

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33

44
using System;
55
using System.Threading;
6+
using System.Threading.Tasks;
7+
using Azure.Core.TestFramework;
68
using Azure.Security.KeyVault.Administration.Models;
9+
using Azure.Security.KeyVault.Tests;
710
using Moq;
811
using NUnit.Framework;
912

@@ -121,5 +124,105 @@ public void ValueThrowsWhenOperationIsNotComplete()
121124
Assert.That(operation.StartTime, Is.EqualTo(incompleteRestore.StartTime));
122125
Assert.That(operation.EndTime, Is.EqualTo(incompleteRestore.EndTime));
123126
}
127+
128+
[Test]
129+
public async Task ValueDoesNotThrowOnNullError()
130+
{
131+
DateTimeOffset endTime = DateTimeOffset.FromUnixTimeSeconds(1622154174);
132+
133+
var transport = new MockTransport(
134+
new MockResponse(200)
135+
.WithContent($@"{{
136+
""jobId"": ""{JobId}"",
137+
""status"": ""Succeeded"",
138+
""startTime"": 1622154134,
139+
""endTime"": {endTime.ToUnixTimeSeconds()},
140+
""error"": null
141+
}}"));
142+
143+
var client = new KeyVaultBackupClient(
144+
new Uri("https://localhost"),
145+
new MockCredential(),
146+
new KeyVaultAdministrationClientOptions
147+
{
148+
Transport = transport,
149+
});
150+
151+
var operation = new KeyVaultSelectiveKeyRestoreOperation(client, JobId);
152+
153+
Response response = await operation.UpdateStatusAsync();
154+
Assert.AreEqual(200, response.Status);
155+
156+
KeyVaultSelectiveKeyRestoreResult result = operation.Value;
157+
Assert.AreEqual(endTime, result.EndTime);
158+
}
159+
160+
[Test]
161+
public async Task ValueDoesNotThrowOnEmptyError()
162+
{
163+
DateTimeOffset endTime = DateTimeOffset.FromUnixTimeSeconds(1622154174);
164+
165+
var transport = new MockTransport(
166+
new MockResponse(200)
167+
.WithContent($@"{{
168+
""jobId"": ""{JobId}"",
169+
""status"": ""Succeeded"",
170+
""startTime"": 1622154134,
171+
""endTime"": {endTime.ToUnixTimeSeconds()},
172+
""error"": {{}}
173+
}}"));
174+
175+
var client = new KeyVaultBackupClient(
176+
new Uri("https://localhost"),
177+
new MockCredential(),
178+
new KeyVaultAdministrationClientOptions
179+
{
180+
Transport = transport,
181+
});
182+
183+
var operation = new KeyVaultSelectiveKeyRestoreOperation(client, JobId);
184+
185+
Response response = await operation.UpdateStatusAsync();
186+
Assert.AreEqual(200, response.Status);
187+
188+
KeyVaultSelectiveKeyRestoreResult result = operation.Value;
189+
Assert.AreEqual(endTime, result.EndTime);
190+
}
191+
192+
[Test]
193+
public async Task ValueDoesNotThrowOnErrorNullProperties()
194+
{
195+
DateTimeOffset endTime = DateTimeOffset.FromUnixTimeSeconds(1622154174);
196+
197+
var transport = new MockTransport(
198+
new MockResponse(200)
199+
.WithContent($@"{{
200+
""jobId"": ""{JobId}"",
201+
""status"": ""Succeeded"",
202+
""startTime"": 1622154134,
203+
""endTime"": {endTime.ToUnixTimeSeconds()},
204+
""error"": {{
205+
""code"": null,
206+
""innererror"": null,
207+
""message"": null
208+
}}
209+
}}"));
210+
211+
var client = new KeyVaultBackupClient(
212+
new Uri("https://localhost"),
213+
new MockCredential(),
214+
new KeyVaultAdministrationClientOptions
215+
{
216+
Transport = transport,
217+
});
218+
219+
var operation = new KeyVaultSelectiveKeyRestoreOperation(client, JobId);
220+
221+
Response response = await operation.UpdateStatusAsync();
222+
Assert.AreEqual(200, response.Status);
223+
224+
KeyVaultSelectiveKeyRestoreResult result = operation.Value;
225+
Assert.AreEqual(endTime, result.EndTime);
226+
}
124227
}
125228
}

0 commit comments

Comments
 (0)