| /******************************************************************************* |
| * Copyright (c) 2018, 2020 Ericsson |
| * |
| * All rights reserved. This program and the accompanying materials are |
| * made available under the terms of the Eclipse Public License 2.0 which |
| * accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| *******************************************************************************/ |
| |
| package org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.services; |
| |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertNotNull; |
| import static org.junit.Assert.assertTrue; |
| |
| import java.io.IOException; |
| import java.util.Collections; |
| |
| import javax.ws.rs.client.WebTarget; |
| import javax.ws.rs.core.Response; |
| |
| import org.eclipse.core.resources.IFolder; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.resources.IWorkspaceRoot; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.FileLocator; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.Path; |
| import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.services.TraceManagerService; |
| import org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.stubs.TraceModelStub; |
| import org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.utils.RestServerTest; |
| import org.eclipse.tracecompass.testtraces.ctf.CtfTestTrace; |
| import org.eclipse.tracecompass.tmf.core.TmfCommonConstants; |
| import org.eclipse.tracecompass.tmf.core.TmfProjectNature; |
| import org.eclipse.tracecompass.tmf.core.io.ResourceUtil; |
| import org.junit.Test; |
| |
| import com.google.common.collect.ImmutableSet; |
| |
| /** |
| * Test the {@link TraceManagerService} |
| * |
| * @author Loic Prieur-Drevon |
| */ |
| public class TraceManagerServiceTest extends RestServerTest { |
| |
| /** |
| * Test basic operations on the {@link TraceManagerService}. |
| */ |
| @Test |
| public void testWithOneTrace() { |
| WebTarget traces = getApplicationEndpoint().path(TRACES); |
| |
| assertTrue("Expected empty set of traces", getTraces(traces).isEmpty()); |
| |
| TraceModelStub kernelStub = assertPost(traces, CONTEXT_SWITCHES_KERNEL_STUB); |
| |
| assertEquals(CONTEXT_SWITCHES_KERNEL_STUB, traces.path(kernelStub.getUUID().toString()).request().get(TraceModelStub.class)); |
| |
| assertEquals("Expected set of traces to contain trace2 stub", |
| Collections.singleton(CONTEXT_SWITCHES_KERNEL_STUB), getTraces(traces)); |
| |
| Response deleteResponse = traces.path(kernelStub.getUUID().toString()).request().delete(); |
| int deleteCode = deleteResponse.getStatus(); |
| assertEquals("Failed to DELETE trace2, error code=" + deleteCode, 200, deleteCode); |
| assertEquals(CONTEXT_SWITCHES_KERNEL_STUB, deleteResponse.readEntity(TraceModelStub.class)); |
| |
| assertEquals("Trace should have been deleted", Collections.emptySet(), getTraces(traces)); |
| } |
| |
| /** |
| * Test the server with two traces, to eliminate the server trace manager bug |
| */ |
| @Test |
| public void testWithTwoTraces() { |
| WebTarget traces = getApplicationEndpoint().path(TRACES); |
| |
| assertPost(traces, CONTEXT_SWITCHES_KERNEL_STUB); |
| assertPost(traces, CONTEXT_SWITCHES_UST_STUB); |
| |
| assertEquals(ImmutableSet.of(CONTEXT_SWITCHES_KERNEL_STUB, CONTEXT_SWITCHES_UST_STUB), getTraces(traces)); |
| } |
| |
| /** |
| * Test conflicting traces |
| * @throws IOException Exception thrown by getting trace path |
| */ |
| @Test |
| public void testConflictingTraces() throws IOException { |
| WebTarget traces = getApplicationEndpoint().path(TRACES); |
| |
| assertPost(traces, CONTEXT_SWITCHES_KERNEL_STUB); |
| assertEquals(ImmutableSet.of(CONTEXT_SWITCHES_KERNEL_STUB), getTraces(traces)); |
| |
| // Post the trace a second time |
| assertPost(traces, CONTEXT_SWITCHES_KERNEL_STUB); |
| assertEquals(ImmutableSet.of(CONTEXT_SWITCHES_KERNEL_STUB), getTraces(traces)); |
| |
| // Post a trace with the same name but another path, the name does not |
| // matter if the path is different, the trace will be added |
| assertPost(traces, ARM_64_KERNEL_STUB); |
| assertEquals(ImmutableSet.of(CONTEXT_SWITCHES_KERNEL_STUB, ARM_64_KERNEL_STUB), getTraces(traces)); |
| } |
| |
| /** |
| * Test workspace structure for traces |
| * |
| * @throws CoreException |
| * when a CoreException occurs |
| * @throws IOException |
| * Exception thrown by getting trace path |
| */ |
| @Test |
| public void testWorkspaceStructure() throws CoreException, IOException { |
| WebTarget traces = getApplicationEndpoint().path(TRACES); |
| |
| assertPost(traces, CONTEXT_SWITCHES_KERNEL_STUB); |
| assertPost(traces, CONTEXT_SWITCHES_UST_STUB); |
| |
| IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); |
| |
| // Make sure that workspace is refreshed |
| root.refreshLocal(IResource.DEPTH_INFINITE, null); |
| |
| // Check for Tracing project with name "Tracing" |
| IProject tracingProject = root.getProject(TmfCommonConstants.DEFAULT_TRACE_PROJECT_NAME); |
| assertTrue(tracingProject.exists()); |
| assertTrue(tracingProject.isNatureEnabled(TmfProjectNature.ID)); |
| |
| IFolder tracesFolder = tracingProject.getFolder("Traces"); |
| assertTrue(tracesFolder.exists()); |
| |
| String contextSwitchesKernelPath = FileLocator.toFileURL(CtfTestTrace.CONTEXT_SWITCHES_KERNEL.getTraceURL()).getPath().replaceAll("/$", ""); |
| IPath path = Path.fromOSString(contextSwitchesKernelPath); |
| |
| // Check if trace parent folder was created |
| IFolder traceParent = tracesFolder.getFolder(path.removeLastSegments(1)); |
| assertTrue(traceParent.exists()); |
| |
| // Check for trace with name kernel under the trace parent directory |
| IFolder trace = traceParent.getFolder(CONTEXT_SWITCHES_KERNEL_NAME); |
| assertTrue(trace.exists()); |
| |
| // Make sure it's a symbolic link and not file copy |
| assertTrue(ResourceUtil.isSymbolicLink(trace)); |
| |
| // Verify that trace type is set as persistent property |
| String traceType = trace.getPersistentProperty(TmfCommonConstants.TRACETYPE); |
| assertNotNull(traceType); |
| |
| // Verify that the trace type is the kernel trace type |
| assertEquals("org.eclipse.linuxtools.lttng2.kernel.tracetype", traceType); |
| } |
| } |