package com.github.eyce9000.iem.webreports; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.io.File; import java.util.Date; import java.util.List; import java.util.Map; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import javax.xml.bind.annotation.XmlElement; import org.apache.http.client.HttpClient; import org.joda.time.DateTime; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import com.fasterxml.jackson.annotation.JsonProperty; import com.github.eyce9000.iem.api.ApacheClientBuilder; import com.github.eyce9000.iem.api.ConnectionDoc; import com.github.eyce9000.iem.api.RESTAPI; import com.github.eyce9000.iem.api.RelevanceAPI; import com.github.eyce9000.iem.api.relevance.RelevanceException; import com.github.eyce9000.iem.api.relevance.RowSerializer; import com.github.eyce9000.iem.api.relevance.SessionRelevanceQuery; import com.github.eyce9000.iem.api.relevance.handlers.AbtractTypedResultHandler; import com.github.eyce9000.iem.api.relevance.handlers.HandlerException; import com.github.eyce9000.iem.api.serialization.ResultAnswerAdapter; import com.github.eyce9000.iem.api.serialization.ResultAnswerAdapter.AnswerValueType; import com.github.eyce9000.iem.webreports.WebreportsAPI; public class RelevanceQueryTest { RESTAPI temClient; RelevanceAPI webreportsClient; private static Unmarshaller unmarshaller; private static ConnectionDoc webreportsDoc; private static ConnectionDoc restapiDoc; @BeforeClass public static void setupClass(){ JAXBContext context; try { context = JAXBContext.newInstance(ConnectionDoc.class); unmarshaller = context.createUnmarshaller(); webreportsDoc = (ConnectionDoc)unmarshaller.unmarshal(new File("config/test-webreports.xml")); restapiDoc = (ConnectionDoc)unmarshaller.unmarshal(new File("config/test-restapi.xml")); } catch (JAXBException e) { e.printStackTrace(); } } @Before public void setUp() throws Exception { HttpClient client = new ApacheClientBuilder().insecure().build(); temClient = new RESTAPI(client,restapiDoc.host,restapiDoc.username,restapiDoc.password); webreportsClient = new WebreportsAPI(client,webreportsDoc.host,webreportsDoc.username,webreportsDoc.password); } @Test public void testParser() throws Exception{ ResultAnswerAdapter adapter = new ResultAnswerAdapter(); ResultAnswerAdapter.Answer answer; answer = new ResultAnswerAdapter.Answer(); answer.setType(AnswerValueType.TIME); answer.setValue("Thu, 13 Mar 2014 09:23:25 -0400"); Date time = (Date)adapter.unmarshal(answer); assertNotNull(time); answer = new ResultAnswerAdapter.Answer(); answer.setType(AnswerValueType.BOOLEAN); answer.setValue("True"); Boolean booleanVal = (Boolean)adapter.unmarshal(answer); assertNotNull(booleanVal); } @Test public void testSessionRelevanceQuery() throws RelevanceException, HandlerException{ try{ testSessionRelevanceQuery(temClient); testSessionRelevanceQuery(webreportsClient); testSessionRelevanceQuery(webreportsClient); } catch(RelevanceException ex){ ex.printStackTrace(); System.out.println(ex.getMessage()); throw ex; } testInvalidQuery(temClient); testInvalidQuery(webreportsClient); } public void testSessionRelevanceQuery(RelevanceAPI client) throws RelevanceException, HandlerException{ SessionRelevanceQuery srq = SessionRelevanceQuery.parseQuery( "(name of it,//@Column computerName\n" + " id of it,//@Column computerId\n" + " last report time of it //@Column computerReportTime\n" + ") of bes computers whose (name of it contains \"TEMTESTSRV\")"); List<Map<String,Object>> result = client.executeQuery(srq); assertTrue(result.size()>0); for(Map<String,Object> row:result){ assertNotNull(row.get("computerName")); assertTrue(row.get("computerName") instanceof String); assertNotNull(row.get("computerId")); assertTrue(row.get("computerId") instanceof Integer); assertNotNull(row.get("computerReportTime")); assertTrue(row.get("computerReportTime") instanceof Date); } List<ComputerData> data = client.executeQuery(srq, ComputerData.class, RowSerializer.getJAXBSerializer()); assertTrue(data.size() > 0); for(ComputerData row : data){ assertNotNull(row.name); assertNotNull(row.id); assertNotNull(row.time); } srq = SessionRelevanceQuery.parseQuery( "names //@Column jscomputerName\n" + " of bes computers whose (name of it contains \"TEMTESTSRV\")"); data = client.executeQuery(srq, ComputerData.class, RowSerializer.getJacksonSerializer()); assertTrue(data.size() > 0); for(ComputerData row : data){ assertNotNull(row.name); } } public void testInvalidQuery(RelevanceAPI api){ SessionRelevanceQuery srq = SessionRelevanceQuery.parseQuery( "this should fail"); RelevanceException exception = null; try{ api.executeQuery(srq); }catch(RelevanceException ex){exception = ex;} assertTrue(exception!=null); assertTrue(exception.getMessage()!=null); } static class ComputerData{ @XmlElement(name="computerName") @JsonProperty("jscomputerName") String name; @XmlElement(name="computerId") @JsonProperty("jscomputerId") int id; @XmlElement(name="computerReportTime") @JsonProperty("jscomputerReportTime") DateTime time; } }