View Javadoc

1   package com.atlassian.asap.core.keys.privatekey;
2   
3   import com.atlassian.asap.api.exception.CannotRetrieveKeyException;
4   import com.atlassian.asap.core.keys.DataUriKeyReader;
5   import com.atlassian.asap.core.keys.KeyProvider;
6   import com.atlassian.asap.core.validator.ValidatedKeyId;
7   import org.junit.Rule;
8   import org.junit.Test;
9   import org.mockito.Mock;
10  import org.mockito.junit.MockitoJUnit;
11  import org.mockito.junit.MockitoRule;
12  
13  import java.io.InputStreamReader;
14  import java.net.URI;
15  import java.security.PrivateKey;
16  import java.security.interfaces.RSAPrivateKey;
17  
18  import static org.junit.Assert.assertSame;
19  import static org.mockito.Matchers.any;
20  import static org.mockito.Mockito.verify;
21  import static org.mockito.Mockito.verifyNoMoreInteractions;
22  import static org.mockito.Mockito.when;
23  
24  public class DataUriKeyProviderTest {
25      private static final String VALID_KID = "issuer/kid";
26      private static final URI VALID_DATA_URI = URI.create("data:application/pkcs8;kid=issuer%2Fkid;base64,EncodedKeyData");
27  
28      @Rule
29      public final MockitoRule mockitoRule = MockitoJUnit.rule();
30  
31      @Mock
32      private DataUriKeyReader keyReader;
33      @Mock
34      private RSAPrivateKey privateKey;
35  
36      @Test
37      public void shouldBeAbleToReadKeyFromDataUri() throws Exception {
38          when(keyReader.readPrivateKey(any(InputStreamReader.class))).thenReturn(privateKey);
39          KeyProvider<PrivateKey> keyRetriever = new DataUriKeyProvider(VALID_DATA_URI, keyReader);
40  
41          assertSame(privateKey, keyRetriever.getKey(ValidatedKeyId.validate(VALID_KID)));
42      }
43  
44      @Test(expected = IllegalArgumentException.class)
45      public void shouldGetErrorWhenKeyParsingFails() throws Exception {
46          when(keyReader.readPrivateKey(any(InputStreamReader.class)))
47                  .thenThrow(new CannotRetrieveKeyException("Random error"));
48          KeyProvider<PrivateKey> keyRetriever = new DataUriKeyProvider(VALID_DATA_URI, keyReader);
49  
50          keyRetriever.getKey(ValidatedKeyId.validate(VALID_KID));
51      }
52  
53      @Test(expected = IllegalArgumentException.class)
54      public void shouldFailWhenDataUriIsInvalid() throws Exception {
55          KeyProvider<PrivateKey> keyRetriever = new DataUriKeyProvider(URI.create("data:invalid"), keyReader);
56  
57          keyRetriever.getKey(ValidatedKeyId.validate(VALID_KID));
58      }
59  
60      @Test(expected = CannotRetrieveKeyException.class)
61      public void shouldFailWhenKeyIdIsNotDefined() throws Exception {
62          KeyProvider<PrivateKey> keyRetriever = new DataUriKeyProvider(VALID_DATA_URI, keyReader);
63  
64          keyRetriever.getKey(ValidatedKeyId.validate("some/other/key/identifier"));
65      }
66  
67      @Test
68      public void shouldParseKeyFromDataUriOnlyOnceOnConstruction() throws Exception {
69          when(keyReader.readPrivateKey(any(InputStreamReader.class))).thenReturn(privateKey);
70          KeyProvider<PrivateKey> keyRetriever = new DataUriKeyProvider(VALID_DATA_URI, keyReader);
71          verify(keyReader).readPrivateKey(any(InputStreamReader.class));
72  
73          assertSame(privateKey, keyRetriever.getKey(ValidatedKeyId.validate(VALID_KID)));
74          verifyNoMoreInteractions(keyReader);
75      }
76  }