All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonTest.aws.sdk.kotlin.runtime.auth.credentials.ProcessCredentialsProviderTest.kt Maven / Gradle / Ivy

/*
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: Apache-2.0
 */
package aws.sdk.kotlin.runtime.auth.credentials

import aws.smithy.kotlin.runtime.auth.awscredentials.Credentials
import aws.smithy.kotlin.runtime.auth.awscredentials.CredentialsProviderException
import aws.smithy.kotlin.runtime.time.Instant
import io.mockk.coEvery
import io.mockk.mockkStatic
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runTest
import kotlin.test.Test
import kotlin.test.assertContains
import kotlin.test.assertEquals
import kotlin.test.assertFailsWith

@OptIn(ExperimentalCoroutinesApi::class)
class ProcessCredentialsProviderTest {
    @Test
    fun testSuccessWithExpiringCredentials() = runTest {
        mockkStatic(::executeCommand)
        coEvery { executeCommand(any(), any(), any(), any(), any()) }.returns(
            Pair(
                0,
                """
            {
                "Version": 1,
                "AccessKeyId": "AccessKeyId",
                "SecretAccessKey": "SecretAccessKey",
                "SessionToken": "SessionToken",
                "Expiration": "2022-10-14T00:00:00Z"
            }
                """.trimIndent(),
            ),
        )

        val expectedCredentials = Credentials(
            accessKeyId = "AccessKeyId",
            secretAccessKey = "SecretAccessKey",
            sessionToken = "SessionToken",
            expiration = Instant.fromEpochSeconds(1665705600),
            providerName = "Process",
        )

        val processCredentialsProvider = ProcessCredentialsProvider("anyString")
        val actualCredentials = processCredentialsProvider.resolve()
        assertEquals(expectedCredentials, actualCredentials)
    }

    @Test
    fun testSuccessWithNonExpiringCredentials() = runTest {
        mockkStatic(::executeCommand)
        coEvery { executeCommand(any(), any(), any(), any(), any()) }.returns(
            Pair(
                0,
                """
            {
                "Version": 1,
                "AccessKeyId": "AccessKeyId",
                "SecretAccessKey": "SecretAccessKey",
                "SessionToken": "SessionToken"
            }
                """.trimIndent(),
            ),
        )

        val expectedCredentials = Credentials(
            accessKeyId = "AccessKeyId",
            secretAccessKey = "SecretAccessKey",
            sessionToken = "SessionToken",
            expiration = Instant.MAX_VALUE,
            providerName = "Process",
        )

        val processCredentialsProvider = ProcessCredentialsProvider("anyString")
        val actualCredentials = processCredentialsProvider.resolve()
        assertEquals(expectedCredentials, actualCredentials)
    }

    @Test
    fun testMissingVersion() = runTest {
        mockkStatic(::executeCommand)
        coEvery { executeCommand(any(), any(), any(), any(), any()) }.returns(
            Pair(
                0,
                """
            {
                "AccessKeyId": "AccessKeyId",
                "SecretAccessKey": "SecretAccessKey",
                "SessionToken": "SessionToken",
                "Expiration": "2022-10-14T00:00:00Z"
            }
                """.trimIndent(),
            ),
        )

        val processCredentialsProvider = ProcessCredentialsProvider("anyString")
        assertFailsWith {
            processCredentialsProvider.resolve()
        }
    }

    @Test
    fun testUnsupportedVersion() = runTest {
        mockkStatic(::executeCommand)
        coEvery { executeCommand(any(), any(), any(), any(), any()) }.returns(
            Pair(
                0,
                """
            {
                "Version": 2
                "AccessKeyId": "AccessKeyId",
                "SecretAccessKey": "SecretAccessKey",
                "SessionToken": "SessionToken",
                "Expiration": "2022-10-14T00:00:00Z"
            }
                """.trimIndent(),
            ),
        )

        val processCredentialsProvider = ProcessCredentialsProvider("anyString")
        assertFailsWith {
            processCredentialsProvider.resolve()
        }
    }

    @Test
    fun testCommandFailure() = runTest {
        val exitCode = 1 // nonzero exit code indicates failure
        val stderr = "stderr message!"

        mockkStatic(::executeCommand)
        coEvery { executeCommand(any(), any(), any(), any(), any()) }.returns(Pair(exitCode, stderr))

        val processCredentialsProvider = ProcessCredentialsProvider("anyString")
        val ex = assertFailsWith { processCredentialsProvider.resolve() }
        assertContains(ex.message!!, stderr) // the exception message should contain the program's stderr
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy