/*******************************************************************************
* Copyright (c) 2016 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v1.0 which
* accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*******************************************************************************/
package org.eclipse.tracecompass.lttng2.ust.core.tests.callstack;
import static org.junit.Assert.assertEquals;
import java.util.Collection;
import java.util.Set;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.tracecompass.internal.lttng2.ust.core.callstack.LttngUstCallStackAnalysisRequirement;
import org.eclipse.tracecompass.lttng2.ust.core.trace.LttngUstTrace;
import org.eclipse.tracecompass.lttng2.ust.core.trace.layout.ILttngUstEventLayout;
import org.eclipse.tracecompass.tmf.ctf.core.event.CtfTmfEventType;
import org.junit.AfterClass;
import org.junit.Test;
import com.google.common.collect.ImmutableSet;
/**
* Test the {@link LttngUstCallStackAnalysisRequirement} class
*
* @author Bernd Hufmann
*/
public class LTTngUstCallStackAnalysisRequirementTest {
private static final @NonNull String FUNC_EXIT_FAST = "lttng_ust_cyg_profile_fast:func_exit";
private static final @NonNull String FUNC_EXIT = "lttng_ust_cyg_profile:func_exit";
private static final @NonNull String FUNC_ENTRY_FAST = "lttng_ust_cyg_profile_fast:func_entry";
private static final @NonNull String FUNC_ENTRY = "lttng_ust_cyg_profile:func_entry";
private static final @NonNull String OTHER_EVENT = "OTHER";
private static final @NonNull String CONTEXT_VTID = "context._vtid";
private static final @NonNull String CONTEXT_PROCNAME = "context._procname";
private static final @NonNull String CONTEXT_OTHER = "context._other";
private static final @NonNull Collection<String> validFields = ImmutableSet.of(CONTEXT_VTID, CONTEXT_PROCNAME);
private static final @NonNull Collection<String> badFields = ImmutableSet.of(CONTEXT_OTHER, CONTEXT_PROCNAME);
enum EventType {
EVT_EXIT_FAST (FUNC_EXIT_FAST, validFields),
EVT_EXIT (FUNC_EXIT, validFields),
EVT_ENTRY_FAST (FUNC_ENTRY_FAST, validFields),
EVT_ENTRY (FUNC_ENTRY, validFields),
EVT_OTHER (OTHER_EVENT, validFields),
EVT_ENTRY_BAD_FIELDS (FUNC_ENTRY, badFields),
EVT_ENTRY_FAST_BAD_FIELDS (FUNC_ENTRY_FAST, badFields),
EVT_ENTRY_FAST_EMPTY_FIELDS (FUNC_ENTRY_FAST, ImmutableSet.of());
private final @NonNull CtfTmfEventType fType;
EventType(@NonNull String name, @NonNull Collection<String> fields) {
fType = new CtfTmfEventType(name, null) {
@Override
public String getName() {
return name;
}
@Override
public @NonNull Collection<String> getFieldNames() {
return fields;
}
};
}
@NonNull CtfTmfEventType getEventType() {
return fType;
}
}
enum TestData {
TRACE_WITH_VALID_EVENTS(EventType.EVT_ENTRY, EventType.EVT_EXIT, true),
TRACE_WITH_VALID_EVENTS_FAST(EventType.EVT_ENTRY_FAST, EventType.EVT_EXIT_FAST, true),
TRACE_WITH_VALID_EVENTS_MISSING_FIELDS(EventType.EVT_ENTRY_BAD_FIELDS,
EventType.EVT_EXIT, false),
TRACE_WITH_VALID_EVENTS_MISSING_FIELDS_FAST(EventType.EVT_ENTRY_FAST_BAD_FIELDS,
EventType.EVT_EXIT_FAST, false),
TRACE_WITH_VALID_EVENTS_WRONG_FIELDS(EventType.EVT_ENTRY_FAST_EMPTY_FIELDS,
EventType.EVT_EXIT_FAST, false),
TRACE_WITH_MISSING_EVENTS(EventType.EVT_OTHER,
EventType.EVT_EXIT_FAST, false),
TRACE_MISMATCH_EVENTS(EventType.EVT_ENTRY_FAST, EventType.EVT_EXIT, false);
private final @NonNull LttngUstTrace fTrace;
private final boolean fIsValid;
TestData(EventType first, EventType second, boolean isValid) {
fTrace = new LttngUstTrace() {
@Override
public Set<CtfTmfEventType> getContainedEventTypes() {
return ImmutableSet.of(first.getEventType(), second.getEventType());
}
};
fIsValid = isValid;
}
@NonNull LttngUstTrace getTrace() {
return fTrace;
}
boolean isValid() {
return fIsValid;
}
}
/**
* Clean up
*/
@AfterClass
public static void cleanup() {
for (TestData testData: TestData.values()) {
testData.getTrace().dispose();
}
}
/**
* Test Call Stack Analysis requirements
*/
@Test
public void testCallStackRequirements() {
LttngUstCallStackAnalysisRequirement req = new LttngUstCallStackAnalysisRequirement(ILttngUstEventLayout.DEFAULT_LAYOUT);
for (TestData item: TestData.values()) {
assertEquals(item.name(), item.isValid(), req.test(item.getTrace()));
}
}
}