package com.lucidworks.storm.solr; import backtype.storm.tuple.Tuple; import com.lucidworks.storm.spring.SpringBolt; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrDocumentList; import org.junit.Before; import org.junit.Test; import java.io.File; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; import java.util.concurrent.TimeUnit; import static org.junit.Assert.*; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class CollectionPerTimeFrameSolrBoltActionTest extends TestSolrCloudClusterSupport { class TestDoc { public String id; public String text; public int number; private Date timestamp; TestDoc(String id, String text, int number, Date timestamp) throws ParseException { this.id = id; this.text = text; this.number = number; this.timestamp = timestamp; } public Date getTimestamp() { return timestamp; } } SimpleDateFormat ISO_8601 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); @Before public void setupCollection() throws Exception { ISO_8601.setTimeZone(TimeZone.getTimeZone("UTC")); String confName = "testConfig"; File confDir = new File("src/test/resources/conf"); String testCollection = "test_2015-12-01-01-05"; int numShards = 1; int replicationFactor = 1; createCollection(testCollection, numShards, replicationFactor, confName, confDir); cloudSolrClient.setDefaultCollection(testCollection); } @Test public void testBoltAction() throws Exception { CollectionPerTimeFrameAssignmentStrategy strat = new CollectionPerTimeFrameAssignmentStrategy(); strat.setDateTimePattern("yyyy-MM-dd-HH-mm"); strat.setTimeFrame(5); // 5 minutes strat.setTimeUnit(TimeUnit.MINUTES); strat.setCollectionNameBase("test_"); strat.setFieldName("timestamp_tdt"); strat.setTimezoneId("UTC"); strat.setNumShards(1); strat.setReplicationFactor(1); strat.setConfigName("testConfig"); // Spring @Autowired property at runtime SolrBoltAction bolt = new SolrBoltAction(cloudSolrClient); bolt.setUpdateRequestStrategy(new DefaultUpdateRequestStrategy()); bolt.setDocumentAssignmentStrategy(strat); bolt.setMaxBufferSize(1); // to avoid buffering docs // Mock the Storm tuple String docId = "1"; TestDoc testDoc = new TestDoc(docId, "foo", 10, ISO_8601.parse("2015-12-01T01:09:59.999Z")); Tuple mockTuple = mock(Tuple.class); when(mockTuple.size()).thenReturn(2); when(mockTuple.getString(0)).thenReturn(docId); when(mockTuple.getValue(1)).thenReturn(testDoc); SpringBolt.ExecuteResult result = bolt.execute(mockTuple, null); assertTrue(result == SpringBolt.ExecuteResult.ACK); cloudSolrClient.commit(); // verify the object to Solr mapping worked correctly using reflection and dynamic fields SolrQuery query = new SolrQuery("id:" + docId); QueryResponse qr = cloudSolrClient.query(query); SolrDocumentList results = qr.getResults(); assertTrue(results.getNumFound() == 1); SolrDocument doc = results.get(0); assertNotNull(doc); assertEquals("foo", doc.getFirstValue("text_s")); assertEquals(new Integer(testDoc.number), doc.getFirstValue("number_i")); assertTrue(doc.getFirstValue("timestamp_tdt") != null); } }