summaryrefslogtreecommitdiffstats
path: root/jdisc-cloud-aws/src/test/java/com/yahoo/jdisc/cloud/aws/VespaAwsCredentialsProviderTest.java
blob: 63cfd2f1eeb72c687dedf6cf690663c6f00e0897 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package com.yahoo.jdisc.cloud.aws;

import com.amazonaws.auth.AWSCredentials;
import com.yahoo.test.ManualClock;
import com.yahoo.vespa.test.file.TestFileSystem;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.Duration;
import java.time.Instant;


public class VespaAwsCredentialsProviderTest {
    Path credentialsPath = TestFileSystem.create().getPath("/credentials.json");
    ManualClock clock = new ManualClock(Instant.now());

    @Test
    void refreshes_credentials() throws IOException {
        Instant originalExpiry = clock.instant().plus(Duration.ofHours(12));
        writeCredentials(credentialsPath, originalExpiry);
        VespaAwsCredentialsProvider credentialsProvider = new VespaAwsCredentialsProvider(credentialsPath, clock);
        AWSCredentials credentials = credentialsProvider.getCredentials();
        assertExpiryEquals(originalExpiry, credentials);

        Instant updatedExpiry = clock.instant().plus(Duration.ofHours(24));
        writeCredentials(credentialsPath, updatedExpiry);
        // File updated, but old credentials still valid
        credentials = credentialsProvider.getCredentials();
        assertExpiryEquals(originalExpiry, credentials);

        // Credentials refreshes when it is < 30 minutes left until expiry
        clock.advance(Duration.ofHours(11).plus(Duration.ofMinutes(31)));
        credentials = credentialsProvider.getCredentials();
        assertExpiryEquals(updatedExpiry, credentials);
    }

    @Test
    void deserializes_credentials() throws IOException {
        Instant originalExpiry = clock.instant().plus(Duration.ofHours(12));
        writeCredentials(credentialsPath, originalExpiry);
        VespaAwsCredentialsProvider credentialsProvider = new VespaAwsCredentialsProvider(credentialsPath, clock);
        AWSCredentials credentials = credentialsProvider.getCredentials();
        assertExpiryEquals(originalExpiry, credentials);
        Assertions.assertEquals("awsAccessKey", credentials.getAWSAccessKeyId());
        Assertions.assertEquals("awsSecretKey", credentials.getAWSSecretKey());
        Assertions.assertEquals("sessionToken", ((VespaAwsCredentialsProvider.Credentials)credentials).getSessionToken());
    }

    private void writeCredentials(Path path, Instant expiry) throws IOException {
        String content = """
                {
                   "awsAccessKey": "awsAccessKey",
                   "awsSecretKey": "awsSecretKey",
                   "sessionToken": "sessionToken",
                   "expiry": "%s"
                 }""".formatted(expiry.toString());
        Files.writeString(path, content);
    }

    private void assertExpiryEquals(Instant expiry, AWSCredentials credentials) {
        Assertions.assertEquals(expiry, ((VespaAwsCredentialsProvider.Credentials)credentials).expiry());
    }
}