xref: /aosp_15_r20/external/curl/tests/util.py (revision 6236dae45794135f37c4eb022389c904c8b0090d)
1*6236dae4SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*6236dae4SAndroid Build Coastguard Worker# -*- coding: utf-8 -*-
3*6236dae4SAndroid Build Coastguard Worker#
4*6236dae4SAndroid Build Coastguard Worker#  Project                     ___| | | |  _ \| |
5*6236dae4SAndroid Build Coastguard Worker#                             / __| | | | |_) | |
6*6236dae4SAndroid Build Coastguard Worker#                            | (__| |_| |  _ <| |___
7*6236dae4SAndroid Build Coastguard Worker#                             \___|\___/|_| \_\_____|
8*6236dae4SAndroid Build Coastguard Worker#
9*6236dae4SAndroid Build Coastguard Worker# Copyright (C) Daniel Stenberg, <[email protected]>, et al.
10*6236dae4SAndroid Build Coastguard Worker#
11*6236dae4SAndroid Build Coastguard Worker# This software is licensed as described in the file COPYING, which
12*6236dae4SAndroid Build Coastguard Worker# you should have received as part of this distribution. The terms
13*6236dae4SAndroid Build Coastguard Worker# are also available at https://curl.se/docs/copyright.html.
14*6236dae4SAndroid Build Coastguard Worker#
15*6236dae4SAndroid Build Coastguard Worker# You may opt to use, copy, modify, merge, publish, distribute and/or sell
16*6236dae4SAndroid Build Coastguard Worker# copies of the Software, and permit persons to whom the Software is
17*6236dae4SAndroid Build Coastguard Worker# furnished to do so, under the terms of the COPYING file.
18*6236dae4SAndroid Build Coastguard Worker#
19*6236dae4SAndroid Build Coastguard Worker# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
20*6236dae4SAndroid Build Coastguard Worker# KIND, either express or implied.
21*6236dae4SAndroid Build Coastguard Worker#
22*6236dae4SAndroid Build Coastguard Worker# SPDX-License-Identifier: curl
23*6236dae4SAndroid Build Coastguard Worker#
24*6236dae4SAndroid Build Coastguard Worker"""Module for extracting test data from the test data folder and other utils."""
25*6236dae4SAndroid Build Coastguard Worker
26*6236dae4SAndroid Build Coastguard Workerfrom __future__ import (absolute_import, division, print_function,
27*6236dae4SAndroid Build Coastguard Worker                        unicode_literals)
28*6236dae4SAndroid Build Coastguard Worker
29*6236dae4SAndroid Build Coastguard Workerimport logging
30*6236dae4SAndroid Build Coastguard Workerimport os
31*6236dae4SAndroid Build Coastguard Workerimport re
32*6236dae4SAndroid Build Coastguard Worker
33*6236dae4SAndroid Build Coastguard Workerlog = logging.getLogger(__name__)
34*6236dae4SAndroid Build Coastguard Worker
35*6236dae4SAndroid Build Coastguard Worker
36*6236dae4SAndroid Build Coastguard WorkerREPLY_DATA = re.compile("<reply>[ \t\n\r]*<data[^<]*>(.*?)</data>", re.MULTILINE | re.DOTALL)
37*6236dae4SAndroid Build Coastguard Worker
38*6236dae4SAndroid Build Coastguard Worker
39*6236dae4SAndroid Build Coastguard Workerclass ClosingFileHandler(logging.StreamHandler):
40*6236dae4SAndroid Build Coastguard Worker    def __init__(self, filename):
41*6236dae4SAndroid Build Coastguard Worker        super(ClosingFileHandler, self).__init__()
42*6236dae4SAndroid Build Coastguard Worker        self.filename = os.path.abspath(filename)
43*6236dae4SAndroid Build Coastguard Worker        self.setStream(None)
44*6236dae4SAndroid Build Coastguard Worker
45*6236dae4SAndroid Build Coastguard Worker    def emit(self, record):
46*6236dae4SAndroid Build Coastguard Worker        with open(self.filename, "a") as fp:
47*6236dae4SAndroid Build Coastguard Worker            self.setStream(fp)
48*6236dae4SAndroid Build Coastguard Worker            super(ClosingFileHandler, self).emit(record)
49*6236dae4SAndroid Build Coastguard Worker            self.setStream(None)
50*6236dae4SAndroid Build Coastguard Worker
51*6236dae4SAndroid Build Coastguard Worker    def setStream(self, stream):
52*6236dae4SAndroid Build Coastguard Worker        setStream = getattr(super(ClosingFileHandler, self), 'setStream', None)
53*6236dae4SAndroid Build Coastguard Worker        if callable(setStream):
54*6236dae4SAndroid Build Coastguard Worker            return setStream(stream)
55*6236dae4SAndroid Build Coastguard Worker        if stream is self.stream:
56*6236dae4SAndroid Build Coastguard Worker            result = None
57*6236dae4SAndroid Build Coastguard Worker        else:
58*6236dae4SAndroid Build Coastguard Worker            result = self.stream
59*6236dae4SAndroid Build Coastguard Worker            self.acquire()
60*6236dae4SAndroid Build Coastguard Worker            try:
61*6236dae4SAndroid Build Coastguard Worker                self.flush()
62*6236dae4SAndroid Build Coastguard Worker                self.stream = stream
63*6236dae4SAndroid Build Coastguard Worker            finally:
64*6236dae4SAndroid Build Coastguard Worker                self.release()
65*6236dae4SAndroid Build Coastguard Worker        return result
66*6236dae4SAndroid Build Coastguard Worker
67*6236dae4SAndroid Build Coastguard Workerclass TestData(object):
68*6236dae4SAndroid Build Coastguard Worker    def __init__(self, data_folder):
69*6236dae4SAndroid Build Coastguard Worker        self.data_folder = data_folder
70*6236dae4SAndroid Build Coastguard Worker
71*6236dae4SAndroid Build Coastguard Worker    def get_test_data(self, test_number):
72*6236dae4SAndroid Build Coastguard Worker        # Create the test file name
73*6236dae4SAndroid Build Coastguard Worker        filename = os.path.join(self.data_folder,
74*6236dae4SAndroid Build Coastguard Worker                                "test{0}".format(test_number))
75*6236dae4SAndroid Build Coastguard Worker
76*6236dae4SAndroid Build Coastguard Worker        log.debug("Parsing file %s", filename)
77*6236dae4SAndroid Build Coastguard Worker
78*6236dae4SAndroid Build Coastguard Worker        with open(filename, "rb") as f:
79*6236dae4SAndroid Build Coastguard Worker            contents = f.read().decode("utf-8")
80*6236dae4SAndroid Build Coastguard Worker
81*6236dae4SAndroid Build Coastguard Worker        m = REPLY_DATA.search(contents)
82*6236dae4SAndroid Build Coastguard Worker        if not m:
83*6236dae4SAndroid Build Coastguard Worker            raise Exception("Couldn't find a <reply><data> section")
84*6236dae4SAndroid Build Coastguard Worker
85*6236dae4SAndroid Build Coastguard Worker        # Left-strip the data so we don't get a newline before our data.
86*6236dae4SAndroid Build Coastguard Worker        return m.group(1).lstrip()
87*6236dae4SAndroid Build Coastguard Worker
88*6236dae4SAndroid Build Coastguard Worker
89*6236dae4SAndroid Build Coastguard Workerif __name__ == '__main__':
90*6236dae4SAndroid Build Coastguard Worker    td = TestData("./data")
91*6236dae4SAndroid Build Coastguard Worker    data = td.get_test_data(1)
92*6236dae4SAndroid Build Coastguard Worker    print(data)
93