mirror of https://github.com/grpc/grpc-java.git
xds: Remove sleeps in FileWatcherCertificateProviderTest (#8968)
This reduces test time by 7 seconds.
This commit is contained in:
parent
db36905abf
commit
1ab7a6dd0f
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue