Skip to content

Commit 73721ac

Browse files
authored
Add UnitTest to verify updateTrustCredentials rotate (#11798)
* Add lastUpdateTime to avoid read
1 parent e61b03c commit 73721ac

File tree

2 files changed

+45
-4
lines changed

2 files changed

+45
-4
lines changed

util/src/main/java/io/grpc/util/AdvancedTlsX509TrustManager.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ public Closeable updateTrustCredentials(File trustCertFile, long period, TimeUni
265265
}
266266
final ScheduledFuture<?> future =
267267
checkNotNull(executor, "executor").scheduleWithFixedDelay(
268-
new LoadFilePathExecution(trustCertFile), period, period, unit);
268+
new LoadFilePathExecution(trustCertFile, updatedTime), period, period, unit);
269269
return () -> future.cancel(false);
270270
}
271271

@@ -312,9 +312,9 @@ private class LoadFilePathExecution implements Runnable {
312312
File file;
313313
long currentTime;
314314

315-
public LoadFilePathExecution(File file) {
315+
public LoadFilePathExecution(File file, long currentTime) {
316316
this.file = file;
317-
this.currentTime = 0;
317+
this.currentTime = currentTime;
318318
}
319319

320320
@Override

util/src/test/java/io/grpc/util/AdvancedTlsX509TrustManagerTest.java

+42-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import static org.mockito.Mockito.when;
2525

2626
import com.google.common.collect.Iterables;
27+
import com.google.common.io.Files;
2728
import io.grpc.internal.FakeClock;
2829
import io.grpc.internal.testing.TestUtils;
2930
import io.grpc.testing.TlsTesting;
@@ -57,21 +58,28 @@ public class AdvancedTlsX509TrustManagerTest {
5758

5859
private static final String CA_PEM_FILE = "ca.pem";
5960
private static final String SERVER_0_PEM_FILE = "server0.pem";
61+
private static final String SERVER_1_PEM_FILE = "server1.pem";
6062
private File caCertFile;
6163
private File serverCert0File;
64+
private File serverCert1File;
6265

6366
private X509Certificate[] caCert;
6467
private X509Certificate[] serverCert0;
68+
private X509Certificate[] serverCert1;
6569

70+
private FakeClock fakeClock;
6671
private ScheduledExecutorService executor;
6772

6873
@Before
6974
public void setUp() throws IOException, GeneralSecurityException {
70-
executor = new FakeClock().getScheduledExecutorService();
75+
fakeClock = new FakeClock();
76+
executor = fakeClock.getScheduledExecutorService();
7177
caCertFile = TestUtils.loadCert(CA_PEM_FILE);
7278
caCert = CertificateUtils.getX509Certificates(TlsTesting.loadCert(CA_PEM_FILE));
7379
serverCert0File = TestUtils.loadCert(SERVER_0_PEM_FILE);
7480
serverCert0 = CertificateUtils.getX509Certificates(TlsTesting.loadCert(SERVER_0_PEM_FILE));
81+
serverCert1File = TestUtils.loadCert(SERVER_1_PEM_FILE);
82+
serverCert1 = CertificateUtils.getX509Certificates(TlsTesting.loadCert(SERVER_1_PEM_FILE));
7583
}
7684

7785
@Test
@@ -147,6 +155,39 @@ public void clientTrustedWithSocketTest() throws Exception {
147155
assertEquals("No handshake session", ce.getMessage());
148156
}
149157

158+
@Test
159+
public void updateTrustCredentials_rotate() throws GeneralSecurityException, IOException {
160+
AdvancedTlsX509TrustManager trustManager = AdvancedTlsX509TrustManager.newBuilder().build();
161+
trustManager.updateTrustCredentials(serverCert0File);
162+
assertArrayEquals(serverCert0, trustManager.getAcceptedIssuers());
163+
164+
trustManager.updateTrustCredentials(serverCert0File, 1, TimeUnit.MINUTES,
165+
executor);
166+
assertArrayEquals(serverCert0, trustManager.getAcceptedIssuers());
167+
168+
fakeClock.forwardTime(1, TimeUnit.MINUTES);
169+
assertArrayEquals(serverCert0, trustManager.getAcceptedIssuers());
170+
171+
serverCert0File.setLastModified(serverCert0File.lastModified() - 10);
172+
173+
fakeClock.forwardTime(1, TimeUnit.MINUTES);
174+
assertArrayEquals(serverCert0, trustManager.getAcceptedIssuers());
175+
176+
long beforeModify = serverCert0File.lastModified();
177+
Files.copy(serverCert1File, serverCert0File);
178+
serverCert0File.setLastModified(beforeModify);
179+
180+
// although file content changed, file modification time is not changed
181+
fakeClock.forwardTime(1, TimeUnit.MINUTES);
182+
assertArrayEquals(serverCert0, trustManager.getAcceptedIssuers());
183+
184+
serverCert0File.setLastModified(beforeModify + 10);
185+
186+
// file modification time changed
187+
fakeClock.forwardTime(1, TimeUnit.MINUTES);
188+
assertArrayEquals(serverCert1, trustManager.getAcceptedIssuers());
189+
}
190+
150191
private static class TestHandler extends Handler {
151192
private final List<LogRecord> records = new ArrayList<>();
152193

0 commit comments

Comments
 (0)