mirror of https://github.com/apache/lucene.git
SOLR-8787: TestAuthenticationFramework should not extend TestMiniSolrCloudCluster
This commit is contained in:
parent
74c86063cf
commit
6528dacb0e
|
@ -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.
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue