changeset 190:b196e5b5ba8c

Use new Timer in HostCpuController. Reviewed-by: omajid Review-thead: http://icedtea.classpath.org/pipermail/thermostat/2012-April/000629.html
author Roman Kennke <rkennke@redhat.com>
date Mon, 02 Apr 2012 22:25:51 +0200
parents 4f2137a2f3d8
children 4a33f41c7782
files client/src/main/java/com/redhat/thermostat/client/ui/HostCpuController.java client/src/test/java/com/redhat/thermostat/client/ui/CpuStatControllerTest.java client/src/test/java/com/redhat/thermostat/client/ui/HostCpuControllerTest.java
diffstat 3 files changed, 191 insertions(+), 122 deletions(-) [+]
line wrap: on
line diff
--- a/client/src/main/java/com/redhat/thermostat/client/ui/HostCpuController.java	Mon Apr 02 14:49:04 2012 +0200
+++ b/client/src/main/java/com/redhat/thermostat/client/ui/HostCpuController.java	Mon Apr 02 22:25:51 2012 +0200
@@ -39,12 +39,12 @@
 import java.awt.Component;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Timer;
-import java.util.TimerTask;
 import java.util.concurrent.TimeUnit;
 
 import com.redhat.thermostat.client.AsyncUiFacade;
 import com.redhat.thermostat.client.appctx.ApplicationContext;
+import com.redhat.thermostat.common.Timer;
+import com.redhat.thermostat.common.Timer.SchedulingType;
 import com.redhat.thermostat.common.dao.CpuStatDAO;
 import com.redhat.thermostat.common.dao.DAOFactory;
 import com.redhat.thermostat.common.dao.HostInfoDAO;
@@ -56,7 +56,7 @@
 public class HostCpuController implements AsyncUiFacade {
 
     private final HostCpuView view;
-    private final Timer backgroundUpdateTimer = new Timer();
+    private final Timer backgroundUpdateTimer;
 
     private final HostInfoDAO hostInfoDAO;
     private final CpuStatDAO cpuStatDAO;
@@ -67,27 +67,40 @@
         DAOFactory daos = ApplicationContext.getInstance().getDAOFactory();
         hostInfoDAO = daos.getHostInfoDAO(ref);
         cpuStatDAO = daos.getCpuStatDAO(ref);
+
+        backgroundUpdateTimer = ApplicationContext.getInstance().getTimerFactory().createTimer();
+        backgroundUpdateTimer.setAction(new Runnable() {
+            
+            @Override
+            public void run() {
+                updateView();
+            }
+
+        });
+        backgroundUpdateTimer.setInitialDelay(0);
+        backgroundUpdateTimer.setDelay(5);
+        backgroundUpdateTimer.setTimeUnit(TimeUnit.SECONDS);
+        backgroundUpdateTimer.setSchedulingType(SchedulingType.FIXED_RATE);
+    }
+
+    // TODO: Consider doing this in a background thread (move to view and use SwingWorker or such).
+    private void updateView() {
+        HostInfo hostInfo = hostInfoDAO.getHostInfo();
+
+        view.setCpuCount(String.valueOf(hostInfo.getCpuCount()));
+        view.setCpuModel(hostInfo.getCpuModel());
+
+        doCpuChartUpdate();
     }
 
     @Override
     public void start() {
-        backgroundUpdateTimer.scheduleAtFixedRate(new TimerTask() {
-            @Override
-            public void run() {
-
-                HostInfo hostInfo = hostInfoDAO.getHostInfo();
-
-                view.setCpuCount(String.valueOf(hostInfo.getCpuCount()));
-                view.setCpuModel(hostInfo.getCpuModel());
-
-                doCpuChartUpdate();
-            }
-        }, 0, TimeUnit.SECONDS.toMillis(5));
+        backgroundUpdateTimer.start();
     }
 
     @Override
     public void stop() {
-        backgroundUpdateTimer.cancel();
+        backgroundUpdateTimer.stop();
     }
 
     private void doCpuChartUpdate() {
--- a/client/src/test/java/com/redhat/thermostat/client/ui/CpuStatControllerTest.java	Mon Apr 02 14:49:04 2012 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,106 +0,0 @@
-/*
- * Copyright 2012 Red Hat, Inc.
- *
- * This file is part of Thermostat.
- *
- * Thermostat is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published
- * by the Free Software Foundation; either version 2, or (at your
- * option) any later version.
- *
- * Thermostat is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Thermostat; see the file COPYING.  If not see
- * <http://www.gnu.org/licenses/>.
- *
- * Linking this code with other modules is making a combined work
- * based on this code.  Thus, the terms and conditions of the GNU
- * General Public License cover the whole combination.
- *
- * As a special exception, the copyright holders of this code give
- * you permission to link this code with independent modules to
- * produce an executable, regardless of the license terms of these
- * independent modules, and to copy and distribute the resulting
- * executable under terms of your choice, provided that you also
- * meet, for each linked independent module, the terms and conditions
- * of the license of that module.  An independent module is a module
- * which is not derived from or based on this code.  If you modify
- * this code, you may extend this exception to your version of the
- * library, but you are not obligated to do so.  If you do not wish
- * to do so, delete this exception statement from your version.
- */
-
-package com.redhat.thermostat.client.ui;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.junit.Test;
-
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.atLeast;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import com.redhat.thermostat.client.appctx.ApplicationContext;
-import com.redhat.thermostat.common.dao.CpuStatDAO;
-import com.redhat.thermostat.common.dao.DAOFactory;
-import com.redhat.thermostat.common.dao.HostInfoDAO;
-import com.redhat.thermostat.common.dao.HostRef;
-import com.redhat.thermostat.common.dao.MongoDAOFactory;
-import com.redhat.thermostat.common.model.CpuStat;
-import com.redhat.thermostat.common.model.HostInfo;
-
-public class CpuStatControllerTest {
-
-    @Test
-    public void testUpdate() {
-
-        CpuStat stat = new CpuStat(10L, 5.0, 10.0, 15.0);
-        List<CpuStat> stats = new ArrayList<CpuStat>();
-        stats.add(stat);
-
-        CpuStatDAO cpuStatDAO = mock(CpuStatDAO.class);
-        when(cpuStatDAO.getLatestCpuStats()).thenReturn(stats).thenReturn(new ArrayList<CpuStat>());
-
-        HostInfo hostInfo = new HostInfo("someHost", "someOS", "linux_0.0.1", "lreally_fast_cpu", 2, 1024);
-        HostInfoDAO hostInfoDAO = mock(HostInfoDAO.class);
-        when(hostInfoDAO.getHostInfo()).thenReturn(hostInfo);
-
-        DAOFactory daoFactory = mock(MongoDAOFactory.class);
-        when(daoFactory.getCpuStatDAO(any(HostRef.class))).thenReturn(cpuStatDAO);
-        when(daoFactory.getHostInfoDAO(any(HostRef.class))).thenReturn(hostInfoDAO);
-
-        ApplicationContext.getInstance().setDAOFactory(daoFactory);
-        HostRef ref = mock(HostRef.class);
-
-        final HostCpuView view = mock(HostCpuView.class);
-
-        // TODO: Consider to pass the ClassesView or a factory for it to the controller instead.
-        HostCpuController controller = new HostCpuController(ref) {
-            @Override
-            protected HostCpuView createView() {
-                return view;
-            }
-        };
-
-        controller.start();
-
-        try {
-            Thread.sleep(500);
-        } catch (InterruptedException e) {
-            // Get out of here ASAP.
-            return;
-        }
-
-        verify(view, atLeast(1)).addCpuLoadData(any(List.class));
-        verify(view, atLeast(1)).setCpuCount(any(String.class));
-        verify(view, atLeast(1)).setCpuModel(any(String.class));
-        // We don't verify atMost() since we might increase the update rate in the future.
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/src/test/java/com/redhat/thermostat/client/ui/HostCpuControllerTest.java	Mon Apr 02 22:25:51 2012 +0200
@@ -0,0 +1,162 @@
+/*
+ * Copyright 2012 Red Hat, Inc.
+ *
+ * This file is part of Thermostat.
+ *
+ * Thermostat is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * Thermostat is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Thermostat; see the file COPYING.  If not see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Linking this code with other modules is making a combined work
+ * based on this code.  Thus, the terms and conditions of the GNU
+ * General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this code give
+ * you permission to link this code with independent modules to
+ * produce an executable, regardless of the license terms of these
+ * independent modules, and to copy and distribute the resulting
+ * executable under terms of your choice, provided that you also
+ * meet, for each linked independent module, the terms and conditions
+ * of the license of that module.  An independent module is a module
+ * which is not derived from or based on this code.  If you modify
+ * this code, you may extend this exception to your version of the
+ * library, but you are not obligated to do so.  If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package com.redhat.thermostat.client.ui;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.isNotNull;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+
+import com.redhat.thermostat.client.appctx.ApplicationContext;
+import com.redhat.thermostat.client.appctx.ApplicationContextUtil;
+import com.redhat.thermostat.client.ui.HostCpuController;
+import com.redhat.thermostat.client.ui.HostCpuView;
+import com.redhat.thermostat.common.Timer;
+import com.redhat.thermostat.common.Timer.SchedulingType;
+import com.redhat.thermostat.common.TimerFactory;
+import com.redhat.thermostat.common.dao.CpuStatDAO;
+import com.redhat.thermostat.common.dao.DAOFactory;
+import com.redhat.thermostat.common.dao.HostInfoDAO;
+import com.redhat.thermostat.common.dao.HostRef;
+import com.redhat.thermostat.common.model.CpuStat;
+import com.redhat.thermostat.common.model.DiscreteTimeData;
+import com.redhat.thermostat.common.model.HostInfo;
+
+public class HostCpuControllerTest {
+
+    private HostCpuController controller;
+
+    private HostCpuView view;
+
+    private Timer timer;
+
+    private Runnable timerAction;
+
+    @Before
+    public void setUp() {
+        // Setup timer.
+        ApplicationContextUtil.resetApplicationContext();
+        timer = mock(Timer.class);
+        ArgumentCaptor<Runnable> actionCaptor = ArgumentCaptor.forClass(Runnable.class);
+        doNothing().when(timer).setAction(actionCaptor.capture());
+
+        TimerFactory timerFactory = mock(TimerFactory.class);
+        when(timerFactory.createTimer()).thenReturn(timer);
+        ApplicationContext.getInstance().setTimerFactory(timerFactory);
+
+        // Setup DAOs.
+        HostInfo hostInfo = new HostInfo("fluffhost1", "fluffOs1", "fluffKernel1", "fluffCpu1", 12345, 98765);
+        HostInfoDAO hostInfoDAO = mock(HostInfoDAO.class);
+        when(hostInfoDAO.getHostInfo()).thenReturn(hostInfo);
+
+        CpuStat cpuStat1 = new CpuStat(1l, 10.0, 20.0, 30.0);
+        CpuStat cpuStat2 = new CpuStat(2l, 15.0, 25.0, 35.0);
+        CpuStatDAO cpuStatDAO = mock(CpuStatDAO.class);
+        when(cpuStatDAO.getLatestCpuStats()).thenReturn(Arrays.asList(cpuStat1, cpuStat2));
+
+        DAOFactory daoFactory = mock(DAOFactory.class);
+        when(daoFactory.getHostInfoDAO(any(HostRef.class))).thenReturn(hostInfoDAO);
+        when(daoFactory.getCpuStatDAO(any(HostRef.class))).thenReturn(cpuStatDAO);
+
+        ApplicationContext.getInstance().setDAOFactory(daoFactory);
+
+        view = mock(HostCpuView.class);
+        HostRef host = new HostRef("123", "fluffhost");
+        controller = new HostCpuController(host) {
+            // TODO: Reverse dependency.
+            @Override
+            protected HostCpuView createView() {
+                return view;
+            }
+        };
+
+        timerAction = actionCaptor.getValue();
+    }
+
+    @After
+    public void tearDown() {
+        timerAction = null;
+        controller = null;
+        view = null;
+        timer = null;
+        ApplicationContextUtil.resetApplicationContext();
+    }
+
+    @Test
+    public void testTimer() {
+        controller.start();
+
+        verify(timer).setAction(isNotNull(Runnable.class));
+        verify(timer).setDelay(5);
+        verify(timer).setTimeUnit(TimeUnit.SECONDS);
+        verify(timer).setInitialDelay(0);
+        verify(timer).setSchedulingType(SchedulingType.FIXED_RATE);
+        verify(timer).start();
+
+        controller.stop();
+
+        verify(timer).stop();
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testTimerAction() {
+        timerAction.run();
+        verify(view).setCpuModel("fluffCpu1");
+        verify(view).setCpuCount("12345");
+        @SuppressWarnings("rawtypes")
+        ArgumentCaptor<List> captor = ArgumentCaptor.forClass(List.class);
+        verify(view).addCpuLoadData(captor.capture());
+        List<DiscreteTimeData<Double>> cpuLoadData = captor.getValue();
+        assertEquals(1, cpuLoadData.get(0).getTimeInMillis());
+        assertEquals(10.0, cpuLoadData.get(0).getData().doubleValue(), 0.0001);
+        assertEquals(2, cpuLoadData.get(1).getTimeInMillis());
+        assertEquals(15.0, cpuLoadData.get(1).getData().doubleValue(), 0.0001);
+    }
+}