def test_without_timeout(self):
        ev_ok = gevent.event.Event()
        def callbackOK(_, solver_result): ev_ok.set()
        def callbackError(_, uniq_query, err_desc): assert 0

        mock_solver = MockSolverAsync()
        solver = AsyncSolverWrapper(TimedSolverWrapper(SyncSolverWrapper(mock_solver), 9999))
        uniq_query = UniqueQuery(123, common.SAT_QUERY_SMT)
        solver.solve_async(uniq_query, callbackOK, callbackError)

        assert mock_solver.called.wait(1)

        mock_solver.raise_solved(SolverResult(uniq_query, False))
        assert ev_ok.wait(5)
    def test_timeout(self):
        ev_error = gevent.event.Event()
        def callbackOK(_, solver_result): assert 0
        def callbackError(_, uniq_query, err_desc): 
            assert 'timeout' in err_desc
            ev_error.set()

        mock_solver = MockSolverAsync()
        solver = AsyncSolverWrapper(TimedSolverWrapper(SyncSolverWrapper(mock_solver), 0.001))
        uniq_query = UniqueQuery(123, common.SAT_QUERY_SMT)
        solver.solve_async(uniq_query, callbackOK, callbackError)

        assert mock_solver.called.wait(1)
        assert ev_error.wait(5)
        solver.cancel()
    def test_cancel(self):
        def callbackOK(_, __): assert 0
        def callbackError(_, __, ___): assert 0
        
        solver = AsyncSolverWrapper(TimedSolverWrapper(SyncSolverWrapper(MockSolverAsync()), 9999))
        uniq_query = UniqueQuery(123, common.SAT_QUERY_SMT)
        solver.solve_async(uniq_query, callbackOK, callbackError)
        gevent.sleep(1) #wait until greenlet spawned
        solver.cancel()

        solver.solve_async(uniq_query, callbackOK, callbackError)
        solver.cancel() #immediately
    def test_sat_stress_test(self):
        ev_ok = gevent.event.Event()
        def callbackOK(s, solver_result):
            assert not ev_ok.is_set()
            assert solver_result.is_sat
            common.assert_sat_assignments(solver_result.assignment, common.SAT_QUERY_ASSIGNMENT_SMT)
            ev_ok.set()
        def callbackError(solver, uniq_query, err_desc): assert 0, err_desc

        solvers = []
        for _ in range(1, 10):
            if random.random() > 1/2.:
                solver = AsyncSolverWrapper(ProcessSolver(STPParser(), "STP", common.STP_PATH, ["--SMTLIB2", "-p"]))
            else:
                solver = AsyncSolverWrapper(ProcessSolver(None, "python", "python", ["-c", "while True: pass"]))
            solvers.append(solver)

        solver = PortfolioSolver(solvers)
        for _ in range(1, 10):
            uniq_query = team_solver.interfaces.interfaces.UniqueQuery(123, common.SAT_QUERY_SMT)
            solver.solve_async(uniq_query, callbackOK, callbackError)
            if random.random() > 1/2.:
                ev_ok.wait() #since there should be no context sw -> we can call solve_async after this wait
            else:
                solver.cancel()
            ev_ok.clear()