blob: efa8e11f05051b964af22b3eec6944dcbb78f24a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.solr.core;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.util.HashMap;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CloudSolrClient;
import org.apache.solr.client.solrj.request.CollectionAdminRequest;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.cloud.SolrCloudTestCase;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.cloud.ZkStateReader;
import org.apache.solr.common.params.CollectionAdminParams;
import org.apache.solr.handler.TestBlobHandler;
import org.junit.BeforeClass;
import org.junit.Test;
public class BlobRepositoryCloudTest extends SolrCloudTestCase {
public static final Path TEST_PATH = getFile("solr/configsets").toPath();
@BeforeClass
public static void setupCluster() throws Exception {
configureCluster(1) // only sharing *within* a node
.addConfig("configname", TEST_PATH.resolve("resource-sharing"))
.configure();
// Thread.sleep(2000);
HashMap<String, String> params = new HashMap<>();
CollectionAdminRequest.createCollection(CollectionAdminParams.SYSTEM_COLL, null, 1, 1)
.process(cluster.getSolrClient());
// test component will fail if it cant' find a blob with this data by this name
TestBlobHandler.postData(cluster.getSolrClient(), findLiveNodeURI(), "testResource", ByteBuffer.wrap("foo,bar\nbaz,bam".getBytes(StandardCharsets.UTF_8)));
// Thread.sleep(2000);
// if these don't load we probably failed to post the blob above
CollectionAdminRequest.createCollection("col1", "configname", 1, 1)
.process(cluster.getSolrClient());
CollectionAdminRequest.createCollection("col2", "configname", 1, 1)
.process(cluster.getSolrClient());
SolrInputDocument document = new SolrInputDocument();
document.addField("id", "1");
document.addField("text", "col1");
CloudSolrClient solrClient = cluster.getSolrClient();
solrClient.add("col1", document);
solrClient.commit("col1");
document = new SolrInputDocument();
document.addField("id", "1");
document.addField("text", "col2");
solrClient.add("col2", document);
solrClient.commit("col2");
Thread.sleep(2000);
}
@Test
public void test() throws Exception {
// This test relies on the installation of ResourceSharingTestComponent which has 2 useful properties:
// 1. it will fail to initialize if it doesn't find a 2 line CSV like foo,bar\nbaz,bam thus validating
// that we are properly pulling data from the blob store
// 2. It replaces any q for a query request to /select with "text:<name>" where <name> is the name
// of the last collection to run a query. It does this by caching a shared resource of type
// ResourceSharingTestComponent.TestObject, and the following sequence is proof that either
// collection can tell if it was (or was not) the last collection to issue a query by
// consulting the shared object
assertLastQueryNotToCollection("col1");
assertLastQueryNotToCollection("col2");
assertLastQueryNotToCollection("col1");
assertLastQueryToCollection("col1");
assertLastQueryNotToCollection("col2");
assertLastQueryToCollection("col2");
}
// TODO: move this up to parent class?
private static String findLiveNodeURI() {
ZkStateReader zkStateReader = cluster.getSolrClient().getZkStateReader();
return zkStateReader.getBaseUrlForNodeName(zkStateReader.getClusterState().getCollection(".system").getSlices().iterator().next().getLeader().getNodeName());
}
private void assertLastQueryToCollection(String collection) throws SolrServerException, IOException {
assertEquals(1, getSolrDocuments(collection).size());
}
private void assertLastQueryNotToCollection(String collection) throws SolrServerException, IOException {
assertEquals(0, getSolrDocuments(collection).size());
}
private SolrDocumentList getSolrDocuments(String collection) throws SolrServerException, IOException {
SolrQuery query = new SolrQuery("*:*");
CloudSolrClient client = cluster.getSolrClient();
QueryResponse resp1 = client.query(collection, query);
return resp1.getResults();
}
}