Author: ghenzler
Date: Wed Jan  9 20:24:51 2019
New Revision: 1850901

URL: http://svn.apache.org/viewvc?rev=1850901&view=rev
Log:
FELIX-5952 General improvements/fixes
- set header "X-Health" not only for format html 
- executor: extended interface ExtendedHealthCheckExecutor and added internal 
helper CombinedExecutionResult (also needed for FELIX-6017 and FELIX-6018)
- improved tests using Mockito for HealthCheckMBeanTest

Added:
    
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/CombinedExecutionResult.java
   (with props)
Modified:
    
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/JmxAdjustableStatusHealthCheck.java
    
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/ExtendedHealthCheckExecutor.java
    
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/HealthCheckExecutorImpl.java
    
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/HealthCheckResultCache.java
    
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/servlet/HealthCheckExecutorServlet.java
    
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/util/HealthCheckFilter.java
    
felix/trunk/healthcheck/core/src/test/java/org/apache/felix/hc/core/it/ExtendedHealthCheckExecutorIT.java
    
felix/trunk/healthcheck/core/src/test/java/org/apache/felix/hc/core/it/HealthCheckFilterIT.java
    
felix/trunk/healthcheck/core/src/test/java/org/apache/felix/hc/core/it/U.java
    
felix/trunk/healthcheck/core/src/test/java/org/apache/felix/hc/jmx/impl/HealthCheckMBeanTest.java

Modified: 
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/JmxAdjustableStatusHealthCheck.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/JmxAdjustableStatusHealthCheck.java?rev=1850901&r1=1850900&r2=1850901&view=diff
==============================================================================
--- 
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/JmxAdjustableStatusHealthCheck.java
 (original)
+++ 
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/JmxAdjustableStatusHealthCheck.java
 Wed Jan  9 20:24:51 2019
@@ -36,11 +36,10 @@ import javax.management.MBeanParameterIn
 import javax.management.ReflectionException;
 
 import org.apache.commons.lang3.StringUtils;
-import org.apache.felix.hc.api.FormattingResultLog;
 import org.apache.felix.hc.api.HealthCheck;
 import org.apache.felix.hc.api.Result;
 import org.apache.felix.hc.api.Result.Status;
-import org.apache.felix.hc.api.ResultLog.Entry;
+import org.apache.felix.hc.core.impl.util.AdhocStatusHealthCheck;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.component.ComponentContext;
@@ -94,13 +93,12 @@ public class JmxAdjustableStatusHealthCh
     /* synchronized as potentially multiple users can run JMX operations */
     private synchronized void registerDynamicHealthCheck(Result.Status status, 
String[] tags) {
         unregisterDynamicHealthCheck();
-        HealthCheck healthCheck = new AdhocStatusOnlyHealthCheck(status);
+        HealthCheck healthCheck = new AdhocStatusHealthCheck(status, "Set 
dynamically via JMX bean " + JmxAdjustableStatusHealthCheck.OBJECT_NAME);
         Dictionary<String, Object> props = new Hashtable<String, Object>();
         props.put(HealthCheck.NAME, "JMX Adhoc Result");
         props.put(HealthCheck.TAGS, tags);
 
         healthCheckRegistration = 
bundleContext.registerService(HealthCheck.class.getName(), healthCheck, props);
-
     }
 
     /* synchronized as potentially multiple users can run JMX operations */
@@ -112,24 +110,6 @@ public class JmxAdjustableStatusHealthCh
         }
     }
 
-    class AdhocStatusOnlyHealthCheck implements HealthCheck {
-
-        private final Result.Status status;
-
-        AdhocStatusOnlyHealthCheck(Result.Status status) {
-            this.status = status;
-        }
-
-        @Override
-        public Result execute() {
-            FormattingResultLog resultLog = new FormattingResultLog();
-            resultLog.add(
-                    new Entry(status, "Set dynamically via JMX bean " + 
OBJECT_NAME));
-            return new Result(resultLog);
-        }
-
-    }
-
     private class AdjustableHealthCheckStatusMBean implements DynamicMBean {
 
         private static final String OP_RESET = "reset";

Added: 
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/CombinedExecutionResult.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/CombinedExecutionResult.java?rev=1850901&view=auto
==============================================================================
--- 
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/CombinedExecutionResult.java
 (added)
+++ 
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/CombinedExecutionResult.java
 Wed Jan  9 20:24:51 2019
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The SF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+package org.apache.felix.hc.core.impl.executor;
+
+import java.util.Date;
+import java.util.List;
+
+import org.apache.felix.hc.api.Result;
+import org.apache.felix.hc.api.Result.Status;
+import org.apache.felix.hc.api.execution.HealthCheckExecutionResult;
+import org.apache.felix.hc.api.execution.HealthCheckMetadata;
+
+/** Used to group execution results. */
+public class CombinedExecutionResult implements HealthCheckExecutionResult {
+
+    final List<HealthCheckExecutionResult> executionResults;
+    final Result overallResult;
+    
+    public CombinedExecutionResult(List<HealthCheckExecutionResult> 
executionResults) {
+        this.executionResults = executionResults;
+        Result.Status mostSevereStatus = Result.Status.OK;
+        for (HealthCheckExecutionResult executionResult : executionResults) {
+            Status status = executionResult.getHealthCheckResult().getStatus();
+            if (status.ordinal() > mostSevereStatus.ordinal()) {
+                mostSevereStatus = status;
+            }
+        }
+        overallResult = new Result(mostSevereStatus, "Overall status " + 
mostSevereStatus);
+    }
+
+    @Override
+    public Result getHealthCheckResult() {
+        return overallResult;
+    }
+
+    @Override
+    public long getElapsedTimeInMs() {
+        long maxElapsed = 0;
+        for(HealthCheckExecutionResult result: executionResults) {
+            maxElapsed = Math.max(maxElapsed,  result.getElapsedTimeInMs());
+        }
+        return maxElapsed;
+    }
+
+    @Override
+    public Date getFinishedAt() {
+        Date latestFinishedAt = null;
+        for(HealthCheckExecutionResult result: executionResults) {
+            if(latestFinishedAt == null || 
latestFinishedAt.before(result.getFinishedAt())) {
+                latestFinishedAt = result.getFinishedAt();
+            }
+        }
+        return latestFinishedAt;
+    }
+
+    @Override
+    public boolean hasTimedOut() {
+        for(HealthCheckExecutionResult result: executionResults) {
+            if(result.hasTimedOut()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public HealthCheckMetadata getHealthCheckMetadata() {
+        throw new UnsupportedOperationException();
+    }
+
+}
\ No newline at end of file

Propchange: 
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/CombinedExecutionResult.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/ExtendedHealthCheckExecutor.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/ExtendedHealthCheckExecutor.java?rev=1850901&r1=1850900&r2=1850901&view=diff
==============================================================================
--- 
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/ExtendedHealthCheckExecutor.java
 (original)
+++ 
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/ExtendedHealthCheckExecutor.java
 Wed Jan  9 20:24:51 2019
@@ -17,13 +17,25 @@
  */
 package org.apache.felix.hc.core.impl.executor;
 
+import java.util.List;
+
 import org.apache.felix.hc.api.HealthCheck;
+import org.apache.felix.hc.api.execution.HealthCheckExecutionOptions;
 import org.apache.felix.hc.api.execution.HealthCheckExecutionResult;
 import org.apache.felix.hc.api.execution.HealthCheckExecutor;
+import org.apache.felix.hc.api.execution.HealthCheckSelector;
 import org.osgi.framework.ServiceReference;
 
-/** Internal service used by the JMX stuff */
+/** Internal service used by the JMX and ServiceUnavailableFilter */
 public interface ExtendedHealthCheckExecutor extends HealthCheckExecutor {
 
+    /** execute single health check using cache, used by JMX */
     HealthCheckExecutionResult execute(ServiceReference<HealthCheck> ref);
+
+    /** internal interface to retrieve service references */
+    ServiceReference<HealthCheck>[] 
selectHealthCheckReferences(HealthCheckSelector selector, 
HealthCheckExecutionOptions options);
+    
+    /** internal interface to execute checks for service references */
+    List<HealthCheckExecutionResult> execute(final 
ServiceReference<HealthCheck>[] healthCheckReferences, 
HealthCheckExecutionOptions options);
+
 }
\ No newline at end of file

Modified: 
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/HealthCheckExecutorImpl.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/HealthCheckExecutorImpl.java?rev=1850901&r1=1850900&r2=1850901&view=diff
==============================================================================
--- 
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/HealthCheckExecutorImpl.java
 (original)
+++ 
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/HealthCheckExecutorImpl.java
 Wed Jan  9 20:24:51 2019
@@ -164,16 +164,17 @@ public class HealthCheckExecutorImpl imp
             selector.withTags(defaultTags);
         }
         
-        final ServiceReference<HealthCheck>[] healthCheckReferences = 
selectHealthCheckReferences(selector, options.isCombineTagsWithOr());
+        final ServiceReference<HealthCheck>[] healthCheckReferences = 
selectHealthCheckReferences(selector, options);
         List<HealthCheckExecutionResult> results = 
this.execute(healthCheckReferences, options);
         return results;
         
     }
 
-    // not part of interface but called by HealthCheckFilterIT
-    private ServiceReference<HealthCheck>[] 
selectHealthCheckReferences(HealthCheckSelector selector, boolean 
isCombineTagsWithOr) {
+    /** @see 
org.apache.felix.hc.core.impl.executor.ExtendedHealthCheckExecutor#selectHealthCheckReferences(HealthCheckSelector,
 HealthCheckExecutionOptions) */
+    @Override
+    public ServiceReference<HealthCheck>[] 
selectHealthCheckReferences(HealthCheckSelector selector, 
HealthCheckExecutionOptions options) {
         final HealthCheckFilter filter = new 
HealthCheckFilter(this.bundleContext);
-        final ServiceReference<HealthCheck>[] healthCheckReferences = 
filter.getHealthCheckServiceReferences(selector, isCombineTagsWithOr);
+        final ServiceReference<HealthCheck>[] healthCheckReferences = 
filter.getHealthCheckServiceReferences(selector, options.isCombineTagsWithOr());
         return healthCheckReferences;
     }
 
@@ -184,21 +185,21 @@ public class HealthCheckExecutorImpl imp
         return createResultsForDescriptor(metadata);
     }
 
-    /** Execute a set of health checks */
-    private List<HealthCheckExecutionResult> execute(final 
ServiceReference<HealthCheck>[] healthCheckReferences,
+    /** @see 
org.apache.felix.hc.core.impl.executor.ExtendedHealthCheckExecutor#execute(ServiceReference[],
 HealthCheckExecutionOptions) */
+    @Override
+    public List<HealthCheckExecutionResult> execute(final 
ServiceReference<HealthCheck>[] healthCheckReferences,
             HealthCheckExecutionOptions options) {
-        final StopWatch stopWatch = new StopWatch();
-        stopWatch.start();
+        final long startTime = System.currentTimeMillis();
 
         final List<HealthCheckExecutionResult> results = new 
ArrayList<HealthCheckExecutionResult>();
         final List<HealthCheckMetadata> healthCheckDescriptors = 
getHealthCheckMetadata(healthCheckReferences);
 
         createResultsForDescriptors(healthCheckDescriptors, results, options);
 
-        stopWatch.stop();
         if (logger.isDebugEnabled()) {
-            logger.debug("Time consumed for all checks: {}", 
msHumanReadable(stopWatch.getTime()));
+            logger.debug("Time consumed for all checks: {}", 
msHumanReadable(System.currentTimeMillis() - startTime));
         }
+        
         // sort result
         Collections.sort(results, new Comparator<HealthCheckExecutionResult>() 
{
 

Modified: 
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/HealthCheckResultCache.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/HealthCheckResultCache.java?rev=1850901&r1=1850900&r2=1850901&view=diff
==============================================================================
--- 
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/HealthCheckResultCache.java
 (original)
+++ 
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/HealthCheckResultCache.java
 Wed Jan  9 20:24:51 2019
@@ -173,7 +173,7 @@ public class HealthCheckResultCache {
 
             if (!nonOkResultsFromPast.isEmpty()) {
                 ResultLog resultLog = new ResultLog();
-                resultLog.add(new Entry(Result.Status.OK, "*** Current Result 
***"));
+                resultLog.add(new Entry(Result.Status.OK, "*** Current Result: 
"+origResult.getHealthCheckResult().getStatus()+" ***"));
                 for (ResultLog.Entry entry : 
origResult.getHealthCheckResult()) {
                     resultLog.add(entry);
                 }
@@ -181,8 +181,8 @@ public class HealthCheckResultCache {
                 for (HealthCheckExecutionResult nonOkResultFromPast : 
nonOkResultsFromPast) {
                     Status status = 
nonOkResultFromPast.getHealthCheckResult().getStatus();
                     resultLog.add(
-                            new Entry(Result.Status.WARN,
-                                    "*** Sticky Result " + status + " from " + 
df.format(nonOkResultFromPast.getFinishedAt()) + " ***"));
+                            new Entry(Result.Status.OK,
+                                    "*** Sticky Result: " + status + " from " 
+ df.format(nonOkResultFromPast.getFinishedAt()) + " ***"));
                     for (ResultLog.Entry entry : 
nonOkResultFromPast.getHealthCheckResult()) {
                         resultLog.add(entry);
                     }

Modified: 
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/servlet/HealthCheckExecutorServlet.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/servlet/HealthCheckExecutorServlet.java?rev=1850901&r1=1850900&r2=1850901&view=diff
==============================================================================
--- 
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/servlet/HealthCheckExecutorServlet.java
 (original)
+++ 
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/servlet/HealthCheckExecutorServlet.java
 Wed Jan  9 20:24:51 2019
@@ -39,6 +39,7 @@ import org.apache.felix.hc.api.execution
 import org.apache.felix.hc.api.execution.HealthCheckExecutionResult;
 import org.apache.felix.hc.api.execution.HealthCheckExecutor;
 import org.apache.felix.hc.api.execution.HealthCheckSelector;
+import org.apache.felix.hc.core.impl.executor.CombinedExecutionResult;
 import org.osgi.service.component.ComponentContext;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
@@ -280,14 +281,8 @@ public class HealthCheckExecutorServlet
 
         List<HealthCheckExecutionResult> executionResults = 
this.healthCheckExecutor.execute(selector, executionOptions);
 
-        Result.Status mostSevereStatus = Result.Status.OK;
-        for (HealthCheckExecutionResult executionResult : executionResults) {
-            Status status = executionResult.getHealthCheckResult().getStatus();
-            if (status.ordinal() > mostSevereStatus.ordinal()) {
-                mostSevereStatus = status;
-            }
-        }
-        Result overallResult = new Result(mostSevereStatus, "Overall status " 
+ mostSevereStatus);
+        CombinedExecutionResult combinedExecutionResult = new 
CombinedExecutionResult(executionResults);
+        Result overallResult = combinedExecutionResult.getHealthCheckResult();
 
         sendNoCacheHeaders(response);
         sendCorsHeaders(response);
@@ -295,6 +290,7 @@ public class HealthCheckExecutorServlet
         Integer httpStatus = statusMapping.get(overallResult.getStatus());
         response.setStatus(httpStatus);
 
+        response.setHeader(STATUS_HEADER_NAME, 
overallResult.getStatus().toString());
         if (FORMAT_HTML.equals(format)) {
             sendHtmlResponse(overallResult, executionResults, request, 
response, includeDebug);
         } else if (FORMAT_JSON.equals(format)) {
@@ -363,7 +359,6 @@ public class HealthCheckExecutorServlet
             throws IOException {
         response.setContentType(CONTENT_TYPE_HTML);
         response.setCharacterEncoding("UTF-8");
-        response.setHeader(STATUS_HEADER_NAME, 
overallResult.getStatus().toString());
         
response.getWriter().append(this.htmlSerializer.serialize(overallResult, 
executionResults, getHtmlHelpText(), includeDebug));
     }
 

Modified: 
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/util/HealthCheckFilter.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/util/HealthCheckFilter.java?rev=1850901&r1=1850900&r2=1850901&view=diff
==============================================================================
--- 
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/util/HealthCheckFilter.java
 (original)
+++ 
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/util/HealthCheckFilter.java
 Wed Jan  9 20:24:51 2019
@@ -114,10 +114,10 @@ public class HealthCheckFilter {
                 }
                 if (name.startsWith(HealthCheckFilter.OMIT_PREFIX)) {
                     // ommit tags always have to be added as and-clause
-                    
filterBuilder.append("(!(").append(HealthCheck.NAME).append("=").append(name.substring(prefixLen)).append("))");
+                    
filterBuilder.append("(!(").append(HealthCheck.NAME).append("=").append(escapeOsgiFilterLiteral(name.substring(prefixLen))).append("))");
                 } else {
                     // names are always ORd
-                    
filterBuilderForOrOperator.append("(").append(HealthCheck.NAME).append("=").append(name).append(")");
+                    
filterBuilderForOrOperator.append("(").append(HealthCheck.NAME).append("=").append(escapeOsgiFilterLiteral(name)).append(")");
                     addedNameToOrBuilder = true;
                 }
             }
@@ -138,4 +138,8 @@ public class HealthCheckFilter {
         filterBuilder.append(")");
         return filterBuilder;
     }
+
+    private Object escapeOsgiFilterLiteral(String name) {
+        return name.replace("*", "\\*").replace("(", "\\(").replace(")", 
"\\)");
+    }
 }

Modified: 
felix/trunk/healthcheck/core/src/test/java/org/apache/felix/hc/core/it/ExtendedHealthCheckExecutorIT.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/healthcheck/core/src/test/java/org/apache/felix/hc/core/it/ExtendedHealthCheckExecutorIT.java?rev=1850901&r1=1850900&r2=1850901&view=diff
==============================================================================
--- 
felix/trunk/healthcheck/core/src/test/java/org/apache/felix/hc/core/it/ExtendedHealthCheckExecutorIT.java
 (original)
+++ 
felix/trunk/healthcheck/core/src/test/java/org/apache/felix/hc/core/it/ExtendedHealthCheckExecutorIT.java
 Wed Jan  9 20:24:51 2019
@@ -98,7 +98,7 @@ public class ExtendedHealthCheckExecutor
 
     @Test
     public void testSingleExecution() throws Exception {
-        ServiceReference<HealthCheck>[] refs = 
U.callSelectHealthCheckReferences(executor, HealthCheckSelector.tags(testTag), 
false);
+        ServiceReference<HealthCheck>[] refs = 
U.callSelectHealthCheckReferences(executor, HealthCheckSelector.tags(testTag));
         assertNotNull(refs);
         assertEquals(1, refs.length);
 

Modified: 
felix/trunk/healthcheck/core/src/test/java/org/apache/felix/hc/core/it/HealthCheckFilterIT.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/healthcheck/core/src/test/java/org/apache/felix/hc/core/it/HealthCheckFilterIT.java?rev=1850901&r1=1850900&r2=1850901&view=diff
==============================================================================
--- 
felix/trunk/healthcheck/core/src/test/java/org/apache/felix/hc/core/it/HealthCheckFilterIT.java
 (original)
+++ 
felix/trunk/healthcheck/core/src/test/java/org/apache/felix/hc/core/it/HealthCheckFilterIT.java
 Wed Jan  9 20:24:51 2019
@@ -163,8 +163,8 @@ public class HealthCheckFilterIT {
     }
 
     
-    private ServiceReference<HealthCheck>[] 
callSelectHealthCheckReferences(HealthCheckSelector selector, boolean 
isCombineTagsWithOr) {
-        return U.callSelectHealthCheckReferences(executor, selector, 
isCombineTagsWithOr);
+    private ServiceReference<HealthCheck>[] 
callSelectHealthCheckReferences(HealthCheckSelector selector) {
+        return U.callSelectHealthCheckReferences(executor, selector);
     }
 
     
@@ -192,91 +192,91 @@ public class HealthCheckFilterIT {
     
     @Test
     public void testAllServices() {
-        ServiceReference<HealthCheck>[] s = 
callSelectHealthCheckReferences(null, false);
+        ServiceReference<HealthCheck>[] s = 
callSelectHealthCheckReferences(null);
         assertServices(s, true, true, true, true, true);
     }
 
     @Test
     public void testEmptyTags() {
-        ServiceReference<HealthCheck>[] s = 
callSelectHealthCheckReferences(HealthCheckSelector.tags("", "", ""), false);
+        ServiceReference<HealthCheck>[] s = 
callSelectHealthCheckReferences(HealthCheckSelector.tags("", "", ""));
         assertServices(s, true, true, true, true, true);
     }
 
     @Test
     public void testFooTag() {
-        ServiceReference<HealthCheck>[] s = 
callSelectHealthCheckReferences(HealthCheckSelector.tags("foo"), false);
+        ServiceReference<HealthCheck>[] s = 
callSelectHealthCheckReferences(HealthCheckSelector.tags("foo"));
         assertServices(s, true, false, true, false, false);
     }
 
     @Test
     public void testBarTag() {
-        ServiceReference<HealthCheck>[] s = 
callSelectHealthCheckReferences(HealthCheckSelector.tags("bar"), false);
+        ServiceReference<HealthCheck>[] s = 
callSelectHealthCheckReferences(HealthCheckSelector.tags("bar"));
         assertServices(s, false, true, true, false, false);
     }
 
     @Test
     public void testFooAndBar() {
-        ServiceReference<HealthCheck>[] s = 
callSelectHealthCheckReferences(HealthCheckSelector.tags("foo", "bar"), false);
+        ServiceReference<HealthCheck>[] s = 
callSelectHealthCheckReferences(HealthCheckSelector.tags("foo", "bar"));
         assertServices(s, false, false, true, false, false);
     }
 
     @Test
     public void testFooMinusBar() {
-        ServiceReference<HealthCheck>[] s = 
callSelectHealthCheckReferences(HealthCheckSelector.tags("foo", "-bar"), false);
+        ServiceReference<HealthCheck>[] s = 
callSelectHealthCheckReferences(HealthCheckSelector.tags("foo", "-bar"));
         assertServices(s, true, false, false, false, false);
     }
 
     @Test
     public void testWhitespace() {
-        ServiceReference<HealthCheck>[] s = 
callSelectHealthCheckReferences(HealthCheckSelector.tags("\t \n\r foo  \t", "", 
" \t-bar\n", ""), false);
+        ServiceReference<HealthCheck>[] s = 
callSelectHealthCheckReferences(HealthCheckSelector.tags("\t \n\r foo  \t", "", 
" \t-bar\n", ""));
         assertServices(s, true, false, false, false, false);
     }
 
     @Test
     public void testOther() {
-        ServiceReference<HealthCheck>[] s = 
callSelectHealthCheckReferences(HealthCheckSelector.tags("other"), false);
+        ServiceReference<HealthCheck>[] s = 
callSelectHealthCheckReferences(HealthCheckSelector.tags("other"));
         assertServices(s, false, false, false, true, false);
     }
 
     @Test
     public void testMinusOther() {
-        ServiceReference<HealthCheck>[] s = 
callSelectHealthCheckReferences(HealthCheckSelector.tags("-other"), false);
+        ServiceReference<HealthCheck>[] s = 
callSelectHealthCheckReferences(HealthCheckSelector.tags("-other"));
         assertServices(s, true, true, true, false, true);
     }
 
     @Test
     public void testMinusOtherFoo() {
-        ServiceReference<HealthCheck>[] s = 
callSelectHealthCheckReferences(HealthCheckSelector.tags("-other",  "-foo"), 
false);
+        ServiceReference<HealthCheck>[] s = 
callSelectHealthCheckReferences(HealthCheckSelector.tags("-other",  "-foo"));
         assertServices(s, false, true, false, false, true);
     }
 
     @Test
     public void testNoResults() {
-        ServiceReference<HealthCheck>[] s = 
callSelectHealthCheckReferences(HealthCheckSelector.tags("NOT A TAG"), false);
+        ServiceReference<HealthCheck>[] s = 
callSelectHealthCheckReferences(HealthCheckSelector.tags("NOT A TAG"));
         assertEquals("Expecting no services", 0, s.length);
     }
 
     @Test
     public void testSingleName() {
-        ServiceReference<HealthCheck>[] s = 
callSelectHealthCheckReferences(HealthCheckSelector.names("test1"), false);
+        ServiceReference<HealthCheck>[] s = 
callSelectHealthCheckReferences(HealthCheckSelector.names("test1"));
         assertServices(s, true, false, false, false, false);
     }
 
     @Test
     public void testMultipleNames() {
-        ServiceReference<HealthCheck>[] s = 
callSelectHealthCheckReferences(HealthCheckSelector.names("test1", "test3"), 
false);
+        ServiceReference<HealthCheck>[] s = 
callSelectHealthCheckReferences(HealthCheckSelector.names("test1", "test3"));
         assertServices(s, true, false, true, false, false);
     }
 
     @Test
     public void testExcludeName() {
-        ServiceReference<HealthCheck>[] s = 
callSelectHealthCheckReferences(HealthCheckSelector.tags("foo").withNames("-test1"),
 false);
+        ServiceReference<HealthCheck>[] s = 
callSelectHealthCheckReferences(HealthCheckSelector.tags("foo").withNames("-test1"));
         assertServices(s, false, false, true, false, false);
     }
 
     @Test
     public void testNameOrTag() {
-        ServiceReference<HealthCheck>[] s = 
callSelectHealthCheckReferences(HealthCheckSelector.tags("foo").withNames("test4"),
 false);
+        ServiceReference<HealthCheck>[] s = 
callSelectHealthCheckReferences(HealthCheckSelector.tags("foo").withNames("test4"));
         assertServices(s, true, false, true, true, false);
     }
 

Modified: 
felix/trunk/healthcheck/core/src/test/java/org/apache/felix/hc/core/it/U.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/healthcheck/core/src/test/java/org/apache/felix/hc/core/it/U.java?rev=1850901&r1=1850900&r2=1850901&view=diff
==============================================================================
--- 
felix/trunk/healthcheck/core/src/test/java/org/apache/felix/hc/core/it/U.java 
(original)
+++ 
felix/trunk/healthcheck/core/src/test/java/org/apache/felix/hc/core/it/U.java 
Wed Jan  9 20:24:51 2019
@@ -113,12 +113,11 @@ public class U {
     }
     
     
-    static ServiceReference<HealthCheck>[] 
callSelectHealthCheckReferences(HealthCheckExecutor executor, 
HealthCheckSelector selector, boolean isCombineTagsWithOr) {
+    static ServiceReference<HealthCheck>[] 
callSelectHealthCheckReferences(HealthCheckExecutor executor, 
HealthCheckSelector selector) {
         String methodName = "selectHealthCheckReferences";
         try {
-            Method method = executor.getClass().getDeclaredMethod(methodName, 
HealthCheckSelector.class, boolean.class);
-            method.setAccessible(true);
-            Object result = method.invoke(executor, selector, 
isCombineTagsWithOr);
+            Method method = executor.getClass().getDeclaredMethod(methodName, 
HealthCheckSelector.class, HealthCheckExecutionOptions.class);
+            Object result = method.invoke(executor, selector, new 
HealthCheckExecutionOptions().setCombineTagsWithOr(false));
             return (ServiceReference<HealthCheck>[]) result;
         } catch(Exception e) {
             throw new IllegalStateException("Could not call method 
"+methodName+ " of class "+executor.getClass(), e);

Modified: 
felix/trunk/healthcheck/core/src/test/java/org/apache/felix/hc/jmx/impl/HealthCheckMBeanTest.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/healthcheck/core/src/test/java/org/apache/felix/hc/jmx/impl/HealthCheckMBeanTest.java?rev=1850901&r1=1850900&r2=1850901&view=diff
==============================================================================
--- 
felix/trunk/healthcheck/core/src/test/java/org/apache/felix/hc/jmx/impl/HealthCheckMBeanTest.java
 (original)
+++ 
felix/trunk/healthcheck/core/src/test/java/org/apache/felix/hc/jmx/impl/HealthCheckMBeanTest.java
 Wed Jan  9 20:24:51 2019
@@ -21,23 +21,23 @@ import static org.hamcrest.CoreMatchers.
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.fail;
+import static org.mockito.Mockito.when;
+import static org.mockito.MockitoAnnotations.initMocks;
 
 import java.lang.management.ManagementFactory;
-import java.util.Date;
-import java.util.List;
 
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
 
 import org.apache.felix.hc.api.HealthCheck;
 import org.apache.felix.hc.api.Result;
-import org.apache.felix.hc.api.execution.HealthCheckExecutionOptions;
 import org.apache.felix.hc.api.execution.HealthCheckExecutionResult;
-import org.apache.felix.hc.api.execution.HealthCheckMetadata;
-import org.apache.felix.hc.api.execution.HealthCheckSelector;
 import org.apache.felix.hc.core.impl.executor.ExtendedHealthCheckExecutor;
+import org.junit.Before;
 import org.junit.Test;
-import org.osgi.framework.Bundle;
+import org.mockito.Mock;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
 import org.osgi.framework.ServiceReference;
 
 public class HealthCheckMBeanTest {
@@ -45,105 +45,49 @@ public class HealthCheckMBeanTest {
     private boolean resultOk;
     public static final String OBJECT_NAME = 
"org.apache.sling.testing:type=HealthCheckMBeanTest";
 
-    private HealthCheck testHealthCheck = new HealthCheck() {
+    @Mock
+    private HealthCheck testHealthCheck;
 
-        @Override
-        public Result execute() {
-            if (resultOk) {
-                return new Result(Result.Status.OK, "Nothing to report, result 
ok");
-            } else {
-                return new Result(Result.Status.WARN, "Result is not ok!");
-            }
-        }
-    };
-
-    private Object getJmxValue(String mbeanName, String attributeName) throws 
Exception {
-        final MBeanServer jmxServer = 
ManagementFactory.getPlatformMBeanServer();
-        final ObjectName objectName = new ObjectName(mbeanName);
-        if (jmxServer.queryNames(objectName, null).size() == 0) {
-            fail("MBean not found: " + objectName);
-        }
-        final Object value = jmxServer.getAttribute(objectName, attributeName);
-        return value;
-    }
-
-    @Test
-    public void testBean() throws Exception {
-        final ServiceReference ref = new ServiceReference() {
-
-            @Override
-            public boolean isAssignableTo(Bundle bundle, String className) {
-                return false;
-            }
-
-            @Override
-            public Bundle[] getUsingBundles() {
-                return null;
-            }
-
-            @Override
-            public String[] getPropertyKeys() {
-                return null;
-            }
-
-            @Override
-            public Object getProperty(String key) {
-                return null;
-            }
+    @Mock
+    private ServiceReference<HealthCheck> ref;
 
-            @Override
-            public Bundle getBundle() {
-                return null;
-            }
+    @Mock
+    private ExtendedHealthCheckExecutor extendedHealthCheckExecutor;
 
-            @Override
-            public int compareTo(Object reference) {
-                return 0;
-            }
-        };
-        final HealthCheckMBean mbean = new HealthCheckMBean(ref, new 
ExtendedHealthCheckExecutor() {
-
-            @Override
-            public HealthCheckExecutionResult execute(ServiceReference ref) {
-                return new HealthCheckExecutionResult() {
-
-                    @Override
-                    public Result getHealthCheckResult() {
-                        return testHealthCheck.execute();
-                    }
-
-                    @Override
-                    public HealthCheckMetadata getHealthCheckMetadata() {
-                        return null;
-                    }
-
-                    @Override
-                    public Date getFinishedAt() {
-                        return null;
-                    }
-
-                    @Override
-                    public long getElapsedTimeInMs() {
-                        return 0;
-                    }
-
-                    @Override
-                    public boolean hasTimedOut() {
-                        return false;
-                    }
-                };
-            }
-
-            @Override
-            public List<HealthCheckExecutionResult> 
execute(HealthCheckSelector selector) {
-                return null;
+    @Mock
+    private HealthCheckExecutionResult result;
+
+    
+    @Before
+    public void setup() {
+        initMocks(this);
+        
+        when(testHealthCheck.execute()).then(new Answer<Result>() {
+
+            @Override
+            public Result answer(InvocationOnMock invocation) throws Throwable 
{
+                if (resultOk) {
+                    return new Result(Result.Status.OK, "Nothing to report, 
result ok");
+                } else {
+                    return new Result(Result.Status.WARN, "Result is not ok!");
+                }
             }
+        });
+        
+        when(extendedHealthCheckExecutor.execute(ref)).thenReturn(result);
+        when(result.getHealthCheckResult()).then(new Answer<Result>() {
 
             @Override
-            public List<HealthCheckExecutionResult> 
execute(HealthCheckSelector selector, HealthCheckExecutionOptions options) {
-                return null;
+            public Result answer(InvocationOnMock invocation) throws Throwable 
{
+                return testHealthCheck.execute();
             }
         });
+    }
+
+    @Test
+    public void testBean() throws Exception {
+        
+        final HealthCheckMBean mbean = new HealthCheckMBean(ref, 
extendedHealthCheckExecutor);
         final ObjectName name = new ObjectName(OBJECT_NAME);
         jmxServer.registerMBean(mbean, name);
         try {
@@ -161,5 +105,17 @@ public class HealthCheckMBeanTest {
             jmxServer.unregisterMBean(name);
         }
     }
+    
+
+    private Object getJmxValue(String mbeanName, String attributeName) throws 
Exception {
+        final MBeanServer jmxServer = 
ManagementFactory.getPlatformMBeanServer();
+        final ObjectName objectName = new ObjectName(mbeanName);
+        if (jmxServer.queryNames(objectName, null).size() == 0) {
+            fail("MBean not found: " + objectName);
+        }
+        final Object value = jmxServer.getAttribute(objectName, attributeName);
+        return value;
+    }
+    
 
 }
\ No newline at end of file


Reply via email to