/*
* JBoss, Home of Professional Open Source.
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership. Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
package org.teiid.dqp.internal.process;
import static org.junit.Assert.*;
import java.util.ArrayList;
import org.junit.Test;
import org.mockito.Mockito;
import org.teiid.cache.DefaultCacheFactory;
import org.teiid.client.RequestMessage;
import org.teiid.client.RequestMessage.StatementType;
import org.teiid.common.buffer.BufferManager;
import org.teiid.common.buffer.BufferManagerFactory;
import org.teiid.core.TeiidComponentException;
import org.teiid.core.TeiidProcessingException;
import org.teiid.dqp.internal.datamgr.ConnectorManagerRepository;
import org.teiid.dqp.internal.datamgr.FakeTransactionService;
import org.teiid.dqp.internal.process.AuthorizationValidator.CommandType;
import org.teiid.dqp.service.AutoGenDataService;
import org.teiid.query.metadata.QueryMetadataInterface;
import org.teiid.query.parser.QueryParser;
import org.teiid.query.processor.FakeDataManager;
import org.teiid.query.resolver.QueryResolver;
import org.teiid.query.sql.lang.Command;
import org.teiid.query.tempdata.TempTableStore;
import org.teiid.query.tempdata.TempTableStore.TransactionMode;
import org.teiid.query.unittest.RealMetadataFactory;
@SuppressWarnings("nls")
public class TestRequest {
private static final TempTableStore TEMP_TABLE_STORE = new TempTableStore("1", TransactionMode.ISOLATE_WRITES); //$NON-NLS-1$
private final static String QUERY = "SELECT * FROM pm1.g1"; //$NON-NLS-1$
/**
* Test Request.validateEntitlement().
* Make sure that this can be called both before and after metadata is initialized.
* See defect 17209.
* @throws Exception
* @since 4.2
*/
@Test public void testValidateEntitlement() throws Exception {
QueryMetadataInterface metadata = RealMetadataFactory.example1Cached();
Request request = new Request();
Command command = QueryParser.getQueryParser().parseCommand(QUERY);
QueryResolver.resolveCommand(command, metadata);
RequestMessage message = new RequestMessage();
DQPWorkContext workContext = RealMetadataFactory.buildWorkContext(metadata, RealMetadataFactory.example1VDB());
request.initialize(message, BufferManagerFactory.getStandaloneBufferManager(), null,
new FakeTransactionService(), TEMP_TABLE_STORE, workContext, null);
request.initMetadata();
DefaultAuthorizationValidator drav = new DefaultAuthorizationValidator();
DataRolePolicyDecider drpd = new DataRolePolicyDecider();
drpd.setAllowCreateTemporaryTablesByDefault(true);
drpd.setAllowFunctionCallsByDefault(true);
drav.setPolicyDecider(drpd);
request.setAuthorizationValidator(drav);
request.validateAccess(new String[] {QUERY}, command, CommandType.USER);
}
/**
* Test Request.processRequest().
* Test processing the same query twice, and make sure that doesn't cause problems.
* See defect 17209.
* @throws Exception
* @since 4.2
*/
@Test public void testProcessRequest() throws Exception {
QueryMetadataInterface metadata = RealMetadataFactory.example1Cached();
//Try before plan is cached.
//If this doesn't throw an exception, assume it was successful.
RequestMessage message = new RequestMessage(QUERY);
DQPWorkContext workContext = RealMetadataFactory.buildWorkContext(metadata, RealMetadataFactory.example1VDB());
helpProcessMessage(message, null, workContext);
//Try again, now that plan is already cached.
//If this doesn't throw an exception, assume it was successful.
message = new RequestMessage(QUERY);
helpProcessMessage(message, null, workContext);
}
@Test public void testCommandContext() throws Exception {
QueryMetadataInterface metadata = RealMetadataFactory.example1Cached();
//Try before plan is cached.
//If this doesn't throw an exception, assume it was successful.
RequestMessage message = new RequestMessage(QUERY);
DQPWorkContext workContext = RealMetadataFactory.buildWorkContext(metadata, RealMetadataFactory.example1VDB());
Request request = helpProcessMessage(message, null, workContext);
assertEquals("1", request.context.getConnectionId()); //$NON-NLS-1$
assertNotNull(request.context.getTransactionContext());
}
private Request helpProcessMessage(RequestMessage message, SessionAwareCache<PreparedPlan> cache, DQPWorkContext workContext) throws TeiidComponentException,
TeiidProcessingException {
Request request = null;
if (cache != null) {
request = new PreparedStatementRequest(cache);
} else {
request = new Request();
}
ConnectorManagerRepository repo = Mockito.mock(ConnectorManagerRepository.class);
workContext.getVDB().addAttchment(ConnectorManagerRepository.class, repo);
Mockito.stub(repo.getConnectorManager(Mockito.anyString())).toReturn(new AutoGenDataService());
request.initialize(message, Mockito.mock(BufferManager.class),
new FakeDataManager(), new FakeTransactionService(), TEMP_TABLE_STORE, workContext, null);
DefaultAuthorizationValidator drav = new DefaultAuthorizationValidator();
request.setAuthorizationValidator(drav);
request.processRequest();
return request;
}
/**
* Test PreparedStatementRequest.processRequest().
* Test processing the same query twice, and make sure that doesn't cause problems.
* @throws Exception
* @since 4.2
*/
@Test public void testProcessRequestPreparedStatement() throws Exception {
QueryMetadataInterface metadata = RealMetadataFactory.example1Cached();
SessionAwareCache<PreparedPlan> cache = new SessionAwareCache<PreparedPlan>("preparedplan", DefaultCacheFactory.INSTANCE, SessionAwareCache.Type.PREPAREDPLAN, 0);
//Try before plan is cached.
//If this doesn't throw an exception, assume it was successful.
RequestMessage message = new RequestMessage(QUERY);
DQPWorkContext workContext = RealMetadataFactory.buildWorkContext(metadata, RealMetadataFactory.example1VDB());
message.setStatementType(StatementType.PREPARED);
message.setParameterValues(new ArrayList<Object>());
helpProcessMessage(message, cache, workContext);
//Try again, now that plan is already cached.
//If this doesn't throw an exception, assume it was successful.
message = new RequestMessage(QUERY);
message.setStatementType(StatementType.PREPARED);
message.setParameterValues(new ArrayList<Object>());
helpProcessMessage(message, cache, workContext);
}
}