|
24 | 24 | import static org.mockito.Mockito.when;
|
25 | 25 |
|
26 | 26 | import com.google.common.collect.Iterables;
|
| 27 | +import com.google.common.io.Files; |
27 | 28 | import io.grpc.internal.FakeClock;
|
28 | 29 | import io.grpc.internal.testing.TestUtils;
|
29 | 30 | import io.grpc.testing.TlsTesting;
|
@@ -57,21 +58,28 @@ public class AdvancedTlsX509TrustManagerTest {
|
57 | 58 |
|
58 | 59 | private static final String CA_PEM_FILE = "ca.pem";
|
59 | 60 | private static final String SERVER_0_PEM_FILE = "server0.pem";
|
| 61 | + private static final String SERVER_1_PEM_FILE = "server1.pem"; |
60 | 62 | private File caCertFile;
|
61 | 63 | private File serverCert0File;
|
| 64 | + private File serverCert1File; |
62 | 65 |
|
63 | 66 | private X509Certificate[] caCert;
|
64 | 67 | private X509Certificate[] serverCert0;
|
| 68 | + private X509Certificate[] serverCert1; |
65 | 69 |
|
| 70 | + private FakeClock fakeClock; |
66 | 71 | private ScheduledExecutorService executor;
|
67 | 72 |
|
68 | 73 | @Before
|
69 | 74 | public void setUp() throws IOException, GeneralSecurityException {
|
70 |
| - executor = new FakeClock().getScheduledExecutorService(); |
| 75 | + fakeClock = new FakeClock(); |
| 76 | + executor = fakeClock.getScheduledExecutorService(); |
71 | 77 | caCertFile = TestUtils.loadCert(CA_PEM_FILE);
|
72 | 78 | caCert = CertificateUtils.getX509Certificates(TlsTesting.loadCert(CA_PEM_FILE));
|
73 | 79 | serverCert0File = TestUtils.loadCert(SERVER_0_PEM_FILE);
|
74 | 80 | 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)); |
75 | 83 | }
|
76 | 84 |
|
77 | 85 | @Test
|
@@ -147,6 +155,39 @@ public void clientTrustedWithSocketTest() throws Exception {
|
147 | 155 | assertEquals("No handshake session", ce.getMessage());
|
148 | 156 | }
|
149 | 157 |
|
| 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 | + |
150 | 191 | private static class TestHandler extends Handler {
|
151 | 192 | private final List<LogRecord> records = new ArrayList<>();
|
152 | 193 |
|
|
0 commit comments