blob: ac7756c87275ecb84e5d3016198f3ad4a24e26c3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 Nokia and others.
* 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
*
* Contributors:
* Nokia - Initial API and implementation. Jun 9, 2011
* Broadcom - Fix name "OpaquePtr_Resolution.dsa" for any case-sensitive OS
*******************************************************************************/
package org.eclipse.cdt.debug.edc.debugger.tests;
import org.eclipse.cdt.debug.edc.internal.services.dsf.Symbols;
import org.eclipse.cdt.debug.edc.internal.symbols.ICompositeType;
import org.eclipse.cdt.debug.edc.internal.symbols.PointerType;
import org.eclipse.cdt.debug.edc.internal.symbols.TypedefType;
import org.eclipse.cdt.debug.edc.services.IEDCExpression;
import org.eclipse.cdt.debug.edc.symbols.IType;
import org.eclipse.cdt.debug.edc.tests.TestUtils;
import org.eclipse.cdt.dsf.datamodel.DMContexts;
import org.eclipse.cdt.dsf.debug.service.IModules.ISymbolDMContext;
import org.junit.Assert;
import org.junit.Test;
/**
* Tests the opaque type resolution.
*/
public class OpaqueTypeResolving extends SimpleDebuggerTest {
@Override
public String getAlbumName() {
// This EDC Snapshot album is based on a CPP project that has opaque pointer.
// Please unzip the .dsa file and look into the resources folder for the source
// files of the project.
return "OpaquePtr_Resolution.dsa";
}
@Test
public void testOpaqueTypeResolving() throws Exception {
// An opaque type that's defined somewhere else. We can resolve it.
//
// typedef struct PrivateStruct* PrivatePTR;
// PrivatePTR opaque_ptr = 0;
//
// At this point, debug session from the snapshot is stopped at
// a the end of the executable.
IEDCExpression exprVal = TestUtils.getExpressionDMC(session, frame, "opaque_ptr");
IType type = exprVal.getEvaluatedType();
// First ensure if the original type of the var is an opaque type.
//
Assert.assertTrue(type instanceof TypedefType);
type = type.getType(); // de-typedef
Assert.assertTrue(type instanceof PointerType);
type = type.getType(); // de-reference
Assert.assertTrue(type instanceof ICompositeType);
Assert.assertTrue(((ICompositeType)type).isOpaque());
Assert.assertTrue("Type is not opaque type.", type.getByteSize() == 0);
// Now resolve the opaque type
//
Symbols symService = TestUtils.getService(session, Symbols.class);
ISymbolDMContext symCtx = DMContexts.getAncestorOfType(exprVal, ISymbolDMContext.class);
ICompositeType defined = symService.resolveOpaqueType(symCtx, (ICompositeType) type);
Assert.assertFalse(defined.isOpaque());
Assert.assertEquals(type.getName(), defined.getName());
// Resolve one that's not an opaque type, fail.
type = symService.resolveOpaqueType(symCtx, defined);
Assert.assertNull(type);
}
@Test
public void testOpaqueTypeNeverDefined() throws Exception {
// An opaque type that's never defined anywhere. We can resolve it.
//
// typedef struct UndefinedStruct* UndefinedPTR;
// UndefinedPTR opaque_ptr_to_undefined;
//
// At this point, debug session from the snapshot is stopped at
// a the end of the executable.
IEDCExpression exprVal = TestUtils.getExpressionDMC(session, frame, "opaque_ptr_to_undefined");
IType type = exprVal.getEvaluatedType();
// First ensure if the original type of the var is an opaque type.
//
Assert.assertTrue(type instanceof TypedefType);
type = type.getType(); // de-typedef
Assert.assertTrue(type instanceof PointerType);
type = type.getType(); // de-reference
Assert.assertTrue(type instanceof ICompositeType);
Assert.assertTrue(((ICompositeType)type).isOpaque());
Assert.assertTrue("Type is not opaque type.", type.getByteSize() == 0);
// Now try to resolve the opaque type, should fail
//
Symbols symService = TestUtils.getService(session, Symbols.class);
ISymbolDMContext symCtx = DMContexts.getAncestorOfType(exprVal, ISymbolDMContext.class);
ICompositeType defined = symService.resolveOpaqueType(symCtx, (ICompositeType) type);
Assert.assertNull(defined);
}
}