package com.intuit.tank.persistence.databases; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.core.config.Configuration; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; import com.amazonaws.ClientConfiguration; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient; import com.amazonaws.services.dynamodbv2.model.ListTablesResult; import com.intuit.tank.reporting.databases.Attribute; import com.intuit.tank.reporting.databases.Item; import com.intuit.tank.results.TankResult; import com.intuit.tank.results.TankResultBuilder; import com.intuit.tank.test.TestGroups; import com.intuit.tank.vm.common.util.ReportUtil; import org.junit.Assert; public class AmazonDynamoDatabaseTest { private static final String TEST_JOB_ID = "TestJob1"; private static final String TEST_TABLE = "TestTable"; private static final int NUM_ENTRIES = 100; private AmazonDynamoDatabaseDocApi db; private AmazonDynamoDBClient dynamoDb; @BeforeSuite public void init() { LoggerContext ctx = (LoggerContext) LogManager.getContext(false); Configuration config = ctx.getConfiguration(); config.getLoggerConfig(LogManager.ROOT_LOGGER_NAME).setLevel(Level.INFO); ctx.updateLoggers(); // This causes all Loggers to refetch information from their LoggerConfig. } @BeforeClass public void before() { AWSCredentials credentials = new BasicAWSCredentials(System.getProperty("AWS_SECRET_KEY_ID"), System.getProperty("AWS_SECRET_KEY")); dynamoDb = new AmazonDynamoDBClient(credentials, new ClientConfiguration()); db = new AmazonDynamoDatabaseDocApi(dynamoDb); } // @BeforeMethod public void cleanTables() { if (db != null) { try { db.deleteTable(TEST_TABLE); } catch (Exception e) { e.printStackTrace(); } } } @Test(groups = TestGroups.EXPERIMENTAL) public void testListTables() { ListTablesResult listTables = dynamoDb.listTables(); for (String s : listTables.getTableNames()) { System.out.println(s); } } // @Test(groups = TestGroups.EXPERIMENTAL) public void testCreateDelete() { db.createTable(TEST_TABLE); boolean hasTable = db.hasTable(TEST_TABLE); Assert.assertEquals(true, hasTable); db.deleteTable(TEST_TABLE); } // @Test(groups = TestGroups.EXPERIMENTAL) public void testInsertTiming() { db.createTable(TEST_TABLE); boolean hasTable = db.hasTable(TEST_TABLE); Assert.assertEquals(true, hasTable); boolean hasJobData = db.hasJobData(TEST_TABLE, TEST_JOB_ID); Assert.assertEquals(false, hasJobData); List<TankResult> results = getResults(NUM_ENTRIES); db.addTimingResults(TEST_TABLE, results, false); List<Item> items = db.getItems(TEST_TABLE, TEST_JOB_ID, null, null, null); Assert.assertEquals(NUM_ENTRIES , items.size()); printItems(items); hasJobData = db.hasJobData(TEST_TABLE, TEST_JOB_ID); Assert.assertEquals(true, hasJobData); String start = ReportUtil.getTimestamp(results.get(10).getTimeStamp()); String end = ReportUtil.getTimestamp(results.get(90).getTimeStamp()); items = db.getItems(TEST_TABLE, TEST_JOB_ID, start, null, null); Assert.assertEquals(NUM_ENTRIES - 10 , items.size()); items = db.getItems(TEST_TABLE, TEST_JOB_ID, null, end, null); Assert.assertEquals(NUM_ENTRIES - 10 , items.size()); items = db.getItems(TEST_TABLE, TEST_JOB_ID, start, end, null); Assert.assertEquals(NUM_ENTRIES - 20 , items.size()); } // @Test(groups = TestGroups.EXPERIMENTAL) public void testInsertTps() { db.createTable(TEST_TABLE); int numJobs = 3; boolean hasTable = db.hasTable(TEST_TABLE); Assert.assertEquals(true, hasTable); List<Item> results = getTpsItems(NUM_ENTRIES, numJobs); db.addItems(TEST_TABLE, results, false); List<Item> items = db.getItems(TEST_TABLE, null, null, null, null); Assert.assertEquals(numJobs * NUM_ENTRIES, items.size()); for (int i = 0; i < numJobs; i++) { items = db.getItems(TEST_TABLE, Integer.toString(i), null, null, null); Assert.assertEquals(NUM_ENTRIES, items.size()); printItems(items); db.deleteForJob(TEST_TABLE, Integer.toString(i), false); items = db.getItems(TEST_TABLE, Integer.toString(i), null, null, null); Assert.assertEquals(0, items.size()); } } private void printItems(List<Item> items) { for (Item item : items) { System.out.println(item.getName()); for (Attribute attr : item.getAttributes()) { System.out.println(attr.getName() + " = " + attr.getValue()); } } } private List<Item> getTpsItems(int numItems, int numJobs) { List<Item> ret = new ArrayList<Item>(); for (int jobId = 0; jobId < numJobs; jobId++) { for (int i = 0; i < numItems; i++) { Item item = new Item(); String testJobId = Integer.toString(jobId); List<Attribute> attributes = new ArrayList<Attribute>(); Date date = new Date(); String ts = ReportUtil.getTimestamp(date); addAttribute(attributes, DatabaseKeys.TIMESTAMP_KEY.getShortKey(), ts); addAttribute(attributes, DatabaseKeys.JOB_ID_KEY.getShortKey(), testJobId); addAttribute(attributes, DatabaseKeys.INSTANCE_ID_KEY.getShortKey(), "TestInstanceID"); addAttribute(attributes, DatabaseKeys.LOGGING_KEY_KEY.getShortKey(), "TestLoggingKey"); addAttribute(attributes, DatabaseKeys.PERIOD_KEY.getShortKey(), "15"); addAttribute(attributes, DatabaseKeys.TRANSACTIONS_KEY.getShortKey(), "10"); item.setAttributes(attributes); String name = "TestInstanceID" + "_" + testJobId + "_" + "TestLoggingKey" + "_" + date; item.setName(name); ret.add(item); } } return ret; } private void addAttribute(List<Attribute> attributes, String key, String value) { if (value == null) { value = ""; } attributes.add(new Attribute(key, value)); } private List<TankResult> getResults(int numItems) { List<TankResult> ret = new ArrayList<TankResult>(); Calendar c = Calendar.getInstance(); c.add(Calendar.SECOND, -numItems); for (int i = 0; i < numItems; i++) { c.add(Calendar.SECOND, 1); TankResultBuilder builder = new TankResultBuilder(); builder.withJobId(TEST_JOB_ID); builder.withError(false); builder.withRequestName("TestRequest"); builder.withResponseSize(1); builder.withResponseTime(2000); builder.withStatusCode(200); TankResult tankResult = builder.build(); tankResult.setTimeStamp(c.getTime()); ret.add(tankResult); } return ret; } }