/*******************************************************************************
 *  Copyright (c) 2000, 2015 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.debug.tests.performance;

import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.model.IValue;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.IDebugModelPresentation;
import org.eclipse.debug.ui.IValueDetailListener;
import org.eclipse.jdt.debug.core.IJavaStackFrame;
import org.eclipse.jdt.debug.core.IJavaThread;
import org.eclipse.jdt.debug.core.IJavaVariable;
import org.eclipse.jdt.debug.tests.AbstractDebugPerformanceTest;
import org.eclipse.test.performance.Dimension;

/**
 * Tests performance of conditional breakpoints.
 */
public class PerfVariableDetailTests extends AbstractDebugPerformanceTest implements IValueDetailListener {

    private Object fLock = new Object();
    
    /**
     * Constructor
     * @param name
     */
    public PerfVariableDetailTests(String name) {
        super(name);
    }

    /**
     * @see org.eclipse.debug.ui.IValueDetailListener#detailComputed(org.eclipse.debug.core.model.IValue, java.lang.String)
     */
    @Override
	public void detailComputed(IValue value, String result) {
    	synchronized (fLock) {
    		fLock.notifyAll();
		}
	}
    
    /**
     * Tests the performance of calculating the 'toString' method 
     * @throws Exception
     */
    public void testToStringDetails() throws Exception {
        // just in case
    	tagAsSummary("Computing variable toString() details iteratively", Dimension.ELAPSED_PROCESS);
        removeAllBreakpoints();
        String typeName = "VariableDetails";
        createLineBreakpoint(24, typeName);
        IJavaThread thread = null;
        try {
        	ILaunchConfiguration configuration = getLaunchConfiguration(typeName);
        	thread = launchToBreakpoint(configuration, false);
        	IJavaStackFrame frame = (IJavaStackFrame) thread.getTopStackFrame();
        	assertNotNull("Missing top stack frame", frame);
        	IJavaVariable variable = frame.findVariable("v");
        	assertNotNull("Missing variable 'v'", variable);
        	IDebugModelPresentation presentation = DebugUITools.newDebugModelPresentation("org.eclipse.jdt.debug");
        	IValue value = variable.getValue();
        	
        	// warm up
        	for (int i = 0; i < 100; i++) {
        		synchronized (fLock) {
        			presentation.computeDetail(value, this);
        			fLock.wait(30000);
        		}
        	}
        	
        	// test
        	for (int i = 0; i < 300; i++) {
        		startMeasuring();
        		for (int j = 0; j < 150; j++) {
	        		synchronized (fLock) {
	        			presentation.computeDetail(value, this);
	        			fLock.wait(30000);
	        		}
        		}
        		stopMeasuring();
        	}
        	
        	commitMeasurements();
        	assertPerformance();
        	
        } finally {
        	removeAllBreakpoints();
        	terminateAndRemove(thread);
        }
    }
}
