CoreTests_URL.cpp
上传用户:huihehuasu
上传日期:2007-01-10
资源大小:6948k
文件大小:14k
源码类别:

xml/soap/webservice

开发平台:

C/C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  * 
  4.  * Copyright (c) 1999-2000 The Apache Software Foundation.  All rights
  5.  * reserved.
  6.  * 
  7.  * Redistribution and use in source and binary forms, with or without
  8.  * modification, are permitted provided that the following conditions
  9.  * are met:
  10.  * 
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer. 
  13.  * 
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in
  16.  *    the documentation and/or other materials provided with the
  17.  *    distribution.
  18.  * 
  19.  * 3. The end-user documentation included with the redistribution,
  20.  *    if any, must include the following acknowledgment:  
  21.  *       "This product includes software developed by the
  22.  *        Apache Software Foundation (http://www.apache.org/)."
  23.  *    Alternately, this acknowledgment may appear in the software itself,
  24.  *    if and wherever such third-party acknowledgments normally appear.
  25.  * 
  26.  * 4. The names "Xerces" and "Apache Software Foundation" must
  27.  *    not be used to endorse or promote products derived from this
  28.  *    software without prior written permission. For written 
  29.  *    permission, please contact apache@apache.org.
  30.  * 
  31.  * 5. Products derived from this software may not be called "Apache",
  32.  *    nor may "Apache" appear in their name, without prior written
  33.  *    permission of the Apache Software Foundation.
  34.  * 
  35.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  36.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  37.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  38.  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  39.  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  41.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  42.  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  43.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  44.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  45.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  46.  * SUCH DAMAGE.
  47.  * ====================================================================
  48.  * 
  49.  * This software consists of voluntary contributions made by many
  50.  * individuals on behalf of the Apache Software Foundation, and was
  51.  * originally based on software copyright (c) 1999, International
  52.  * Business Machines, Inc., http://www.ibm.com .  For more information
  53.  * on the Apache Software Foundation, please see
  54.  * <http://www.apache.org/>.
  55.  */
  56. /*
  57.  * $Log: CoreTests_URL.cpp,v $
  58.  * Revision 1.8  2000/03/23 01:02:40  roddey
  59.  * Updates to the XMLURL class to correct a lot of parsing problems
  60.  * and to add support for the port number. Updated the URL tests
  61.  * to test some of this new stuff.
  62.  *
  63.  * Revision 1.7  2000/03/02 19:55:49  roddey
  64.  * This checkin includes many changes done while waiting for the
  65.  * 1.1.0 code to be finished. I can't list them all here, but a list is
  66.  * available elsewhere.
  67.  *
  68.  * Revision 1.6  2000/02/17 18:51:10  roddey
  69.  * Added a new test for pruning leading whitespace
  70.  *
  71.  * Revision 1.5  2000/02/06 07:48:39  rahulj
  72.  * Year 2K copyright swat.
  73.  *
  74.  * Revision 1.4  2000/01/19 00:59:06  roddey
  75.  * Get rid of dependence on old utils output streams.
  76.  *
  77.  * Revision 1.3  2000/01/12 00:17:48  roddey
  78.  * Removed validator tests temporarily, since they have changed and the tests need
  79.  * to be rewritten. Added new tests for the new URL class.
  80.  *
  81.  * Revision 1.2  1999/12/07 23:11:01  roddey
  82.  * Add in some new tests for transcoders and update the URL tests
  83.  * a bit.
  84.  *
  85.  * Revision 1.1.1.1  1999/11/09 01:02:05  twl
  86.  * Initial checkin
  87.  *
  88.  * Revision 1.2  1999/11/08 20:42:28  rahul
  89.  * Swat for adding in Product name and CVS comment log variable.
  90.  *
  91.  */
  92. // ---------------------------------------------------------------------------
  93. //  XML4C2 includes
  94. // ---------------------------------------------------------------------------
  95. #include <util/RuntimeException.hpp>
  96. #include <util/XMLURL.hpp>
  97. #include "CoreTests.hpp"
  98. // ---------------------------------------------------------------------------
  99. //  Local testing functions
  100. // ---------------------------------------------------------------------------
  101. //
  102. //  This test just sets up a list of variations on URLs and parses them. The
  103. //  URL list includes the expected text for each of the parts that should be
  104. //  parsed out of the URL.
  105. //
  106. struct BasicTestEntry
  107. {
  108.     const XMLCh*        orgURL;
  109.     const XMLCh*        fullText;
  110.     XMLURL::Protocols   protocol;
  111.     unsigned int        portNum;
  112.     const XMLCh*        fragment;
  113.     const XMLCh*        host;
  114.     const XMLCh*        path;
  115.     const XMLCh*        password;
  116.     const XMLCh*        query;
  117.     const XMLCh*        user;
  118. };
  119. static bool checkAField(const   XMLCh* const test
  120.                         , const XMLCh* const expected
  121.                         , const XMLCh* const fieldName)
  122. {
  123.     if (!test && !expected)
  124.         return true;
  125.     if (!test && expected)
  126.     {
  127.         std::wcout << L"Expected value for the " << fieldName
  128.                    << " field was not present" << std::endl;
  129.         return false;
  130.     }
  131.      else if (test && !expected)
  132.     {
  133.         std::wcout << L"The value '" << test << L"' for the " << fieldName
  134.                    << L" was not expected" << std::endl;
  135.         return false;
  136.     }
  137.      else if (XMLString::compareString(test, expected))
  138.     {
  139.         std::wcout  << L"Expected: " << expected << L", but got: " << test
  140.                     << std::endl;
  141.         return false;
  142.     }
  143.     return true;
  144. }
  145. static bool checkBasicResult(const  XMLURL&         testURL
  146.                             , const BasicTestEntry& testInfo)
  147. {
  148.     //
  149.     //  Check each part to insure that its what its supposed to be. Since
  150.     //  any of them can be a null pointer, we have a little helper function
  151.     //  that spits out the actual testing code for each one.
  152.     //
  153.     if (!checkAField(testURL.getURLText(), testInfo.fullText, L"Full Text"))
  154.         return false;
  155.     if (!checkAField(testURL.getFragment(), testInfo.fragment, L"Fragment"))
  156.         return false;
  157.     if (!checkAField(testURL.getHost(), testInfo.host, L"Host"))
  158.         return false;
  159.     if (testURL.getPortNum() != testInfo.portNum)
  160.     {
  161.         std::wcout << L"Expected port number: " << testInfo.portNum
  162.                    << L" but got: " << testURL.getPortNum() << std::endl;
  163.         return false;
  164.     }
  165.     if (!checkAField(testURL.getPath(), testInfo.path, L"Path"))
  166.         return false;
  167.     if (!checkAField(testURL.getPassword(), testInfo.password, L"Password"))
  168.         return false;
  169.     if (!checkAField(testURL.getQuery(), testInfo.query, L"Query"))
  170.         return false;
  171.     if (!checkAField(testURL.getUser(), testInfo.user, L"User"))
  172.         return false;
  173.     return true;
  174. }
  175. static bool basicURLTest()
  176. {
  177.     static BasicTestEntry testList[] =
  178.     {
  179.         {
  180.             L"file://user:password@host/path1/path2/file.txt?query#fragment"
  181.             , L"file://user:password@host/path1/path2/file.txt?query#fragment"
  182.             , XMLURL::File
  183.             , 0
  184.             , L"fragment"
  185.             , L"host"
  186.             , L"/path1/path2/file.txt"
  187.             , L"password"
  188.             , L"query"
  189.             , L"user"
  190.         }
  191.       , {
  192.             L"file:///path2/file.txt?query#fragment"
  193.             , L"file:///path2/file.txt?query#fragment"
  194.             , XMLURL::File
  195.             , 0
  196.             , L"fragment"
  197.             , 0
  198.             , L"/path2/file.txt"
  199.             , 0
  200.             , L"query"
  201.             , 0
  202.         }
  203.       , {
  204.             L"#fragment"
  205.             , L"#fragment"
  206.             , XMLURL::Unknown
  207.             , 0
  208.             , L"fragment"
  209.             , 0
  210.             , 0
  211.             , 0
  212.             , 0
  213.             , 0
  214.         }
  215.       , {
  216.             L"file://user@host/path1/path2/file.txt#fragment"
  217.             , L"file://user@host/path1/path2/file.txt#fragment"
  218.             , XMLURL::File
  219.             , 0
  220.             , L"fragment"
  221.             , L"host"
  222.             , L"/path1/path2/file.txt"
  223.             , 0
  224.             , 0
  225.             , L"user"
  226.         }
  227.       , {
  228.             L"     file://user@host/path1/path2/file.txt#fragment"
  229.             , L"file://user@host/path1/path2/file.txt#fragment"
  230.             , XMLURL::File
  231.             , 0
  232.             , L"fragment"
  233.             , L"host"
  234.             , L"/path1/path2/file.txt"
  235.             , 0
  236.             , 0
  237.             , L"user"
  238.         }
  239.       , {
  240.             L"http://host:90/path1/path2/file.txt"
  241.             , L"http://host:90/path1/path2/file.txt"
  242.             , XMLURL::HTTP
  243.             , 90
  244.             , 0
  245.             , L"host"
  246.             , L"/path1/path2/file.txt"
  247.             , 0
  248.             , 0
  249.             , 0
  250.         }
  251.       , {
  252.             L"http://host/path1/path2/file.txt"
  253.             , L"http://host/path1/path2/file.txt"
  254.             , XMLURL::HTTP
  255.             , 80
  256.             , 0
  257.             , L"host"
  258.             , L"/path1/path2/file.txt"
  259.             , 0
  260.             , 0
  261.             , 0
  262.         }
  263.       , {
  264.             L"ftp://"
  265.             , L"ftp://"
  266.             , XMLURL::FTP
  267.             , 21
  268.             , 0
  269.             , 0
  270.             , 0
  271.             , 0
  272.             , 0
  273.             , 0
  274.         }
  275.       , {
  276.             L"ftp://user@"
  277.             , L"ftp://user@"
  278.             , XMLURL::FTP
  279.             , 21
  280.             , 0
  281.             , 0
  282.             , 0
  283.             , 0
  284.             , 0
  285.             , L"user"
  286.         }
  287.     };
  288.     const unsigned int testCount = sizeof(testList) / sizeof(testList[0]);
  289.     bool retVal = true;
  290.     //
  291.     //  Do a run where we construct the URL over and over for each
  292.     //  test.
  293.     //
  294.     unsigned int index;
  295.     for (index = 0; index < testCount; index++)
  296.     {
  297.         // Force full destruction each time
  298.         {
  299.             XMLURL testURL(testList[index].orgURL);
  300.             // Call the comparison function
  301.             if (!checkBasicResult(testURL, testList[index]))
  302.                 retVal = false;
  303.         }
  304.     }
  305.     //
  306.     //  Do a run where we use a single URL object and just reset it over
  307.     //  and over again.
  308.     //
  309.     XMLURL testURL;
  310.     for (index = 0; index < testCount; index++)
  311.     {
  312.         testURL.setURL(testList[index].orgURL);
  313.         // Call the comparison function
  314.         if (!checkBasicResult(testURL, testList[index]))
  315.             retVal = false;
  316.     }
  317.     return retVal;
  318. }
  319. //
  320. //  This test makes sure that parsing one URL relative to another works
  321. //  correctly. The tests used here come from one of the internet RFCs on
  322. //  generic URI syntax. A single base URL is created, then a number of
  323. //  relative URLs are parsed against it and the results compared to the
  324. //  expected result.
  325. //
  326. static bool relativeURLTest()
  327. {
  328.     static struct TestEntry
  329.     {
  330.         const XMLCh*    relative;
  331.         const XMLCh*    result;
  332.     } testList[] =
  333.     {
  334.         { L"g"      , L"http://a/b/c/g" }
  335.       , { L"./g"    , L"http://a/b/c/g" }
  336.       , { L"g/"     , L"http://a/b/c/g/" }
  337.       , { L"/g"     , L"http://a/g" }
  338.       , { L"?y"     , L"http://a/b/c/?y" }
  339.       , { L"g?y"    , L"http://a/b/c/g?y" }
  340.       , { L"#s"     , L"http://a/b/c/d;p#s" }
  341.       , { L"g#s"    , L"http://a/b/c/g#s" }
  342.       , { L"g?y#s"  , L"http://a/b/c/g?y#s" }
  343.       , { L";x"     , L"http://a/b/c/;x" }
  344.       , { L"g;x"    , L"http://a/b/c/g;x" }
  345.       , { L"g;x?y#s", L"http://a/b/c/g;x?y#s" }
  346.       , { L"."      , L"http://a/b/c/" }
  347.       , { L"./"     , L"http://a/b/c/" }
  348.       , { L".."     , L"http://a/b/" }
  349.       , { L"../"    , L"http://a/b/" }
  350.       , { L"../g"   , L"http://a/b/g" }
  351.       , { L"../.."  , L"http://a/" }
  352.       , { L"../../" , L"http://a/" }
  353.       , { L"../../g", L"http://a/g" }
  354.     };
  355.     const unsigned int testCount = sizeof(testList) / sizeof(testList[0]);
  356.     // This is the base URL against which the tests are run
  357.     XMLURL baseURL(L"http://a/b/c/d;p?q");
  358.     bool retVal = true;
  359.     for (unsigned int index = 0; index < testCount; index++)
  360.     {
  361.         XMLURL testURL(baseURL, testList[index].relative);
  362.         if (XMLString::compareString(testURL.getURLText(), testList[index].result))
  363.         {
  364.             std::wcout  << L"Expected URL: " << testList[index].result
  365.                         << L" but got: " << testURL.getURLText() << std::endl;
  366.             retVal = false;
  367.         }
  368.     }
  369.     return retVal;
  370. };
  371. // ---------------------------------------------------------------------------
  372. //  Test entry point
  373. // ---------------------------------------------------------------------------
  374. bool testURL()
  375. {
  376.     std::wcout  << L"----------------------------------n"
  377.                 << L"Testing URL class n"
  378.                 << L"----------------------------------"
  379.                 << std::endl;
  380.     bool retVal = true;
  381.     try
  382.     {
  383.         // Call other local methods to do specific tests
  384.         std::wcout << L"Testing basic URL parsing" << std::endl;
  385.         if (!basicURLTest())
  386.         {
  387.             std::wcout << L"Basic URL parsing tests failed" << std::endl;
  388.             retVal = false;
  389.         }
  390.          else
  391.         {
  392.             std::wcout << L"Basic URL parsing tests passed" << std::endl;
  393.         }
  394.         std::wcout << std::endl;
  395.         std::wcout << L"Testing relative URL parsing" << std::endl;
  396.         if (!relativeURLTest())
  397.         {
  398.             std::wcout << L"Relative URL parsing tests failed" << std::endl;
  399.             retVal = false;
  400.         }
  401.          else
  402.         {
  403.             std::wcout << L"Relative URL parsing tests passed" << std::endl;
  404.         }
  405.         std::wcout << std::endl;
  406.     }
  407.     catch(const XMLException& toCatch)
  408.     {
  409.         std::wcout  << L"  ERROR: Unexpected exception!n   Msg: "
  410.                     << toCatch.getMessage() << std::endl;
  411.         return false;
  412.     }
  413.     return retVal;
  414. }