Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
ca4ea6d
server.tests: Use TSP client in TraceManagerServiceTest
bhufmann Sep 15, 2025
df6112f
server.tests: Use TSP client in ExperimentManagerServiceTest
bhufmann Sep 17, 2025
89ec042
server.tests: Use TSP client in DataProviderServiceTest
bhufmann Sep 19, 2025
b24c567
server.tests: Use TSP client in DataTreeDataProviderServiceTest
bhufmann Sep 19, 2025
cabb496
server.tests: Use TSP client in XyDataProviderServiceTest
bhufmann Sep 23, 2025
f086788
server.tests: Use TSP client in TimeGraphDataProviderServiceTest
bhufmann Sep 30, 2025
b0df22e
server.tests: Use TSP client in ConfigurationManagerServiceTest
bhufmann Oct 6, 2025
5258a11
server.tests: Use TSP client in TableDataProviderServiceTest
bhufmann Oct 7, 2025
3c52d70
server.tests: Use TSP client in BookmarkManagerServiceTest
bhufmann Oct 7, 2025
d13cdfd
server.tests: Use TSP client in HealthServiceTest
bhufmann Oct 7, 2025
784d662
server.tests: Use TSP client in IdentifierServiceTest
bhufmann Oct 7, 2025
9a5eab1
server.tests: Use TSP client in DataProviderConfigurationServiceTest
bhufmann Oct 7, 2025
d4feba7
server.tests: Use TSP client in GenericXYDataProviderServiceTest
bhufmann Oct 7, 2025
b0bc25a
server.tests: Use TSP client in OutputElementStyleSerializerTest
bhufmann Oct 8, 2025
447b07b
server.tests: Use TSP client in SeriesModelSerializerTest
bhufmann Oct 8, 2025
8acc2db
server.tess: Move NewRestServerTests back to RestServerTests
bhufmann Oct 8, 2025
9a56e16
server.tests: Remove all unused, handwritten TSP model stubs
bhufmann Oct 8, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,14 @@
import static org.junit.Assert.assertTrue;

import java.util.List;
import java.util.Set;

import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;

import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.services.DataProviderService;
import org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.stubs.DataProviderDescriptorStub;
import org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.stubs.ExperimentModelStub;
import org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.stubs.MarkerSetStub;
import org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.stubs.MarkerSetsOutputResponseStub;
import org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.utils.RestServerTest;
import org.eclipse.tracecompass.incubator.tsp.client.core.ApiException;
import org.eclipse.tracecompass.incubator.tsp.client.core.model.DataProvider;
import org.eclipse.tracecompass.incubator.tsp.client.core.model.Experiment;
import org.eclipse.tracecompass.incubator.tsp.client.core.model.MarkerSet;
import org.eclipse.tracecompass.incubator.tsp.client.core.model.MarkerSetsResponse;
import org.junit.Test;

/**
Expand All @@ -37,38 +34,35 @@
* @author Geneviève Bastien
* @author Bernd Hufmann
*/
@SuppressWarnings("null")
public class DataProviderServiceTest extends RestServerTest {

/**
* Test getting the data provider descriptors
*
* @throws ApiException
* if such exception occurs
*/
@Test
public void testProviders() {
ExperimentModelStub exp = assertPostExperiment(sfContextSwitchesUstNotInitializedStub.getName(), sfContextSwitchesUstNotInitializedStub);
public void testProviders() throws ApiException {
Experiment exp = assertPostExperiment(sfContextSwitchesUstNotInitializedStub.getName(), sfContextSwitchesUstNotInitializedStub);

WebTarget experiments = getApplicationEndpoint().path(EXPERIMENTS);
WebTarget providers = experiments.path(exp.getUUID().toString())
.path(OUTPUTS_PATH);

Set<DataProviderDescriptorStub> descriptors = getDataProviderDescriptors(providers);
for (DataProviderDescriptorStub desc : sfExpectedDataProviderDescriptorStub) {
List<DataProvider> descriptors = getDataProviderDescriptors(exp.getUUID());
for (DataProvider desc : sfExpectedDataProviderDescriptorStub) {
assertTrue(desc.getName(), descriptors.contains(desc));
}
}

/**
* Test getting a single data provider descriptor
*
* @throws ApiException
* if such exception occurs
*/
@Test
public void testProvider() {
ExperimentModelStub exp = assertPostExperiment(sfContextSwitchesUstNotInitializedStub.getName(), sfContextSwitchesUstNotInitializedStub);
public void testProvider() throws ApiException {
Experiment exp = assertPostExperiment(sfContextSwitchesUstNotInitializedStub.getName(), sfContextSwitchesUstNotInitializedStub);

WebTarget experiments = getApplicationEndpoint().path(EXPERIMENTS);
WebTarget provider = experiments.path(exp.getUUID().toString())
.path(OUTPUTS_PATH).path(CALL_STACK_DATAPROVIDER_ID);

DataProviderDescriptorStub descriptor = provider.request(MediaType.APPLICATION_JSON).get(DataProviderDescriptorStub.class);
DataProvider descriptor = sfExpApi.getProvider(exp.getUUID(), CALL_STACK_DATAPROVIDER_ID);
assertNotNull(descriptor);

assertEquals(EXPECTED_CALLSTACK_PROVIDER_DESCRIPTOR, descriptor);
Expand All @@ -79,14 +73,16 @@ public void testProvider() {
*
* Note: For this test a marker set extension is defined in the plugin.xml
* of this test plug-in.
*
* @throws ApiException
* if such exception occurs
*/
@Test
public void testGetMarkerSets() {
ExperimentModelStub exp = assertPostExperiment(sfContextSwitchesUstNotInitializedStub.getName(), sfContextSwitchesUstNotInitializedStub);

MarkerSetsOutputResponseStub outputResponseStub = getMarkerSetsEndpoint(exp.getUUID().toString()).request(MediaType.APPLICATION_JSON).get(MarkerSetsOutputResponseStub.class);
public void testGetMarkerSets() throws ApiException {
Experiment exp = assertPostExperiment(sfContextSwitchesUstNotInitializedStub.getName(), sfContextSwitchesUstNotInitializedStub);
MarkerSetsResponse outputResponseStub = sfAnnotationApi.getMarkerSets(exp.getUUID());
assertNotNull(outputResponseStub);
List<MarkerSetStub> markerSets = outputResponseStub.getModel();
List<MarkerSet> markerSets = outputResponseStub.getModel();
assertFalse(markerSets.isEmpty());
assertEquals("Example", markerSets.get(0).getName());
assertEquals("example.id", markerSets.get(0).getId());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,92 +17,87 @@
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;

import javax.ws.rs.ProcessingException;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Response;

import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.model.views.QueryParameters;
import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.services.DataProviderService;
import org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.stubs.EntryHeaderStub;
import org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.stubs.EntryModelStub;
import org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.stubs.EntryStub;
import org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.stubs.ExperimentModelStub;
import org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.stubs.TreeOutputResponseStub;
import org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.utils.RestServerTest;
import org.eclipse.tracecompass.incubator.tsp.client.core.ApiException;
import org.eclipse.tracecompass.incubator.tsp.client.core.api.DataTreeApi;
import org.eclipse.tracecompass.incubator.tsp.client.core.model.DataTreeEntry;
import org.eclipse.tracecompass.incubator.tsp.client.core.model.DataTreeEntryModel;
import org.eclipse.tracecompass.incubator.tsp.client.core.model.DataTreeResponse;
import org.eclipse.tracecompass.incubator.tsp.client.core.model.Experiment;
import org.eclipse.tracecompass.incubator.tsp.client.core.model.TimeRange;
import org.eclipse.tracecompass.incubator.tsp.client.core.model.TreeColumnHeader;
import org.eclipse.tracecompass.incubator.tsp.client.core.model.TreeParameters;
import org.eclipse.tracecompass.incubator.tsp.client.core.model.TreeQueryParameters;
import org.junit.Test;

import com.google.common.collect.ImmutableMap;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;

/**
* Test the {@link DataProviderService} with focus on the data tree endpoint
*
* @author Bernd Hufmann
*/
@SuppressWarnings("null")
public class DataTreeDataProviderServiceTest extends RestServerTest {
private static final String DATA_PROVIDER_RESPONSE_FAILED_MSG = "There should be a positive response for the data provider";
private static final String MODEL_NULL_MSG = "The model is null, maybe the analysis did not run long enough?";
private static final int MAX_ITER = 40;
private static final String STATISTICS_DATAPROVIDER_ID = "org.eclipse.tracecompass.analysis.timing.core.segmentstore.SegmentStoreStatisticsDataProvider:org.eclipse.linuxtools.lttng2.ust.analysis.callstack";
private static final String REQUESTED_TIMERANGE_KEY = "requested_timerange";
private static final String IS_FILTERED_KEY = "isFiltered";
private static final String START = "start";
private static final String END = "end";

private static final List<String> STATISTICS_TREE_HEADERS = List.of("Label", "Minimum", "Maximum", "Average", "Std Dev", "Count", "Total", "Min Time Range", "Max Time Range");
private static final List<String> SAMPLE_TOTAL_STATS_LABELS = List.of("ust", "1 ns", "5.979 s", "10.845 ms", "196.299 ms", "1948", "21.127 s", "[1450193745774189602,1450193745774189603]", "[1450193722283061910,1450193728261604656]");
private static final List<String> SAMPLE_SELECTION_STATS_LABELS = List.of("Selection", "49.665 µs", "5.979 s", "11.388 ms", "201.201 ms", "1854", "21.113 s", "[1450193730177271075,1450193730177320740]", "[1450193722283061910,1450193728261604656]");

/**
* Data provider API
*/
protected static DataTreeApi sfDataTreeApi = new DataTreeApi(sfApiClient);

/**
* Ensure that a data tree data provider exists and returns correct data.
* It does not test the data itself, simply that the serialized fields are
* the expected ones.
*
* @throws InterruptedException
* Exception thrown while waiting to execute again
* @throws ApiException
* if such exception occurs
*/
@Test
public void testDataTreeDataProvider() throws InterruptedException {
public void testDataTreeDataProvider() throws InterruptedException, ApiException {
long start = 1450193697034689597L;
long end = 1450193745774189602L;
try {
ExperimentModelStub exp = assertPostExperiment(sfContextSwitchesUstNotInitializedStub.getName(), sfContextSwitchesUstNotInitializedStub);
Experiment exp = assertPostExperiment(sfContextSwitchesUstNotInitializedStub.getName(), sfContextSwitchesUstNotInitializedStub);

// Test getting the time graph tree
WebTarget dataTree = getDataTreeEndpoint(exp.getUUID().toString(), STATISTICS_DATAPROVIDER_ID);

Map<String, Object> parameters = new HashMap<>();
parameters.put(REQUESTED_TIMERANGE_KEY, ImmutableMap.of(START, start, END, end));
EntryModelStub model = getDataTreeEntryModel(dataTree, parameters);
List<EntryStub> totalEntries = model.getEntries();
List<DataTreeEntry> totalEntries = getDataTreeEntryModel(exp.getUUID(), STATISTICS_DATAPROVIDER_ID, start, end, false);

List<String> sampleLabels = totalEntries.get(0).getLabels();
for(String sample : SAMPLE_TOTAL_STATS_LABELS) {
assertTrue(sampleLabels.contains(sample));
}

// Query selection time range
// Query selection time range (total and appended selection stats)
end = end - 100000000L;
parameters.put(REQUESTED_TIMERANGE_KEY, ImmutableMap.of(START, start, END, end));
parameters.put(IS_FILTERED_KEY, true);
model = getDataTreeEntryModel(dataTree, parameters);
List<EntryStub> selectionRangeEntries = model.getEntries();
List<DataTreeEntry> selectionRangeEntries = getDataTreeEntryModel(exp.getUUID(), STATISTICS_DATAPROVIDER_ID, start, end, true);
assertFalse(selectionRangeEntries.isEmpty());
// the result model contains total and selection statistics
assertTrue(selectionRangeEntries.size() > totalEntries.size());

sampleLabels = selectionRangeEntries.get(totalEntries.size()).getLabels();
for(String sample : SAMPLE_SELECTION_STATS_LABELS) {
assertEquals(SAMPLE_SELECTION_STATS_LABELS, sampleLabels);
for (String sample : SAMPLE_SELECTION_STATS_LABELS) {
assertTrue(sampleLabels.contains(sample));
}

} catch (ProcessingException e) {
// The failure from this exception alone is not helpful. Use the
// suppressed exception's message be the failure message for more
Expand All @@ -111,35 +106,85 @@ public void testDataTreeDataProvider() throws InterruptedException {
}
}

private static EntryModelStub getDataTreeEntryModel(WebTarget dataTree, Map<String, Object> parameters) throws InterruptedException {
TreeOutputResponseStub responseModel;
Response treeResponse = dataTree.request().post(Entity.json(new QueryParameters(parameters, Collections.emptyList())));
assertEquals(DATA_PROVIDER_RESPONSE_FAILED_MSG, 200, treeResponse.getStatus());
responseModel = treeResponse.readEntity(TreeOutputResponseStub.class);
assertNotNull(responseModel);
treeResponse.close();
private static List<DataTreeEntry> getDataTreeEntryModel(UUID uuid, String id, long start, long end, boolean isFiltered) throws InterruptedException, ApiException {
TreeParameters params = new TreeParameters();
if (isFiltered) {
params = new FilteredTreeParameter();
((FilteredTreeParameter) params).isFiltered(isFiltered);
}
params.requestedTimerange(new TimeRange().start(start).end(end));
TreeQueryParameters queryParams = new TreeQueryParameters().parameters(params);

DataTreeResponse treeResponse = sfDataTreeApi.getDataTree(uuid, id, queryParams);
assertTrue(DATA_PROVIDER_RESPONSE_FAILED_MSG, !treeResponse.getStatus().equals(DataTreeResponse.StatusEnum.FAILED));
DataTreeEntryModel responseModel = treeResponse.getModel();

// Make sure the analysis ran enough and we have a model
int iteration = 0;
while ((responseModel.isRunning() || responseModel.getModel() == null) && iteration < MAX_ITER) {
while ((treeResponse.getStatus().equals(DataTreeResponse.StatusEnum.RUNNING)) || (responseModel == null) && (iteration < MAX_ITER)) {
Thread.sleep(100);
treeResponse = dataTree.request().post(Entity.json(new QueryParameters(parameters, Collections.emptyList())));
assertEquals(DATA_PROVIDER_RESPONSE_FAILED_MSG, 200, treeResponse.getStatus());
responseModel = treeResponse.readEntity(TreeOutputResponseStub.class);
treeResponse = sfDataTreeApi.getDataTree(uuid, id, queryParams);
assertTrue(DATA_PROVIDER_RESPONSE_FAILED_MSG, !treeResponse.getStatus().equals(DataTreeResponse.StatusEnum.FAILED));
responseModel = treeResponse.getModel();
assertNotNull(responseModel);
iteration++;
treeResponse.close();
}

EntryModelStub model = responseModel.getModel();
assertNotNull(responseModel);
List<DataTreeEntry> model = responseModel.getEntries();
assertNotNull(MODEL_NULL_MSG + responseModel, model);
List<EntryStub> totalEntries = model.getEntries();
assertFalse(totalEntries.isEmpty());

List<String> headerLabels = model.getHeaders().stream().map(EntryHeaderStub::getName).collect(Collectors.toList());
List<TreeColumnHeader> headers = responseModel.getHeaders();
assertNotNull(headers);

List<String> headerLabels = headers.stream().map(TreeColumnHeader::getName).collect(Collectors.toList());
for(String header : STATISTICS_TREE_HEADERS) {
assertTrue(headerLabels.contains(header));
}
return model;
}

// FIXME: isFiltered should be part of the TSP
private static class FilteredTreeParameter extends TreeParameters {
private boolean isFiltered;
public FilteredTreeParameter isFiltered(boolean flag) {
this.isFiltered = flag;
return this;
}
/**
* Get isFiltered flag
* @return isFiltered
*/
@JsonProperty(IS_FILTERED_KEY)
@JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
public boolean isFiltered() {
return isFiltered;
}

@JsonProperty(IS_FILTERED_KEY)
@JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
public void setFiltered(boolean isFiltered) {
this.isFiltered = isFiltered;
}

@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}

FilteredTreeParameter treeParameters = (FilteredTreeParameter) o;
return super.equals(o) && isFiltered == treeParameters.isFiltered;
}

@Override
public int hashCode() {
int result = super.hashCode();
result = 31 * result + Boolean.hashCode(isFiltered);
return result;
}
}
}
Loading
Loading