/** * Copyright 2009 Google Inc. * * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 * * 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 org.waveprotocol.wave.model.util; import junit.framework.TestCase; import org.waveprotocol.wave.model.util.FuzzingBackOffScheduler.Builder; import org.waveprotocol.wave.model.util.FuzzingBackOffScheduler.Cancellable; import org.waveprotocol.wave.model.util.FuzzingBackOffScheduler.CollectiveScheduler; import org.waveprotocol.wave.model.util.Scheduler.Command; /** * Tests for FuzzingBackOffScheduler * @author zdwang@google.com (David Wang) */ public class FuzzingBackOffSchedulerTest extends TestCase { private class FakeCancellable implements Cancellable { boolean cancelled; @Override public void cancel() { cancelled = true; } } private class FakeNativeScheduler implements CollectiveScheduler { Command command; FakeCancellable cancellable; int millisec; @Override public Cancellable schedule(Command command, int millisec, int window) { this.millisec = millisec; this.command = command; this.cancellable = new FakeCancellable(); return this.cancellable; } } private Command fakeComamnd; private FakeNativeScheduler fakeNativeScheduler; private Scheduler scheduler; @Override protected void setUp() { fakeComamnd = new Command() { @Override public void execute() { } }; fakeNativeScheduler = new FakeNativeScheduler(); scheduler = new Builder(fakeNativeScheduler) .setInitialBackOffMs(10) .setMaxBackOffMs(100) .setRandomisationFactor(0.5) .build(); } public void testSchedule() { assertNull(fakeNativeScheduler.command); scheduler.schedule(fakeComamnd); assertNotNull(fakeNativeScheduler.command); } public void testScheduleMultiple() { // Schedule for the first time. scheduler.schedule(fakeComamnd); int lastMillisec = fakeNativeScheduler.millisec; FakeCancellable lastCancellable = fakeNativeScheduler.cancellable; assertNotNull(fakeNativeScheduler.command); assertFalse(fakeNativeScheduler.cancellable.cancelled); assertTrue(lastMillisec != 0); // Schedule again and check previous cancelled for (int i = 0; i < 20; i++) { scheduler.schedule(fakeComamnd); assertNotNull(fakeNativeScheduler.command); assertFalse(fakeNativeScheduler.cancellable.cancelled); assertNotSame(lastCancellable, fakeNativeScheduler.cancellable); assertTrue(lastCancellable.cancelled); lastMillisec = fakeNativeScheduler.millisec; lastCancellable = fakeNativeScheduler.cancellable; } // Check that the time have increased over time assertTrue(lastMillisec >= 50); } public void testScheduleMaxTimes() { int maxAttempts = 5; scheduler = new Builder(fakeNativeScheduler) .setInitialBackOffMs(10) .setMaxBackOffMs(100) .setRandomisationFactor(0.5) .setMaxAttempts(maxAttempts) .build(); for (int i = 0; i < maxAttempts; i++) { assertTrue(scheduler.schedule(fakeComamnd)); } assertFalse(scheduler.schedule(fakeComamnd)); } public void testReset() { // schedule something. scheduler.schedule(fakeComamnd); FakeCancellable lastTask = fakeNativeScheduler.cancellable; assertNotNull(fakeNativeScheduler.cancellable); // reset it and check the previous is cancelled. scheduler.reset(); assertTrue(lastTask.cancelled); scheduler.schedule(fakeComamnd); assertNotNull(fakeNativeScheduler.command); assertNotSame(lastTask, fakeNativeScheduler.command); } }