xds: Remove sleeps in FileWatcherCertificateProviderTest (#8968)

This reduces test time by 7 seconds.
This commit is contained in:
Eric Anderson 2022-04-01 16:35:51 -07:00 committed by GitHub
parent db36905abf
commit 1ab7a6dd0f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 42 additions and 22 deletions

View File

@ -31,7 +31,6 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset; import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import io.grpc.Status; import io.grpc.Status;
import io.grpc.internal.TimeProvider; import io.grpc.internal.TimeProvider;
@ -42,6 +41,7 @@ import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.NoSuchFileException; import java.nio.file.NoSuchFileException;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.nio.file.attribute.FileTime;
import java.security.PrivateKey; import java.security.PrivateKey;
import java.security.cert.CertificateException; import java.security.cert.CertificateException;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
@ -75,7 +75,7 @@ public class FileWatcherCertificateProviderTest {
@Mock private CertificateProvider.Watcher mockWatcher; @Mock private CertificateProvider.Watcher mockWatcher;
@Mock private ScheduledExecutorService timeService; @Mock private ScheduledExecutorService timeService;
@Mock private TimeProvider timeProvider; private final FakeTimeProvider timeProvider = new FakeTimeProvider();
@Rule public TemporaryFolder tempFolder = new TemporaryFolder(); @Rule public TemporaryFolder tempFolder = new TemporaryFolder();
@ -114,6 +114,8 @@ public class FileWatcherCertificateProviderTest {
if (certFileSource != null) { if (certFileSource != null) {
certFileSource = CommonTlsContextTestsUtil.getTempFileNameForResourcesFile(certFileSource); certFileSource = CommonTlsContextTestsUtil.getTempFileNameForResourcesFile(certFileSource);
Files.copy(Paths.get(certFileSource), Paths.get(certFile), REPLACE_EXISTING); Files.copy(Paths.get(certFileSource), Paths.get(certFile), REPLACE_EXISTING);
Files.setLastModifiedTime(
Paths.get(certFile), FileTime.fromMillis(timeProvider.currentTimeMillis()));
} }
if (deleteCurKey) { if (deleteCurKey) {
Files.delete(Paths.get(keyFile)); Files.delete(Paths.get(keyFile));
@ -121,6 +123,8 @@ public class FileWatcherCertificateProviderTest {
if (keyFileSource != null) { if (keyFileSource != null) {
keyFileSource = CommonTlsContextTestsUtil.getTempFileNameForResourcesFile(keyFileSource); keyFileSource = CommonTlsContextTestsUtil.getTempFileNameForResourcesFile(keyFileSource);
Files.copy(Paths.get(keyFileSource), Paths.get(keyFile), REPLACE_EXISTING); Files.copy(Paths.get(keyFileSource), Paths.get(keyFile), REPLACE_EXISTING);
Files.setLastModifiedTime(
Paths.get(keyFile), FileTime.fromMillis(timeProvider.currentTimeMillis()));
} }
if (deleteCurRoot) { if (deleteCurRoot) {
Files.delete(Paths.get(rootFile)); Files.delete(Paths.get(rootFile));
@ -128,6 +132,8 @@ public class FileWatcherCertificateProviderTest {
if (rootFileSource != null) { if (rootFileSource != null) {
rootFileSource = CommonTlsContextTestsUtil.getTempFileNameForResourcesFile(rootFileSource); rootFileSource = CommonTlsContextTestsUtil.getTempFileNameForResourcesFile(rootFileSource);
Files.copy(Paths.get(rootFileSource), Paths.get(rootFile), REPLACE_EXISTING); Files.copy(Paths.get(rootFileSource), Paths.get(rootFile), REPLACE_EXISTING);
Files.setLastModifiedTime(
Paths.get(rootFile), FileTime.fromMillis(timeProvider.currentTimeMillis()));
} }
} }
@ -166,7 +172,7 @@ public class FileWatcherCertificateProviderTest {
doReturn(scheduledFuture) doReturn(scheduledFuture)
.when(timeService) .when(timeService)
.schedule(any(Runnable.class), any(Long.TYPE), eq(TimeUnit.SECONDS)); .schedule(any(Runnable.class), any(Long.TYPE), eq(TimeUnit.SECONDS));
Thread.sleep(1000L); timeProvider.forwardTime(1, TimeUnit.SECONDS);
populateTarget(SERVER_0_PEM_FILE, SERVER_0_KEY_FILE, SERVER_1_PEM_FILE, false, false, false); populateTarget(SERVER_0_PEM_FILE, SERVER_0_KEY_FILE, SERVER_1_PEM_FILE, false, false, false);
provider.checkAndReloadCertificates(); provider.checkAndReloadCertificates();
verifyWatcherUpdates(SERVER_0_PEM_FILE, SERVER_1_PEM_FILE); verifyWatcherUpdates(SERVER_0_PEM_FILE, SERVER_1_PEM_FILE);
@ -205,7 +211,7 @@ public class FileWatcherCertificateProviderTest {
doReturn(scheduledFuture) doReturn(scheduledFuture)
.when(timeService) .when(timeService)
.schedule(any(Runnable.class), any(Long.TYPE), eq(TimeUnit.SECONDS)); .schedule(any(Runnable.class), any(Long.TYPE), eq(TimeUnit.SECONDS));
Thread.sleep(1000L); timeProvider.forwardTime(1, TimeUnit.SECONDS);
populateTarget(null, null, SERVER_1_PEM_FILE, false, false, false); populateTarget(null, null, SERVER_1_PEM_FILE, false, false, false);
provider.checkAndReloadCertificates(); provider.checkAndReloadCertificates();
verifyWatcherUpdates(null, SERVER_1_PEM_FILE); verifyWatcherUpdates(null, SERVER_1_PEM_FILE);
@ -227,7 +233,7 @@ public class FileWatcherCertificateProviderTest {
doReturn(scheduledFuture) doReturn(scheduledFuture)
.when(timeService) .when(timeService)
.schedule(any(Runnable.class), any(Long.TYPE), eq(TimeUnit.SECONDS)); .schedule(any(Runnable.class), any(Long.TYPE), eq(TimeUnit.SECONDS));
Thread.sleep(1000L); timeProvider.forwardTime(1, TimeUnit.SECONDS);
populateTarget(SERVER_0_PEM_FILE, SERVER_0_KEY_FILE, null, false, false, false); populateTarget(SERVER_0_PEM_FILE, SERVER_0_KEY_FILE, null, false, false, false);
provider.checkAndReloadCertificates(); provider.checkAndReloadCertificates();
verifyWatcherUpdates(SERVER_0_PEM_FILE, null); verifyWatcherUpdates(SERVER_0_PEM_FILE, null);
@ -242,8 +248,6 @@ public class FileWatcherCertificateProviderTest {
.when(timeService) .when(timeService)
.schedule(any(Runnable.class), any(Long.TYPE), eq(TimeUnit.SECONDS)); .schedule(any(Runnable.class), any(Long.TYPE), eq(TimeUnit.SECONDS));
populateTarget(null, CLIENT_KEY_FILE, CA_PEM_FILE, false, false, false); populateTarget(null, CLIENT_KEY_FILE, CA_PEM_FILE, false, false, false);
when(timeProvider.currentTimeNanos())
.thenReturn(TimeProvider.SYSTEM_TIME_PROVIDER.currentTimeNanos());
provider.checkAndReloadCertificates(); provider.checkAndReloadCertificates();
verifyWatcherErrorUpdates(Status.Code.UNKNOWN, NoSuchFileException.class, 0, 1, "cert.pem"); verifyWatcherErrorUpdates(Status.Code.UNKNOWN, NoSuchFileException.class, 0, 1, "cert.pem");
} }
@ -285,12 +289,11 @@ public class FileWatcherCertificateProviderTest {
provider.checkAndReloadCertificates(); provider.checkAndReloadCertificates();
reset(mockWatcher); reset(mockWatcher);
Thread.sleep(1000L); timeProvider.forwardTime(1, TimeUnit.SECONDS);
populateTarget(CLIENT_PEM_FILE, CLIENT_KEY_FILE, null, false, false, true); populateTarget(CLIENT_PEM_FILE, CLIENT_KEY_FILE, null, false, false, true);
when(timeProvider.currentTimeNanos()) timeProvider.forwardTime(
.thenReturn( CERT0_EXPIRY_TIME_MILLIS - 610_000L - timeProvider.currentTimeMillis(),
TimeUnit.MILLISECONDS.toNanos( TimeUnit.MILLISECONDS);
CERT0_EXPIRY_TIME_MILLIS - 610_000L));
provider.checkAndReloadCertificates(); provider.checkAndReloadCertificates();
verifyWatcherErrorUpdates(Status.Code.UNKNOWN, NoSuchFileException.class, 1, 0, "root.pem"); verifyWatcherErrorUpdates(Status.Code.UNKNOWN, NoSuchFileException.class, 1, 0, "root.pem");
} }
@ -315,22 +318,18 @@ public class FileWatcherCertificateProviderTest {
provider.checkAndReloadCertificates(); provider.checkAndReloadCertificates();
reset(mockWatcher); reset(mockWatcher);
Thread.sleep(1000L); timeProvider.forwardTime(1, TimeUnit.SECONDS);
populateTarget( populateTarget(
certFile, keyFile, rootFile, certFile == null, keyFile == null, rootFile == null); certFile, keyFile, rootFile, certFile == null, keyFile == null, rootFile == null);
when(timeProvider.currentTimeNanos()) timeProvider.forwardTime(
.thenReturn( CERT0_EXPIRY_TIME_MILLIS - 610_000L - timeProvider.currentTimeMillis(),
TimeUnit.MILLISECONDS.toNanos( TimeUnit.MILLISECONDS);
CERT0_EXPIRY_TIME_MILLIS - 610_000L));
provider.checkAndReloadCertificates(); provider.checkAndReloadCertificates();
verifyWatcherErrorUpdates( verifyWatcherErrorUpdates(
null, null, firstUpdateCertCount, firstUpdateRootCount, (String[]) null); null, null, firstUpdateCertCount, firstUpdateRootCount, (String[]) null);
reset(mockWatcher, timeProvider); reset(mockWatcher);
when(timeProvider.currentTimeNanos()) timeProvider.forwardTime(20, TimeUnit.SECONDS);
.thenReturn(
TimeUnit.MILLISECONDS.toNanos(
CERT0_EXPIRY_TIME_MILLIS - 590_000L));
provider.checkAndReloadCertificates(); provider.checkAndReloadCertificates();
verifyWatcherErrorUpdates( verifyWatcherErrorUpdates(
Status.Code.UNKNOWN, Status.Code.UNKNOWN,
@ -450,4 +449,25 @@ public class FileWatcherCertificateProviderTest {
return null; return null;
} }
} }
/**
* Fake TimeProvider that roughly mirrors FakeClock. Not using FakeClock because it incorrectly
* fails to align the wall-time API TimeProvider.currentTimeNanos() with currentTimeMillis() and
* fixing it upsets a _lot_ of tests.
*/
static class FakeTimeProvider implements TimeProvider {
public long currentTimeNanos = TimeUnit.SECONDS.toNanos(1262332800); /* 2010-01-01 */
@Override public long currentTimeNanos() {
return currentTimeNanos;
}
public void forwardTime(long duration, TimeUnit unit) {
currentTimeNanos += unit.toNanos(duration);
}
public long currentTimeMillis() {
return TimeUnit.NANOSECONDS.toMillis(currentTimeNanos);
}
}
} }