/*
* Copyright 2011-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.glowroot.agent.embedded.repo;
import java.io.File;
import com.google.common.base.Ticker;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.glowroot.agent.collector.Collector.TraceReader;
import org.glowroot.agent.embedded.util.CappedDatabase;
import org.glowroot.agent.embedded.util.DataSource;
import org.glowroot.common.live.ImmutableTracePointFilter;
import org.glowroot.common.live.LiveTraceRepository.TracePoint;
import org.glowroot.common.live.LiveTraceRepository.TracePointFilter;
import org.glowroot.common.live.StringComparator;
import org.glowroot.common.model.Result;
import org.glowroot.common.repo.ImmutableTraceQuery;
import org.glowroot.common.repo.TraceRepository.TraceQuery;
import org.glowroot.wire.api.model.TraceOuterClass.Trace;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
// NOTE this is mostly a copy of TraceDaoIT.java in glowroot-central
//
// this is not an integration test (*IT.java) since then it would run against shaded agent and fail
// due to shading issues
public class TraceDaoTest {
private static final String AGENT_ROLLUP = "";
private static final String AGENT_ID = "";
private DataSource dataSource;
private File cappedFile;
private CappedDatabase cappedDatabase;
private TraceDao traceDao;
@Before
public void beforeEachTest() throws Exception {
dataSource = new DataSource();
if (dataSource.tableExists("trace")) {
dataSource.execute("drop table trace");
}
cappedFile = File.createTempFile("glowroot-test-", ".capped.db");
cappedDatabase = new CappedDatabase(cappedFile, 1000000, Ticker.systemTicker());
traceDao = new TraceDao(dataSource, cappedDatabase, mock(TransactionTypeDao.class),
mock(FullQueryTextDao.class), mock(TraceAttributeNameDao.class));
}
@After
public void afterEachTest() throws Exception {
dataSource.close();
cappedDatabase.close();
cappedFile.delete();
}
@Test
public void shouldReadTrace() throws Exception {
// given
Trace.Header header = TraceTestData.createTraceHeader();
traceDao.store(TraceTestData.createTraceReader(header));
TraceQuery query = ImmutableTraceQuery.builder()
.transactionType("unit test")
.from(0)
.to(100)
.build();
TracePointFilter filter = ImmutableTracePointFilter.builder().build();
Result<TracePoint> queryResult = traceDao.readSlowPoints(AGENT_ROLLUP, query, filter, 1);
// when
Trace.Header header2 = traceDao
.readHeaderPlus(AGENT_ROLLUP, AGENT_ID, queryResult.records().get(0).traceId())
.header();
// then
assertThat(header2.getPartial()).isEqualTo(header.getPartial());
assertThat(header2.getStartTime()).isEqualTo(header.getStartTime());
assertThat(header2.getCaptureTime()).isEqualTo(header.getCaptureTime());
assertThat(header2.getDurationNanos()).isEqualTo(header.getDurationNanos());
assertThat(header2.getHeadline()).isEqualTo("test headline");
assertThat(header2.getUser()).isEqualTo(header.getUser());
}
@Test
public void shouldReadTraceWithAttributeQualifier() throws Exception {
// given
traceDao.store(TraceTestData.createTraceReader());
TraceQuery query = ImmutableTraceQuery.builder()
.transactionType("unit test")
.from(0)
.to(100)
.build();
TracePointFilter filter = ImmutableTracePointFilter.builder()
.attributeName("abc")
.attributeValueComparator(StringComparator.EQUALS)
.attributeValue("xyz")
.build();
// when
Result<TracePoint> queryResult = traceDao.readSlowPoints(AGENT_ROLLUP, query, filter, 1);
// then
assertThat(queryResult.records()).hasSize(1);
}
@Test
public void shouldReadTraceWithAttributeQualifier2() throws Exception {
// given
traceDao.store(TraceTestData.createTraceReader());
TraceQuery query = ImmutableTraceQuery.builder()
.transactionType("unit test")
.from(0)
.to(100)
.build();
TracePointFilter filter = ImmutableTracePointFilter.builder()
.attributeName("abc")
.attributeValueComparator(null)
.attributeValue(null)
.build();
// when
Result<TracePoint> queryResult = traceDao.readSlowPoints(AGENT_ROLLUP, query, filter, 1);
// then
assertThat(queryResult.records()).hasSize(1);
}
@Test
public void shouldReadTraceWithAttributeQualifier3() throws Exception {
// given
traceDao.store(TraceTestData.createTraceReader());
TraceQuery query = ImmutableTraceQuery.builder()
.transactionType("unit test")
.from(0)
.to(100)
.build();
TracePointFilter filter = ImmutableTracePointFilter.builder()
.attributeName(null)
.attributeValueComparator(StringComparator.EQUALS)
.attributeValue("xyz")
.build();
// when
Result<TracePoint> queryResult = traceDao.readSlowPoints(AGENT_ROLLUP, query, filter, 1);
// then
assertThat(queryResult.records()).hasSize(1);
}
@Test
public void shouldNotReadTraceWithNonMatchingAttributeQualifier() throws Exception {
// given
traceDao.store(TraceTestData.createTraceReader());
TraceQuery query = ImmutableTraceQuery.builder()
.transactionType("unit test")
.from(0)
.to(100)
.build();
TracePointFilter filter = ImmutableTracePointFilter.builder()
.attributeName("abc")
.attributeValueComparator(StringComparator.EQUALS)
.attributeValue("abc")
.build();
// when
Result<TracePoint> queryResult = traceDao.readSlowPoints(AGENT_ROLLUP, query, filter, 1);
// then
assertThat(queryResult.records()).isEmpty();
}
@Test
public void shouldNotReadTraceWithNonMatchingAttributeQualifier2() throws Exception {
// given
traceDao.store(TraceTestData.createTraceReader());
TraceQuery query = ImmutableTraceQuery.builder()
.transactionType("unit test")
.from(0)
.to(100)
.build();
TracePointFilter filter = ImmutableTracePointFilter.builder()
.attributeName(null)
.attributeValueComparator(StringComparator.EQUALS)
.attributeValue("xyz1")
.build();
// when
Result<TracePoint> queryResult = traceDao.readSlowPoints(AGENT_ROLLUP, query, filter, 1);
// then
assertThat(queryResult.records()).isEmpty();
}
@Test
public void shouldDeletedTrace() throws Exception {
// given
TraceReader traceReader = TraceTestData.createTraceReader();
traceDao.store(traceReader);
// when
traceDao.deleteBefore(100);
// then
assertThat(traceDao.readHeaderPlus(AGENT_ROLLUP, AGENT_ID, traceReader.traceId())).isNull();
}
}