|
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