11abddd9f6225298066094e20a6c29061b6af4590Nick Chalko/* 21abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Copyright (C) 2015 The Android Open Source Project 31abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * 41abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License"); 51abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * you may not use this file except in compliance with the License. 61abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * You may obtain a copy of the License at 71abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * 81abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * http://www.apache.org/licenses/LICENSE-2.0 91abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * 101abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Unless required by applicable law or agreed to in writing, software 111abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS, 121abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * See the License for the specific language governing permissions and 141abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * limitations under the License. 151abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 161abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 171abddd9f6225298066094e20a6c29061b6af4590Nick Chalkopackage com.android.tv.testing; 181abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 191abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport com.android.tv.util.Clock; 201abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 211abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport java.util.concurrent.TimeUnit; 221abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 231abddd9f6225298066094e20a6c29061b6af4590Nick Chalko/** 241abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Fake implementation of Clock suitable for testing. 251abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * 261abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * <p>The current time only changes if {@link #setCurrentTimeMillis(long)}, {@link #increment} or 271abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * {@link #sleep(long)} is called. 281abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 291abddd9f6225298066094e20a6c29061b6af4590Nick Chalkopublic class FakeClock implements Clock { 301abddd9f6225298066094e20a6c29061b6af4590Nick Chalko /** 311abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Creates a fake clock with the time set to now and the boot time set to now - 100,000. 321abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 331abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public static FakeClock createWithCurrentTime() { 341abddd9f6225298066094e20a6c29061b6af4590Nick Chalko long now = System.currentTimeMillis(); 351abddd9f6225298066094e20a6c29061b6af4590Nick Chalko return new FakeClock(now, now - 100_000); 361abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 371abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 381abddd9f6225298066094e20a6c29061b6af4590Nick Chalko /** 391abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Creates a fake clock with the time set to zero. 401abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 411abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public static FakeClock createWithTimeOne() { 421abddd9f6225298066094e20a6c29061b6af4590Nick Chalko return new FakeClock(1L, 0L); 431abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 441abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 451abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 461abddd9f6225298066094e20a6c29061b6af4590Nick Chalko private long mCurrentTimeMillis; 471abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 481abddd9f6225298066094e20a6c29061b6af4590Nick Chalko private long mBootTimeMillis; 491abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 501abddd9f6225298066094e20a6c29061b6af4590Nick Chalko private FakeClock(long currentTimeMillis, long bootTimeMillis) { 511abddd9f6225298066094e20a6c29061b6af4590Nick Chalko mCurrentTimeMillis = currentTimeMillis; 521abddd9f6225298066094e20a6c29061b6af4590Nick Chalko mBootTimeMillis = bootTimeMillis; 531abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 541abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 551abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public void setCurrentTimeMillis(long ms) { 561abddd9f6225298066094e20a6c29061b6af4590Nick Chalko if (ms < mBootTimeMillis) { 571abddd9f6225298066094e20a6c29061b6af4590Nick Chalko throw new IllegalStateException("current time can not be before boot time"); 581abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 591abddd9f6225298066094e20a6c29061b6af4590Nick Chalko mCurrentTimeMillis = ms; 601abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 611abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 621abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public void setBootTimeMillis(long ms) { 631abddd9f6225298066094e20a6c29061b6af4590Nick Chalko if (ms > mCurrentTimeMillis) { 641abddd9f6225298066094e20a6c29061b6af4590Nick Chalko throw new IllegalStateException("boot time can not be after current time"); 651abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 661abddd9f6225298066094e20a6c29061b6af4590Nick Chalko mBootTimeMillis = ms; 671abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 681abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 691abddd9f6225298066094e20a6c29061b6af4590Nick Chalko /** 701abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Increment the current time by one unit of time. 711abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * 721abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * @param unit The time unit to increment by. 731abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 741abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public void increment(TimeUnit unit) { 751abddd9f6225298066094e20a6c29061b6af4590Nick Chalko increment(unit, 1); 761abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 771abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 781abddd9f6225298066094e20a6c29061b6af4590Nick Chalko /** 791abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Increment the current time by {@code amount} unit of time. 801abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * 811abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * @param unit The time unit to increment by. 821abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * @param amount The amount of time units to increment by. 831abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 8448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho public void increment(TimeUnit unit, long amount) { 851abddd9f6225298066094e20a6c29061b6af4590Nick Chalko mCurrentTimeMillis += unit.toMillis(amount); 861abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 871abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 881abddd9f6225298066094e20a6c29061b6af4590Nick Chalko @Override 891abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public long currentTimeMillis() { 901abddd9f6225298066094e20a6c29061b6af4590Nick Chalko return mCurrentTimeMillis; 911abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 921abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 931abddd9f6225298066094e20a6c29061b6af4590Nick Chalko @Override 941abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public long elapsedRealtime() { 951abddd9f6225298066094e20a6c29061b6af4590Nick Chalko return mCurrentTimeMillis - mBootTimeMillis; 961abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 971abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 981abddd9f6225298066094e20a6c29061b6af4590Nick Chalko /** 991abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Sleep does not block it just updates the current time. 1001abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 1011abddd9f6225298066094e20a6c29061b6af4590Nick Chalko @Override 1021abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public void sleep(long ms) { 1031abddd9f6225298066094e20a6c29061b6af4590Nick Chalko // TODO: implement blocking if needed. 1041abddd9f6225298066094e20a6c29061b6af4590Nick Chalko mCurrentTimeMillis += ms; 1051abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 1061abddd9f6225298066094e20a6c29061b6af4590Nick Chalko} 107