3636import java .util .HashMap ;
3737import java .util .List ;
3838import java .util .Map ;
39+ import java .util .Random ;
3940import java .util .UUID ;
41+ import java .util .concurrent .atomic .AtomicInteger ;
4042
4143import javax .net .ssl .KeyManager ;
4244import javax .net .ssl .SSLContext ;
4345
46+ import static org .elasticsearch .test .ESTestCase .randomBoolean ;
47+
4448public class MsGraphHttpFixture extends ExternalResource {
4549
4650 private static final Logger logger = LogManager .getLogger (MsGraphHttpFixture .class );
@@ -53,7 +57,11 @@ public class MsGraphHttpFixture extends ExternalResource {
5357 private final String email ;
5458 private final String [] firstGroupsPage ;
5559 private final String [] secondGroupsPage ;
56- private final String jwt ;
60+ private final String jwt = "test jwt" ;
61+
62+ private final AtomicInteger loginCount = new AtomicInteger (0 );
63+ private final AtomicInteger getUserPropertiesCount = new AtomicInteger (0 );
64+ private final AtomicInteger getGroupMembershipCount = new AtomicInteger (0 );
5765
5866 private HttpsServer server ;
5967
@@ -75,8 +83,6 @@ public MsGraphHttpFixture(
7583 this .email = email ;
7684 this .firstGroupsPage = firstGroupsPage ;
7785 this .secondGroupsPage = secondGroupsPage ;
78-
79- this .jwt = "test jwt" ;
8086 }
8187
8288 @ Override
@@ -105,6 +111,7 @@ protected void before() throws Throwable {
105111 exchange .close ();
106112 });
107113 server .start ();
114+ logger .info ("Started server on port [{}]" , server .getAddress ().getPort ());
108115 }
109116
110117 @ Override
@@ -118,6 +125,9 @@ public String getBaseUrl() {
118125
119126 private void registerGetAccessTokenHandler () {
120127 server .createContext ("/" + tenantId + "/oauth2/v2.0/token" , exchange -> {
128+ logger .info ("Received access token request" );
129+ loginCount .incrementAndGet ();
130+
121131 if (exchange .getRequestMethod ().equals ("POST" ) == false ) {
122132 graphError (exchange , RestStatus .METHOD_NOT_ALLOWED , "Expected POST request" );
123133 return ;
@@ -171,6 +181,9 @@ private void registerGetAccessTokenHandler() {
171181
172182 private void registerGetUserHandler () {
173183 server .createContext ("/v1.0/users/" + principal , exchange -> {
184+ logger .info ("Received get user properties request [{}]" , exchange .getRequestURI ());
185+ final var callCount = getUserPropertiesCount .incrementAndGet ();
186+
174187 if (exchange .getRequestMethod ().equals ("GET" ) == false ) {
175188 graphError (exchange , RestStatus .METHOD_NOT_ALLOWED , "Expected GET request" );
176189 return ;
@@ -187,6 +200,15 @@ private void registerGetUserHandler() {
187200 return ;
188201 }
189202
203+ // ensure the client retries temporary errors
204+ if (callCount == 1 ) {
205+ graphError (exchange , RestStatus .GATEWAY_TIMEOUT , "Gateway timed out" );
206+ return ;
207+ } else if (callCount == 2 ) {
208+ graphError (exchange , RestStatus .TOO_MANY_REQUESTS , "Too many requests" );
209+ return ;
210+ }
211+
190212 var userProperties = XContentBuilder .builder (XContentType .JSON .xContent ());
191213 userProperties .startObject ();
192214 userProperties .field ("displayName" , displayName );
@@ -207,6 +229,9 @@ private void registerGetUserMembershipHandler() {
207229 final var skipToken = UUID .randomUUID ().toString ();
208230
209231 server .createContext ("/v1.0/users/" + principal + "/memberOf" , exchange -> {
232+ logger .info ("Received get user membership request [{}]" , exchange .getRequestURI ());
233+ getGroupMembershipCount .incrementAndGet ();
234+
210235 if (exchange .getRequestMethod ().equals ("GET" ) == false ) {
211236 graphError (exchange , RestStatus .METHOD_NOT_ALLOWED , "Expected GET request" );
212237 return ;
0 commit comments