Automated coverage-driven testing: combining symbolic execution and model checking