SOLR-8787: TestAuthenticationFramework should not extend TestMiniSolrCloudCluster

This commit is contained in:
Shalin Shekhar Mangar 2016-06-30 19:50:17 +05:30
parent 74c86063cf
commit 6528dacb0e
2 changed files with 125 additions and 13 deletions

View File

@ -121,6 +121,8 @@ Other Changes
* SOLR-9076: Update to Hadoop 2.7.2 * SOLR-9076: Update to Hadoop 2.7.2
(Mark Miller, Gregory Chanan) (Mark Miller, Gregory Chanan)
* SOLR-8787: TestAuthenticationFramework should not extend TestMiniSolrCloudCluster. (Trey Cahill via shalin)
================== 6.1.0 ================== ================== 6.1.0 ==================
Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release. Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.

View File

@ -16,8 +16,11 @@
*/ */
package org.apache.solr.cloud; package org.apache.solr.cloud;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodHandles;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import javax.servlet.FilterChain; import javax.servlet.FilterChain;
@ -30,13 +33,27 @@ import org.apache.http.HttpException;
import org.apache.http.HttpRequest; import org.apache.http.HttpRequest;
import org.apache.http.HttpRequestInterceptor; import org.apache.http.HttpRequestInterceptor;
import org.apache.http.protocol.HttpContext; import org.apache.http.protocol.HttpContext;
import org.apache.lucene.index.TieredMergePolicy;
import org.apache.lucene.util.LuceneTestCase; import org.apache.lucene.util.LuceneTestCase;
import org.apache.lucene.util.LuceneTestCase.SuppressSysoutChecks; import org.apache.lucene.util.LuceneTestCase.SuppressSysoutChecks;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.embedded.JettyConfig;
import org.apache.solr.client.solrj.embedded.JettySolrRunner;
import org.apache.solr.client.solrj.impl.CloudSolrClient;
import org.apache.solr.client.solrj.impl.HttpClientUtil; import org.apache.solr.client.solrj.impl.HttpClientUtil;
import org.apache.solr.client.solrj.impl.SolrHttpClientBuilder; import org.apache.solr.client.solrj.impl.SolrHttpClientBuilder;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.RequestStatusState;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.cloud.ZkStateReader;
import org.apache.solr.core.CoreDescriptor;
import org.apache.solr.index.TieredMergePolicyFactory;
import org.apache.solr.security.AuthenticationPlugin; import org.apache.solr.security.AuthenticationPlugin;
import org.apache.solr.security.HttpClientBuilderPlugin; import org.apache.solr.security.HttpClientBuilderPlugin;
import org.apache.solr.util.RevertDefaultThreadHandlerRule; import org.apache.solr.util.RevertDefaultThreadHandlerRule;
import org.junit.After;
import org.junit.Before;
import org.junit.ClassRule; import org.junit.ClassRule;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
@ -52,15 +69,12 @@ import com.carrotsearch.randomizedtesting.rules.SystemPropertiesRestoreRule;
*/ */
@LuceneTestCase.Slow @LuceneTestCase.Slow
@SuppressSysoutChecks(bugUrl = "Solr logs to JUL") @SuppressSysoutChecks(bugUrl = "Solr logs to JUL")
public class TestAuthenticationFramework extends TestMiniSolrCloudCluster { public class TestAuthenticationFramework extends LuceneTestCase {
private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
private int NUM_SERVERS = 5;
public TestAuthenticationFramework () { private int NUM_SHARDS = 2;
NUM_SERVERS = 5; private int REPLICATION_FACTOR = 2;
NUM_SHARDS = 2;
REPLICATION_FACTOR = 2;
}
static String requestUsername = MockAuthenticationPlugin.expectedUsername; static String requestUsername = MockAuthenticationPlugin.expectedUsername;
static String requestPassword = MockAuthenticationPlugin.expectedPassword; static String requestPassword = MockAuthenticationPlugin.expectedPassword;
@ -74,7 +88,7 @@ public class TestAuthenticationFramework extends TestMiniSolrCloudCluster {
new SystemPropertiesRestoreRule()).around( new SystemPropertiesRestoreRule()).around(
new RevertDefaultThreadHandlerRule()); new RevertDefaultThreadHandlerRule());
@Override @Before
public void setUp() throws Exception { public void setUp() throws Exception {
setupAuthenticationPlugin(); setupAuthenticationPlugin();
super.setUp(); super.setUp();
@ -84,21 +98,22 @@ public class TestAuthenticationFramework extends TestMiniSolrCloudCluster {
System.setProperty("authenticationPlugin", "org.apache.solr.cloud.TestAuthenticationFramework$MockAuthenticationPlugin"); System.setProperty("authenticationPlugin", "org.apache.solr.cloud.TestAuthenticationFramework$MockAuthenticationPlugin");
MockAuthenticationPlugin.expectedUsername = null; MockAuthenticationPlugin.expectedUsername = null;
MockAuthenticationPlugin.expectedPassword = null; MockAuthenticationPlugin.expectedPassword = null;
} }
@Test @Test
public void testBasics() throws Exception { public void testBasics() throws Exception {
MiniSolrCloudCluster miniCluster = createMiniSolrCloudCluster();
// Should pass // Should pass
testCollectionCreateSearchDelete(); collectionCreateSearchDelete(miniCluster);
MockAuthenticationPlugin.expectedUsername = "solr"; MockAuthenticationPlugin.expectedUsername = "solr";
MockAuthenticationPlugin.expectedPassword = "s0lrRocks"; MockAuthenticationPlugin.expectedPassword = "s0lrRocks";
// Should fail with 401 // Should fail with 401
try { try {
testCollectionCreateSearchDelete(); collectionCreateSearchDelete(miniCluster);
fail("Should've returned a 401 error"); fail("Should've returned a 401 error");
} catch (Exception ex) { } catch (Exception ex) {
if (!ex.getMessage().contains("Error 401")) { if (!ex.getMessage().contains("Error 401")) {
@ -108,14 +123,109 @@ public class TestAuthenticationFramework extends TestMiniSolrCloudCluster {
MockAuthenticationPlugin.expectedUsername = null; MockAuthenticationPlugin.expectedUsername = null;
MockAuthenticationPlugin.expectedPassword = null; MockAuthenticationPlugin.expectedPassword = null;
} }
miniCluster.shutdown();
} }
@Override @After
public void tearDown() throws Exception { public void tearDown() throws Exception {
System.clearProperty("authenticationPlugin"); System.clearProperty("authenticationPlugin");
super.tearDown(); super.tearDown();
} }
private MiniSolrCloudCluster createMiniSolrCloudCluster() throws Exception {
JettyConfig.Builder jettyConfig = JettyConfig.builder();
jettyConfig.waitForLoadingCoresToFinish(null);
return new MiniSolrCloudCluster(NUM_SERVERS, createTempDir(), jettyConfig.build());
}
private void createCollection(MiniSolrCloudCluster miniCluster, String collectionName, String asyncId)
throws Exception {
String configName = "solrCloudCollectionConfig";
File configDir = new File(SolrTestCaseJ4.TEST_HOME() + File.separator + "collection1" + File.separator + "conf");
miniCluster.uploadConfigDir(configDir, configName);
final boolean persistIndex = random().nextBoolean();
Map<String, String> collectionProperties = new HashMap<>();
collectionProperties.putIfAbsent(CoreDescriptor.CORE_CONFIG, "solrconfig-tlog.xml");
collectionProperties.putIfAbsent("solr.tests.maxBufferedDocs", "100000");
collectionProperties.putIfAbsent("solr.tests.ramBufferSizeMB", "100");
// use non-test classes so RandomizedRunner isn't necessary
if (random().nextBoolean()) {
collectionProperties.putIfAbsent(SolrTestCaseJ4.SYSTEM_PROPERTY_SOLR_TESTS_MERGEPOLICY, TieredMergePolicy.class.getName());
collectionProperties.putIfAbsent(SolrTestCaseJ4.SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICY, "true");
collectionProperties.putIfAbsent(SolrTestCaseJ4.SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICYFACTORY, "false");
} else {
collectionProperties.putIfAbsent(SolrTestCaseJ4.SYSTEM_PROPERTY_SOLR_TESTS_MERGEPOLICYFACTORY, TieredMergePolicyFactory.class.getName());
collectionProperties.putIfAbsent(SolrTestCaseJ4.SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICYFACTORY, "true");
collectionProperties.putIfAbsent(SolrTestCaseJ4.SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICY, "false");
}
collectionProperties.putIfAbsent("solr.tests.mergeScheduler", "org.apache.lucene.index.ConcurrentMergeScheduler");
collectionProperties.putIfAbsent("solr.directoryFactory", (persistIndex ? "solr.StandardDirectoryFactory" : "solr.RAMDirectoryFactory"));
miniCluster.createCollection(collectionName, NUM_SHARDS, REPLICATION_FACTOR, configName, null, asyncId, collectionProperties);
}
public void collectionCreateSearchDelete(MiniSolrCloudCluster miniCluster) throws Exception {
final String collectionName = "testcollection";
final CloudSolrClient cloudSolrClient = miniCluster.getSolrClient();
assertNotNull(miniCluster.getZkServer());
List<JettySolrRunner> jettys = miniCluster.getJettySolrRunners();
assertEquals(NUM_SERVERS, jettys.size());
for (JettySolrRunner jetty : jettys) {
assertTrue(jetty.isRunning());
}
// create collection
log.info("#### Creating a collection");
final String asyncId = (random().nextBoolean() ? null : "asyncId("+collectionName+".create)="+random().nextInt());
createCollection(miniCluster, collectionName, asyncId);
if (asyncId != null) {
final RequestStatusState state = AbstractFullDistribZkTestBase.getRequestStateAfterCompletion(asyncId, 330,
cloudSolrClient);
assertSame("did not see async createCollection completion", RequestStatusState.COMPLETED, state);
}
ZkStateReader zkStateReader = miniCluster.getSolrClient().getZkStateReader();
AbstractDistribZkTestBase.waitForRecoveriesToFinish(collectionName, zkStateReader, true, true, 330);
// modify/query collection
log.info("#### updating a querying collection");
cloudSolrClient.setDefaultCollection(collectionName);
SolrInputDocument doc = new SolrInputDocument();
doc.setField("id", "1");
cloudSolrClient.add(doc);
cloudSolrClient.commit();
SolrQuery query = new SolrQuery();
query.setQuery("*:*");
QueryResponse rsp = cloudSolrClient.query(query);
assertEquals(1, rsp.getResults().getNumFound());
// delete the collection we created earlier
miniCluster.deleteCollection(collectionName);
AbstractDistribZkTestBase.waitForCollectionToDisappear(collectionName, zkStateReader, true, true, 330);
// create it again
String asyncId2 = (random().nextBoolean() ? null : "asyncId("+collectionName+".create)="+random().nextInt());
createCollection(miniCluster, collectionName, asyncId2);
if (asyncId2 != null) {
final RequestStatusState state = AbstractFullDistribZkTestBase.getRequestStateAfterCompletion(asyncId2, 330,
cloudSolrClient);
assertSame("did not see async createCollection completion", RequestStatusState.COMPLETED, state);
}
AbstractDistribZkTestBase.waitForRecoveriesToFinish(collectionName, zkStateReader, true, true, 330);
// check that there's no left-over state
assertEquals(0, cloudSolrClient.query(new SolrQuery("*:*")).getResults().getNumFound());
cloudSolrClient.add(doc);
cloudSolrClient.commit();
assertEquals(1, cloudSolrClient.query(new SolrQuery("*:*")).getResults().getNumFound());
}
public static class MockAuthenticationPlugin extends AuthenticationPlugin implements HttpClientBuilderPlugin { public static class MockAuthenticationPlugin extends AuthenticationPlugin implements HttpClientBuilderPlugin {
public static String expectedUsername; public static String expectedUsername;
public static String expectedPassword; public static String expectedPassword;