/* * Copyright (c) 2013, the Dart project authors. * * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.eclipse.org/legal/epl-v10.html * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.dart.tools.core.internal.builder; import com.google.dart.tools.core.AbstractDartCoreTest; import com.google.dart.tools.core.analysis.model.ContextManager; import static org.mockito.Mockito.mock; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; public class AnalysisManagerTest extends AbstractDartCoreTest { /** Specialized worker that does not perform any actual analysis */ private class MockWorker extends AnalysisWorker { private int analysisCount; public MockWorker() { super(mock(ContextManager.class), null); } @Override public void performAnalysis(AnalysisManager manager) { analysisCount++; } void assertAnalysisCount(int expected) { assertEquals(expected, analysisCount); } } /** Specialized subclass that does not automatically start a background job */ private class Target extends AnalysisManager { private int startBackgroundAnalysisCount = 0; @Override public void startBackgroundAnalysis() { startBackgroundAnalysisCount++; } void assertBackgroundAnalysisCount(int expected) { assertEquals(expected, startBackgroundAnalysisCount); } void superStartBackgroundAnalysis() { super.startBackgroundAnalysis(); } } private Target target = new Target(); public void test_addWorker() throws Exception { assertEquals(0, target.getQueueWorkers().length); MockWorker worker = new MockWorker(); target.addWorker(worker); target.assertBackgroundAnalysisCount(1); assertEquals(1, target.getQueueWorkers().length); assertSame(worker, target.getQueueWorkers()[0]); } public void test_getInstance() { assertNotNull(AnalysisManager.getInstance()); } public void test_getNextWorker() throws Exception { assertNull(target.getNextWorker()); MockWorker worker = new MockWorker(); target.addWorker(worker); assertEquals(1, target.getQueueWorkers().length); assertSame(worker, target.getQueueWorkers()[0]); assertSame(worker, target.getNextWorker()); assertEquals(0, target.getQueueWorkers().length); assertNull(target.getNextWorker()); } public void test_performAnalysis() throws Exception { MockWorker worker = new MockWorker(); target.performAnalysis(null); worker.assertAnalysisCount(0); target.addWorker(worker); worker.assertAnalysisCount(0); target.performAnalysis(null); worker.assertAnalysisCount(1); } public void test_startBackgroundAnalysis() throws Exception { final CountDownLatch latch = new CountDownLatch(1); MockWorker worker = new MockWorker() { @Override public void performAnalysis(AnalysisManager manager) { assertSame(target, manager); latch.countDown(); }; }; target.addWorker(worker); target.superStartBackgroundAnalysis(); assertTrue(latch.await(5, TimeUnit.SECONDS)); } public void test_stopBackgroundAnalysis() throws Exception { final CountDownLatch startedLatch = new CountDownLatch(1); final CountDownLatch stoppedLatch = new CountDownLatch(1); final CountDownLatch wasStoppedLatch = new CountDownLatch(1); MockWorker worker = new MockWorker() { @Override public void performAnalysis(AnalysisManager manager) { assertSame(target, manager); startedLatch.countDown(); try { if (stoppedLatch.await(5, TimeUnit.SECONDS)) { wasStoppedLatch.countDown(); } } catch (InterruptedException e) { //$FALL-THROUGH$ } }; @Override public void stop() { super.stop(); stoppedLatch.countDown(); } }; target.addWorker(worker); target.superStartBackgroundAnalysis(); assertTrue(startedLatch.await(5, TimeUnit.SECONDS)); target.stopBackgroundAnalysis(); assertTrue(stoppedLatch.await(5, TimeUnit.SECONDS)); } public void test_waitForBackgroundAnalysis() throws Exception { assertTrue(target.waitForBackgroundAnalysis(5000)); final CountDownLatch latch = new CountDownLatch(1); final CountDownLatch resume = new CountDownLatch(1); final boolean[] finished = {false}; MockWorker worker = new MockWorker() { @Override public void performAnalysis(AnalysisManager manager) { assertSame(target, manager); latch.countDown(); try { finished[0] = resume.await(5, TimeUnit.SECONDS); } catch (InterruptedException e) { // ignored } }; }; assertNull(target.getActiveWorker()); target.addWorker(worker); assertNull(target.getActiveWorker()); target.superStartBackgroundAnalysis(); assertTrue(latch.await(5, TimeUnit.SECONDS)); assertFalse(target.waitForBackgroundAnalysis(10)); assertFalse(finished[0]); assertSame(worker, target.getActiveWorker()); resume.countDown(); assertTrue(target.waitForBackgroundAnalysis(5000)); assertTrue(finished[0]); assertNull(target.getActiveWorker()); } }