*/
package org.sonar.db.audit;
+import java.util.List;
import org.sonar.api.utils.System2;
import org.sonar.core.util.UuidFactory;
import org.sonar.db.Dao;
import org.sonar.db.DbSession;
-
-import java.util.List;
+import org.sonar.db.Pagination;
import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.MAX_SIZE;
return dbSession.getMapper(AuditMapper.class);
}
- public List<AuditDto> selectAll(DbSession dbSession) {
- return getMapper(dbSession).selectAll();
- }
-
- public List<AuditDto> selectByPeriod(DbSession dbSession, long beginning, long end) {
- return getMapper(dbSession).selectByPeriod(beginning, end);
- }
-
- public List<AuditDto> selectIfBeforeSelectedDate(DbSession dbSession, long end) {
- return getMapper(dbSession).selectIfBeforeSelectedDate(end);
+ public List<AuditDto> selectByPeriodPaginated(DbSession dbSession, long start, long end, int page) {
+ return getMapper(dbSession).selectByPeriodPaginated(start, end, Pagination.forPage(page).andSize(DEFAULT_PAGE_SIZE));
}
public void insert(DbSession dbSession, AuditDto auditDto) {
- long now = system2.now();
- auditDto.setUuid(uuidFactory.create());
- auditDto.setCreatedAt(now);
- if (auditDto.getNewValue().length() > MAX_SIZE) {
+ if (auditDto.getUuid() == null) {
+ auditDto.setUuid(uuidFactory.create());
+ }
+ if (auditDto.getCreatedAt() == 0) {
+ long now = system2.now();
+ auditDto.setCreatedAt(now);
+ }
+ if(auditDto.getNewValue().length() > MAX_SIZE) {
auditDto.setNewValue(EXCEEDED_LENGTH);
}
getMapper(dbSession).insert(auditDto);
import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.impl.utils.TestSystem2;
-import org.sonar.core.util.UuidFactory;
import org.sonar.core.util.UuidFactoryImpl;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
import static org.apache.commons.lang.RandomStringUtils.randomAlphanumeric;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
import static org.sonar.db.audit.AuditDao.EXCEEDED_LENGTH;
public class AuditDaoTest {
private static final long NOW = 1000000L;
- private static final String A_UUID = "SOME_UUID";
private final TestSystem2 system2 = new TestSystem2().setNow(NOW);
@Rule
public final DbTester db = DbTester.create(system2);
private final DbSession dbSession = db.getSession();
- private final UuidFactory uuidFactory = mock(UuidFactory.class);
private final AuditDao testAuditDao = new AuditDao(system2, UuidFactoryImpl.INSTANCE);
@Test
- public void selectAll_oneEntryInserted_returnThisEntry() {
- AuditDao auditDaoDeterministicUUID = new AuditDao(system2, uuidFactory);
- when(uuidFactory.create()).thenReturn(A_UUID);
- AuditDto auditDto = AuditTesting.newAuditDto();
- auditDaoDeterministicUUID.insert(dbSession, auditDto);
+ public void selectByPeriodPaginated_10001EntriesInserted_defaultPageSizeEntriesReturned() {
+ prepareRowsWithDeterministicCreatedAt(10001);
- List<AuditDto> auditDtos = auditDaoDeterministicUUID.selectAll(dbSession);
+ List<AuditDto> auditDtos = testAuditDao.selectByPeriodPaginated(dbSession, 1, 20000, 1);
- assertThat(auditDtos.size()).isEqualTo(1);
- assertThat(auditDtos.get(0))
- .extracting(AuditDto::getUuid, AuditDto::getUserLogin,
- AuditDto::getUserUuid, AuditDto::getCategory,
- AuditDto::getOperation, AuditDto::getNewValue,
- AuditDto::getCreatedAt)
- .containsExactly(A_UUID, auditDto.getUserLogin(),
- auditDto.getUserUuid(), auditDto.getCategory(),
- auditDto.getOperation(), auditDto.getNewValue(),
- auditDto.getCreatedAt());
+ assertThat(auditDtos.size()).isEqualTo(10000);
}
@Test
- public void selectAll_100EntriesInserted_100EntriesReturned() {
- AuditDao auditDao = new AuditDao(system2, UuidFactoryImpl.INSTANCE);
- for(int i=0; i<100; i++) {
- AuditDto auditDto = AuditTesting.newAuditDto();
- auditDto.setUuid(randomAlphanumeric(20));
- auditDao.insert(dbSession, auditDto);
- }
+ public void selectByPeriodPaginated_10001EntriesInserted_querySecondPageReturns1Item() {
+ prepareRowsWithDeterministicCreatedAt(10001);
- List<AuditDto> auditDtos = auditDao.selectAll(dbSession);
+ List<AuditDto> auditDtos = testAuditDao.selectByPeriodPaginated(dbSession, 1, 20000, 2);
- assertThat(auditDtos.size()).isEqualTo(100);
+ assertThat(auditDtos.size()).isEqualTo(1);
}
@Test
- public void selectByPeriod_selectOneRowFromTheMiddle() {
- prepareThreeRowsWithDeterministicCreatedAt();
+ public void deleteIfBeforeSelectedDate_deleteTwoRows() {
+ prepareRowsWithDeterministicCreatedAt(3);
- List<AuditDto> auditDtos = testAuditDao.selectByPeriod(dbSession, 1, 3);
+ testAuditDao.deleteIfBeforeSelectedDate(dbSession, 2);
+ List<AuditDto> auditDtos = testAuditDao.selectByPeriodPaginated(dbSession, 1, 4, 1);
assertThat(auditDtos.size()).isEqualTo(1);
- assertThat(auditDtos.get(0).getCreatedAt()).isEqualTo(2);
}
@Test
- public void selectByPeriod_selectOneRowFromTheEnd() {
- prepareThreeRowsWithDeterministicCreatedAt();
+ public void selectByPeriodPaginated_100EntriesInserted_100EntriesReturned() {
+ prepareRowsWithDeterministicCreatedAt(100);
- List<AuditDto> auditDtos = testAuditDao.selectByPeriod(dbSession, 2, 4);
+ List<AuditDto> auditDtos = testAuditDao.selectByPeriodPaginated(dbSession, 1, 101, 1);
- assertThat(auditDtos.size()).isEqualTo(1);
- assertThat(auditDtos.get(0).getCreatedAt()).isEqualTo(3);
+ assertThat(auditDtos.size()).isEqualTo(100);
}
@Test
- public void selectByPeriod_selectAllRows() {
- prepareThreeRowsWithDeterministicCreatedAt();
+ public void insert_doNotSetACreatedAtIfAlreadySet() {
+ AuditDto auditDto = AuditTesting.newAuditDto();
+ auditDto.setCreatedAt(1041375600000L);
- List<AuditDto> auditDtos = testAuditDao.selectByPeriod(dbSession, 0, 4);
+ testAuditDao.insert(dbSession, auditDto);
- assertThat(auditDtos.size()).isEqualTo(3);
+ List<AuditDto> auditDtos = testAuditDao.selectByPeriodPaginated(dbSession, 1041375500000L, 1041375700000L, 1);
+ AuditDto storedAuditDto = auditDtos.get(0);
+ assertThat(storedAuditDto.getCreatedAt()).isEqualTo(auditDto.getCreatedAt());
}
@Test
- public void selectIfBeforeSelectedDate_select1Row() {
- prepareThreeRowsWithDeterministicCreatedAt();
+ public void insert_setACreatedAtIfAlreadySet() {
+ AuditDto auditDto = AuditTesting.newAuditDto();
+ auditDto.setCreatedAt(0);
- List<AuditDto> auditDtos = testAuditDao.selectIfBeforeSelectedDate(dbSession, 2);
+ testAuditDao.insert(dbSession, auditDto);
- assertThat(auditDtos.size()).isEqualTo(1);
+ assertThat(auditDto.getCreatedAt()).isNotZero();
}
@Test
- public void deleteIfBeforeSelectedDate_deleteTwoRows() {
- prepareThreeRowsWithDeterministicCreatedAt();
+ public void insert_doNotSetAUUIDIfAlreadySet() {
+ AuditDto auditDto = AuditTesting.newAuditDto();
+ auditDto.setUuid("myuuid");
+ auditDto.setCreatedAt(1041375600000L);
- testAuditDao.deleteIfBeforeSelectedDate(dbSession, 2);
+ testAuditDao.insert(dbSession, auditDto);
- List<AuditDto> auditDtos = testAuditDao.selectAll(dbSession);
- assertThat(auditDtos.size()).isEqualTo(1);
+ List<AuditDto> auditDtos = testAuditDao.selectByPeriodPaginated(dbSession, 1041375500000L, 1041375700000L, 1);
+ AuditDto storedAuditDto = auditDtos.get(0);
+ assertThat(storedAuditDto.getUuid()).isEqualTo(auditDto.getUuid());
}
@Test
assertThat(auditDto.getNewValue()).isEqualTo(EXCEEDED_LENGTH);
}
- private void prepareThreeRowsWithDeterministicCreatedAt() {
- for(int i=1; i<=3; i++) {
- AuditDto auditDto = AuditTesting.newAuditDto();
- system2.setNow(i);
+ private void prepareRowsWithDeterministicCreatedAt(int size) {
+ for (int i = 1; i <= size; i++) {
+ AuditDto auditDto = AuditTesting.newAuditDto(i);
testAuditDao.insert(dbSession, auditDto);
}
}
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2021 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.sonar.db.audit;
+
+import org.sonar.db.DbClient;
+import org.sonar.db.DbSession;
+import org.sonar.db.DbTester;
+
+public class AuditDbTester {
+
+ private final DbTester db;
+ private final DbClient dbClient;
+ private final DbSession dbSession;
+
+ public AuditDbTester(DbTester db) {
+ this.db = db;
+ this.dbClient = db.getDbClient();
+ this.dbSession = db.getSession();
+ }
+
+ public final void insertRandomAuditEntry(long createdAt) {
+ AuditDto auditDto = AuditTesting.newAuditDto(createdAt);
+ dbClient.auditDao().insert(dbSession, auditDto);
+ db.commit();
+ }
+}