changeset 1936:dde5c37cd8b7

Don't throw NPE if there is no host memory data Reviewed by: jkang Review Thread: http://icedtea.classpath.org/pipermail/thermostat/2016-June/019687.html PR3032
author Joshua Matsuoka <jmatsuok@redhat.com>
date Thu, 23 Jun 2016 10:05:46 -0400
parents 5935a4e822ba
children 4d83b41ff85b
files host-memory/client-core/src/main/java/com/redhat/thermostat/host/memory/client/core/internal/HostMemoryController.java host-memory/client-core/src/test/java/com/redhat/thermostat/host/memory/client/core/internal/HostMemoryControllerTest.java
diffstat 2 files changed, 47 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/host-memory/client-core/src/main/java/com/redhat/thermostat/host/memory/client/core/internal/HostMemoryController.java	Thu Jun 23 10:17:48 2016 -0400
+++ b/host-memory/client-core/src/main/java/com/redhat/thermostat/host/memory/client/core/internal/HostMemoryController.java	Thu Jun 23 10:05:46 2016 -0400
@@ -148,6 +148,13 @@
     }
 
     private void doMemoryChartUpdate() {
+        MemoryStat oldest = memoryStatDAO.getOldest(ref);
+        MemoryStat newest = memoryStatDAO.getNewest(ref);
+        // Do nothing if no memory data is available
+        if (oldest == null || newest == null) {
+            return;
+        }
+        
         final List<DiscreteTimeData<? extends Number>> memFree = new LinkedList<>();
         final List<DiscreteTimeData<? extends Number>> memTotal = new LinkedList<>();
         final List<DiscreteTimeData<? extends Number>> memUsed = new LinkedList<>();
@@ -155,9 +162,6 @@
         final List<DiscreteTimeData<? extends Number>> swapTotal = new LinkedList<>();
         final List<DiscreteTimeData<? extends Number>> swapFree = new LinkedList<>();
 
-        MemoryStat oldest = memoryStatDAO.getOldest(ref);
-        MemoryStat newest = memoryStatDAO.getNewest(ref);
-
         Range<Long> newAvailableRange = new Range<>(oldest.getTimeStamp(), newest.getTimeStamp());
 
         TimeRangeController.StatsSupplier<MemoryStat, HostRef> statsSupplier = new TimeRangeController.StatsSupplier<MemoryStat, HostRef>() {
--- a/host-memory/client-core/src/test/java/com/redhat/thermostat/host/memory/client/core/internal/HostMemoryControllerTest.java	Thu Jun 23 10:17:48 2016 -0400
+++ b/host-memory/client-core/src/test/java/com/redhat/thermostat/host/memory/client/core/internal/HostMemoryControllerTest.java	Thu Jun 23 10:05:46 2016 -0400
@@ -67,24 +67,20 @@
 import com.redhat.thermostat.storage.model.HostInfo;
 
 public class HostMemoryControllerTest {
-
+    
+    private static final long TOTAL_MEMORY = 512;
+    private ActionListener<HostMemoryView.Action> listener;
+    private Timer timer;
+    private Runnable timerAction;
+    private HostMemoryView view;
+    
     @SuppressWarnings({ "unchecked", "rawtypes" }) // any(List.class)
-    @Test
-    public void testUpdate() {
-        final long TOTAL_MEMORY = 512;
+    private void setupWithMemoryDAO(MemoryStatDAO memoryStatDAO) {
         HostInfo hostInfo = new HostInfo("foo-agent", "someHost", "someOS", "linux_0.0.1", "lreally_fast_cpu", 2, TOTAL_MEMORY);
         HostInfoDAO hostInfoDAO = mock(HostInfoDAO.class);
         when(hostInfoDAO.getHostInfo(any(HostRef.class))).thenReturn(hostInfo);
 
-        MemoryStat memoryStat = new MemoryStat("foo", 1, 2, 3, 4, 5, 6, 7, 8);
-        List<MemoryStat> memoryStats = new LinkedList<>();
-        memoryStats.add(memoryStat);
-        MemoryStatDAO memoryStatDAO = mock(MemoryStatDAO.class);
-        when(memoryStatDAO.getMemoryStats(any(HostRef.class), anyLong(), anyLong())).thenReturn(memoryStats);
-        when(memoryStatDAO.getOldest(any(HostRef.class))).thenReturn(memoryStat);
-        when(memoryStatDAO.getNewest(any(HostRef.class))).thenReturn(memoryStat);
-
-        Timer timer = mock(Timer.class);
+        timer = mock(Timer.class);
         ArgumentCaptor<Runnable> timerActionCaptor = ArgumentCaptor.forClass(Runnable.class);
         doNothing().when(timer).setAction(timerActionCaptor.capture());
 
@@ -95,7 +91,7 @@
 
         HostRef ref = mock(HostRef.class);
 
-        HostMemoryView view = mock(HostMemoryView.class);
+        view = mock(HostMemoryView.class);
         when(view.getUserDesiredDuration()).thenReturn(new Duration(10, TimeUnit.MINUTES));
         ArgumentCaptor<ActionListener> viewArgumentCaptor = ArgumentCaptor.forClass(ActionListener.class);
         doNothing().when(view).addActionListener(viewArgumentCaptor.capture());
@@ -105,21 +101,46 @@
 
         @SuppressWarnings("unused")
         HostMemoryController controller = new HostMemoryController(appSvc, hostInfoDAO, memoryStatDAO, ref, viewProvider);
+        timerAction = timerActionCaptor.getValue();
 
-        ActionListener<HostMemoryView.Action> l = viewArgumentCaptor.getValue();
+        listener = viewArgumentCaptor.getValue();
+    }
 
-        l.actionPerformed(new ActionEvent<>(view, HostMemoryView.Action.VISIBLE));
+    
+    @SuppressWarnings("unchecked") // any(List.class)
+    @Test
+    public void testUpdate() {
+        MemoryStat memoryStat = new MemoryStat("foo", 1, 2, 3, 4, 5, 6, 7, 8);
+        List<MemoryStat> memoryStats = new LinkedList<>();
+        memoryStats.add(memoryStat);
+        MemoryStatDAO memoryStatDAO = mock(MemoryStatDAO.class);
+        when(memoryStatDAO.getMemoryStats(any(HostRef.class), anyLong(), anyLong())).thenReturn(memoryStats);
+        when(memoryStatDAO.getOldest(any(HostRef.class))).thenReturn(memoryStat);
+        when(memoryStatDAO.getNewest(any(HostRef.class))).thenReturn(memoryStat);
+
+        setupWithMemoryDAO(memoryStatDAO);
+
+        listener.actionPerformed(new ActionEvent<>(view, HostMemoryView.Action.VISIBLE));
 
         verify(timer).start();
-        timerActionCaptor.getValue().run();
+        timerAction.run();
 
         verify(view, times(1)).setTotalMemory(eq(TOTAL_MEMORY + " B"));
         verify(view, times(6)).addMemoryData(any(String.class), any(List.class));
 
-        l.actionPerformed(new ActionEvent<>(view, HostMemoryView.Action.HIDDEN));
+        listener.actionPerformed(new ActionEvent<>(view, HostMemoryView.Action.HIDDEN));
 
         verify(timer).stop();
-
+    }
+    
+    /**
+     * Verify that no NPE is thrown when the memory view is shown with no
+     * host memory data.
+     */
+    @Test
+    public void testUpdateNoMemoryData() {
+        setupWithMemoryDAO(mock(MemoryStatDAO.class));
+        timerAction.run(); // must not throw NPE
     }
 }