2727
2828import static com .easypost .easyvcr .internalutilities .Tools .readFromInputStream ;
2929
30- public class HttpUrlConnectionTest {
30+ public class HttpUrlConnectionTest {
3131
32- private static FakeDataService .IPAddressData getIPAddressDataRequest (Cassette cassette , Mode mode ) throws Exception {
32+ private static FakeDataService .IPAddressData getIPAddressDataRequest (Cassette cassette , Mode mode )
33+ throws Exception {
3334 RecordableHttpsURLConnection connection = TestUtils .getSimpleHttpsURLConnection (cassette .name , mode , null );
3435
3536 FakeDataService .HttpsUrlConnection fakeDataService = new FakeDataService .HttpsUrlConnection (connection );
@@ -42,7 +43,8 @@ public void testPOSTRequest() throws Exception {
4243 AdvancedSettings advancedSettings = new AdvancedSettings ();
4344 advancedSettings .matchRules = new MatchRules ().byMethod ().byBody ().byFullUrl ();
4445 RecordableHttpsURLConnection connection =
45- TestUtils .getSimpleHttpsURLConnection ("https://www.google.com" , "test_post_request" , Mode .Record , advancedSettings );
46+ TestUtils .getSimpleHttpsURLConnection ("https://www.google.com" , "test_post_request" , Mode .Record ,
47+ advancedSettings );
4648 String jsonInputString = "{'name': 'Upendra', 'job': 'Programmer'}" ;
4749 connection .setDoOutput (true );
4850 connection .setRequestMethod ("POST" );
@@ -70,7 +72,8 @@ public void testNonJsonDataWithCensors() throws Exception {
7072
7173 advancedSettings .matchRules = new MatchRules ().byMethod ().byBody ().byFullUrl ();
7274 RecordableHttpsURLConnection connection =
73- TestUtils .getSimpleHttpsURLConnection ("https://www.google.com" , "test_non_json" , Mode .Record , advancedSettings );
75+ TestUtils .getSimpleHttpsURLConnection ("https://www.google.com" , "test_non_json" , Mode .Record ,
76+ advancedSettings );
7477 String jsonInputString = "{'name': 'Upendra', 'job': 'Programmer'}" ;
7578 connection .setDoOutput (true );
7679 connection .setRequestMethod ("POST" );
@@ -164,7 +167,8 @@ public void testInteractionElements() throws Exception {
164167
165168 // Most elements of a VCR request are black-boxed, so we can't test them here.
166169 // Instead, we can get the recreated HttpResponseMessage and check the details.
167- RecordableHttpsURLConnection response = (RecordableHttpsURLConnection ) fakeDataService .getIPAddressDataRawResponse ();
170+ RecordableHttpsURLConnection response =
171+ (RecordableHttpsURLConnection ) fakeDataService .getIPAddressDataRawResponse ();
168172 Assert .assertNotNull (response );
169173 }
170174
@@ -193,7 +197,8 @@ public void testCensors() throws Exception {
193197 connection = (RecordableHttpsURLConnection ) HttpClients .newClient (HttpClientType .HttpsUrlConnection ,
194198 FakeDataService .URL , cassette , Mode .Replay , advancedSettings );
195199 fakeDataService = new FakeDataService .HttpsUrlConnection (connection );
196- RecordableHttpsURLConnection response = (RecordableHttpsURLConnection ) fakeDataService .getIPAddressDataRawResponse ();
200+ RecordableHttpsURLConnection response =
201+ (RecordableHttpsURLConnection ) fakeDataService .getIPAddressDataRawResponse ();
197202
198203 // check that the replayed response contains the censored header
199204 Assert .assertNotNull (response );
@@ -221,7 +226,8 @@ public void testMatchSettings() throws Exception {
221226 connection .setRequestProperty ("X-Custom-Header" ,
222227 "custom-value" ); // add custom header to request, shouldn't matter when matching by default rules
223228 fakeDataService = new FakeDataService .HttpsUrlConnection (connection );
224- RecordableHttpsURLConnection response = (RecordableHttpsURLConnection ) fakeDataService .getIPAddressDataRawResponse ();
229+ RecordableHttpsURLConnection response =
230+ (RecordableHttpsURLConnection ) fakeDataService .getIPAddressDataRawResponse ();
225231 Assert .assertNotNull (response );
226232
227233 // replay cassette with custom match rules, should not find a match because request is different (throw exception)
@@ -290,7 +296,8 @@ public void testIgnoreElementsFailMatch() throws URISyntaxException, IOException
290296 String bodyData2 = "{'name': 'NewName', 'job': 'Programmer'}" ;
291297
292298 // record baseline request first
293- RecordableHttpsURLConnection connection = HttpClients .newHttpsURLConnection (FakeDataService .URL , cassette , Mode .Record );
299+ RecordableHttpsURLConnection connection =
300+ HttpClients .newHttpsURLConnection (FakeDataService .URL , cassette , Mode .Record );
294301 connection .setDoOutput (true );
295302 connection .setRequestMethod ("POST" );
296303 // use bodyData1 to make request
@@ -339,7 +346,8 @@ public void testIgnoreElementsPassMatch() throws URISyntaxException, IOException
339346 String bodyData2 = "{'name': 'NewName', 'job': 'Programmer'}" ;
340347
341348 // record baseline request first
342- RecordableHttpsURLConnection connection = HttpClients .newHttpsURLConnection (FakeDataService .URL , cassette , Mode .Record );
349+ RecordableHttpsURLConnection connection =
350+ HttpClients .newHttpsURLConnection (FakeDataService .URL , cassette , Mode .Record );
343351 connection .setDoOutput (true );
344352 connection .setRequestMethod ("POST" );
345353 // use bodyData1 to make request
@@ -383,7 +391,7 @@ public void testIgnoreElementsPassMatch() throws URISyntaxException, IOException
383391 }
384392
385393 @ Test
386- public void testExpirationSettings () throws Exception {
394+ public void testExpirationSettingsCommonTimeFrame () throws Exception {
387395 Cassette cassette = TestUtils .getCassette ("test_expiration_settings" );
388396 cassette .erase (); // Erase cassette before recording
389397
@@ -398,7 +406,8 @@ public void testExpirationSettings() throws Exception {
398406 connection = (RecordableHttpsURLConnection ) HttpClients .newClient (HttpClientType .HttpsUrlConnection ,
399407 FakeDataService .URL , cassette , Mode .Replay );
400408 fakeDataService = new FakeDataService .HttpsUrlConnection (connection );
401- RecordableHttpsURLConnection response = (RecordableHttpsURLConnection ) fakeDataService .getIPAddressDataRawResponse ();
409+ RecordableHttpsURLConnection response =
410+ (RecordableHttpsURLConnection ) fakeDataService .getIPAddressDataRawResponse ();
402411 Assert .assertNotNull (response );
403412
404413 // replay cassette with custom expiration rules, should not find a match because recording is expired (throw exception)
@@ -416,10 +425,49 @@ public void testExpirationSettings() throws Exception {
416425 // replay cassette with bad expiration rules, should throw an exception because settings are bad
417426 advancedSettings = new AdvancedSettings ();
418427 advancedSettings .timeFrame = TimeFrame .never ();
419- advancedSettings .whenExpired = ExpirationActions .RecordAgain ; // invalid settings for replay mode, should throw exception
428+ advancedSettings .whenExpired =
429+ ExpirationActions .RecordAgain ; // invalid settings for replay mode, should throw exception
420430 AdvancedSettings finalAdvancedSettings = advancedSettings ;
421- Assert .assertThrows (RecordingExpirationException .class , () -> HttpClients .newClient (HttpClientType .HttpsUrlConnection ,
422- FakeDataService .URL , cassette , Mode .Replay , finalAdvancedSettings ));
431+ Assert .assertThrows (RecordingExpirationException .class ,
432+ () -> HttpClients .newClient (HttpClientType .HttpsUrlConnection , FakeDataService .URL , cassette ,
433+ Mode .Replay , finalAdvancedSettings ));
434+ }
435+
436+ @ Test
437+ public void testExpirationSettingsCustomTimeFrame () throws Exception {
438+ Cassette cassette = TestUtils .getCassette ("test_expiration_settings" );
439+ cassette .erase (); // Erase cassette before recording
440+
441+ // record cassette first
442+ RecordableHttpsURLConnection connection =
443+ (RecordableHttpsURLConnection ) HttpClients .newClient (HttpClientType .HttpsUrlConnection ,
444+ FakeDataService .URL , cassette , Mode .Record );
445+ FakeDataService .HttpsUrlConnection fakeDataService = new FakeDataService .HttpsUrlConnection (connection );
446+ fakeDataService .getIPAddressDataRawResponse ();
447+
448+ // Custom expiration rules
449+ AdvancedSettings advancedSettings = new AdvancedSettings ();
450+ advancedSettings .timeFrame = new TimeFrame (1 , 0 , 0 , 0 ); // 1 day from now
451+ advancedSettings .whenExpired = ExpirationActions .ThrowException ; // throw exception when recording is expired
452+
453+ // replay cassette with custom expiration rules, should find a match
454+ connection = (RecordableHttpsURLConnection ) HttpClients .newClient (HttpClientType .HttpsUrlConnection ,
455+ FakeDataService .URL , cassette , Mode .Replay , advancedSettings );
456+ fakeDataService = new FakeDataService .HttpsUrlConnection (connection );
457+ RecordableHttpsURLConnection response =
458+ (RecordableHttpsURLConnection ) fakeDataService .getIPAddressDataRawResponse ();
459+ Assert .assertNotNull (response );
460+
461+ // Change expiration rules
462+ advancedSettings .timeFrame = new TimeFrame (-1 , 0 , 0 , 0 ); // 1 day ago
463+
464+ // replay cassette with custom expiration rules, should not find a match because recording is expired (throw exception)
465+ connection = (RecordableHttpsURLConnection ) HttpClients .newClient (HttpClientType .HttpsUrlConnection ,
466+ FakeDataService .URL , cassette , Mode .Replay , advancedSettings );
467+ fakeDataService = new FakeDataService .HttpsUrlConnection (connection );
468+ FakeDataService .HttpsUrlConnection finalFakeDataService = fakeDataService ;
469+ // this throws a RuntimeException rather than a RecordingExpirationException because the exceptions are coalesced internally
470+ Assert .assertThrows (Exception .class , () -> finalFakeDataService .getIPAddressData ());
423471 }
424472
425473 @ Test
0 commit comments