summaryrefslogtreecommitdiff
path: root/tests/http/testenv/client.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/http/testenv/client.py')
-rw-r--r--tests/http/testenv/client.py105
1 files changed, 105 insertions, 0 deletions
diff --git a/tests/http/testenv/client.py b/tests/http/testenv/client.py
new file mode 100644
index 000000000..3b7ea0fc6
--- /dev/null
+++ b/tests/http/testenv/client.py
@@ -0,0 +1,105 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#***************************************************************************
+# _ _ ____ _
+# Project ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at https://curl.se/docs/copyright.html.
+#
+# You may opt to use, copy, modify, merge, publish, distribute and/or sell
+# copies of the Software, and permit persons to whom the Software is
+# furnished to do so, under the terms of the COPYING file.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+# SPDX-License-Identifier: curl
+#
+###########################################################################
+#
+import pytest
+import json
+import logging
+import os
+import re
+import shutil
+import subprocess
+from datetime import timedelta, datetime
+from typing import List, Optional, Dict, Union
+from urllib.parse import urlparse
+
+from . import ExecResult
+from .env import Env
+
+
+log = logging.getLogger(__name__)
+
+
+class LocalClient:
+
+ def __init__(self, name: str, env: Env, run_dir: Optional[str] = None,
+ timeout: Optional[float] = None):
+ self.name = name
+ self.path = os.path.join(env.project_dir, f'tests/http/clients/{name}')
+ self.env = env
+ self._timeout = timeout if timeout else env.test_timeout
+ self._curl = os.environ['CURL'] if 'CURL' in os.environ else env.curl
+ self._run_dir = run_dir if run_dir else os.path.join(env.gen_dir, name)
+ self._stdoutfile = f'{self._run_dir}/stdout'
+ self._stderrfile = f'{self._run_dir}/stderr'
+ self._rmrf(self._run_dir)
+ self._mkpath(self._run_dir)
+
+ @property
+ def run_dir(self) -> str:
+ return self._run_dir
+
+ def exists(self) -> bool:
+ return os.path.exists(self.path)
+
+ def download_file(self, i: int) -> str:
+ return os.path.join(self._run_dir, f'download_{i}.data')
+
+ def _rmf(self, path):
+ if os.path.exists(path):
+ return os.remove(path)
+
+ def _rmrf(self, path):
+ if os.path.exists(path):
+ return shutil.rmtree(path)
+
+ def _mkpath(self, path):
+ if not os.path.exists(path):
+ return os.makedirs(path)
+
+ def run(self, args):
+ self._rmf(self._stdoutfile)
+ self._rmf(self._stderrfile)
+ start = datetime.now()
+ exception = None
+ myargs = [self.path]
+ myargs.extend(args)
+ try:
+ with open(self._stdoutfile, 'w') as cout:
+ with open(self._stderrfile, 'w') as cerr:
+ p = subprocess.run(myargs, stderr=cerr, stdout=cout,
+ cwd=self._run_dir, shell=False,
+ input=None,
+ timeout=self._timeout)
+ exitcode = p.returncode
+ except subprocess.TimeoutExpired:
+ log.warning(f'Timeout after {self._timeout}s: {args}')
+ exitcode = -1
+ exception = 'TimeoutExpired'
+ coutput = open(self._stdoutfile).readlines()
+ cerrput = open(self._stderrfile).readlines()
+ return ExecResult(args=myargs, exit_code=exitcode, exception=exception,
+ stdout=coutput, stderr=cerrput,
+ duration=datetime.now() - start)