package org.ovirt.engine.core.bll.provider.network.openstack; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import org.ovirt.engine.core.common.businessentities.OpenstackNetworkProviderProperties; import org.ovirt.engine.core.common.businessentities.Provider; import com.woorea.openstack.keystone.Keystone; import com.woorea.openstack.keystone.api.TokensResource; import com.woorea.openstack.keystone.api.TokensResource.Authenticate; import com.woorea.openstack.keystone.model.Access; import com.woorea.openstack.keystone.model.Token; import com.woorea.openstack.keystone.model.authentication.UsernamePassword; import com.woorea.openstack.keystone.model.authentication.UsernamePassword.PasswordCredentials; @RunWith(MockitoJUnitRunner.class) public class ExternalNetworkTokenProviderTest { private static final String AUTH_URL = "authUrl"; private static final String PASSWORD = "password"; private static final String USERNAME = "username"; private static final String TOKEN_ID = "token id"; private static final Token token = new Token(); @Mock private Keystone mockKeystone; @Mock private TokensResource mockTokensResource; @Mock private Authenticate mockAuthenticate; @Mock private Access mockAccess; @Captor private ArgumentCaptor<UsernamePassword> usernamePasswordCaptor; private ExternalNetworkTokenProvider tokenProvider; @Before public void setUp() { Provider<OpenstackNetworkProviderProperties> provider = new Provider<>(); provider.setAuthUrl(AUTH_URL); provider.setUsername(USERNAME); provider.setPassword(PASSWORD); tokenProvider = spy(new ExternalNetworkTokenProvider(provider)); doReturn(mockKeystone).when(tokenProvider).createKeystone(AUTH_URL); doReturn(TOKEN_ID).when(tokenProvider).getTokenId(same(token)); when(mockKeystone.tokens()).thenReturn(mockTokensResource); when(mockTokensResource.authenticate(any(UsernamePassword.class))).thenReturn(mockAuthenticate); when(mockAuthenticate.execute()).thenReturn(mockAccess); when(mockAccess.getToken()).thenReturn(token); } @Test public void testGetToken() { assertEquals(TOKEN_ID, tokenProvider.getToken()); verify(mockTokensResource).authenticate(usernamePasswordCaptor.capture()); verifyUsernamePassword(); } private void verifyUsernamePassword() { final PasswordCredentials passwordCredentials = usernamePasswordCaptor.getValue().getPasswordCredentials(); assertThat(passwordCredentials, notNullValue()); assertThat(passwordCredentials.getPassword(), is(PASSWORD)); assertThat(passwordCredentials.getUsername(), is(USERNAME)); } @Test public void testExpireTokenCachesToken() { String result1 = tokenProvider.getToken(); String result2 = tokenProvider.getToken(); verify(mockAuthenticate, times(1)).execute(); assertThat(result1, is(TOKEN_ID)); assertThat(result2, is(TOKEN_ID)); } @Test public void testExpireToken() { String result1 = tokenProvider.getToken(); verify(mockAuthenticate, times(1)).execute(); tokenProvider.expireToken(); String result2 = tokenProvider.getToken(); verify(mockAuthenticate, times(2)).execute(); assertThat(result1, is(TOKEN_ID)); assertThat(result2, is(TOKEN_ID)); } }