/***************************************************************************** * * Copyright (C) Zenoss, Inc. 2010, all rights reserved. * * This content is made available according to terms specified in * License.zenoss under the directory where your Zenoss product is installed. * ****************************************************************************/ package org.zenoss.zep.dao.impl; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests; import org.zenoss.utils.dao.Partition; import org.zenoss.utils.dao.RangePartitioner; import org.zenoss.zep.dao.impl.compat.DatabaseCompatibility; import org.zenoss.zep.dao.impl.compat.DatabaseType; import javax.sql.DataSource; import java.sql.Timestamp; import java.util.List; import java.util.concurrent.TimeUnit; import static org.junit.Assert.*; @ContextConfiguration({ "classpath:zep-config.xml" }) public class RangePartitionerIT extends AbstractTransactionalJUnit4SpringContextTests { @Autowired public DatabaseCompatibility databaseCompatibility; @Autowired public DataSource dataSource; @Before public void createSampleTable() { if (databaseCompatibility.getDatabaseType() == DatabaseType.MYSQL) { this.simpleJdbcTemplate .update("CREATE TABLE `range_partition` (`col_ts` BIGINT NOT NULL, `message` VARCHAR(256) NOT NULL)"); } else if (databaseCompatibility.getDatabaseType() == DatabaseType.POSTGRESQL) { this.simpleJdbcTemplate .update("CREATE TABLE range_partition (col_ts timestamp without time zone, message VARCHAR(256) NOT NULL)"); } } @After public void dropSampleTable() { this.simpleJdbcTemplate.update("DROP TABLE range_partition"); } @Test public void testRangePartitioner() { RangePartitioner partitioner = databaseCompatibility.getRangePartitioner( this.dataSource, "range_partition", "col_ts", 1, TimeUnit.DAYS); assertEquals(0, partitioner.listPartitions().size()); /* * Initialize partitions with 5 previous days partitions and 10 future * partitions. */ int numBefore = 0, numAfter = 0; partitioner.createPartitions(5, 10); Timestamp time = new Timestamp(System.currentTimeMillis()); List<Partition> partitions = partitioner.listPartitions(); assertEquals(15, partitions.size()); for (Partition partition : partitions) { if (partition.getRangeLessThan().before(time)) { numBefore++; } else { numAfter++; } } assertEquals(5, numBefore); assertEquals(10, numAfter); // Try to create partitions which overlap existing ranges and verify it doesn't create any. assertEquals(0, partitioner.createPartitions(10, 10)); assertEquals(0, partitioner.createPartitions(0, 5)); // Create two additional ones in the future and verify it only creates those two assertEquals(2, partitioner.createPartitions(5, 12)); assertEquals(17, partitioner.listPartitions().size()); // Test pruning partitions older than 3 days ago numBefore = 0; numAfter = 0; partitioner.pruneAndCreatePartitions(3, TimeUnit.DAYS, 0, 0); partitions = partitioner.listPartitions(); assertEquals(15, partitions.size()); for (Partition partition : partitions) { if (partition.getRangeLessThan().before(time)) { numBefore++; } else { numAfter++; } } assertEquals(3, numBefore); assertEquals(12, numAfter); // Test pruning partitions again, expecting same results numBefore = 0; numAfter = 0; partitioner.pruneAndCreatePartitions(3, TimeUnit.DAYS, 0, 0); partitions = partitioner.listPartitions(); assertEquals(15, partitions.size()); for (Partition partition : partitions) { if (partition.getRangeLessThan().before(time)) { numBefore++; } else { numAfter++; } } assertEquals(3, numBefore); assertEquals(12, numAfter); // Test dropping partitions partitioner.removeAllPartitions(); assertEquals(0, partitioner.listPartitions().size()); } }