14f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla/* 24f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla * Copyright (C) 2017 The Android Open Source Project 34f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla * 44f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla * Licensed under the Apache License, Version 2.0 (the "License"); 54f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla * you may not use this file except in compliance with the License. 64f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla * You may obtain a copy of the License at 74f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla * 84f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla * http://www.apache.org/licenses/LICENSE-2.0 94f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla * 104f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla * Unless required by applicable law or agreed to in writing, software 114f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla * distributed under the License is distributed on an "AS IS" BASIS, 124f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla * See the License for the specific language governing permissions and 144f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla * limitations under the License. 154f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla */ 164f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla 174f8680bb778d35b7440f927f03c1c372d0770e88Eugene Suslapackage com.android.server.testutils; 184f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla 194f8680bb778d35b7440f927f03c1c372d0770e88Eugene Suslaimport android.os.SystemClock; 204f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla 214f8680bb778d35b7440f927f03c1c372d0770e88Eugene Suslaimport java.util.function.LongSupplier; 224f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla 234f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla/** 244f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla * A time supplier (in the format of a {@code long} as the amount of milliseconds) similar 254f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla * to {@link SystemClock#uptimeMillis()}, but with the ability to {@link #fastForward} 264f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla * and {@link #rewind} 274f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla * 284f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla * Implements {@link LongSupplier} to be interchangeable with {@code SystemClock::uptimeMillis} 294f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla * 304f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla * Can be provided to {@link TestHandler} to "mock time" for the delayed execution testing 314f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla * 324f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla * @see OffsettableClock.Stopped for a version of this clock that does not advance on its own 334f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla */ 344f8680bb778d35b7440f927f03c1c372d0770e88Eugene Suslapublic class OffsettableClock implements LongSupplier { 354f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla private long mOffset = 0L; 364f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla 374f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla /** 384f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla * @return Current time in milliseconds, according to this clock 394f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla */ 404f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla public long now() { 414f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla return realNow() + mOffset; 424f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla } 434f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla 444f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla /** 454f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla * Can be overriden with a constant for a clock that stands still, and is only ever moved 464f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla * manually 474f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla */ 484f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla public long realNow() { 494f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla return SystemClock.uptimeMillis(); 504f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla } 514f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla 524f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla public void fastForward(long timeMs) { 534f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla mOffset += timeMs; 544f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla } 554f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla public void rewind(long timeMs) { 564f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla fastForward(-timeMs); 574f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla } 584f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla public void reset() { 594f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla mOffset = 0; 604f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla } 614f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla 624f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla /** @deprecated Only present for {@link LongSupplier} contract */ 634f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla @Override 644f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla @Deprecated 654f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla public long getAsLong() { 664f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla return now(); 674f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla } 684f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla 694f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla /** 704f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla * An {@link OffsettableClock} that does not advance with real time, and can only be 714f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla * advanced manually via {@link #fastForward} 724f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla */ 734f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla public static class Stopped extends OffsettableClock { 744f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla @Override 754f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla public long realNow() { 764f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla return 0L; 774f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla } 784f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla } 794f8680bb778d35b7440f927f03c1c372d0770e88Eugene Susla} 80