All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.evosuite.testcase.localsearch.AVMTestCaseLocalSearch Maven / Gradle / Ivy

/**
 * Copyright (C) 2010-2018 Gordon Fraser, Andrea Arcuri and EvoSuite
 * contributors
 *
 * This file is part of EvoSuite.
 *
 * EvoSuite is free software: you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published
 * by the Free Software Foundation, either version 3.0 of the License, or
 * (at your option) any later version.
 *
 * EvoSuite is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with EvoSuite. If not, see .
 */
package org.evosuite.testcase.localsearch;

import java.util.HashSet;
import java.util.Set;

import org.evosuite.Properties;
import org.evosuite.ga.localsearch.LocalSearchBudget;
import org.evosuite.ga.localsearch.LocalSearchObjective;
import org.evosuite.testcase.TestCase;
import org.evosuite.testcase.TestChromosome;
import org.evosuite.testcase.statements.Statement;

/**
 * Applies the AVM local search algorithm described in
 * http://dx.doi.org/10.1016/j.jss.2014.05.032 at the test case level
 * 
 * @author galeotti
 *
 */
public class AVMTestCaseLocalSearch extends TestCaseLocalSearch {

	@Override
	public boolean doSearch(TestChromosome individual, LocalSearchObjective objective) {

		logger.info("Test before local search: " + individual.getTestCase().toCode());

		boolean improved = false;

		// Only apply local search up to the point where an exception was thrown
		// TODO: Check whether this conflicts with test expansion
		int lastPosition = individual.size() - 1;
		if (individual.getLastExecutionResult() != null && !individual.isChanged()) {
			Integer lastPos = individual.getLastExecutionResult().getFirstPositionOfThrownException();
			if (lastPos != null)
				lastPosition = lastPos.intValue();
		}
		TestCase test = individual.getTestCase();

		// We count down to make the code work when lines are
		// added during the search (see NullReferenceSearch).

		for (int i = lastPosition; i >= 0; i--) {
			if (LocalSearchBudget.getInstance().isFinished())
				break;

			if (objective.isDone()) {
				break;
			}

			if (i >= individual.size()) {
				logger.warn("Test size decreased unexpectedly during local search, aborting local search");
				logger.warn(individual.getTestCase().toCode());
				break;
			}
			final Class targetClass = Properties.getTargetClassAndDontInitialise();

			final Statement statement = test.getStatement(i);

			if (!test.hasReferences(statement.getReturnValue()) && !statement.getReturnClass().equals(targetClass)) {
				logger.info(
						"Return value of statement " + i + " is not referenced and not SUT, not doing local search");
				continue;
			}

			StatementLocalSearch search = StatementLocalSearch.getLocalSearchFor(statement);
			if (search != null) {
				logger.info("Applying local search of type " + search.getClass() + " to statement " + statement + " / "
						+ individual.getTestCase().getStatement(i));
				if (search.doSearch(individual, i, (LocalSearchObjective) objective)) {
					improved = true;
				}
				// i = s.getPosition();
				logger.debug("Old position was: " + i + ", adjusting to: " + (i + search.getPositionDelta()));
				i += search.getPositionDelta();
				test = individual.getTestCase();
			} else {
				/*
				 * No statement local search has been produced for this
				 * statement. Skipping.
				 */
				continue;
			}
		}

		LocalSearchBudget.getInstance().countLocalSearchOnTest();

		// logger.warn("Test after local search: " +
		// individual.getTestCase().toCode());

		// Return true iif search was successful
		return improved;

		// TODO: Handle arrays in local search
		// TODO: mutating an int might have an effect on array lengths
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy