[java-opensaml] branch master updated: OSJ-193: Provide a mechanism to detect ResolverExceptions in ...

Brent Putman putmanb at georgetown.edu
Wed Mar 4 22:11:55 EST 2020


This is an automated email from the git hooks/post-receive script.

putmanb pushed a commit to branch master
in repository java-opensaml.

View the commit online:
http://git.shibboleth.net/view/?p=java-opensaml.git;a=commit;h=765228260758afc3172adf0a16848d74671db883

The following commit(s) were added to refs/heads/master by this push:
       new  7652282   OSJ-193: Provide a mechanism to detect ResolverExceptions in ...
7652282 is described below

commit 765228260758afc3172adf0a16848d74671db883
Author: Brent Putman <putmanb at georgetown.edu>
AuthorDate: Tue Mar 3 21:42:40 2020 -0500

    OSJ-193: Provide a mechanism to detect ResolverExceptions in ...
    
    Provide a mechanism to detect ResolverExceptions in
    AbstractReloadingMetadataResolver.
---
 .../resolver/ChainingMetadataResolver.java         |  14 ++
 .../resolver/RefreshableMetadataResolver.java      |   7 +
 .../impl/AbstractReloadingMetadataResolver.java    |  15 +++
 .../resolver/impl/CompositeMetadataResolver.java   |  14 ++
 .../impl/FileBackedHTTPMetadataResolverTest.java   | 147 +++++++++++++++++----
 .../impl/FilesystemMetadataResolverTest.java       |  83 ++++++++++--
 .../resolver/impl/HTTPMetadataResolverTest.java    | 129 ++++++++++++------
 7 files changed, 331 insertions(+), 78 deletions(-)

diff --git a/opensaml-saml-api/src/main/java/org/opensaml/saml/metadata/resolver/ChainingMetadataResolver.java b/opensaml-saml-api/src/main/java/org/opensaml/saml/metadata/resolver/ChainingMetadataResolver.java
index 0c2e75e..a43949b 100644
--- a/opensaml-saml-api/src/main/java/org/opensaml/saml/metadata/resolver/ChainingMetadataResolver.java
+++ b/opensaml-saml-api/src/main/java/org/opensaml/saml/metadata/resolver/ChainingMetadataResolver.java
@@ -235,6 +235,20 @@ public class ChainingMetadataResolver extends AbstractIdentifiableInitializableC
     }
     
     /** {@inheritDoc} */
+    public Throwable getLastFailureCause() {
+        for (final MetadataResolver resolver : resolvers) {
+            if (resolver instanceof RefreshableMetadataResolver) {
+                final RefreshableMetadataResolver refreshable = (RefreshableMetadataResolver) resolver;
+                if (refreshable.getLastFailureCause() != null) {
+                    return refreshable.getLastFailureCause();
+                }
+            }
+        }
+
+        return null;
+    }
+
+    /** {@inheritDoc} */
     @Override protected void doInitialize() throws ComponentInitializationException {
         super.doInitialize();
         if (resolvers == null) {
diff --git a/opensaml-saml-api/src/main/java/org/opensaml/saml/metadata/resolver/RefreshableMetadataResolver.java b/opensaml-saml-api/src/main/java/org/opensaml/saml/metadata/resolver/RefreshableMetadataResolver.java
index b0fac11..d6f0491 100644
--- a/opensaml-saml-api/src/main/java/org/opensaml/saml/metadata/resolver/RefreshableMetadataResolver.java
+++ b/opensaml-saml-api/src/main/java/org/opensaml/saml/metadata/resolver/RefreshableMetadataResolver.java
@@ -70,4 +70,11 @@ public interface RefreshableMetadataResolver extends MetadataResolver {
      */
     @Nullable public Boolean wasLastRefreshSuccess();
     
+    /**
+     * Gets the reason the last refresh failed.
+     *
+     * @return reason the last refresh failed or null if the last refresh was successful
+     */
+    @Nullable public Throwable getLastFailureCause();
+
 }
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/AbstractReloadingMetadataResolver.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/AbstractReloadingMetadataResolver.java
index 2608251..83c6f71 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/AbstractReloadingMetadataResolver.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/AbstractReloadingMetadataResolver.java
@@ -111,6 +111,8 @@ public abstract class AbstractReloadingMetadataResolver extends AbstractBatchMet
     /** Internal flag for tracking success during the refresh operation. */
     private boolean trackRefreshSuccess;
     
+    /** Reason for the failure of the last refresh.  Will be null if last refresh was success. */
+    @Nullable private Throwable lastFailureCause;
 
 
     /** Constructor. */
@@ -183,6 +185,11 @@ public abstract class AbstractReloadingMetadataResolver extends AbstractBatchMet
         return wasLastRefreshSuccess;
     }
 
+    /** {@inheritDoc} */
+    @Nullable public Throwable getLastFailureCause() {
+        return lastFailureCause;
+    }
+
     /**
      * Gets the time when the next refresh cycle will occur.
      * 
@@ -302,6 +309,9 @@ public abstract class AbstractReloadingMetadataResolver extends AbstractBatchMet
         lastRefresh = null;
         lastUpdate = null;
         nextRefresh = null;
+        wasLastRefreshSuccess = null;
+        lastSuccessfulRefresh = null;
+        lastFailureCause = null;
         
         super.doDestroy();
     }
@@ -361,6 +371,7 @@ public abstract class AbstractReloadingMetadataResolver extends AbstractBatchMet
             }
         } catch (final Throwable t) {
             trackRefreshSuccess = false;
+            lastFailureCause = t;
             nextRefresh = Instant.now().plus(computeNextRefreshDelay(null));
             if (t instanceof Exception) {
                 log.error("{} Error occurred while attempting to refresh metadata from '{}'", getLogPrefix(), mdId);
@@ -375,6 +386,7 @@ public abstract class AbstractReloadingMetadataResolver extends AbstractBatchMet
             if (trackRefreshSuccess) {
                 wasLastRefreshSuccess = true;
                 lastSuccessfulRefresh = now;
+                lastFailureCause = null;
             } else {
                 wasLastRefreshSuccess = false;
             }
@@ -511,6 +523,9 @@ public abstract class AbstractReloadingMetadataResolver extends AbstractBatchMet
 
         nextRefresh = Instant.now().plus(computeNextRefreshDelay(null));
         trackRefreshSuccess = false;
+        // Note: We don't throw this b/c it would change behavior wrt to init and failFast,
+        // but we still want to expose the failure cause to clients.
+        lastFailureCause = new ResolverException("Entire metadata document was already expired at time of loading");
     }
 
     /**
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/CompositeMetadataResolver.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/CompositeMetadataResolver.java
index dc9628e..8131da7 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/CompositeMetadataResolver.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/CompositeMetadataResolver.java
@@ -235,6 +235,20 @@ public class CompositeMetadataResolver extends AbstractIdentifiedInitializableCo
         return true;
     }
 
+    /** {@inheritDoc} */
+    public Throwable getLastFailureCause() {
+        for (final MetadataResolver resolver : resolvers) {
+            if (resolver instanceof RefreshableMetadataResolver) {
+                final RefreshableMetadataResolver refreshable = (RefreshableMetadataResolver) resolver;
+                if (refreshable.getLastFailureCause() != null) {
+                    return refreshable.getLastFailureCause();
+                }
+            }
+        }
+
+        return null;
+    }
+
     /**
      * {@link Iterable} implementation that provides an {@link Iterator} that lazily iterates over each composed
      * resolver.
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/impl/FileBackedHTTPMetadataResolverTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/impl/FileBackedHTTPMetadataResolverTest.java
index e87938b..9569f5c 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/impl/FileBackedHTTPMetadataResolverTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/impl/FileBackedHTTPMetadataResolverTest.java
@@ -104,6 +104,10 @@ public class FileBackedHTTPMetadataResolverTest extends XMLObjectBaseTestCase {
         metadataProvider.setId("test");
         metadataProvider.initialize();
         
+        Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertTrue(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertNull(metadataProvider.getLastFailureCause());
+        
         Assert.assertFalse(metadataProvider.isInitializedFromBackupFile());
         
         EntityDescriptor descriptor = metadataProvider.resolveSingle(criteriaSet);
@@ -122,12 +126,16 @@ public class FileBackedHTTPMetadataResolverTest extends XMLObjectBaseTestCase {
         
         metadataProvider.setFailFastInitialization(true);
         metadataProvider.setParserPool(parserPool);
+        metadataProvider.setId("test");
         
         try {
             metadataProvider.initialize();
             Assert.fail("metadata provider claims to have parsed known invalid data");
         } catch (ComponentInitializationException e) {
-            //expected, do nothing
+            Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertFalse(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertNotNull(metadataProvider.getLastFailureCause());
+            Assert.assertTrue(ResolverException.class.isInstance(metadataProvider.getLastFailureCause()));
         }
     }
     
@@ -146,6 +154,11 @@ public class FileBackedHTTPMetadataResolverTest extends XMLObjectBaseTestCase {
         
         try {
             metadataProvider.initialize();
+            
+            Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertFalse(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertNotNull(metadataProvider.getLastFailureCause());
+            Assert.assertTrue(ResolverException.class.isInstance(metadataProvider.getLastFailureCause()));
         } catch (ComponentInitializationException e) {
             Assert.fail("Provider failed init with fail-fast=false");
         }
@@ -163,19 +176,21 @@ public class FileBackedHTTPMetadataResolverTest extends XMLObjectBaseTestCase {
     public void testFailFastBadBackupFile() throws Exception {
         try {
             // Use a known existing directory as backup file path, which is an invalid argument.
-            metadataProvider = new FileBackedHTTPMetadataResolver(httpClientBuilder.buildClient(), metadataURLHttps, System.getProperty("java.io.tmpdir"));
+            metadataProvider = new FileBackedHTTPMetadataResolver(httpClientBuilder.buildClient(), metadataURLHttp, System.getProperty("java.io.tmpdir"));
         } catch (ResolverException e) {
             Assert.fail("Provider failed bad backup file in constructor");
             
         }
         metadataProvider.setFailFastInitialization(true);
         metadataProvider.setParserPool(parserPool);
+        metadataProvider.setId("test");
         
         try {
             metadataProvider.initialize();
             Assert.fail("Provider passed init with bad backup file, fail-fast=true");
         } catch (ComponentInitializationException e) {
-            // expected do nothing
+            Assert.assertNull(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertNull(metadataProvider.getLastFailureCause());
         }
     }
     
@@ -200,6 +215,11 @@ public class FileBackedHTTPMetadataResolverTest extends XMLObjectBaseTestCase {
         try {
             metadataProvider.initialize();
             Assert.assertFalse(metadataProvider.isInitializedFromBackupFile());
+            
+            // This is success because if backup file is bad, then resolver immediately does the HTTP fetch
+            Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertTrue(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertNull(metadataProvider.getLastFailureCause());
         } catch (ComponentInitializationException e) {
             Assert.fail("Provider failed init with bad backup file, fail-fast=false");
         }
@@ -231,6 +251,10 @@ public class FileBackedHTTPMetadataResolverTest extends XMLObjectBaseTestCase {
         metadataProvider.setBackupFileInitNextRefreshDelay(Duration.ofSeconds(1));
         metadataProvider.setMetadataFilter(mockFilter);
         metadataProvider.initialize();
+        
+        Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertTrue(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertNull(metadataProvider.getLastFailureCause());
 
         Assert.assertTrue(metadataProvider.isInitializedFromBackupFile());
 
@@ -246,6 +270,10 @@ public class FileBackedHTTPMetadataResolverTest extends XMLObjectBaseTestCase {
 
         Assert.assertTrue(initRefresh.isBefore(metadataProvider.getLastRefresh()));
         Assert.assertTrue(initUpdate.isBefore(metadataProvider.getLastUpdate()));
+        
+        Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertTrue(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertNull(metadataProvider.getLastFailureCause());
 
         Assert.assertFalse(mockFilter.lastFilterContext.get(MetadataSource.class).isTrusted());
 
@@ -274,8 +302,14 @@ public class FileBackedHTTPMetadataResolverTest extends XMLObjectBaseTestCase {
         metadataProvider.setFailFastInitialization(true);
         metadataProvider.setId("test");
         metadataProvider.setBackupFileInitNextRefreshDelay(Duration.ofSeconds(1));
+        
         metadataProvider.initialize();
         
+        Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertFalse(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertNotNull(metadataProvider.getLastFailureCause());
+        Assert.assertTrue(ResolverException.class.isInstance(metadataProvider.getLastFailureCause()));
+        
         Assert.assertTrue(metadataProvider.isInitializedFromBackupFile());
         
         Instant postInit = Instant.now();
@@ -294,6 +328,10 @@ public class FileBackedHTTPMetadataResolverTest extends XMLObjectBaseTestCase {
         Assert.assertNotNull(refreshUpdate);
         Assert.assertTrue(refreshUpdate.isAfter(postInit));
         
+        Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertTrue(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertNull(metadataProvider.getLastFailureCause());
+        
         Assert.assertNotNull(metadataProvider.resolveSingle(criteriaSet), "Metadata retrieved from HTTP refreshed metadata was null");
     }
     
@@ -321,6 +359,11 @@ public class FileBackedHTTPMetadataResolverTest extends XMLObjectBaseTestCase {
         metadataProvider.setBackupFileInitNextRefreshDelay(Duration.ofSeconds(1));
         metadataProvider.initialize();
         
+        Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertFalse(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertNotNull(metadataProvider.getLastFailureCause());
+        Assert.assertTrue(ResolverException.class.isInstance(metadataProvider.getLastFailureCause()));
+        
         Assert.assertTrue(metadataProvider.isInitializedFromBackupFile());
         
         Instant postInit = Instant.now();
@@ -339,6 +382,10 @@ public class FileBackedHTTPMetadataResolverTest extends XMLObjectBaseTestCase {
         Assert.assertNotNull(refreshUpdate);
         Assert.assertTrue(refreshUpdate.isAfter(postInit));
         
+        Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertTrue(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertNull(metadataProvider.getLastFailureCause());
+        
         Assert.assertNotNull(metadataProvider.resolveSingle(criteriaSet), "Metadata retrieved from HTTP refreshed metadata was null");
     }
     
@@ -363,6 +410,10 @@ public class FileBackedHTTPMetadataResolverTest extends XMLObjectBaseTestCase {
         metadataProvider.setId("test");
         metadataProvider.initialize();
         
+        Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertTrue(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertNull(metadataProvider.getLastFailureCause());
+        
         Assert.assertTrue(metadataProvider.isInitializedFromBackupFile());
         
         Instant initRefresh = metadataProvider.getLastRefresh();
@@ -379,6 +430,10 @@ public class FileBackedHTTPMetadataResolverTest extends XMLObjectBaseTestCase {
         Assert.assertTrue(initRefresh.isBefore(metadataProvider.getLastRefresh()));
         Assert.assertEquals(initUpdate, metadataProvider.getLastUpdate());
         
+        Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertTrue(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertNull(metadataProvider.getLastFailureCause());
+        
         Assert.assertNotNull(metadataProvider.resolveSingle(criteriaSet), "Metadata retrieved from cached metadata was null");
     }
     
@@ -392,6 +447,10 @@ public class FileBackedHTTPMetadataResolverTest extends XMLObjectBaseTestCase {
         metadataProvider.setId("test");
         metadataProvider.initialize();
         
+        Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertTrue(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertNull(metadataProvider.getLastFailureCause());
+        
         EntityDescriptor descriptor = metadataProvider.resolveSingle(criteriaSet);
         Assert.assertNotNull(descriptor, "Retrieved entity descriptor was null");
         Assert.assertEquals(descriptor.getEntityID(), entityID, "Entity's ID does not match requested ID");
@@ -410,6 +469,10 @@ public class FileBackedHTTPMetadataResolverTest extends XMLObjectBaseTestCase {
         metadataProvider.setHttpClientSecurityParameters(params);
         metadataProvider.initialize();
         
+        Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertTrue(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertNull(metadataProvider.getLastFailureCause());
+        
         EntityDescriptor descriptor = metadataProvider.resolveSingle(criteriaSet);
         Assert.assertNotNull(descriptor, "Retrieved entity descriptor was null");
         Assert.assertEquals(descriptor.getEntityID(), entityID, "Entity's ID does not match requested ID");
@@ -427,6 +490,10 @@ public class FileBackedHTTPMetadataResolverTest extends XMLObjectBaseTestCase {
             metadataProvider.setParserPool(parserPool);
             metadataProvider.setId("test");
             metadataProvider.initialize();
+            
+            Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertTrue(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertNull(metadataProvider.getLastFailureCause());
 
             EntityDescriptor descriptor = metadataProvider.resolveSingle(criteriaSet);
             Assert.assertNotNull(descriptor, "Retrieved entity descriptor was null");
@@ -450,13 +517,17 @@ public class FileBackedHTTPMetadataResolverTest extends XMLObjectBaseTestCase {
         metadataProvider.setHttpClientSecurityParameters(params);
         metadataProvider.initialize();
         
+        Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertTrue(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertNull(metadataProvider.getLastFailureCause());
+        
         EntityDescriptor descriptor = metadataProvider.resolveSingle(criteriaSet);
         Assert.assertNotNull(descriptor, "Retrieved entity descriptor was null");
         Assert.assertEquals(descriptor.getEntityID(), entityID, "Entity's ID does not match requested ID");
     }
     
 
-    @Test(expectedExceptions=ComponentInitializationException.class)
+    @Test
     public void testHTTPSTrustEngineInvalidKey() throws Exception  {
         httpClientBuilder.setTLSSocketFactory(HTTPMetadataResolverTest.buildSocketFactory());
         
@@ -466,11 +537,16 @@ public class FileBackedHTTPMetadataResolverTest extends XMLObjectBaseTestCase {
         final HttpClientSecurityParameters params = new HttpClientSecurityParameters();
         params.setTLSTrustEngine(HTTPMetadataResolverTest.buildExplicitKeyTrustEngine("badKey.crt"));
         metadataProvider.setHttpClientSecurityParameters(params);
-        metadataProvider.initialize();
         
-        EntityDescriptor descriptor = metadataProvider.resolveSingle(criteriaSet);
-        Assert.assertNotNull(descriptor, "Retrieved entity descriptor was null");
-        Assert.assertEquals(descriptor.getEntityID(), entityID, "Entity's ID does not match requested ID");
+        try {
+            metadataProvider.initialize();
+            Assert.fail("Invalid metadata TLS should have failed init");
+        } catch (ComponentInitializationException e) {
+            Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertFalse(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertNotNull(metadataProvider.getLastFailureCause());
+            Assert.assertTrue(ResolverException.class.isInstance(metadataProvider.getLastFailureCause())); 
+        }
     }
     
     @Test
@@ -487,6 +563,10 @@ public class FileBackedHTTPMetadataResolverTest extends XMLObjectBaseTestCase {
 
         metadataProvider.initialize();
         
+        Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertTrue(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertNull(metadataProvider.getLastFailureCause());
+        
         EntityDescriptor descriptor = metadataProvider.resolveSingle(criteriaSet);
         Assert.assertNotNull(descriptor, "Retrieved entity descriptor was null");
         Assert.assertEquals(descriptor.getEntityID(), entityID, "Entity's ID does not match requested ID");
@@ -505,12 +585,16 @@ public class FileBackedHTTPMetadataResolverTest extends XMLObjectBaseTestCase {
 
         metadataProvider.initialize();
         
+        Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertTrue(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertNull(metadataProvider.getLastFailureCause());
+        
         EntityDescriptor descriptor = metadataProvider.resolveSingle(criteriaSet);
         Assert.assertNotNull(descriptor, "Retrieved entity descriptor was null");
         Assert.assertEquals(descriptor.getEntityID(), entityID, "Entity's ID does not match requested ID");
     }
     
-    @Test(expectedExceptions=ComponentInitializationException.class)
+    @Test
     public void testHTTPSTrustEngineInvalidPKIX() throws Exception  {
         httpClientBuilder.setTLSSocketFactory(HTTPMetadataResolverTest.buildSocketFactory());
         
@@ -521,14 +605,18 @@ public class FileBackedHTTPMetadataResolverTest extends XMLObjectBaseTestCase {
         params.setTLSTrustEngine(HTTPMetadataResolverTest.buildPKIXTrustEngine("badCA.crt", null, false));
         metadataProvider.setHttpClientSecurityParameters(params);
 
-        metadataProvider.initialize();
-        
-        EntityDescriptor descriptor = metadataProvider.resolveSingle(criteriaSet);
-        Assert.assertNotNull(descriptor, "Retrieved entity descriptor was null");
-        Assert.assertEquals(descriptor.getEntityID(), entityID, "Entity's ID does not match requested ID");
+        try {
+            metadataProvider.initialize();
+            Assert.fail("Invalid metadata TLS should have failed init");
+        } catch (ComponentInitializationException e) {
+            Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertFalse(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertNotNull(metadataProvider.getLastFailureCause());
+            Assert.assertTrue(ResolverException.class.isInstance(metadataProvider.getLastFailureCause())); 
+        }
     }
     
-    @Test(expectedExceptions=ComponentInitializationException.class)
+    @Test
     public void testHTTPSTrustEngineValidPKIXInvalidName() throws Exception  {
         httpClientBuilder.setTLSSocketFactory(HTTPMetadataResolverTest.buildSocketFactory());
         
@@ -539,14 +627,19 @@ public class FileBackedHTTPMetadataResolverTest extends XMLObjectBaseTestCase {
         final HttpClientSecurityParameters params = new HttpClientSecurityParameters();
         params.setTLSTrustEngine(HTTPMetadataResolverTest.buildPKIXTrustEngine("repo-rootCA.crt", "foobar.shibboleth.net", true));
         metadataProvider.setHttpClientSecurityParameters(params);
-        metadataProvider.initialize();
         
-        EntityDescriptor descriptor = metadataProvider.resolveSingle(criteriaSet);
-        Assert.assertNotNull(descriptor, "Retrieved entity descriptor was null");
-        Assert.assertEquals(descriptor.getEntityID(), entityID, "Entity's ID does not match requested ID");
+        try {
+            metadataProvider.initialize();
+            Assert.fail("Invalid metadata TLS should have failed init");
+        } catch (ComponentInitializationException e) {
+            Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertFalse(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertNotNull(metadataProvider.getLastFailureCause());
+            Assert.assertTrue(ResolverException.class.isInstance(metadataProvider.getLastFailureCause())); 
+        }
     }
     
-    @Test(expectedExceptions=ComponentInitializationException.class)
+    @Test
     public void testHTTPSTrustEngineWrongSocketFactory() throws Exception  {
         // Trust engine set, but appropriate socket factory not set
         metadataProvider = new FileBackedHTTPMetadataResolver(httpClientBuilder.buildClient(), metadataURLHttps, backupFilePath);
@@ -556,11 +649,15 @@ public class FileBackedHTTPMetadataResolverTest extends XMLObjectBaseTestCase {
         params.setTLSTrustEngine(HTTPMetadataResolverTest.buildExplicitKeyTrustEngine("repo-entity.crt"));
         metadataProvider.setHttpClientSecurityParameters(params);
 
-        metadataProvider.initialize();
-        
-        EntityDescriptor descriptor = metadataProvider.resolveSingle(criteriaSet);
-        Assert.assertNotNull(descriptor, "Retrieved entity descriptor was null");
-        Assert.assertEquals(descriptor.getEntityID(), entityID, "Entity's ID does not match requested ID");
+        try {
+            metadataProvider.initialize();
+            Assert.fail("Invalid metadata TLS should have failed init");
+        } catch (ComponentInitializationException e) {
+            Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertFalse(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertNotNull(metadataProvider.getLastFailureCause());
+            Assert.assertTrue(ResolverException.class.isInstance(metadataProvider.getLastFailureCause())); 
+        }
     }
     
     // Test helpers
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/impl/FilesystemMetadataResolverTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/impl/FilesystemMetadataResolverTest.java
index 3158b9f..e2938a5 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/impl/FilesystemMetadataResolverTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/impl/FilesystemMetadataResolverTest.java
@@ -53,11 +53,6 @@ public class FilesystemMetadataResolverTest extends XMLObjectBaseTestCase {
                 .getResource("/org/opensaml/saml/saml2/metadata/InCommon-metadata.xml");
         mdFile = new File(mdURL.toURI());
 
-        metadataProvider = new FilesystemMetadataResolver(mdFile);
-        metadataProvider.setParserPool(parserPool);
-        metadataProvider.setId("test");
-        metadataProvider.initialize();
-        
         criteriaSet = new CriteriaSet(new EntityIdCriterion(entityID));
     }
 
@@ -68,6 +63,19 @@ public class FilesystemMetadataResolverTest extends XMLObjectBaseTestCase {
      */
     @Test
     public void testGetEntityDescriptor() throws ResolverException {
+        try {
+            metadataProvider = new FilesystemMetadataResolver(mdFile);
+            metadataProvider.setParserPool(parserPool);
+            metadataProvider.setId("test");
+            metadataProvider.initialize();
+            
+            Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertTrue(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertNull(metadataProvider.getLastFailureCause());
+        } catch (ComponentInitializationException e) {
+            Assert.fail("Valid metdata failed init");
+        }
+        
         EntityDescriptor descriptor = metadataProvider.resolveSingle(criteriaSet);
         Assert.assertNotNull(descriptor, "Retrieved entity descriptor was null");
         Assert.assertEquals(descriptor.getEntityID(), entityID, "Entity's ID does not match requested ID");
@@ -79,11 +87,20 @@ public class FilesystemMetadataResolverTest extends XMLObjectBaseTestCase {
      * @throws ResolverException ...
      * @throws ComponentInitializationException ...
      */
-    @Test(expectedExceptions = {ComponentInitializationException.class})
+    @Test
     public void testNonexistentMetadataFile() throws ResolverException, ComponentInitializationException {
-        metadataProvider = new FilesystemMetadataResolver(new File("I-Dont-Exist.xml"));
-        metadataProvider.setParserPool(parserPool);
-        metadataProvider.initialize();
+        try {
+            metadataProvider = new FilesystemMetadataResolver(new File("I-Dont-Exist.xml"));
+            metadataProvider.setParserPool(parserPool);
+            metadataProvider.setId("test");
+            metadataProvider.initialize();
+            Assert.fail("Init should have thrown");
+        } catch (ComponentInitializationException e) {
+            Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertFalse(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertNotNull(metadataProvider.getLastFailureCause());
+            Assert.assertTrue(ResolverException.class.isInstance(metadataProvider.getLastFailureCause()));
+        }
     }
     
     /**
@@ -93,7 +110,7 @@ public class FilesystemMetadataResolverTest extends XMLObjectBaseTestCase {
      * @throws ResolverException ...
      * @throws ComponentInitializationException ...
      */
-    @Test(expectedExceptions = {ComponentInitializationException.class})
+    @Test
     public void testInvalidMetadataFile() throws IOException, ResolverException, ComponentInitializationException {
         File targetFile = new File(System.getProperty("java.io.tmpdir"), "filesystem-md-provider-test");
         if (targetFile.exists()) {
@@ -106,7 +123,14 @@ public class FilesystemMetadataResolverTest extends XMLObjectBaseTestCase {
         try {
             metadataProvider = new FilesystemMetadataResolver(targetFile);
             metadataProvider.setParserPool(parserPool);
+            metadataProvider.setId("test");
             metadataProvider.initialize();
+            Assert.fail("Init should have thrown");
+        } catch (ComponentInitializationException e) {
+            Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertFalse(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertNotNull(metadataProvider.getLastFailureCause());
+            Assert.assertTrue(ResolverException.class.isInstance(metadataProvider.getLastFailureCause()));
         } finally {
             targetFile.delete();
         }
@@ -119,7 +143,7 @@ public class FilesystemMetadataResolverTest extends XMLObjectBaseTestCase {
      * @throws ResolverException ...
      * @throws ComponentInitializationException ...
      */
-    @Test(expectedExceptions = {ComponentInitializationException.class})
+    @Test
     public void testUnreadableMetadataFile() throws IOException, ResolverException, ComponentInitializationException {
         File targetFile = File.createTempFile("filesystem-md-provider-test", "xml");
         Assert.assertTrue(targetFile.exists());
@@ -130,7 +154,13 @@ public class FilesystemMetadataResolverTest extends XMLObjectBaseTestCase {
         try {
             metadataProvider = new FilesystemMetadataResolver(targetFile);
             metadataProvider.setParserPool(parserPool);
+            metadataProvider.setId("test");
             metadataProvider.initialize();
+        } catch (ComponentInitializationException e) {
+            Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertFalse(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertNotNull(metadataProvider.getLastFailureCause());
+            Assert.assertTrue(ResolverException.class.isInstance(metadataProvider.getLastFailureCause()));
         } finally {
             targetFile.delete();
         }
@@ -142,7 +172,7 @@ public class FilesystemMetadataResolverTest extends XMLObjectBaseTestCase {
      * @throws IOException ...
      * @throws ResolverException ...
      */
-    @Test(expectedExceptions = {ResolverException.class})
+    @Test
     public void testDisappearingMetadataFile() throws IOException, ResolverException {
         File targetFile = new File(System.getProperty("java.io.tmpdir"), "filesystem-md-provider-disappearing.xml");
         if (targetFile.exists()) {
@@ -157,13 +187,25 @@ public class FilesystemMetadataResolverTest extends XMLObjectBaseTestCase {
             metadataProvider.setParserPool(parserPool);
             metadataProvider.setId("test");
             metadataProvider.initialize();
+            
+            Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertTrue(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertNull(metadataProvider.getLastFailureCause());
         } catch (ComponentInitializationException e) {
             Assert.fail("Filesystem metadata provider init failed with file: " + targetFile.getAbsolutePath());
         }
         
         Assert.assertTrue(targetFile.delete());
         
-        metadataProvider.refresh();
+        try {
+            metadataProvider.refresh();
+            Assert.fail("Refresh should have thrown");
+        } catch (ResolverException e) {
+            Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertFalse(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertNotNull(metadataProvider.getLastFailureCause());
+            Assert.assertTrue(ResolverException.class.isInstance(metadataProvider.getLastFailureCause()));
+        }
     }
     
     /**
@@ -185,6 +227,11 @@ public class FilesystemMetadataResolverTest extends XMLObjectBaseTestCase {
             metadataProvider.setParserPool(parserPool);
             metadataProvider.setId("test");
             metadataProvider.initialize();
+            
+            Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertFalse(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertNotNull(metadataProvider.getLastFailureCause());
+            Assert.assertTrue(ResolverException.class.isInstance(metadataProvider.getLastFailureCause()));
         } catch (ComponentInitializationException | ResolverException e) {
             Assert.fail("Filesystem metadata provider init failed with non-existent file and fail fast = false");
         }
@@ -208,6 +255,11 @@ public class FilesystemMetadataResolverTest extends XMLObjectBaseTestCase {
         
         try {
             metadataProvider.refresh();
+            
+            Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertTrue(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertNull(metadataProvider.getLastFailureCause());
+            
             EntityDescriptor descriptor = metadataProvider.resolveSingle(criteriaSet);
             Assert.assertNotNull(descriptor, "Retrieved entity descriptor was null");
         } catch (ResolverException e) {
@@ -228,6 +280,11 @@ public class FilesystemMetadataResolverTest extends XMLObjectBaseTestCase {
             metadataProvider.setId("test");
             metadataProvider.setParserPool(parserPool);
             metadataProvider.initialize();
+            
+            Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertFalse(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertNotNull(metadataProvider.getLastFailureCause());
+            Assert.assertTrue(ResolverException.class.isInstance(metadataProvider.getLastFailureCause()));
         } catch (ComponentInitializationException | ResolverException e) {
             Assert.fail("Filesystem metadata provider init failed with expired file and fail fast = false");
         }
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/impl/HTTPMetadataResolverTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/impl/HTTPMetadataResolverTest.java
index d105217..34fdf8e 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/impl/HTTPMetadataResolverTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/metadata/resolver/impl/HTTPMetadataResolverTest.java
@@ -26,14 +26,12 @@ import java.util.Collections;
 import java.util.Set;
 
 import org.apache.http.conn.socket.LayeredConnectionSocketFactory;
-import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
 import org.opensaml.core.criterion.EntityIdCriterion;
 import org.opensaml.core.xml.XMLObjectBaseTestCase;
 import org.opensaml.saml.saml2.metadata.EntityDescriptor;
 import org.opensaml.security.credential.impl.StaticCredentialResolver;
 import org.opensaml.security.httpclient.HttpClientSecurityParameters;
 import org.opensaml.security.httpclient.impl.SecurityEnhancedHttpClientSupport;
-import org.opensaml.security.httpclient.impl.SecurityEnhancedTLSSocketFactory;
 import org.opensaml.security.trust.TrustEngine;
 import org.opensaml.security.trust.impl.ExplicitKeyTrustEngine;
 import org.opensaml.security.x509.BasicX509Credential;
@@ -46,7 +44,6 @@ import org.opensaml.security.x509.impl.CertPathPKIXTrustEvaluator;
 import org.opensaml.security.x509.impl.PKIXX509CredentialTrustEngine;
 import org.opensaml.security.x509.impl.StaticPKIXValidationInformationResolver;
 import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
@@ -55,9 +52,6 @@ import com.google.common.io.ByteStreams;
 
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
 import net.shibboleth.utilities.java.support.httpclient.HttpClientBuilder;
-import net.shibboleth.utilities.java.support.httpclient.HttpClientSupport;
-import net.shibboleth.utilities.java.support.httpclient.TLSSocketFactory;
-import net.shibboleth.utilities.java.support.httpclient.TLSSocketFactoryBuilder;
 import net.shibboleth.utilities.java.support.repository.RepositorySupport;
 import net.shibboleth.utilities.java.support.resolver.CriteriaSet;
 import net.shibboleth.utilities.java.support.resolver.ResolverException;
@@ -91,22 +85,28 @@ public class HTTPMetadataResolverTest extends XMLObjectBaseTestCase {
         badMDURL = "http://www.google.com/";
         entityID = "https://www.example.org/sp";
         
-        metadataProvider = new HTTPMetadataResolver(httpClientBuilder.buildClient(), metadataURLHttp);
-        metadataProvider.setParserPool(parserPool);
-        metadataProvider.setId("test");
-        metadataProvider.initialize();
-        
-        
         criteriaSet = new CriteriaSet(new EntityIdCriterion(entityID));
     }
     
     /**
      * Tests the {@link HTTPMetadataResolver#lookupEntityID(String)} method.
-     * 
-     * @throws ResolverException ...
+     * @throws Exception 
      */
     @Test
-    public void testGetEntityDescriptor() throws ResolverException {
+    public void testGetEntityDescriptor() throws Exception {
+        try {
+            metadataProvider = new HTTPMetadataResolver(httpClientBuilder.buildClient(), metadataURLHttp);
+            metadataProvider.setParserPool(parserPool);
+            metadataProvider.setId("test");
+            metadataProvider.initialize();
+            
+            Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertTrue(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertNull(metadataProvider.getLastFailureCause());
+        } catch (ComponentInitializationException e) {
+            Assert.fail("Valid metadata failed init");
+        }
+        
         EntityDescriptor descriptor = metadataProvider.resolveSingle(criteriaSet);
         Assert.assertNotNull(descriptor, "Retrieved entity descriptor was null");
         Assert.assertEquals(descriptor.getEntityID(), entityID, "Entity's ID does not match requested ID");
@@ -129,7 +129,10 @@ public class HTTPMetadataResolverTest extends XMLObjectBaseTestCase {
             metadataProvider.initialize();
             Assert.fail("metadata provider claims to have parsed known invalid data");
         } catch (ComponentInitializationException e) {
-            //expected, do nothing
+            Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertFalse(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertNotNull(metadataProvider.getLastFailureCause());
+            Assert.assertTrue(ResolverException.class.isInstance(metadataProvider.getLastFailureCause()));
         }
     }
     
@@ -148,6 +151,11 @@ public class HTTPMetadataResolverTest extends XMLObjectBaseTestCase {
         
         try {
             metadataProvider.initialize();
+            
+            Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertFalse(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertNotNull(metadataProvider.getLastFailureCause());
+            Assert.assertTrue(ResolverException.class.isInstance(metadataProvider.getLastFailureCause()));
         } catch (ComponentInitializationException e) {
             Assert.fail("Provider failed init with fail-fast=false");
         }
@@ -166,6 +174,10 @@ public class HTTPMetadataResolverTest extends XMLObjectBaseTestCase {
         metadataProvider.setId("test");
         metadataProvider.initialize();
         
+        Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertTrue(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertNull(metadataProvider.getLastFailureCause());
+        
         EntityDescriptor descriptor = metadataProvider.resolveSingle(criteriaSet);
         Assert.assertNotNull(descriptor, "Retrieved entity descriptor was null");
         Assert.assertEquals(descriptor.getEntityID(), entityID, "Entity's ID does not match requested ID");
@@ -185,6 +197,10 @@ public class HTTPMetadataResolverTest extends XMLObjectBaseTestCase {
         metadataProvider.setHttpClientSecurityParameters(params);
         metadataProvider.initialize();
         
+        Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertTrue(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertNull(metadataProvider.getLastFailureCause());
+        
         EntityDescriptor descriptor = metadataProvider.resolveSingle(criteriaSet);
         Assert.assertNotNull(descriptor, "Retrieved entity descriptor was null");
         Assert.assertEquals(descriptor.getEntityID(), entityID, "Entity's ID does not match requested ID");
@@ -202,6 +218,10 @@ public class HTTPMetadataResolverTest extends XMLObjectBaseTestCase {
             metadataProvider.setParserPool(parserPool);
             metadataProvider.setId("test");
             metadataProvider.initialize();
+            
+            Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertTrue(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertNull(metadataProvider.getLastFailureCause());
 
             EntityDescriptor descriptor = metadataProvider.resolveSingle(criteriaSet);
             Assert.assertNotNull(descriptor, "Retrieved entity descriptor was null");
@@ -226,13 +246,17 @@ public class HTTPMetadataResolverTest extends XMLObjectBaseTestCase {
 
         metadataProvider.initialize();
         
+        Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertTrue(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertNull(metadataProvider.getLastFailureCause());
+        
         EntityDescriptor descriptor = metadataProvider.resolveSingle(criteriaSet);
         Assert.assertNotNull(descriptor, "Retrieved entity descriptor was null");
         Assert.assertEquals(descriptor.getEntityID(), entityID, "Entity's ID does not match requested ID");
     }
     
 
-    @Test(expectedExceptions=ComponentInitializationException.class)
+    @Test
     public void testHTTPSTrustEngineInvalidKey() throws Exception  {
         httpClientBuilder.setTLSSocketFactory(buildSocketFactory());
         
@@ -244,11 +268,15 @@ public class HTTPMetadataResolverTest extends XMLObjectBaseTestCase {
         params.setTLSTrustEngine(HTTPMetadataResolverTest.buildExplicitKeyTrustEngine("badKey.crt"));
         metadataProvider.setHttpClientSecurityParameters(params);
 
-        metadataProvider.initialize();
-        
-        EntityDescriptor descriptor = metadataProvider.resolveSingle(criteriaSet);
-        Assert.assertNotNull(descriptor, "Retrieved entity descriptor was null");
-        Assert.assertEquals(descriptor.getEntityID(), entityID, "Entity's ID does not match requested ID");
+        try {
+            metadataProvider.initialize();
+            Assert.fail("Invalid metadata TLS should have failed init");
+        } catch (ComponentInitializationException e) {
+            Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertFalse(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertNotNull(metadataProvider.getLastFailureCause());
+            Assert.assertTrue(ResolverException.class.isInstance(metadataProvider.getLastFailureCause()));
+        }
     }
     
     @Test
@@ -265,6 +293,10 @@ public class HTTPMetadataResolverTest extends XMLObjectBaseTestCase {
 
         metadataProvider.initialize();
         
+        Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertTrue(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertNull(metadataProvider.getLastFailureCause());
+        
         EntityDescriptor descriptor = metadataProvider.resolveSingle(criteriaSet);
         Assert.assertNotNull(descriptor, "Retrieved entity descriptor was null");
         Assert.assertEquals(descriptor.getEntityID(), entityID, "Entity's ID does not match requested ID");
@@ -284,12 +316,16 @@ public class HTTPMetadataResolverTest extends XMLObjectBaseTestCase {
 
         metadataProvider.initialize();
         
+        Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertTrue(metadataProvider.wasLastRefreshSuccess());
+        Assert.assertNull(metadataProvider.getLastFailureCause());
+        
         EntityDescriptor descriptor = metadataProvider.resolveSingle(criteriaSet);
         Assert.assertNotNull(descriptor, "Retrieved entity descriptor was null");
         Assert.assertEquals(descriptor.getEntityID(), entityID, "Entity's ID does not match requested ID");
     }
     
-    @Test(expectedExceptions=ComponentInitializationException.class)
+    @Test
     public void testHTTPSTrustEngineInvalidPKIX() throws Exception  {
         httpClientBuilder.setTLSSocketFactory(buildSocketFactory());
         
@@ -301,14 +337,18 @@ public class HTTPMetadataResolverTest extends XMLObjectBaseTestCase {
         params.setTLSTrustEngine(HTTPMetadataResolverTest.buildPKIXTrustEngine("badCA.crt", null, false));
         metadataProvider.setHttpClientSecurityParameters(params);
 
-        metadataProvider.initialize();
-        
-        EntityDescriptor descriptor = metadataProvider.resolveSingle(criteriaSet);
-        Assert.assertNotNull(descriptor, "Retrieved entity descriptor was null");
-        Assert.assertEquals(descriptor.getEntityID(), entityID, "Entity's ID does not match requested ID");
+        try {
+            metadataProvider.initialize();
+            Assert.fail("Invalid metadata TLS should have failed init");
+        } catch (ComponentInitializationException e) {
+            Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertFalse(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertNotNull(metadataProvider.getLastFailureCause());
+            Assert.assertTrue(ResolverException.class.isInstance(metadataProvider.getLastFailureCause()));
+        }
     }
     
-    @Test(expectedExceptions=ComponentInitializationException.class)
+    @Test
     public void testHTTPSTrustEngineValidPKIXInvalidName() throws Exception  {
         httpClientBuilder.setTLSSocketFactory(buildSocketFactory());
         
@@ -320,14 +360,18 @@ public class HTTPMetadataResolverTest extends XMLObjectBaseTestCase {
         params.setTLSTrustEngine(HTTPMetadataResolverTest.buildPKIXTrustEngine("repo-rootCA.crt", "foobar.shibboleth.net", true));
         metadataProvider.setHttpClientSecurityParameters(params);
 
-        metadataProvider.initialize();
-        
-        EntityDescriptor descriptor = metadataProvider.resolveSingle(criteriaSet);
-        Assert.assertNotNull(descriptor, "Retrieved entity descriptor was null");
-        Assert.assertEquals(descriptor.getEntityID(), entityID, "Entity's ID does not match requested ID");
+        try {
+            metadataProvider.initialize();
+            Assert.fail("Invalid metadata TLS should have failed init");
+        } catch (ComponentInitializationException e) {
+            Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertFalse(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertNotNull(metadataProvider.getLastFailureCause());
+            Assert.assertTrue(ResolverException.class.isInstance(metadataProvider.getLastFailureCause()));
+        }
     }
     
-    @Test(expectedExceptions=ComponentInitializationException.class)
+    @Test
     public void testHTTPSTrustEngineWrongSocketFactory() throws Exception  {
         // Trust engine set, but appropriate socket factory not set
         metadataProvider = new HTTPMetadataResolver(httpClientBuilder.buildClient(), metadataURLHttps);
@@ -338,12 +382,17 @@ public class HTTPMetadataResolverTest extends XMLObjectBaseTestCase {
         params.setTLSTrustEngine(HTTPMetadataResolverTest.buildExplicitKeyTrustEngine("repo-entity.crt"));
         metadataProvider.setHttpClientSecurityParameters(params);
 
-        metadataProvider.initialize();
-        
-        EntityDescriptor descriptor = metadataProvider.resolveSingle(criteriaSet);
-        Assert.assertNotNull(descriptor, "Retrieved entity descriptor was null");
-        Assert.assertEquals(descriptor.getEntityID(), entityID, "Entity's ID does not match requested ID");
+        try {
+            metadataProvider.initialize();
+            Assert.fail("Invalid metadata TLS should have failed init");
+        } catch (ComponentInitializationException e) {
+            Assert.assertNotNull(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertFalse(metadataProvider.wasLastRefreshSuccess());
+            Assert.assertNotNull(metadataProvider.getLastFailureCause());
+            Assert.assertTrue(ResolverException.class.isInstance(metadataProvider.getLastFailureCause()));
+        }
     }
+    
     // Helpers
     
     public static TrustEngine<? super X509Credential> buildPKIXTrustEngine(String cert, String name, boolean nameCheckEnabled) throws URISyntaxException, CertificateException, IOException {

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the commits mailing list