You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cs...@apache.org on 2021/11/26 14:54:55 UTC

[felix-dev] branch FELIX-6474 created (now 5048a51)

This is an automated email from the ASF dual-hosted git repository.

cschneider pushed a change to branch FELIX-6474
in repository https://gitbox.apache.org/repos/asf/felix-dev.git.


      at 5048a51  FELIX-6474 - Improve HealthCheckResultCacheTest

This branch includes the following new commits:

     new 5048a51  FELIX-6474 - Improve HealthCheckResultCacheTest

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[felix-dev] 01/01: FELIX-6474 - Improve HealthCheckResultCacheTest

Posted by cs...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cschneider pushed a commit to branch FELIX-6474
in repository https://gitbox.apache.org/repos/asf/felix-dev.git

commit 5048a51ef50bed3021a7a27c43f5f8a4a2b35873
Author: Christian Schneider <cs...@adobe.com>
AuthorDate: Fri Nov 26 15:54:27 2021 +0100

    FELIX-6474 - Improve HealthCheckResultCacheTest
---
 .../core/impl/executor/HealthCheckResultCache.java |   7 +-
 .../impl/executor/HealthCheckResultCacheTest.java  | 126 ++++++++++-----------
 2 files changed, 64 insertions(+), 69 deletions(-)

diff --git a/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/HealthCheckResultCache.java b/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/HealthCheckResultCache.java
index 6bdcbfd..8618ce1 100644
--- a/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/HealthCheckResultCache.java
+++ b/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/HealthCheckResultCache.java
@@ -72,7 +72,12 @@ public class HealthCheckResultCache {
         }
     }
 
-    /** Get the valid cache results */
+    /**
+     * Get the valid cache results for given metadata list
+     * 
+     * @param metadatas list of metadata to get results for. For each found result the metadata will be deleted
+     * @param results matching cached results are added to this list
+     */
     public void useValidCacheResults(final List<HealthCheckMetadata> metadatas,
             final Collection<HealthCheckExecutionResult> results,
             final long resultCacheTtlInMs) {
diff --git a/healthcheck/core/src/test/java/org/apache/felix/hc/core/impl/executor/HealthCheckResultCacheTest.java b/healthcheck/core/src/test/java/org/apache/felix/hc/core/impl/executor/HealthCheckResultCacheTest.java
index 97e53dc..a385625 100644
--- a/healthcheck/core/src/test/java/org/apache/felix/hc/core/impl/executor/HealthCheckResultCacheTest.java
+++ b/healthcheck/core/src/test/java/org/apache/felix/hc/core/impl/executor/HealthCheckResultCacheTest.java
@@ -22,9 +22,6 @@ import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.spy;
-import static org.mockito.MockitoAnnotations.initMocks;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -33,18 +30,19 @@ import java.util.List;
 
 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;
 import org.apache.felix.hc.api.execution.HealthCheckExecutionResult;
 import org.apache.felix.hc.api.execution.HealthCheckMetadata;
-import org.junit.Before;
 import org.junit.Test;
-import org.mockito.Mock;
+import org.mockito.Mockito;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
 
 public class HealthCheckResultCacheTest {
 
     private static final int HC_TIMEOUT_NOT_SET = -1;
+    private static final int DUR_0_MIN = 0;
     private static final int DUR_1_MIN = 60 * 1000;
     private static final int DUR_2_MIN = 2 * DUR_1_MIN;
     private static final int DUR_3_MIN = 3 * DUR_1_MIN;
@@ -52,124 +50,96 @@ public class HealthCheckResultCacheTest {
 
     private HealthCheckResultCache healthCheckResultCache = new HealthCheckResultCache();
 
-    @Mock
-    ServiceReference serviceRef;
-
-    @Before
-    public void setup() {
-        initMocks(this);
-    }
-
-    private HealthCheckMetadata setupHealthCheckMetadata(long id, long ttl) {
-        reset(serviceRef);
-        doReturn(id).when(serviceRef).getProperty(Constants.SERVICE_ID);
-        doReturn(ttl).when(serviceRef).getProperty(HealthCheck.RESULT_CACHE_TTL_IN_MS);
-        doReturn("HC id=" + id).when(serviceRef).getProperty(HealthCheck.NAME);
-        return new HealthCheckMetadata(serviceRef);
-    }
-
     @Test
     public void testHealthCheckResultCache() {
 
         HealthCheckMetadata hc1 = setupHealthCheckMetadata(1, HC_TIMEOUT_NOT_SET);
-        ExecutionResult executionResult1 = spy(new ExecutionResult(hc1, new Result(Result.Status.OK, "result for hc1"), 1));
-        doReturn(new Date(new Date().getTime() - DUR_1_MIN)).when(executionResult1).getFinishedAt();
+        ExecutionResult executionResult1 = createResult(hc1, Result.Status.OK, DUR_1_MIN);
         healthCheckResultCache.updateWith(executionResult1);
 
         HealthCheckMetadata hc2 = setupHealthCheckMetadata(2, HC_TIMEOUT_NOT_SET);
-        ExecutionResult executionResult2 = spy(new ExecutionResult(hc2, new Result(Result.Status.OK, "result for hc2"), 1));
-        doReturn(new Date(new Date().getTime() - DUR_3_MIN)).when(executionResult2).getFinishedAt();
+        ExecutionResult executionResult2 = createResult(hc2, Result.Status.OK, DUR_3_MIN);
         healthCheckResultCache.updateWith(executionResult2);
 
         HealthCheckMetadata hc3 = setupHealthCheckMetadata(3, DUR_4_MIN);
-        ExecutionResult executionResult3 = spy(new ExecutionResult(hc3, new Result(Result.Status.OK, "result for hc3"), 1));
-        doReturn(new Date(new Date().getTime() - DUR_3_MIN)).when(executionResult3).getFinishedAt();
+        ExecutionResult executionResult3 = createResult(hc3, Result.Status.OK, DUR_3_MIN);
         healthCheckResultCache.updateWith(executionResult3);
 
         HealthCheckMetadata hc4 = setupHealthCheckMetadata(4, HC_TIMEOUT_NOT_SET);
         // no result for this yet
 
-        List<HealthCheckMetadata> hcList = new ArrayList<HealthCheckMetadata>(Arrays.asList(hc1, hc2, hc3, hc4));
+        List<HealthCheckMetadata> hcList = new ArrayList<>(Arrays.asList(hc1, hc2, hc3, hc4));
         List<HealthCheckExecutionResult> results = new ArrayList<HealthCheckExecutionResult>();
 
         healthCheckResultCache.useValidCacheResults(hcList, results, DUR_2_MIN);
 
-        assertTrue(hcList.contains(hc2)); // result too old, left in hcList for later execution
-        assertTrue(hcList.contains(hc4)); // no result was added to cache via updateWith()
-
-        assertTrue(results.contains(executionResult1)); // true <= result one min old, global timeout 2min
-        assertFalse(results.contains(executionResult2)); // false <= result three min old, global timeout 2min
-        assertTrue(results.contains(executionResult3)); // true <= result one three old, HC timeout 4min
+        assertTrue("result too old, left in hcList for later execution", hcList.contains(hc2));
+        assertTrue("no result was added to cache via updateWith()", hcList.contains(hc4)); 
+        assertEquals("values not found in cache are left in hcList", 2, hcList.size()); 
 
-        // values not found in cache are left in hcList
-        assertEquals(2, hcList.size());
+        assertTrue("result one min old, global timeout 2min", results.contains(executionResult1));
+        assertFalse("result three min old, global timeout 2min", results.contains(executionResult2));
+        assertTrue("result one three old, HC timeout 4min", results.contains(executionResult3));
         assertEquals(2, results.size());
 
     }
 
     @Test
-    public void testHealthCheckResultCacheTtl() {
-
+    public void testgetValidCacheResultMissTimedout() {
         // -- test cache miss due to HC TTL
         HealthCheckMetadata hcWithTtl = setupHealthCheckMetadata(1, DUR_1_MIN);
-        ExecutionResult executionResult = spy(new ExecutionResult(hcWithTtl, new Result(Result.Status.OK, "result for hc"), 1));
-        doReturn(new Date(new Date().getTime() - DUR_2_MIN)).when(executionResult).getFinishedAt();
+        ExecutionResult executionResult = createResult(hcWithTtl, Result.Status.OK, DUR_2_MIN);
         healthCheckResultCache.updateWith(executionResult);
 
         HealthCheckExecutionResult result = healthCheckResultCache.getValidCacheResult(hcWithTtl, DUR_3_MIN);
         assertNull(result); // even though global timeout would be ok (2min<3min, the hc timeout of 1min invalidates the result)
-
+    }
+    
+    @Test
+    public void testgetValidCacheResultHitTTL() {
         // -- test cache hit due to HC TTL
-        hcWithTtl = setupHealthCheckMetadata(2, DUR_3_MIN);
-        executionResult = spy(new ExecutionResult(hcWithTtl, new Result(Result.Status.OK, "result for hc"), 1));
-        doReturn(new Date(new Date().getTime() - DUR_2_MIN)).when(executionResult).getFinishedAt();
+        HealthCheckMetadata hcWithTtl = setupHealthCheckMetadata(2, DUR_3_MIN);
+        ExecutionResult executionResult = createResult(hcWithTtl, Result.Status.OK, DUR_2_MIN);
         healthCheckResultCache.updateWith(executionResult);
 
-        result = healthCheckResultCache.getValidCacheResult(hcWithTtl, DUR_1_MIN);
+        HealthCheckExecutionResult result = healthCheckResultCache.getValidCacheResult(hcWithTtl, DUR_1_MIN);
         assertEquals(executionResult, result); // even though global timeout would invalidate this result (1min<2min, the hc timeout of 3min
                                                // allows the result)
-
+    }
+    
+    @Test
+    public void testgetValidCacheResultHitPermanent() {
         // -- test Long.MAX_VALUE
-        hcWithTtl = setupHealthCheckMetadata(3, Long.MAX_VALUE);
-        executionResult = spy(new ExecutionResult(hcWithTtl, new Result(Result.Status.OK, "result for hc"), 1));
-        doReturn(new Date(new Date().getTime() - DUR_4_MIN)).when(executionResult).getFinishedAt();
+        HealthCheckMetadata hcWithTtl = setupHealthCheckMetadata(3, Long.MAX_VALUE);
+        ExecutionResult executionResult = createResult(hcWithTtl, Result.Status.OK, DUR_4_MIN);
         healthCheckResultCache.updateWith(executionResult);
 
-        result = healthCheckResultCache.getValidCacheResult(hcWithTtl, DUR_1_MIN);
+        HealthCheckExecutionResult result = healthCheckResultCache.getValidCacheResult(hcWithTtl, DUR_1_MIN);
         assertEquals(executionResult, result);
-
-    }
-
-    private HealthCheckMetadata setupHealthCheckMetadataWithStickyResults(long id, long nonOkStickyForSec) {
-        reset(serviceRef);
-        doReturn(id).when(serviceRef).getProperty(Constants.SERVICE_ID);
-        doReturn(nonOkStickyForSec).when(serviceRef).getProperty(HealthCheck.KEEP_NON_OK_RESULTS_STICKY_FOR_SEC);
-        doReturn("HC id=" + id).when(serviceRef).getProperty(HealthCheck.NAME);
-        return new HealthCheckMetadata(serviceRef);
     }
 
     @Test
     public void testCreateExecutionResultWithStickyResults() {
 
         HealthCheckMetadata hcWithStickyResultsSet = setupHealthCheckMetadataWithStickyResults(1, 120 /* 2 minutes */);
-        ExecutionResult currentResult = spy(new ExecutionResult(hcWithStickyResultsSet, new Result(Result.Status.OK, "result for hc"), 1));
+        ExecutionResult currentResult = createResult(hcWithStickyResultsSet, Result.Status.OK, DUR_0_MIN);
         HealthCheckExecutionResult overallResultWithStickyResults = healthCheckResultCache
                 .createExecutionResultWithStickyResults(currentResult);
         assertTrue("Exact same result is expected if no history exists", currentResult == overallResultWithStickyResults);
 
         // add 4 minutes old WARN to cache
-        ExecutionResult oldWarnResult = spy(
-                new ExecutionResult(hcWithStickyResultsSet, new Result(Result.Status.WARN, "result for hc"), 1));
-        doReturn(new Date(System.currentTimeMillis() - DUR_4_MIN)).when(oldWarnResult).getFinishedAt();
+        ExecutionResult oldWarnResult = createResult(hcWithStickyResultsSet, Result.Status.WARN, DUR_4_MIN);
         healthCheckResultCache.updateWith(oldWarnResult);
 
         // check that it is not used
-        currentResult = new ExecutionResult(hcWithStickyResultsSet, new Result(Result.Status.OK, "result for hc"), 1);
+        currentResult = createResult(hcWithStickyResultsSet, Result.Status.OK, DUR_0_MIN);
         overallResultWithStickyResults = healthCheckResultCache.createExecutionResultWithStickyResults(currentResult);
         assertTrue("Exact same result is expected if WARN HC Result is too old", currentResult == overallResultWithStickyResults);
 
         // change WARN to 1 minute age
-        doReturn(new Date(System.currentTimeMillis() - DUR_1_MIN)).when(oldWarnResult).getFinishedAt();
+        ExecutionResult warnResult = createResult(hcWithStickyResultsSet, Result.Status.WARN, DUR_1_MIN);
+        healthCheckResultCache.updateWith(warnResult);
+
         overallResultWithStickyResults = healthCheckResultCache.createExecutionResultWithStickyResults(currentResult);
         assertTrue("Expect newly created result as sticky result should be taken into account",
                 currentResult != overallResultWithStickyResults);
@@ -178,9 +148,7 @@ public class HealthCheckResultCacheTest {
         assertEquals("Expect 4 entries, two each for current and WARN", 4, getLogMsgCount(overallResultWithStickyResults));
 
         // add 1 minutes old CRITICAL to cache
-        ExecutionResult oldCriticalResult = spy(
-                new ExecutionResult(hcWithStickyResultsSet, new Result(Result.Status.CRITICAL, "result for hc"), 1));
-        doReturn(new Date(System.currentTimeMillis() - DUR_1_MIN)).when(oldCriticalResult).getFinishedAt();
+        ExecutionResult oldCriticalResult = createResult(hcWithStickyResultsSet, Result.Status.CRITICAL, DUR_1_MIN);
         healthCheckResultCache.updateWith(oldCriticalResult);
 
         overallResultWithStickyResults = healthCheckResultCache.createExecutionResultWithStickyResults(currentResult);
@@ -193,6 +161,28 @@ public class HealthCheckResultCacheTest {
 
     }
 
+    private ExecutionResult createResult(HealthCheckMetadata hc, Status status, int minutesAgo) {
+        Date finishedAt = new Date(new Date().getTime() - minutesAgo);
+        return new ExecutionResult(hc, new Result(status, "result for hc"), finishedAt, 1, false);
+    }
+
+    private HealthCheckMetadata setupHealthCheckMetadata(long id, long ttl) {
+        ServiceReference<?> serviceRef = Mockito.mock(ServiceReference.class);
+        doReturn(id).when(serviceRef).getProperty(Constants.SERVICE_ID);
+        doReturn(ttl).when(serviceRef).getProperty(HealthCheck.RESULT_CACHE_TTL_IN_MS);
+        doReturn("HC id=" + id).when(serviceRef).getProperty(HealthCheck.NAME);
+        return new HealthCheckMetadata(serviceRef);
+    }
+
+    private HealthCheckMetadata setupHealthCheckMetadataWithStickyResults(long id, long nonOkStickyForSec) {
+        ServiceReference<?> serviceRef = Mockito.mock(ServiceReference.class);
+        doReturn(id).when(serviceRef).getProperty(Constants.SERVICE_ID);
+        doReturn(nonOkStickyForSec).when(serviceRef).getProperty(HealthCheck.KEEP_NON_OK_RESULTS_STICKY_FOR_SEC);
+        doReturn("HC id=" + id).when(serviceRef).getProperty(HealthCheck.NAME);
+        return new HealthCheckMetadata(serviceRef);
+    }
+
+    @SuppressWarnings("unused")
     private int getLogMsgCount(HealthCheckExecutionResult result) {
         int count = 0;
         for (ResultLog.Entry entry : result.getHealthCheckResult()) {