Add tests for audit logs partitions
This commit is contained in:
parent
7eea5a6cda
commit
b4300b35bf
@ -20,18 +20,33 @@ import org.junit.After;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.boot.test.mock.mockito.SpyBean;
|
||||
import org.thingsboard.server.common.data.Device;
|
||||
import org.thingsboard.server.common.data.Tenant;
|
||||
import org.thingsboard.server.common.data.User;
|
||||
import org.thingsboard.server.common.data.audit.ActionType;
|
||||
import org.thingsboard.server.common.data.audit.AuditLog;
|
||||
import org.thingsboard.server.common.data.id.EntityId;
|
||||
import org.thingsboard.server.common.data.page.PageData;
|
||||
import org.thingsboard.server.common.data.page.TimePageLink;
|
||||
import org.thingsboard.server.common.data.security.Authority;
|
||||
import org.thingsboard.server.dao.audit.AuditLogDao;
|
||||
import org.thingsboard.server.dao.model.ModelConstants;
|
||||
import org.thingsboard.server.dao.sqlts.insert.sql.SqlPartitioningRepository;
|
||||
import org.thingsboard.server.service.ttl.AuditLogsCleanUpService;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.time.ZoneOffset;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.reset;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||
|
||||
public abstract class BaseAuditLogControllerTest extends AbstractControllerTest {
|
||||
@ -39,6 +54,18 @@ public abstract class BaseAuditLogControllerTest extends AbstractControllerTest
|
||||
private Tenant savedTenant;
|
||||
private User tenantAdmin;
|
||||
|
||||
@Autowired
|
||||
private AuditLogDao auditLogDao;
|
||||
@SpyBean
|
||||
private SqlPartitioningRepository partitioningRepository;
|
||||
@Autowired
|
||||
private AuditLogsCleanUpService auditLogsCleanUpService;
|
||||
|
||||
@Value("#{${sql.audit_logs.partition_size} * 60 * 60 * 1000}")
|
||||
private long partitionDurationInMs;
|
||||
@Value("${sql.ttl.audit_logs.ttl}")
|
||||
private long auditLogsTtlInSec;
|
||||
|
||||
@Before
|
||||
public void beforeTest() throws Exception {
|
||||
loginSysAdmin();
|
||||
@ -145,4 +172,45 @@ public abstract class BaseAuditLogControllerTest extends AbstractControllerTest
|
||||
|
||||
Assert.assertEquals(179, loadedAuditLogs.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenSavingNewAuditLog_thenCheckAndCreatePartitionIfNotExists() {
|
||||
reset(partitioningRepository);
|
||||
AuditLog auditLog = createAuditLog(ActionType.LOGIN, tenantAdminUserId);
|
||||
verify(partitioningRepository).createPartitionIfNotExists(eq("audit_log"), eq(auditLog.getCreatedTime()), eq(partitionDurationInMs));
|
||||
|
||||
List<Long> partitions = partitioningRepository.fetchPartitions("audit_log");
|
||||
assertThat(partitions).singleElement().satisfies(partitionStartTs -> {
|
||||
assertThat(partitionStartTs).isEqualTo(partitioningRepository.calculatePartitionStartTime(auditLog.getCreatedTime(), partitionDurationInMs));
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenCleaningUpAuditLogsByTtl_thenDropOldPartitions() {
|
||||
long oldAuditLogTs = LocalDate.of(2020, 10, 1).atStartOfDay().toInstant(ZoneOffset.UTC).toEpochMilli();
|
||||
long partitionStartTs = partitioningRepository.calculatePartitionStartTime(oldAuditLogTs, partitionDurationInMs);
|
||||
partitioningRepository.createPartitionIfNotExists("audit_log", oldAuditLogTs, partitionDurationInMs);
|
||||
List<Long> partitions = partitioningRepository.fetchPartitions("audit_log");
|
||||
assertThat(partitions).contains(partitionStartTs);
|
||||
|
||||
auditLogsCleanUpService.cleanUp();
|
||||
partitions = partitioningRepository.fetchPartitions("audit_log");
|
||||
assertThat(partitions).doesNotContain(partitionStartTs);
|
||||
assertThat(partitions).allSatisfy(partitionsStart -> {
|
||||
long partitionEndTs = partitionsStart + partitionDurationInMs;
|
||||
assertThat(partitionEndTs).isGreaterThan(System.currentTimeMillis() - TimeUnit.SECONDS.toMillis(auditLogsTtlInSec));
|
||||
});
|
||||
}
|
||||
|
||||
private AuditLog createAuditLog(ActionType actionType, EntityId entityId) {
|
||||
AuditLog auditLog = new AuditLog();
|
||||
auditLog.setTenantId(tenantId);
|
||||
auditLog.setCustomerId(null);
|
||||
auditLog.setUserId(tenantAdminUserId);
|
||||
auditLog.setEntityId(entityId);
|
||||
auditLog.setUserName(tenantAdmin.getEmail());
|
||||
auditLog.setActionType(actionType);
|
||||
return auditLogDao.save(tenantId, auditLog);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -56,4 +56,7 @@ queue.rule-engine.queues[2].processing-strategy.retries=1
|
||||
queue.rule-engine.queues[2].processing-strategy.pause-between-retries=0
|
||||
queue.rule-engine.queues[2].processing-strategy.max-pause-between-retries=0
|
||||
|
||||
usage.stats.report.enabled=false
|
||||
usage.stats.report.enabled=false
|
||||
|
||||
sql.audit_logs.partition_size=24
|
||||
sql.ttl.audit_logs.ttl=2592000
|
||||
@ -127,7 +127,7 @@ public class SqlPartitioningRepository {
|
||||
return false;
|
||||
}
|
||||
|
||||
private List<Long> fetchPartitions(String table) {
|
||||
public List<Long> fetchPartitions(String table) {
|
||||
List<Long> partitions = new ArrayList<>();
|
||||
List<String> partitionsTables = jdbcTemplate.queryForList(SELECT_PARTITIONS_STMT, new Object[]{table}, String.class);
|
||||
for (String partitionTableName : partitionsTables) {
|
||||
@ -141,7 +141,7 @@ public class SqlPartitioningRepository {
|
||||
return partitions;
|
||||
}
|
||||
|
||||
private long calculatePartitionStartTime(long ts, long partitionDuration) {
|
||||
public long calculatePartitionStartTime(long ts, long partitionDuration) {
|
||||
return ts - (ts % partitionDuration);
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user