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