Matthew White <[email protected]> writes: > [Coverity Scan is ok, make syntax-check is ok, make check-valgrind is ok, > contrib/check-hard is ok] > > This adds a new Metalink test. > > The following description is verbatim from the patch: > ----- > Test if when there are no good Metalink url resources there is any > segmentation fault. > ----- > > Regards, > Matthew > > -- > Matthew White <[email protected]> > > From fe1c53b831387742e0d21c5e0fd1935596f4b1ed Mon Sep 17 00:00:00 2001 > From: Matthew White <[email protected]> > Date: Tue, 23 Aug 2016 04:57:33 +0200 > Subject: [PATCH 14/25] New test: Detect when there are no good Metalink url > resources > > * testenv/Makefile.am: Add new file > * testenv/Test-metalink-xml-nourls.py: New file. Metalink/XML unknown > urls tests > > Test if when there are no good Metalink url resources there is any > segmentation fault. > --- > testenv/Makefile.am | 3 +- > testenv/Test-metalink-xml-nourls.py | 196 > ++++++++++++++++++++++++++++++++++++ > 2 files changed, 198 insertions(+), 1 deletion(-) > create mode 100755 testenv/Test-metalink-xml-nourls.py > > diff --git a/testenv/Makefile.am b/testenv/Makefile.am > index 5a67822..3d9ea44 100644 > --- a/testenv/Makefile.am > +++ b/testenv/Makefile.am > @@ -45,7 +45,8 @@ if METALINK_IS_ENABLED > Test-metalink-xml-absprefix-trust.py \ > Test-metalink-xml-homeprefix-trust.py \ > Test-metalink-xml-continue.py \ > - Test-metalink-xml-size.py > + Test-metalink-xml-size.py \ > + Test-metalink-xml-nourls.py > else > METALINK_TESTS = > endif > diff --git a/testenv/Test-metalink-xml-nourls.py > b/testenv/Test-metalink-xml-nourls.py > new file mode 100755 > index 0000000..60a748b > --- /dev/null > +++ b/testenv/Test-metalink-xml-nourls.py > @@ -0,0 +1,196 @@ > +#!/usr/bin/env python3 > +from sys import exit > +from test.http_test import HTTPTest > +from misc.wget_file import WgetFile > +import re > +import hashlib > + > +""" > + This is to test Metalink/XML with unknown url types. > + > + With --trust-server-names, trust the metalink:file names. > + > + Without --trust-server-names, don't trust the metalink:file names: > + use the basename of --input-metalink, and add a sequential number > + (e.g. .#1, .#2, etc.). > + > + Strip the directory from unsafe paths. > +""" > +############# File Definitions > ############################################### > +bad = "Ouch!" > + > +File1 = "Would you like some Tea?" > +File1_lowPref = "Do not take this" > +File1_sha256 = hashlib.sha256 (File1.encode ('UTF-8')).hexdigest () > + > +File2 = "This is gonna be good" > +File2_lowPref = "Not this one too" > +File2_sha256 = hashlib.sha256 (File2.encode ('UTF-8')).hexdigest () > + > +File3 = "A little more, please" > +File3_lowPref = "That's just too much" > +File3_sha256 = hashlib.sha256 (File3.encode ('UTF-8')).hexdigest () > + > +File4 = "Maybe a biscuit?" > +File4_lowPref = "No, thanks" > +File4_sha256 = hashlib.sha256 (File4.encode ('UTF-8')).hexdigest () > + > +File5 = "More Tea...?" > +File5_lowPref = "I have to go..." > +File5_sha256 = hashlib.sha256 (File5.encode ('UTF-8')).hexdigest () > + > +MetaXml = \ > +"""<?xml version="1.0" encoding="utf-8"?> > +<metalink version="3.0" xmlns="http://www.metalinker.org/"> > + <publisher> > + <name>GNU Wget</name> > + </publisher> > + <license> > + <name>GNU GPL</name> > + <url>http://www.gnu.org/licenses/gpl.html</url> > + </license> > + <identity>Wget Test Files</identity> > + <version>1.2.3</version> > + <description>Wget Test Files description</description> > + <files> > + <file name="File1"> > + <verification> > + <hash type="sha256">{{FILE1_HASH}}</hash> > + </verification> > + <resources> > + <url type="http" > preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url> > + <url type="http" > preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url> > + <url type="http" > preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File1_lowPref</url> > + <url type="http" > preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File1</url> > + </resources> > + </file> > + <file name="File2"> <!-- all unknown resources, test SIGSEGV --> > + <verification> > + <hash type="sha256">{{FILE2_HASH}}</hash> > + </verification> > + <resources> > + <url type="unknown" > preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url> > + <url type="unknown" > preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url> > + <url type="unknown" > preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File2_lowPref</url> > + <url type="unknown" > preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File2</url> > + </resources> > + </file> > + <file name="File3"> > + <verification> > + <hash type="sha256">{{FILE3_HASH}}</hash> > + </verification> > + <resources> > + <url type="http" > preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url> > + <url type="http" > preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url> > + <url type="http" > preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File3_lowPref</url> > + <url type="http" > preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File3</url> > + </resources> > + </file> > + <file name="File4"> <!-- only one good resource --> > + <verification> > + <hash type="sha256">{{FILE4_HASH}}</hash> > + </verification> > + <resources> > + <url type="unknown" > preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url> > + <url type="unknown" > preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url> > + <url type="unknown" > preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File4_lowPref</url> > + <url type="http" > preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File4</url> > + </resources> > + </file> > + <file name="File5"> > + <verification> > + <hash type="sha256">{{FILE5_HASH}}</hash> > + </verification> > + <resources> > + <url type="http" > preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url> > + <url type="http" > preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url> > + <url type="http" > preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File5_lowPref</url> > + <url type="http" > preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File5</url> > + </resources> > + </file> > + </files> > +</metalink> > +""" > + > +wrong_file = WgetFile ("wrong_file", bad) > + > +File1_orig = WgetFile ("File1", File1) > +File1_down = WgetFile ("test.meta4.#1", File1) > +File1_nono = WgetFile ("File1_lowPref", File1_lowPref) > + > +# all unknown resources, test SIGSEGV > +File2_orig = WgetFile ("File2", File2) > +File2_nono = WgetFile ("File2_lowPref", File2_lowPref) > + > +File3_orig = WgetFile ("File3", File3) > +File3_down = WgetFile ("test.meta4.#3", File3) > +File3_nono = WgetFile ("File3_lowPref", File3_lowPref) > + > +File4_orig = WgetFile ("File4", File4) > +File4_down = WgetFile ("test.meta4.#4", File4) > +File4_nono = WgetFile ("File4_lowPref", File4_lowPref) > + > +File5_orig = WgetFile ("File5", File5) > +File5_down = WgetFile ("test.meta4.#5", File5) > +File5_nono = WgetFile ("File5_lowPref", File5_lowPref) > + > +MetaFile = WgetFile ("test.meta4", MetaXml) > + > +WGET_OPTIONS = "--input-metalink test.meta4" > +WGET_URLS = [[]] > + > +Files = [[ > + wrong_file, > + File1_orig, File1_nono, > + File2_orig, File2_nono, > + File3_orig, File3_nono, > + File4_orig, File4_nono, > + File5_orig, File5_nono > +]] > +Existing_Files = [MetaFile] > + > +ExpectedReturnCode = 1 > +ExpectedDownloadedFiles = [ > + File1_down, > + File3_down, > + File4_down, > + File5_down, > + MetaFile > +] > + > +################ Pre and Post Test Hooks > ##################################### > +pre_test = { > + "ServerFiles" : Files, > + "LocalFiles" : Existing_Files > +} > +test_options = { > + "WgetCommands" : WGET_OPTIONS, > + "Urls" : WGET_URLS > +} > +post_test = { > + "ExpectedFiles" : ExpectedDownloadedFiles, > + "ExpectedRetcode" : ExpectedReturnCode > +} > + > +http_test = HTTPTest ( > + pre_hook=pre_test, > + test_params=test_options, > + post_hook=post_test, > +) > + > +http_test.server_setup() > +### Get and use dynamic server sockname > +srv_host, srv_port = http_test.servers[0].server_inst.socket.getsockname () > + > +MetaXml = re.sub (r'{{FILE1_HASH}}', File1_sha256, MetaXml) > +MetaXml = re.sub (r'{{FILE2_HASH}}', File2_sha256, MetaXml) > +MetaXml = re.sub (r'{{FILE3_HASH}}', File3_sha256, MetaXml) > +MetaXml = re.sub (r'{{FILE4_HASH}}', File4_sha256, MetaXml) > +MetaXml = re.sub (r'{{FILE5_HASH}}', File5_sha256, MetaXml) > +MetaXml = re.sub (r'{{SRV_HOST}}', srv_host, MetaXml) > +MetaXml = re.sub (r'{{SRV_PORT}}', str (srv_port), MetaXml) > +MetaFile.content = MetaXml
and here again could we skip the re module? ACK with it changed. Giuseppe
