package org.ovirt.engine.core.bll; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import org.jgroups.util.UUID; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.ovirt.engine.core.bll.aaa.SessionDataContainer; import org.ovirt.engine.core.common.businessentities.aaa.DbUser; import org.ovirt.engine.core.common.queries.VdcQueryParametersBase; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.utils.CorrelationIdTracker; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** A test case for the {@link QueriesCommandBase} class. */ public class QueriesCommandBaseTest extends BaseCommandTest { private static final Logger log = LoggerFactory.getLogger(QueriesCommandBaseTest.class); @Mock private SessionDataContainer mockSessionDataContainer; @Mock private DbUser mockDbUser; /* Getters and Setters tests */ /** Test {@link QueriesCommandBase#isInternalExecution()} and {@link QueriesCommandBase#setInternalExecution(boolean)} */ @Test public void testIsInternalExecutionDefault() { ThereIsNoSuchQuery query = new ThereIsNoSuchQuery(mock(VdcQueryParametersBase.class)); assertFalse("By default, a query should not be marked for internel execution", query.isInternalExecution()); } @Test public void testIsInternalExecutionTrue() { ThereIsNoSuchQuery query = new ThereIsNoSuchQuery(mock(VdcQueryParametersBase.class)); query.setInternalExecution(true); assertTrue("Query should be marked for internel execution", query.isInternalExecution()); } @Test public void testIsInternalExecutionFalse() { ThereIsNoSuchQuery query = new ThereIsNoSuchQuery(mock(VdcQueryParametersBase.class)); // Set as true, then override with false query.setInternalExecution(true); query.setInternalExecution(false); assertFalse("Query should not be marked for internel execution", query.isInternalExecution()); } /** Test that an "oddly" typed query will be considered unknown */ @Test public void testUnknownQuery() throws Exception { ThereIsNoSuchQuery query = new ThereIsNoSuchQuery(mock(VdcQueryParametersBase.class)); assertEquals("Wrong type for 'ThereIsNoSuchQuery' ", VdcQueryType.Unknown, TestHelperQueriesCommandType.getQueryTypeFieldValue(query)); } /** Tests Admin permission check */ @Test public void testPermissionChecking() throws Exception { boolean[] booleans = { true, false }; for (VdcQueryType queryType : VdcQueryType.values()) { for (boolean isFiltered : booleans) { for (boolean isUserAdmin : booleans) { for (boolean isInternalExecution : booleans) { boolean shouldBeAbleToRunQuery; if (isFiltered) { shouldBeAbleToRunQuery = !queryType.isAdmin(); } else { shouldBeAbleToRunQuery = isInternalExecution || isUserAdmin; } log.debug("Running on query: {}", this); String sessionId = getClass().getSimpleName(); // Mock parameters VdcQueryParametersBase params = mock(VdcQueryParametersBase.class); when(params.isFiltered()).thenReturn(isFiltered); when(params.getSessionId()).thenReturn(sessionId); Guid guid = mock(Guid.class); // Set up the user id env. when(mockDbUser.getId()).thenReturn(guid); when(mockDbUser.isAdmin()).thenReturn(isUserAdmin); when(mockSessionDataContainer.getUser(sessionId, false)).thenReturn(mockDbUser); // Mock-Set the query as admin/user ThereIsNoSuchQuery query = new ThereIsNoSuchQuery(params); TestHelperQueriesCommandType.setQueryTypeFieldValue(query, queryType); query.setInternalExecution(isInternalExecution); query.executeCommand(); assertEquals("Running with type=" + queryType + " isUserAdmin=" + isUserAdmin + " isFiltered=" + isFiltered + " isInternalExecution=" + isInternalExecution + "\n " + "Query should succeed is: ", shouldBeAbleToRunQuery, query.getQueryReturnValue().getSucceeded()); } } } } } @Test public void testGetUserID() { when(mockDbUser.getId()).thenReturn(Guid.EVERYONE); String session = UUID.randomUUID().toString(); when(mockSessionDataContainer.getUser(session, false)).thenReturn(mockDbUser); VdcQueryParametersBase params = new VdcQueryParametersBase(session); params.setRefresh(false); ThereIsNoSuchQuery query = new ThereIsNoSuchQuery(params); assertEquals("wrong guid", Guid.EVERYONE, query.getUserID()); } @Test public void testGetUserIDWithNoUser() { ThereIsNoSuchQuery query = new ThereIsNoSuchQuery(new VdcQueryParametersBase()); assertNull("wrong guid", query.getUserID()); } /* Test Utilities */ @Before @After public void clearSession() { CorrelationIdTracker.clean(); } /** A stub class that will cause the {@link VdcQueryType#Unknown} to be used */ private class ThereIsNoSuchQuery extends QueriesCommandBase<VdcQueryParametersBase> { public ThereIsNoSuchQuery(VdcQueryParametersBase parameters) { super(parameters); postConstruct(); } @Override protected void executeQueryCommand() { // Stub method, do nothing } @Override protected SessionDataContainer getSessionDataContainer() { return mockSessionDataContainer; } } }