public function runDriver($name)
    {
        // if not found driver by the name, throw exception.
        $driver = $this->getDriver($name);
        if (!$driver) {
            return false;
        }
        $this->currentDriver = $driver;

        // before run a driver, call 'beforeDriverRun' hooks,
        // and current driver has already changed.
        // If 'beforeDriverRun' hook return false,
        // stop to use current driver and try to use next driver.
        $currentDriverEnable = $this->callHookHandler('beforeDriverRun', $driver);
        if (!$currentDriverEnable) {
            return $this->tryNextDriver();
        }

        // start run driver, and store the result.
        $result = $driver->run();
        $success = $driver->success;
        $data = [
            'driver'  => $driver->name,
            'time'    => $driver->time,
            'success' => $success,
            'result'  => $result,
        ];
        array_push($this->results, $data);

        // call 'afterDriverRun' hooks.
        $this->callHookHandler('afterDriverRun', $data);

        // if failed, try to use next backup driver.
        if (!$success) {
            return $this->tryNextDriver();
        }

        return true;
    }