Mercurial > hg > release > thermostat-1.6
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 } }