Mercurial > hg > release > thermostat-0.13
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); + } +}