Tests for ThrottleService, NTP into TrustedTime.
Wrote initial suite of tests for ThrottleService, checking a variety of edge cases. Checks going over limits, updating policies, and reset after cycle elapses. Moved NTP code in ThrottleService into new TrustedTime interface, which makes it easier to understand, and allows tests to provide custom clocks. Change-Id: I0d62b8b3a169516a2ab2d33025f6fe30dc792be8
This commit is contained in:
96
core/java/android/util/NtpTrustedTime.java
Normal file
96
core/java/android/util/NtpTrustedTime.java
Normal file
@@ -0,0 +1,96 @@
|
||||
/*
|
||||
* Copyright (C) 2011 The Android Open Source Project
|
||||
*
|
||||
* 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 android.util;
|
||||
|
||||
import android.net.SntpClient;
|
||||
import android.os.SystemClock;
|
||||
|
||||
/**
|
||||
* {@link TrustedTime} that connects with a remote NTP server as its remote
|
||||
* trusted time source.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
public class NtpTrustedTime implements TrustedTime {
|
||||
private String mNtpServer;
|
||||
private long mNtpTimeout;
|
||||
|
||||
private boolean mHasCache;
|
||||
private long mCachedNtpTime;
|
||||
private long mCachedNtpElapsedRealtime;
|
||||
private long mCachedNtpCertainty;
|
||||
|
||||
public NtpTrustedTime() {
|
||||
}
|
||||
|
||||
public void setNtpServer(String server, long timeout) {
|
||||
mNtpServer = server;
|
||||
mNtpTimeout = timeout;
|
||||
}
|
||||
|
||||
/** {@inheritDoc} */
|
||||
public boolean forceRefresh() {
|
||||
if (mNtpServer == null) {
|
||||
throw new IllegalStateException("Missing NTP server");
|
||||
}
|
||||
|
||||
final SntpClient client = new SntpClient();
|
||||
if (client.requestTime(mNtpServer, (int) mNtpTimeout)) {
|
||||
mHasCache = true;
|
||||
mCachedNtpTime = client.getNtpTime();
|
||||
mCachedNtpElapsedRealtime = client.getNtpTimeReference();
|
||||
mCachedNtpCertainty = client.getRoundTripTime() / 2;
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/** {@inheritDoc} */
|
||||
public boolean hasCache() {
|
||||
return mHasCache;
|
||||
}
|
||||
|
||||
/** {@inheritDoc} */
|
||||
public long getCacheAge() {
|
||||
if (mHasCache) {
|
||||
return SystemClock.elapsedRealtime() - mCachedNtpElapsedRealtime;
|
||||
} else {
|
||||
return Long.MAX_VALUE;
|
||||
}
|
||||
}
|
||||
|
||||
/** {@inheritDoc} */
|
||||
public long getCacheCertainty() {
|
||||
if (mHasCache) {
|
||||
return mCachedNtpCertainty;
|
||||
} else {
|
||||
return Long.MAX_VALUE;
|
||||
}
|
||||
}
|
||||
|
||||
/** {@inheritDoc} */
|
||||
public long currentTimeMillis() {
|
||||
if (!mHasCache) {
|
||||
throw new IllegalStateException("Missing authoritative time source");
|
||||
}
|
||||
|
||||
// current time is age after the last ntp cache; callers who
|
||||
// want fresh values will hit makeAuthoritative() first.
|
||||
return mCachedNtpTime + getCacheAge();
|
||||
}
|
||||
}
|
||||
55
core/java/android/util/TrustedTime.java
Normal file
55
core/java/android/util/TrustedTime.java
Normal file
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Copyright (C) 2011 The Android Open Source Project
|
||||
*
|
||||
* 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 android.util;
|
||||
|
||||
/**
|
||||
* Interface that provides trusted time information, possibly coming from an NTP
|
||||
* server. Implementations may cache answers until {@link #forceRefresh()}.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
public interface TrustedTime {
|
||||
/**
|
||||
* Force update with an external trusted time source, returning {@code true}
|
||||
* when successful.
|
||||
*/
|
||||
public boolean forceRefresh();
|
||||
|
||||
/**
|
||||
* Check if this instance has cached a response from a trusted time source.
|
||||
*/
|
||||
public boolean hasCache();
|
||||
|
||||
/**
|
||||
* Return time since last trusted time source contact, or
|
||||
* {@link Long#MAX_VALUE} if never contacted.
|
||||
*/
|
||||
public long getCacheAge();
|
||||
|
||||
/**
|
||||
* Return certainty of cached trusted time in milliseconds, or
|
||||
* {@link Long#MAX_VALUE} if never contacted. Smaller values are more
|
||||
* precise.
|
||||
*/
|
||||
public long getCacheCertainty();
|
||||
|
||||
/**
|
||||
* Return current time similar to {@link System#currentTimeMillis()},
|
||||
* possibly using a cached authoritative time source.
|
||||
*/
|
||||
public long currentTimeMillis();
|
||||
}
|
||||
Reference in New Issue
Block a user