/* * Copyright 2014 Bevbot LLC <info@bevbot.com> * * This file is part of the Kegtab package from the Kegbot project. For * more information on Kegtab or Kegbot, see <http://kegbot.org/>. * * Kegtab 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, version 2. * * Kegtab 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 Kegtab. If not, see <http://www.gnu.org/licenses/>. */ package org.kegbot.core; import android.test.InstrumentationTestCase; import com.squareup.otto.Bus; import org.kegbot.app.config.AppConfiguration; import org.kegbot.core.FlowManager.Clock; import org.kegbot.proto.Models.Controller; import org.kegbot.proto.Models.FlowMeter; import org.kegbot.proto.Models.KegTap; import java.util.List; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; /** * Tests for {@link FlowManager}. * * @author mike wakerly (opensource@hoho.com) */ public class FlowManagerTest extends InstrumentationTestCase { private static final String METER_0 = "test.flow0"; private static final String METER_1 = "test.flow1"; private TapManager mTapManager; private AppConfiguration mConfig; private Bus mBus; private KegTap mTap0; private KegTap mTap1; private FlowManager mFlowManager; private long mElapsedRealtime = 0; private final Clock mClock = new Clock() { @Override public long elapsedRealtime() { return mElapsedRealtime; } }; @Override protected void setUp() throws Exception { super.setUp(); // http://stackoverflow.com/q/12267572 System.setProperty("dexmaker.dexcache", getInstrumentation().getTargetContext().getCacheDir().getPath()); mBus = mock(Bus.class); mTapManager = new TapManager(mBus, null); mTap0 = KegTap.newBuilder() .setId(1) .setName("Test Tap 0") .setMeter(FlowMeter.newBuilder() .setId(1) .setPortName("flow0") .setName(METER_0) .setTicksPerMl(1) .setController(Controller.newBuilder() .setId(1) .setName("test") .build()) .build()) .build(); mTap1 = KegTap.newBuilder() .setId(2) .setName("Test Tap 1") .setMeter(FlowMeter.newBuilder() .setId(1) .setPortName("flow1") .setName(METER_1) .setTicksPerMl(1) .setController(Controller.newBuilder() .setId(1) .setName("test") .build()) .build()) .build(); mTapManager.addTap(mTap0); mTapManager.addTap(mTap1); mConfig = mock(AppConfiguration.class); when(Boolean.valueOf(mConfig.getEnableFlowAutoStart())).thenReturn(Boolean.TRUE); mFlowManager = new FlowManager(mBus, mTapManager, mConfig, mClock); } @Override protected void tearDown() throws Exception { super.tearDown(); } public void testGetAllActiveFlows() { List<Flow> flows = mFlowManager.getAllActiveFlows(); assertEquals(0, flows.size()); mFlowManager.startFlow(METER_0, 10000); flows = mFlowManager.getAllActiveFlows(); assertEquals(1, flows.size()); Flow flow = flows.get(0); assertEquals(mTap0, flow.getTap()); assertEquals(1, flow.getFlowId()); mFlowManager.endFlow(flow); flows = mFlowManager.getAllActiveFlows(); assertEquals(0, flows.size()); } public void testEndFlow() { List<Flow> flows = mFlowManager.getAllActiveFlows(); assertEquals(0, flows.size()); final Flow flow = mFlowManager.startFlow(METER_0, 10000); flows = mFlowManager.getAllActiveFlows(); assertEquals(1, flows.size()); mFlowManager.endFlow(flow); flows = mFlowManager.getAllActiveFlows(); assertEquals(0, flows.size()); } public void testGetFlowForTap() { List<Flow> flows = mFlowManager.getAllActiveFlows(); assertEquals(0, flows.size()); final Flow flow = mFlowManager.startFlow(METER_0, 10000); flows = mFlowManager.getAllActiveFlows(); assertEquals(1, flows.size()); assertEquals(flow, mFlowManager.getFlowForTap(mTap0)); assertNull(mFlowManager.getFlowForTap(mTap1)); } @SuppressWarnings("deprecation") public void testGetFlowForMeterName() { List<Flow> flows = mFlowManager.getAllActiveFlows(); assertEquals(0, flows.size()); final Flow flow = mFlowManager.startFlow(METER_0, 10000); flows = mFlowManager.getAllActiveFlows(); assertEquals(1, flows.size()); assertEquals(flow, mFlowManager.getFlowForMeterName(mTap0.getMeter().getName())); assertNull(mFlowManager.getFlowForMeterName(mTap1.getMeter().getName())); } public void testGetFlowForFlowId() { List<Flow> flows = mFlowManager.getAllActiveFlows(); assertEquals(0, flows.size()); final Flow flow = mFlowManager.startFlow(METER_0, 10000); flows = mFlowManager.getAllActiveFlows(); assertEquals(1, flows.size()); assertEquals(1, flow.getFlowId()); assertSame(flow, mFlowManager.getFlowForFlowId(1)); assertNull(mFlowManager.getFlowForFlowId(2)); } public void testCreateUpdateReplaceFlow() { List<Flow> flows = mFlowManager.getAllActiveFlows(); assertEquals(0, flows.size()); Flow flow = mFlowManager.handleMeterActivity(mTap0.getMeter().getName(), 100); flows = mFlowManager.getAllActiveFlows(); assertEquals(1, flows.size()); assertSame(flow, flows.get(0)); assertEquals(0, flow.getTicks()); assertEquals(1, flow.getFlowId()); Flow updatedFlow = mFlowManager.handleMeterActivity(mTap0.getMeter().getName(), 200); assertSame(flow, updatedFlow); assertEquals(100, flow.getTicks()); // Rolling the flow meter backwards does not increase flow ticks; zeroes // meter on new value. updatedFlow = mFlowManager.handleMeterActivity(mTap0.getMeter().getName(), 10); assertSame(flow, updatedFlow); assertEquals(100, flow.getTicks()); mFlowManager.handleMeterActivity(mTap0.getMeter().getName(), 11); assertEquals(101, flow.getTicks()); mFlowManager.endFlow(flow); flows = mFlowManager.getAllActiveFlows(); assertEquals(0, flows.size()); } public void testAuthentication() { Flow flow = mFlowManager.startFlow(METER_0, 10000); List<Flow> flows = mFlowManager.getAllActiveFlows(); assertEquals(1, flows.size()); assertTrue(flow.isAnonymous()); assertFalse(flow.isAuthenticated()); assertEquals("", flow.getUsername()); // Add user at tap. No new flow, takes over existing flow. mFlowManager.activateUserAtTap(mTap0, "testuser"); flows = mFlowManager.getAllActiveFlows(); assertEquals(1, flows.size()); assertSame(flow, flows.get(0)); assertFalse(flow.isAnonymous()); assertTrue(flow.isAuthenticated()); assertEquals("testuser", flow.getUsername()); // Replace user at tap. Creates new flow. mFlowManager.activateUserAtTap(mTap0, "newuser"); flows = mFlowManager.getAllActiveFlows(); assertEquals(1, flows.size()); assertNotSame(flow, flows.get(0)); Flow newFlow = flows.get(0); assertFalse(newFlow.isAnonymous()); assertTrue(newFlow.isAuthenticated()); assertEquals("newuser", newFlow.getUsername()); } }