org.sonar.db.ce.CeActivityDaoTest.java Source code

Java tutorial

Introduction

Here is the source code for org.sonar.db.ce.CeActivityDaoTest.java

Source

/*
 * SonarQube
 * Copyright (C) 2009-2016 SonarSource SA
 * mailto:contact 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.ce;

import com.google.common.base.Optional;
import java.util.Collections;
import java.util.List;
import org.apache.ibatis.session.RowBounds;
import org.junit.Rule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.sonar.api.utils.internal.TestSystem2;
import org.sonar.db.DbTester;
import org.sonar.test.DbTests;

import static org.assertj.core.api.Assertions.assertThat;
import static org.sonar.db.ce.CeTaskTypes.REPORT;

@Category(DbTests.class)
public class CeActivityDaoTest {

    TestSystem2 system2 = new TestSystem2().setNow(1_450_000_000_000L);

    @Rule
    public DbTester db = DbTester.create(system2);

    CeActivityDao underTest = new CeActivityDao(system2);

    @Test
    public void test_insert() {
        insert("TASK_1", REPORT, "PROJECT_1", CeActivityDto.Status.SUCCESS);

        Optional<CeActivityDto> saved = underTest.selectByUuid(db.getSession(), "TASK_1");
        assertThat(saved.isPresent()).isTrue();
        assertThat(saved.get().getUuid()).isEqualTo("TASK_1");
        assertThat(saved.get().getComponentUuid()).isEqualTo("PROJECT_1");
        assertThat(saved.get().getStatus()).isEqualTo(CeActivityDto.Status.SUCCESS);
        assertThat(saved.get().getSubmitterLogin()).isEqualTo("henri");
        assertThat(saved.get().getIsLast()).isTrue();
        assertThat(saved.get().getIsLastKey()).isEqualTo("REPORTPROJECT_1");
        assertThat(saved.get().getSubmittedAt()).isEqualTo(1_300_000_000_000L);
        assertThat(saved.get().getCreatedAt()).isEqualTo(1_450_000_000_000L);
        assertThat(saved.get().getStartedAt()).isEqualTo(1_500_000_000_000L);
        assertThat(saved.get().getExecutedAt()).isEqualTo(1_500_000_000_500L);
        assertThat(saved.get().getExecutionTimeMs()).isEqualTo(500L);
        assertThat(saved.get().getSnapshotId()).isEqualTo(123_456);
        assertThat(saved.get().toString()).isNotEmpty();
    }

    @Test
    public void insert_must_set_relevant_is_last_field() {
        // only a single task on PROJECT_1 -> is_last=true
        insert("TASK_1", REPORT, "PROJECT_1", CeActivityDto.Status.SUCCESS);
        assertThat(underTest.selectByUuid(db.getSession(), "TASK_1").get().getIsLast()).isTrue();

        // only a single task on PROJECT_2 -> is_last=true
        insert("TASK_2", REPORT, "PROJECT_2", CeActivityDto.Status.SUCCESS);
        assertThat(underTest.selectByUuid(db.getSession(), "TASK_2").get().getIsLast()).isTrue();

        // two tasks on PROJECT_1, the most recent one is TASK_3
        insert("TASK_3", REPORT, "PROJECT_1", CeActivityDto.Status.FAILED);
        assertThat(underTest.selectByUuid(db.getSession(), "TASK_1").get().getIsLast()).isFalse();
        assertThat(underTest.selectByUuid(db.getSession(), "TASK_2").get().getIsLast()).isTrue();
        assertThat(underTest.selectByUuid(db.getSession(), "TASK_3").get().getIsLast()).isTrue();

        // inserting a cancelled task does not change the last task
        insert("TASK_4", REPORT, "PROJECT_1", CeActivityDto.Status.CANCELED);
        assertThat(underTest.selectByUuid(db.getSession(), "TASK_1").get().getIsLast()).isFalse();
        assertThat(underTest.selectByUuid(db.getSession(), "TASK_2").get().getIsLast()).isTrue();
        assertThat(underTest.selectByUuid(db.getSession(), "TASK_3").get().getIsLast()).isTrue();
        assertThat(underTest.selectByUuid(db.getSession(), "TASK_4").get().getIsLast()).isFalse();
    }

    @Test
    public void test_selectByQuery() {
        insert("TASK_1", REPORT, "PROJECT_1", CeActivityDto.Status.SUCCESS);
        insert("TASK_2", REPORT, "PROJECT_1", CeActivityDto.Status.FAILED);
        insert("TASK_3", REPORT, "PROJECT_2", CeActivityDto.Status.SUCCESS);
        insert("TASK_4", "views", null, CeActivityDto.Status.SUCCESS);

        // no filters
        CeActivityQuery query = new CeActivityQuery();
        List<CeActivityDto> dtos = underTest.selectByQuery(db.getSession(), query, new RowBounds(0, 10));
        assertThat(dtos).extracting("uuid").containsExactly("TASK_4", "TASK_3", "TASK_2", "TASK_1");

        // select by component uuid
        query = new CeActivityQuery().setComponentUuid("PROJECT_1");
        dtos = underTest.selectByQuery(db.getSession(), query, new RowBounds(0, 10));
        assertThat(dtos).extracting("uuid").containsExactly("TASK_2", "TASK_1");

        // select by status
        query = new CeActivityQuery().setStatus(CeActivityDto.Status.SUCCESS);
        dtos = underTest.selectByQuery(db.getSession(), query, new RowBounds(0, 10));
        assertThat(dtos).extracting("uuid").containsExactly("TASK_4", "TASK_3", "TASK_1");

        // select by type
        query = new CeActivityQuery().setType(REPORT);
        dtos = underTest.selectByQuery(db.getSession(), query, new RowBounds(0, 10));
        assertThat(dtos).extracting("uuid").containsExactly("TASK_3", "TASK_2", "TASK_1");
        query = new CeActivityQuery().setType("views");
        dtos = underTest.selectByQuery(db.getSession(), query, new RowBounds(0, 10));
        assertThat(dtos).extracting("uuid").containsExactly("TASK_4");

        // select by multiple conditions
        query = new CeActivityQuery().setType(REPORT).setOnlyCurrents(true).setComponentUuid("PROJECT_1");
        dtos = underTest.selectByQuery(db.getSession(), query, new RowBounds(0, 10));
        assertThat(dtos).extracting("uuid").containsExactly("TASK_2");
    }

    @Test
    public void test_countByQuery() {
        insert("TASK_1", REPORT, "PROJECT_1", CeActivityDto.Status.SUCCESS);
        insert("TASK_2", REPORT, "PROJECT_1", CeActivityDto.Status.FAILED);
        insert("TASK_3", REPORT, "PROJECT_2", CeActivityDto.Status.SUCCESS);
        insert("TASK_4", "views", null, CeActivityDto.Status.SUCCESS);

        // no filters
        CeActivityQuery query = new CeActivityQuery();
        assertThat(underTest.countByQuery(db.getSession(), query)).isEqualTo(4);

        // select by component uuid
        query = new CeActivityQuery().setComponentUuid("PROJECT_1");
        assertThat(underTest.countByQuery(db.getSession(), query)).isEqualTo(2);

        // select by status
        query = new CeActivityQuery().setStatus(CeActivityDto.Status.SUCCESS);
        assertThat(underTest.countByQuery(db.getSession(), query)).isEqualTo(3);

        // select by type
        query = new CeActivityQuery().setType(REPORT);
        assertThat(underTest.countByQuery(db.getSession(), query)).isEqualTo(3);
        query = new CeActivityQuery().setType("views");
        assertThat(underTest.countByQuery(db.getSession(), query)).isEqualTo(1);

        // select by multiple conditions
        query = new CeActivityQuery().setType(REPORT).setOnlyCurrents(true).setComponentUuid("PROJECT_1");
        assertThat(underTest.countByQuery(db.getSession(), query)).isEqualTo(1);
    }

    @Test
    public void selectByQuery_no_results_if_shortcircuited_by_component_uuids() {
        insert("TASK_1", REPORT, "PROJECT_1", CeActivityDto.Status.SUCCESS);

        CeActivityQuery query = new CeActivityQuery();
        query.setComponentUuids(Collections.<String>emptyList());
        assertThat(underTest.selectByQuery(db.getSession(), query, new RowBounds(0, 10))).isEmpty();
    }

    @Test
    public void countByQuery_no_results_if_shortcircuited_by_component_uuids() {
        insert("TASK_1", REPORT, "PROJECT_1", CeActivityDto.Status.SUCCESS);

        CeActivityQuery query = new CeActivityQuery();
        query.setComponentUuids(Collections.<String>emptyList());
        assertThat(underTest.countByQuery(db.getSession(), query)).isEqualTo(0);
    }

    @Test
    public void select_and_count_by_date() {
        insertWithDates("UUID1", 1_450_000_000_000L, 1_470_000_000_000L);
        insertWithDates("UUID2", 1_460_000_000_000L, 1_480_000_000_000L);

        // search by min submitted date
        CeActivityQuery query = new CeActivityQuery().setMinSubmittedAt(1_455_000_000_000L);
        assertThat(underTest.selectByQuery(db.getSession(), query, new RowBounds(0, 10))).extracting("uuid")
                .containsOnly("UUID2");
        assertThat(underTest.countByQuery(db.getSession(), query)).isEqualTo(1);

        // search by max executed date
        query = new CeActivityQuery().setMaxExecutedAt(1_475_000_000_000L);
        assertThat(underTest.selectByQuery(db.getSession(), query, new RowBounds(0, 10))).extracting("uuid")
                .containsOnly("UUID1");
        assertThat(underTest.countByQuery(db.getSession(), query)).isEqualTo(1);

        // search by both dates
        query = new CeActivityQuery().setMinSubmittedAt(1_400_000_000_000L).setMaxExecutedAt(1_475_000_000_000L);
        assertThat(underTest.selectByQuery(db.getSession(), query, new RowBounds(0, 10))).extracting("uuid")
                .containsOnly("UUID1");
        assertThat(underTest.countByQuery(db.getSession(), query)).isEqualTo(1);

    }

    private void insertWithDates(String uuid, long submittedAt, long executedAt) {
        CeQueueDto queueDto = new CeQueueDto();
        queueDto.setUuid(uuid);
        queueDto.setTaskType("fake");
        CeActivityDto dto = new CeActivityDto(queueDto);
        dto.setStatus(CeActivityDto.Status.SUCCESS);
        dto.setSubmittedAt(submittedAt);
        dto.setExecutedAt(executedAt);
        underTest.insert(db.getSession(), dto);
    }

    @Test
    public void selectOlderThan() {
        insertWithCreationDate("TASK_1", 1_450_000_000_000L);
        insertWithCreationDate("TASK_2", 1_460_000_000_000L);
        insertWithCreationDate("TASK_3", 1_470_000_000_000L);

        List<CeActivityDto> dtos = underTest.selectOlderThan(db.getSession(), 1_465_000_000_000L);
        assertThat(dtos).extracting("uuid").containsOnly("TASK_1", "TASK_2");
    }

    @Test
    public void deleteByUuid() {
        insert("TASK_1", "REPORT", "COMPONENT1", CeActivityDto.Status.SUCCESS);
        insert("TASK_2", "REPORT", "COMPONENT1", CeActivityDto.Status.SUCCESS);

        underTest.deleteByUuid(db.getSession(), "TASK_1");
        assertThat(underTest.selectByUuid(db.getSession(), "TASK_1").isPresent()).isFalse();
        assertThat(underTest.selectByUuid(db.getSession(), "TASK_2").isPresent()).isTrue();
    }

    @Test
    public void deleteByUuid_does_nothing_if_uuid_does_not_exist() {
        insert("TASK_1", "REPORT", "COMPONENT1", CeActivityDto.Status.SUCCESS);

        // must not fail
        underTest.deleteByUuid(db.getSession(), "TASK_2");

        assertThat(underTest.selectByUuid(db.getSession(), "TASK_1").isPresent()).isTrue();
    }

    private void insert(String uuid, String type, String componentUuid, CeActivityDto.Status status) {
        CeQueueDto queueDto = new CeQueueDto();
        queueDto.setUuid(uuid);
        queueDto.setTaskType(type);
        queueDto.setComponentUuid(componentUuid);
        queueDto.setSubmitterLogin("henri");
        queueDto.setCreatedAt(1_300_000_000_000L);

        CeActivityDto dto = new CeActivityDto(queueDto);
        dto.setStatus(status);
        dto.setStartedAt(1_500_000_000_000L);
        dto.setExecutedAt(1_500_000_000_500L);
        dto.setExecutionTimeMs(500L);
        dto.setSnapshotId(123_456L);
        underTest.insert(db.getSession(), dto);
    }

    private void insertWithCreationDate(String uuid, long date) {
        CeQueueDto queueDto = new CeQueueDto();
        queueDto.setUuid(uuid);
        queueDto.setTaskType("fake");

        CeActivityDto dto = new CeActivityDto(queueDto);
        dto.setStatus(CeActivityDto.Status.SUCCESS);
        system2.setNow(date);
        underTest.insert(db.getSession(), dto);
    }
}