CoreTests_URL.cpp
上传用户:zhuqijet
上传日期:2013-06-25
资源大小:10074k
文件大小:14k
源码类别:

词法分析

开发平台:

Visual 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.9  2002/02/01 22:46:28  peiyongz
  59.  * sane_include
  60.  *
  61.  * Revision 1.8  2000/03/23 01:02:40  roddey
  62.  * Updates to the XMLURL class to correct a lot of parsing problems
  63.  * and to add support for the port number. Updated the URL tests
  64.  * to test some of this new stuff.
  65.  *
  66.  * Revision 1.7  2000/03/02 19:55:49  roddey
  67.  * This checkin includes many changes done while waiting for the
  68.  * 1.1.0 code to be finished. I can't list them all here, but a list is
  69.  * available elsewhere.
  70.  *
  71.  * Revision 1.6  2000/02/17 18:51:10  roddey
  72.  * Added a new test for pruning leading whitespace
  73.  *
  74.  * Revision 1.5  2000/02/06 07:48:39  rahulj
  75.  * Year 2K copyright swat.
  76.  *
  77.  * Revision 1.4  2000/01/19 00:59:06  roddey
  78.  * Get rid of dependence on old utils output streams.
  79.  *
  80.  * Revision 1.3  2000/01/12 00:17:48  roddey
  81.  * Removed validator tests temporarily, since they have changed and the tests need
  82.  * to be rewritten. Added new tests for the new URL class.
  83.  *
  84.  * Revision 1.2  1999/12/07 23:11:01  roddey
  85.  * Add in some new tests for transcoders and update the URL tests
  86.  * a bit.
  87.  *
  88.  * Revision 1.1.1.1  1999/11/09 01:02:05  twl
  89.  * Initial checkin
  90.  *
  91.  * Revision 1.2  1999/11/08 20:42:28  rahul
  92.  * Swat for adding in Product name and CVS comment log variable.
  93.  *
  94.  */
  95. // ---------------------------------------------------------------------------
  96. //  XML4C2 includes
  97. // ---------------------------------------------------------------------------
  98. #include <xercesc/util/RuntimeException.hpp>
  99. #include <xercesc/util/XMLURL.hpp>
  100. #include "CoreTests.hpp"
  101. // ---------------------------------------------------------------------------
  102. //  Local testing functions
  103. // ---------------------------------------------------------------------------
  104. //
  105. //  This test just sets up a list of variations on URLs and parses them. The
  106. //  URL list includes the expected text for each of the parts that should be
  107. //  parsed out of the URL.
  108. //
  109. struct BasicTestEntry
  110. {
  111.     const XMLCh*        orgURL;
  112.     const XMLCh*        fullText;
  113.     XMLURL::Protocols   protocol;
  114.     unsigned int        portNum;
  115.     const XMLCh*        fragment;
  116.     const XMLCh*        host;
  117.     const XMLCh*        path;
  118.     const XMLCh*        password;
  119.     const XMLCh*        query;
  120.     const XMLCh*        user;
  121. };
  122. static bool checkAField(const   XMLCh* const test
  123.                         , const XMLCh* const expected
  124.                         , const XMLCh* const fieldName)
  125. {
  126.     if (!test && !expected)
  127.         return true;
  128.     if (!test && expected)
  129.     {
  130.         std::wcout << L"Expected value for the " << fieldName
  131.                    << " field was not present" << std::endl;
  132.         return false;
  133.     }
  134.      else if (test && !expected)
  135.     {
  136.         std::wcout << L"The value '" << test << L"' for the " << fieldName
  137.                    << L" was not expected" << std::endl;
  138.         return false;
  139.     }
  140.      else if (XMLString::compareString(test, expected))
  141.     {
  142.         std::wcout  << L"Expected: " << expected << L", but got: " << test
  143.                     << std::endl;
  144.         return false;
  145.     }
  146.     return true;
  147. }
  148. static bool checkBasicResult(const  XMLURL&         testURL
  149.                             , const BasicTestEntry& testInfo)
  150. {
  151.     //
  152.     //  Check each part to insure that its what its supposed to be. Since
  153.     //  any of them can be a null pointer, we have a little helper function
  154.     //  that spits out the actual testing code for each one.
  155.     //
  156.     if (!checkAField(testURL.getURLText(), testInfo.fullText, L"Full Text"))
  157.         return false;
  158.     if (!checkAField(testURL.getFragment(), testInfo.fragment, L"Fragment"))
  159.         return false;
  160.     if (!checkAField(testURL.getHost(), testInfo.host, L"Host"))
  161.         return false;
  162.     if (testURL.getPortNum() != testInfo.portNum)
  163.     {
  164.         std::wcout << L"Expected port number: " << testInfo.portNum
  165.                    << L" but got: " << testURL.getPortNum() << std::endl;
  166.         return false;
  167.     }
  168.     if (!checkAField(testURL.getPath(), testInfo.path, L"Path"))
  169.         return false;
  170.     if (!checkAField(testURL.getPassword(), testInfo.password, L"Password"))
  171.         return false;
  172.     if (!checkAField(testURL.getQuery(), testInfo.query, L"Query"))
  173.         return false;
  174.     if (!checkAField(testURL.getUser(), testInfo.user, L"User"))
  175.         return false;
  176.     return true;
  177. }
  178. static bool basicURLTest()
  179. {
  180.     static BasicTestEntry testList[] =
  181.     {
  182.         {
  183.             L"file://user:password@host/path1/path2/file.txt?query#fragment"
  184.             , L"file://user:password@host/path1/path2/file.txt?query#fragment"
  185.             , XMLURL::File
  186.             , 0
  187.             , L"fragment"
  188.             , L"host"
  189.             , L"/path1/path2/file.txt"
  190.             , L"password"
  191.             , L"query"
  192.             , L"user"
  193.         }
  194.       , {
  195.             L"file:///path2/file.txt?query#fragment"
  196.             , L"file:///path2/file.txt?query#fragment"
  197.             , XMLURL::File
  198.             , 0
  199.             , L"fragment"
  200.             , 0
  201.             , L"/path2/file.txt"
  202.             , 0
  203.             , L"query"
  204.             , 0
  205.         }
  206.       , {
  207.             L"#fragment"
  208.             , L"#fragment"
  209.             , XMLURL::Unknown
  210.             , 0
  211.             , L"fragment"
  212.             , 0
  213.             , 0
  214.             , 0
  215.             , 0
  216.             , 0
  217.         }
  218.       , {
  219.             L"file://user@host/path1/path2/file.txt#fragment"
  220.             , L"file://user@host/path1/path2/file.txt#fragment"
  221.             , XMLURL::File
  222.             , 0
  223.             , L"fragment"
  224.             , L"host"
  225.             , L"/path1/path2/file.txt"
  226.             , 0
  227.             , 0
  228.             , L"user"
  229.         }
  230.       , {
  231.             L"     file://user@host/path1/path2/file.txt#fragment"
  232.             , L"file://user@host/path1/path2/file.txt#fragment"
  233.             , XMLURL::File
  234.             , 0
  235.             , L"fragment"
  236.             , L"host"
  237.             , L"/path1/path2/file.txt"
  238.             , 0
  239.             , 0
  240.             , L"user"
  241.         }
  242.       , {
  243.             L"http://host:90/path1/path2/file.txt"
  244.             , L"http://host:90/path1/path2/file.txt"
  245.             , XMLURL::HTTP
  246.             , 90
  247.             , 0
  248.             , L"host"
  249.             , L"/path1/path2/file.txt"
  250.             , 0
  251.             , 0
  252.             , 0
  253.         }
  254.       , {
  255.             L"http://host/path1/path2/file.txt"
  256.             , L"http://host/path1/path2/file.txt"
  257.             , XMLURL::HTTP
  258.             , 80
  259.             , 0
  260.             , L"host"
  261.             , L"/path1/path2/file.txt"
  262.             , 0
  263.             , 0
  264.             , 0
  265.         }
  266.       , {
  267.             L"ftp://"
  268.             , L"ftp://"
  269.             , XMLURL::FTP
  270.             , 21
  271.             , 0
  272.             , 0
  273.             , 0
  274.             , 0
  275.             , 0
  276.             , 0
  277.         }
  278.       , {
  279.             L"ftp://user@"
  280.             , L"ftp://user@"
  281.             , XMLURL::FTP
  282.             , 21
  283.             , 0
  284.             , 0
  285.             , 0
  286.             , 0
  287.             , 0
  288.             , L"user"
  289.         }
  290.     };
  291.     const unsigned int testCount = sizeof(testList) / sizeof(testList[0]);
  292.     bool retVal = true;
  293.     //
  294.     //  Do a run where we construct the URL over and over for each
  295.     //  test.
  296.     //
  297.     unsigned int index;
  298.     for (index = 0; index < testCount; index++)
  299.     {
  300.         // Force full destruction each time
  301.         {
  302.             XMLURL testURL(testList[index].orgURL);
  303.             // Call the comparison function
  304.             if (!checkBasicResult(testURL, testList[index]))
  305.                 retVal = false;
  306.         }
  307.     }
  308.     //
  309.     //  Do a run where we use a single URL object and just reset it over
  310.     //  and over again.
  311.     //
  312.     XMLURL testURL;
  313.     for (index = 0; index < testCount; index++)
  314.     {
  315.         testURL.setURL(testList[index].orgURL);
  316.         // Call the comparison function
  317.         if (!checkBasicResult(testURL, testList[index]))
  318.             retVal = false;
  319.     }
  320.     return retVal;
  321. }
  322. //
  323. //  This test makes sure that parsing one URL relative to another works
  324. //  correctly. The tests used here come from one of the internet RFCs on
  325. //  generic URI syntax. A single base URL is created, then a number of
  326. //  relative URLs are parsed against it and the results compared to the
  327. //  expected result.
  328. //
  329. static bool relativeURLTest()
  330. {
  331.     static struct TestEntry
  332.     {
  333.         const XMLCh*    relative;
  334.         const XMLCh*    result;
  335.     } testList[] =
  336.     {
  337.         { L"g"      , L"http://a/b/c/g" }
  338.       , { L"./g"    , L"http://a/b/c/g" }
  339.       , { L"g/"     , L"http://a/b/c/g/" }
  340.       , { L"/g"     , L"http://a/g" }
  341.       , { L"?y"     , L"http://a/b/c/?y" }
  342.       , { L"g?y"    , L"http://a/b/c/g?y" }
  343.       , { L"#s"     , L"http://a/b/c/d;p#s" }
  344.       , { L"g#s"    , L"http://a/b/c/g#s" }
  345.       , { L"g?y#s"  , L"http://a/b/c/g?y#s" }
  346.       , { L";x"     , L"http://a/b/c/;x" }
  347.       , { L"g;x"    , L"http://a/b/c/g;x" }
  348.       , { L"g;x?y#s", L"http://a/b/c/g;x?y#s" }
  349.       , { L"."      , L"http://a/b/c/" }
  350.       , { L"./"     , L"http://a/b/c/" }
  351.       , { L".."     , L"http://a/b/" }
  352.       , { L"../"    , L"http://a/b/" }
  353.       , { L"../g"   , L"http://a/b/g" }
  354.       , { L"../.."  , L"http://a/" }
  355.       , { L"../../" , L"http://a/" }
  356.       , { L"../../g", L"http://a/g" }
  357.     };
  358.     const unsigned int testCount = sizeof(testList) / sizeof(testList[0]);
  359.     // This is the base URL against which the tests are run
  360.     XMLURL baseURL(L"http://a/b/c/d;p?q");
  361.     bool retVal = true;
  362.     for (unsigned int index = 0; index < testCount; index++)
  363.     {
  364.         XMLURL testURL(baseURL, testList[index].relative);
  365.         if (XMLString::compareString(testURL.getURLText(), testList[index].result))
  366.         {
  367.             std::wcout  << L"Expected URL: " << testList[index].result
  368.                         << L" but got: " << testURL.getURLText() << std::endl;
  369.             retVal = false;
  370.         }
  371.     }
  372.     return retVal;
  373. };
  374. // ---------------------------------------------------------------------------
  375. //  Test entry point
  376. // ---------------------------------------------------------------------------
  377. bool testURL()
  378. {
  379.     std::wcout  << L"----------------------------------n"
  380.                 << L"Testing URL class n"
  381.                 << L"----------------------------------"
  382.                 << std::endl;
  383.     bool retVal = true;
  384.     try
  385.     {
  386.         // Call other local methods to do specific tests
  387.         std::wcout << L"Testing basic URL parsing" << std::endl;
  388.         if (!basicURLTest())
  389.         {
  390.             std::wcout << L"Basic URL parsing tests failed" << std::endl;
  391.             retVal = false;
  392.         }
  393.          else
  394.         {
  395.             std::wcout << L"Basic URL parsing tests passed" << std::endl;
  396.         }
  397.         std::wcout << std::endl;
  398.         std::wcout << L"Testing relative URL parsing" << std::endl;
  399.         if (!relativeURLTest())
  400.         {
  401.             std::wcout << L"Relative URL parsing tests failed" << std::endl;
  402.             retVal = false;
  403.         }
  404.          else
  405.         {
  406.             std::wcout << L"Relative URL parsing tests passed" << std::endl;
  407.         }
  408.         std::wcout << std::endl;
  409.     }
  410.     catch(const XMLException& toCatch)
  411.     {
  412.         std::wcout  << L"  ERROR: Unexpected exception!n   Msg: "
  413.                     << toCatch.getMessage() << std::endl;
  414.         return false;
  415.     }
  416.     return retVal;
  417. }