/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.api.service;
import java.io.*;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.StreamingOutput;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import com.emc.storageos.api.service.impl.resource.utils.MarshallingExcetion;
import com.emc.storageos.security.audit.AuditLogRequest;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.junit.Assert;
import org.codehaus.jackson.map.AnnotationIntrospector;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.xc.JaxbAnnotationIntrospector;
import org.junit.Test;
import com.emc.storageos.api.service.impl.resource.AuditService;
import com.emc.storageos.api.service.impl.resource.utils.DbAuditLogRetriever;
import com.emc.storageos.api.service.utils.DummyDBClient;
import com.emc.storageos.api.service.utils.DummyHttpHeaders;
import com.emc.storageos.api.service.utils.AuditLogs;
import com.emc.storageos.db.exceptions.RetryableDatabaseException;
import com.emc.storageos.svcs.errorhandling.resources.InternalServerErrorException;
import com.sun.jersey.api.client.ClientResponse.Status;
public class DbAuditLogRetrieverTest {
/**
* test feed output files
*/
private static final String XmlTestOutputFile = "xmlAuditLogsOutput.xml";
private static final String JsonTestOutputFile = "jsonAuditLogsOutput.json";
private static final int queryThreadCount = 10;
@Test
public void auditServiceDBRetrieverTestXML()
throws WebApplicationException, IOException, JAXBException {
deleteIfExists(XmlTestOutputFile);
DummyDBClient dbClient = new DummyDBClient();
DbAuditLogRetriever dummyDbAuditLogRetriever = new DbAuditLogRetriever();
dummyDbAuditLogRetriever.setDbClient(dbClient);
String timeBucket = "2012-01-07T00";
AuditLogRequest auditLogRequest = getAuditLogRequest(timeBucket);
MediaType mediaType = MediaType.APPLICATION_XML_TYPE;
File of = new File(XmlTestOutputFile);
OutputStream os = new FileOutputStream(of);
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(os));
try {
dummyDbAuditLogRetriever.getBulkAuditLogs(auditLogRequest,mediaType,out);
} catch (MarshallingExcetion e ) {
Assert.fail(e.getMessage());
}
out.close();
JAXBContext context = null;
Unmarshaller unmarshaller = null;
context = JAXBContext.newInstance(AuditLogs.class);
unmarshaller = context.createUnmarshaller();
Object o = unmarshaller.unmarshal(new File(XmlTestOutputFile));
Assert.assertTrue(o instanceof AuditLogs);
AuditLogs auditLogs = (AuditLogs) o;
// expected number of events unmarshaled
Assert.assertEquals(10, auditLogs.auditLogs.size());
deleteIfExists(XmlTestOutputFile);
}
@Test
public void auditServiceDBExceptionsTestXML()
throws WebApplicationException, IOException, JAXBException {
deleteIfExists(XmlTestOutputFile);
DummyDBClient dbClient = new DummyDBClient();
DbAuditLogRetriever dummyDbAuditLogRetriever = new DbAuditLogRetriever();
dummyDbAuditLogRetriever.setDbClient(dbClient);
String timeBucket = "2012-01-02T00";
AuditLogRequest auditLogRequest = getAuditLogRequest(timeBucket);
MediaType mediaType = MediaType.APPLICATION_XML_TYPE;
File of = new File(XmlTestOutputFile);
OutputStream os = new FileOutputStream(of);
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(os));
try {
dummyDbAuditLogRetriever.getBulkAuditLogs(auditLogRequest,mediaType,out);
} catch (RetryableDatabaseException e ) {
Assert.assertTrue(e.toString().contains("I/O"));
} catch (MarshallingExcetion e ) {
Assert.fail(e.getMessage());
}
out.close();
}
@Test
public void auditServiceMarshallingExceptionsTestXML()
throws WebApplicationException, IOException, JAXBException {
deleteIfExists(XmlTestOutputFile);
DummyDBClient dbClient = new DummyDBClient();
DbAuditLogRetriever dummyDbAuditLogRetriever = new DbAuditLogRetriever();
dummyDbAuditLogRetriever.setDbClient(dbClient);
String timeBucket = "2012-01-08T00";
AuditLogRequest auditLogRequest = getAuditLogRequest(timeBucket);
MediaType mediaType = MediaType.APPLICATION_XML_TYPE;
File of = new File(XmlTestOutputFile);
OutputStream os = new FileOutputStream(of);
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(os));
try {
dummyDbAuditLogRetriever.getBulkAuditLogs(auditLogRequest,mediaType,out);
} catch (MarshallingExcetion e ) {
Assert.assertTrue(true);
}
out.close();
}
@Test
public void auditServiceDBExceptionsTestJSON()
throws WebApplicationException, IOException, JAXBException {
deleteIfExists(JsonTestOutputFile);
DummyDBClient dbClient = new DummyDBClient();
DbAuditLogRetriever dummyDbAuditLogRetriever = new DbAuditLogRetriever();
dummyDbAuditLogRetriever.setDbClient(dbClient);
String timeBucket = "2012-01-07T00";
DateTime startTime = new DateTime(timeBucket, DateTimeZone.UTC);
DateTime endTime = startTime.plusMinutes(59);
AuditLogRequest auditLogRequest = new AuditLogRequest.Builder().timeBucket(timeBucket)
.start(startTime).end(endTime).lang("en_US").build();
MediaType mediaType = MediaType.APPLICATION_JSON_TYPE;
File of = new File(JsonTestOutputFile);
OutputStream os = new FileOutputStream(of);
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(os));
try {
dummyDbAuditLogRetriever.getBulkAuditLogs(auditLogRequest,mediaType,out);
} catch (MarshallingExcetion e ) {
Assert.fail(e.getMessage());
}
out.close();
ObjectMapper mapper = null;
mapper = new ObjectMapper();
AnnotationIntrospector introspector = new JaxbAnnotationIntrospector();
mapper.getDeserializationConfig().withAnnotationIntrospector(
introspector);
AuditLogs auditLogs = mapper.readValue(new File(JsonTestOutputFile),
AuditLogs.class);
Assert.assertEquals(10, auditLogs.auditLogs.size());
deleteIfExists(JsonTestOutputFile);
}
@Test
public void auditServiceNullDBclientTestXML()
throws WebApplicationException, IOException, JAXBException {
deleteIfExists(XmlTestOutputFile);
DummyDBClient dbClient = null;
AuditService auditResource = new AuditService();
DbAuditLogRetriever dummyDbAuditLogRetriever = new DbAuditLogRetriever();
dummyDbAuditLogRetriever.setDbClient(dbClient);
auditResource.setAuditLogRetriever(dummyDbAuditLogRetriever);
DummyHttpHeaders header = new DummyHttpHeaders(
MediaType.APPLICATION_XML_TYPE);
Response r = auditResource.getAuditLogs("2012-01-05T00:00", "en_US", header);
Assert.assertNotNull(r);
Assert.assertEquals(Status.OK.getStatusCode(), r.getStatus());
Assert.assertTrue(r.getEntity() instanceof StreamingOutput);
StreamingOutput so = (StreamingOutput) r.getEntity();
File of = new File(XmlTestOutputFile);
OutputStream os = new FileOutputStream(of);
try {
so.write(os);
} catch (InternalServerErrorException e) {
Assert.assertTrue(e.toString().contains("DB"));
}
os.close();
}
private void deleteIfExists(String fname) {
File f = new File(fname);
if (f.exists()) {
f.delete();
}
}
private AuditLogRequest getAuditLogRequest(String timeBucket) {
DateTime startTime = new DateTime(timeBucket, DateTimeZone.UTC);
DateTime endTime = startTime.plusMinutes(59);
return new AuditLogRequest.Builder().timeBucket(timeBucket)
.start(startTime).end(endTime).lang("en_US").build();
}
}