Skip to content

Commit 28f60b9

Browse files
author
pavlo
committed
feature/appcheck/final
1 parent e2fabac commit 28f60b9

36 files changed

+2214
-1440
lines changed

FirebaseAdmin/FirebaseAdmin.Tests/AppCheck/AppCheckApiClientTest.cs

Lines changed: 241 additions & 128 deletions
Large diffs are not rendered by default.
Lines changed: 238 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,238 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Net;
4+
using System.Net.Http;
5+
using System.Text;
6+
using FirebaseAdmin.Util;
7+
using Xunit;
8+
9+
namespace FirebaseAdmin.AppCheck.Tests
10+
{
11+
public class AppCheckErrorHandlerTest
12+
{
13+
public static readonly IEnumerable<object[]> AppCheckErrorCodes =
14+
new List<object[]>()
15+
{
16+
new object[]
17+
{
18+
"ABORTED",
19+
ErrorCode.Aborted,
20+
AppCheckErrorCode.Aborted,
21+
},
22+
new object[]
23+
{
24+
"INVALID_ARGUMENT",
25+
ErrorCode.InvalidArgument,
26+
AppCheckErrorCode.InvalidArgument,
27+
},
28+
new object[]
29+
{
30+
"INVALID_CREDENTIAL",
31+
ErrorCode.InvalidArgument,
32+
AppCheckErrorCode.InvalidCredential,
33+
},
34+
new object[]
35+
{
36+
"PERMISSION_DENIED",
37+
ErrorCode.PermissionDenied,
38+
AppCheckErrorCode.PermissionDenied,
39+
},
40+
new object[]
41+
{
42+
"UNAUTHENTICATED",
43+
ErrorCode.Unauthenticated,
44+
AppCheckErrorCode.Unauthenticated,
45+
},
46+
new object[]
47+
{
48+
"NOT_FOUND",
49+
ErrorCode.NotFound,
50+
AppCheckErrorCode.NotFound,
51+
},
52+
new object[]
53+
{
54+
"UNKNOWN",
55+
ErrorCode.Unknown,
56+
AppCheckErrorCode.UnknownError,
57+
},
58+
};
59+
60+
[Theory]
61+
[MemberData(nameof(AppCheckErrorCodes))]
62+
public void KnownErrorCode(
63+
string code, ErrorCode expectedCode, AppCheckErrorCode expectedAppCheckCode)
64+
{
65+
var json = $@"{{
66+
""error"": {{
67+
""message"": ""{code}"",
68+
}}
69+
}}";
70+
var resp = new HttpResponseMessage()
71+
{
72+
StatusCode = HttpStatusCode.ServiceUnavailable,
73+
Content = new StringContent(json, Encoding.UTF8, "application/json"),
74+
};
75+
76+
var error = AppCheckErrorHandler.Instance.HandleHttpErrorResponse(resp, json);
77+
78+
Assert.Equal(expectedCode, error.ErrorCode);
79+
Assert.Equal(expectedAppCheckCode, error.AppCheckErrorCode);
80+
Assert.Same(resp, error.HttpResponse);
81+
Assert.Null(error.InnerException);
82+
Assert.EndsWith($" ({code}).", error.Message);
83+
}
84+
85+
[Theory]
86+
[MemberData(nameof(AppCheckErrorCodes))]
87+
public void KnownErrorCodeWithDetails(
88+
string code, ErrorCode expectedCode, AppCheckErrorCode expectedAppCheckCode)
89+
{
90+
var json = $@"{{
91+
""error"": {{
92+
""message"": ""{code}: Some details."",
93+
}}
94+
}}";
95+
var resp = new HttpResponseMessage()
96+
{
97+
StatusCode = HttpStatusCode.ServiceUnavailable,
98+
Content = new StringContent(json, Encoding.UTF8, "application/json"),
99+
};
100+
101+
var error = AppCheckErrorHandler.Instance.HandleHttpErrorResponse(resp, json);
102+
103+
Assert.Equal(expectedCode, error.ErrorCode);
104+
Assert.Equal(expectedAppCheckCode, error.AppCheckErrorCode);
105+
Assert.Same(resp, error.HttpResponse);
106+
Assert.Null(error.InnerException);
107+
Assert.EndsWith($" ({code}).: Some details.", error.Message);
108+
}
109+
110+
[Fact]
111+
public void UnknownErrorCode()
112+
{
113+
var json = $@"{{
114+
""error"": {{
115+
""message"": ""SOMETHING_UNUSUAL"",
116+
}}
117+
}}";
118+
var resp = new HttpResponseMessage()
119+
{
120+
StatusCode = HttpStatusCode.InternalServerError,
121+
Content = new StringContent(json, Encoding.UTF8, "application/json"),
122+
};
123+
124+
var error = AppCheckErrorHandler.Instance.HandleHttpErrorResponse(resp, json);
125+
126+
Assert.Equal(ErrorCode.Internal, error.ErrorCode);
127+
Assert.Equal(
128+
$"Unexpected HTTP response with status: 500 (InternalServerError){Environment.NewLine}{json}",
129+
error.Message);
130+
Assert.Null(error.AppCheckErrorCode);
131+
Assert.Same(resp, error.HttpResponse);
132+
Assert.Null(error.InnerException);
133+
}
134+
135+
[Fact]
136+
public void UnspecifiedErrorCode()
137+
{
138+
var json = $@"{{
139+
""error"": {{}}
140+
}}";
141+
var resp = new HttpResponseMessage()
142+
{
143+
StatusCode = HttpStatusCode.InternalServerError,
144+
Content = new StringContent(json, Encoding.UTF8, "application/json"),
145+
};
146+
147+
var error = AppCheckErrorHandler.Instance.HandleHttpErrorResponse(resp, json);
148+
149+
Assert.Equal(ErrorCode.Internal, error.ErrorCode);
150+
Assert.Equal(
151+
$"Unexpected HTTP response with status: 500 (InternalServerError){Environment.NewLine}{json}",
152+
error.Message);
153+
Assert.Null(error.AppCheckErrorCode);
154+
Assert.Same(resp, error.HttpResponse);
155+
Assert.Null(error.InnerException);
156+
}
157+
158+
[Fact]
159+
public void NoDetails()
160+
{
161+
var json = @"{}";
162+
var resp = new HttpResponseMessage()
163+
{
164+
StatusCode = HttpStatusCode.ServiceUnavailable,
165+
Content = new StringContent(json, Encoding.UTF8, "application/json"),
166+
};
167+
168+
var error = AppCheckErrorHandler.Instance.HandleHttpErrorResponse(resp, json);
169+
170+
Assert.Equal(ErrorCode.Unavailable, error.ErrorCode);
171+
Assert.Equal(
172+
$"Unexpected HTTP response with status: 503 (ServiceUnavailable){Environment.NewLine}{{}}",
173+
error.Message);
174+
Assert.Null(error.AppCheckErrorCode);
175+
Assert.Same(resp, error.HttpResponse);
176+
Assert.Null(error.InnerException);
177+
}
178+
179+
[Fact]
180+
public void NonJson()
181+
{
182+
var text = "plain text";
183+
var resp = new HttpResponseMessage()
184+
{
185+
StatusCode = HttpStatusCode.ServiceUnavailable,
186+
Content = new StringContent(text, Encoding.UTF8, "text/plain"),
187+
};
188+
189+
var error = AppCheckErrorHandler.Instance.HandleHttpErrorResponse(resp, text);
190+
191+
Assert.Equal(ErrorCode.Unavailable, error.ErrorCode);
192+
Assert.Equal(
193+
$"Unexpected HTTP response with status: 503 (ServiceUnavailable){Environment.NewLine}{text}",
194+
error.Message);
195+
Assert.Null(error.AppCheckErrorCode);
196+
Assert.Same(resp, error.HttpResponse);
197+
Assert.Null(error.InnerException);
198+
}
199+
200+
[Fact]
201+
public void DeserializeException()
202+
{
203+
var text = "plain text";
204+
var resp = new HttpResponseMessage()
205+
{
206+
StatusCode = HttpStatusCode.ServiceUnavailable,
207+
Content = new StringContent(text, Encoding.UTF8, "text/plain"),
208+
};
209+
var inner = new Exception("Deserialization error");
210+
211+
var error = AppCheckErrorHandler.Instance.HandleDeserializeException(
212+
inner, new ResponseInfo(resp, text));
213+
214+
Assert.Equal(ErrorCode.Unknown, error.ErrorCode);
215+
Assert.Equal(
216+
$"Error while parsing AppCheck service response. Deserialization error: {text}",
217+
error.Message);
218+
Assert.Equal(AppCheckErrorCode.UnknownError, error.AppCheckErrorCode);
219+
Assert.Same(resp, error.HttpResponse);
220+
Assert.Same(inner, error.InnerException);
221+
}
222+
223+
[Fact]
224+
public void HttpRequestException()
225+
{
226+
var exception = new HttpRequestException("network error");
227+
228+
var error = AppCheckErrorHandler.Instance.HandleHttpRequestException(exception);
229+
230+
Assert.Equal(ErrorCode.Unknown, error.ErrorCode);
231+
Assert.Equal(
232+
"Unknown error while making a remote service call: network error", error.Message);
233+
Assert.Null(error.AppCheckErrorCode);
234+
Assert.Null(error.HttpResponse);
235+
Assert.Same(exception, error.InnerException);
236+
}
237+
}
238+
}

0 commit comments

Comments
 (0)