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