| /******************************************************************************* |
| * Copyright (c) 2010, 2015 IBM Corporation and others. |
| * |
| * 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 |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.cdt.core.lrparser.tests; |
| |
| import org.eclipse.cdt.core.dom.ast.IASTCompletionNode; |
| import org.eclipse.cdt.core.dom.lrparser.gnu.GCCLanguage; |
| import org.eclipse.cdt.core.dom.lrparser.gnu.GPPLanguage; |
| import org.eclipse.cdt.core.model.ILanguage; |
| |
| import junit.framework.TestCase; |
| |
| public class AbstractLRHangingTest extends TestCase { |
| |
| public AbstractLRHangingTest() { |
| } |
| |
| public AbstractLRHangingTest(String name) { |
| super(name); |
| } |
| |
| protected ILanguage getCLanguage() { |
| return GCCLanguage.getDefault(); |
| } |
| |
| protected ILanguage getCPPLanguage() { |
| return GPPLanguage.getDefault(); |
| } |
| |
| protected void runThreadByLimitedTime(long limitTime, Thread testThread) throws Exception { |
| testThread.start(); |
| testThread.join(limitTime); |
| |
| if (testThread.isAlive()) { |
| testThread.interrupt(); |
| fail("timeout by " + limitTime / 1000 + " seconds"); //$NON-NLS-2$ |
| } else { |
| // Finished |
| } |
| } |
| |
| // 1mins |
| public static long THREAD_TIMEOUT_LIMIT = 1 * 60 * 1000; |
| public static String CONTENT_ASIST_CURSOR = " /*<ctrl-space>*/ "; |
| |
| private String errMsg = ""; |
| |
| public void resetErrMsg() { |
| errMsg = ""; |
| } |
| |
| public void setErrMsg(String errMsg) { |
| this.errMsg = errMsg; |
| } |
| |
| protected void runTestCase(final String code, final ILanguage language) throws Exception { |
| |
| Thread testThread = new Thread() { |
| |
| @Override |
| public void run() { |
| |
| String errMsg = ""; |
| resetErrMsg(); |
| String msg = null; |
| int offset = code.indexOf(CONTENT_ASIST_CURSOR); |
| int index = 0; |
| while (offset >= 0) { |
| |
| IASTCompletionNode node = null; |
| try { |
| node = ParseHelper.getCompletionNode(code, language, offset); |
| } catch (Exception e) { |
| if (errMsg.length() == 0) { |
| errMsg = "caught an exception when the code is parsed for cursor number " + index; |
| } else { |
| errMsg = errMsg + "\n" + "caught an exception when the code is parsed for cursor number " |
| + index; |
| } |
| |
| } |
| if (node == null) { |
| if (errMsg.length() == 0) { |
| errMsg = "return completion node is null when the code is parsed for cursor number " |
| + index; |
| } else { |
| errMsg = errMsg + "\n" |
| + "return completion node is null when the code is parsed for cursor number " |
| + index; |
| } |
| |
| } |
| offset = code.indexOf(CONTENT_ASIST_CURSOR, offset + 1); |
| index++; |
| } |
| setErrMsg(errMsg); |
| |
| } |
| |
| }; |
| |
| runThreadByLimitedTime(THREAD_TIMEOUT_LIMIT, testThread); |
| if (errMsg.length() > 0) { |
| //fail(errMsg); |
| } |
| |
| } |
| |
| } |