19252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey/* 29252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey * Copyright (C) 2018 The Android Open Source Project 39252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey * 49252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License"); 59252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey * you may not use this file except in compliance with the License. 69252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey * You may obtain a copy of the License at 79252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey * 89252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey * http://www.apache.org/licenses/LICENSE-2.0 99252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey * 109252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey * Unless required by applicable law or agreed to in writing, software 119252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS, 129252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey * See the License for the specific language governing permissions and 149252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey * limitations under the License 159252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey */ 169252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey 179252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkeypackage com.android.server.job.controllers; 189252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey 199252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkeyimport static org.junit.Assert.assertEquals; 209252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey 219252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkeyimport android.app.job.JobInfo; 229252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkeyimport android.content.ComponentName; 239252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkeyimport android.os.SystemClock; 249252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkeyimport android.support.test.runner.AndroidJUnit4; 259252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey 269252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkeyimport com.android.server.job.JobSchedulerService; 279252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey 289252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkeyimport org.junit.Before; 299252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkeyimport org.junit.Test; 309252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkeyimport org.junit.runner.RunWith; 319252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey 329252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkeyimport java.time.Clock; 339252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkeyimport java.time.ZoneOffset; 349252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey 359252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey@RunWith(AndroidJUnit4.class) 369252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkeypublic class JobStatusTest { 379252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey private static final double DELTA = 0.00001; 389252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey 399252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey @Before 409252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey public void setUp() throws Exception { 419252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey // Freeze the clocks at this moment in time 429252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey JobSchedulerService.sSystemClock = 439252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey Clock.fixed(Clock.systemUTC().instant(), ZoneOffset.UTC); 449252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey JobSchedulerService.sUptimeMillisClock = 459252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey Clock.fixed(SystemClock.uptimeMillisClock().instant(), ZoneOffset.UTC); 469252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey JobSchedulerService.sElapsedRealtimeClock = 479252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey Clock.fixed(SystemClock.elapsedRealtimeClock().instant(), ZoneOffset.UTC); 489252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey } 499252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey 509252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey @Test 519252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey public void testFraction() throws Exception { 529252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey final long now = JobSchedulerService.sElapsedRealtimeClock.millis(); 539252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey 549252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey assertEquals(1, createJobStatus(0, Long.MAX_VALUE).getFractionRunTime(), DELTA); 559252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey 569252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey assertEquals(1, createJobStatus(0, now - 1000).getFractionRunTime(), DELTA); 579252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey assertEquals(0, createJobStatus(0, now + 1000).getFractionRunTime(), DELTA); 589252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey 599252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey assertEquals(1, createJobStatus(now - 1000, Long.MAX_VALUE).getFractionRunTime(), DELTA); 609252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey assertEquals(0, createJobStatus(now + 1000, Long.MAX_VALUE).getFractionRunTime(), DELTA); 619252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey 629252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey assertEquals(0, createJobStatus(now, now + 2000).getFractionRunTime(), DELTA); 639252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey assertEquals(0.25, createJobStatus(now - 500, now + 1500).getFractionRunTime(), DELTA); 649252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey assertEquals(0.5, createJobStatus(now - 1000, now + 1000).getFractionRunTime(), DELTA); 659252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey assertEquals(0.75, createJobStatus(now - 1500, now + 500).getFractionRunTime(), DELTA); 669252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey assertEquals(1, createJobStatus(now - 2000, now).getFractionRunTime(), DELTA); 679252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey } 689252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey 699252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey private static JobStatus createJobStatus(long earliestRunTimeElapsedMillis, 709252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey long latestRunTimeElapsedMillis) { 719252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey final JobInfo job = new JobInfo.Builder(101, new ComponentName("foo", "bar")) 729252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY).build(); 739252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey return new JobStatus(job, 0, null, -1, 0, 0, null, earliestRunTimeElapsedMillis, 7415407846682b269e6b7fd0c24b84f709257fab5dMakoto Onuki latestRunTimeElapsedMillis, 0, 0, null, 0); 759252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey } 769252b34065809731ea2f6d3ffad91f678f809c93Jeff Sharkey} 77