Back to index

lightning-sunbird  0.9+nobinonly
Defines | Enumerations | Functions | Variables
urltest.cpp File Reference
#include <stdio.h>
#include "TestCommon.h"
#include "plstr.h"
#include "nsIServiceManager.h"
#include "nsIIOService.h"
#include "nsIURL.h"
#include "nsCOMPtr.h"
#include "nsXPIDLString.h"
#include "nsString.h"
#include "nsReadableUtils.h"
#include "nsCRT.h"
#include "nsNetCID.h"
#include "nsIComponentRegistrar.h"

Go to the source code of this file.

Defines

#define RESULT()   NS_SUCCEEDED(rv) ? temp.get() : ""

Enumerations

enum  { URL_FACTORY_DEFAULT, URL_FACTORY_STDURL }

Functions

static NS_DEFINE_CID (kIOServiceCID, NS_IOSERVICE_CID)
static NS_DEFINE_CID (kStdURLCID, NS_STANDARDURL_CID)
nsresult writeoutto (const char *i_pURL, char **o_Result, PRInt32 urlFactory=URL_FACTORY_DEFAULT)
nsresult writeout (const char *i_pURL, PRInt32 urlFactory=URL_FACTORY_DEFAULT)
nsresult testURL (const char *i_pURL, PRInt32 urlFactory=URL_FACTORY_DEFAULT)
nsresult makeAbsTest (const char *i_BaseURI, const char *relativePortion, const char *expectedResult)
int doMakeAbsTest (const char *i_URL=0, const char *i_relativePortion=0)
void printusage (void)
int main (int argc, char **argv)
 The Xalan testcases app.

Variables

char * gFileIO = 0

Define Documentation

#define RESULT ( )    NS_SUCCEEDED(rv) ? temp.get() : ""

Enumeration Type Documentation

anonymous enum
Enumerator:
URL_FACTORY_DEFAULT 
URL_FACTORY_STDURL 

Definition at line 65 of file urltest.cpp.


Function Documentation

int doMakeAbsTest ( const char *  i_URL = 0,
const char *  i_relativePortion = 0 
)

Definition at line 283 of file urltest.cpp.

{
    if (i_URL && i_relativePortion)
    {
        return makeAbsTest(i_URL, i_relativePortion, nsnull);
    }

    // Run standard tests. These tests are based on the ones described in 
    // rfc2396 with the exception of the handling of ?y which is wrong as
    // notified by on of the RFC authors.

    /* Section C.1.  Normal Examples

      g:h        = <URL:g:h>
      g          = <URL:http://a/b/c/g>
      ./g        = <URL:http://a/b/c/g>
      g/         = <URL:http://a/b/c/g/>
      /g         = <URL:http://a/g>
      //g        = <URL:http://g>
      ?y         = <URL:http://a/b/c/d;p?y>
      g?y        = <URL:http://a/b/c/g?y>
      g?y/./x    = <URL:http://a/b/c/g?y/./x>
      #s         = <URL:http://a/b/c/d;p?q#s>
      g#s        = <URL:http://a/b/c/g#s>
      g#s/./x    = <URL:http://a/b/c/g#s/./x>
      g?y#s      = <URL:http://a/b/c/g?y#s>
      ;x         = <URL:http://a/b/c/;x>
      g;x        = <URL:http://a/b/c/g;x>
      g;x?y#s    = <URL:http://a/b/c/g;x?y#s>
      .          = <URL:http://a/b/c/>
      ./         = <URL:http://a/b/c/>
      ..         = <URL:http://a/b/>
      ../        = <URL:http://a/b/>
      ../g       = <URL:http://a/b/g>
      ../..      = <URL:http://a/>
      ../../     = <URL:http://a/>
      ../../g    = <URL:http://a/g>
    */

    struct test {
        const char* baseURL;
        const char* relativeURL;
        const char* expectedResult;
    };

    test tests[] = {
        // Tests from rfc2396, section C.1 with the exception of the
        // handling of ?y
        { "http://a/b/c/d;p?q#f",     "g:h",         "g:h" },
        { "http://a/b/c/d;p?q#f",     "g",           "http://a/b/c/g" },
        { "http://a/b/c/d;p?q#f",     "./g",         "http://a/b/c/g" },
        { "http://a/b/c/d;p?q#f",     "g/",          "http://a/b/c/g/" },
        { "http://a/b/c/d;p?q#f",     "/g",          "http://a/g" },
        { "http://a/b/c/d;p?q#f",     "//g",         "http://g" },
        { "http://a/b/c/d;p?q#f",     "?y",          "http://a/b/c/d;p?y" },
        { "http://a/b/c/d;p?q#f",     "g?y",         "http://a/b/c/g?y" },
        { "http://a/b/c/d;p?q#f",     "g?y/./x",     "http://a/b/c/g?y/./x" },
        { "http://a/b/c/d;p?q#f",     "#s",          "http://a/b/c/d;p?q#s" },
        { "http://a/b/c/d;p?q#f",     "g#s",         "http://a/b/c/g#s" },
        { "http://a/b/c/d;p?q#f",     "g#s/./x",     "http://a/b/c/g#s/./x" },
        { "http://a/b/c/d;p?q#f",     "g?y#s",       "http://a/b/c/g?y#s" },
        { "http://a/b/c/d;p?q#f",     ";x",          "http://a/b/c/;x" },
        { "http://a/b/c/d;p?q#f",     "g;x",         "http://a/b/c/g;x" },
        { "http://a/b/c/d;p?q#f",     "g;x?y#s",     "http://a/b/c/g;x?y#s" },
        { "http://a/b/c/d;p?q#f",     ".",           "http://a/b/c/" },
        { "http://a/b/c/d;p?q#f",     "./",          "http://a/b/c/" },
        { "http://a/b/c/d;p?q#f",     "..",          "http://a/b/" },
        { "http://a/b/c/d;p?q#f",     "../",         "http://a/b/" },
        { "http://a/b/c/d;p?q#f",     "../g",        "http://a/b/g" },
        { "http://a/b/c/d;p?q#f",     "../..",       "http://a/" },
        { "http://a/b/c/d;p?q#f",     "../../",      "http://a/" },
        { "http://a/b/c/d;p?q#f",     "../../g",     "http://a/g" },

        // Our additional tests...
        { "http://a/b/c/d;p?q#f",     "#my::anchor", "http://a/b/c/d;p?q#my::anchor" },
        { "http://a/b/c/d;p?q#f",     "get?baseRef=viewcert.jpg", "http://a/b/c/get?baseRef=viewcert.jpg" },

        // Make sure relative query's work right even if the query
        // string contains absolute urls or other junk.
        { "http://a/b/c/d;p?q#f",     "?http://foo",        "http://a/b/c/d;p?http://foo" },
        { "http://a/b/c/d;p?q#f",     "g?http://foo",       "http://a/b/c/g?http://foo" },
        {"http://a/b/c/d;p?q#f",      "g/h?http://foo",     "http://a/b/c/g/h?http://foo" },
        { "http://a/b/c/d;p?q#f",     "g/h/../H?http://foo","http://a/b/c/g/H?http://foo" },
        { "http://a/b/c/d;p?q#f",     "g/h/../H?http://foo?baz", "http://a/b/c/g/H?http://foo?baz" },
        { "http://a/b/c/d;p?q#f",     "g/h/../H?http://foo;baz", "http://a/b/c/g/H?http://foo;baz" },
        { "http://a/b/c/d;p?q#f",     "g/h/../H?http://foo#bar", "http://a/b/c/g/H?http://foo#bar" },
        { "http://a/b/c/d;p?q#f",     "g/h/../H;baz?http://foo", "http://a/b/c/g/H;baz?http://foo" },
        { "http://a/b/c/d;p?q#f",     "g/h/../H;baz?http://foo#bar", "http://a/b/c/g/H;baz?http://foo#bar" },
        { "http://a/b/c/d;p?q#f",     "g/h/../H;baz?C:\\temp", "http://a/b/c/g/H;baz?C:\\temp" },
        { "http://a/b/c/d;p?q#f",     "", "http://a/b/c/d;p?q" },
        { "http://a/b/c/d;p?q#f",     "#", "http://a/b/c/d;p?q#" },
        { "http://a/b/c;p/d;p?q#f",   "../g;p" , "http://a/b/g;p" },

    };

    const int numTests = sizeof(tests) / sizeof(tests[0]);
    int failed = 0;
    nsresult rv;
    for (int i = 0 ; i<numTests ; ++i)
    {
        rv = makeAbsTest(tests[i].baseURL, tests[i].relativeURL,
                         tests[i].expectedResult);
        if (NS_FAILED(rv))
            failed++;
    }
    if (failed>0) {
        printf("%d tests FAILED out of %d\n", failed, numTests);
        return NS_ERROR_FAILURE;
    } else {
        printf("All %d tests PASSED.\n", numTests);
        return NS_OK;
    }
}

Here is the call graph for this function:

Here is the caller graph for this function:

int main ( int  argc,
char **  argv 
)

The Xalan testcases app.

Definition at line 410 of file urltest.cpp.

{
    if (test_common_init(&argc, &argv) != 0)
        return -1;

    int rv = -1;

    if (argc < 2) {
        printusage();
        return NS_OK;
    }
    {
        nsCOMPtr<nsIServiceManager> servMan;
        NS_InitXPCOM2(getter_AddRefs(servMan), nsnull, nsnull);
        nsCOMPtr<nsIComponentRegistrar> registrar = do_QueryInterface(servMan);
        NS_ASSERTION(registrar, "Null nsIComponentRegistrar");
        if (registrar)
            registrar->AutoRegister(nsnull);

        // end of all messages from register components...
        printf("------------------\n\n");

        PRInt32 urlFactory = URL_FACTORY_DEFAULT;
        PRBool bMakeAbs= PR_FALSE;
        char* relativePath = 0;
        char* url = 0;
        for (int i=1; i<argc; i++) {
            if (PL_strcasecmp(argv[i], "-std") == 0)
            {
                urlFactory = URL_FACTORY_STDURL;
                if (i+1 >= argc)
                {
                    printusage();
                    return NS_OK;
                }
            }
            else if (PL_strcasecmp(argv[i], "-abs") == 0)
            {
                if (!gFileIO)
                {
                    relativePath = argv[i+1];
                    i++;
                }
                bMakeAbs = PR_TRUE;
            }
            else if (PL_strcasecmp(argv[i], "-file") == 0)
            {
                if (i+1 >= argc)
                {
                    printusage();
                    return NS_OK;
                }
                gFileIO = argv[i+1];
                i++;
            }
            else
            {
                url = argv[i];
            }
        }
        PRTime startTime = PR_Now();
        if (bMakeAbs)
        {
            rv = (url && relativePath)
               ? doMakeAbsTest(url, relativePath)
               : doMakeAbsTest();
        }
        else
        {
            rv = gFileIO ? testURL(0, urlFactory) : testURL(url, urlFactory);
        }
        if (gFileIO)
        {
            PRTime endTime = PR_Now();
            printf("Elapsed time: %d micros.\n", (PRInt32)
                (endTime - startTime));
        }
    } // this scopes the nsCOMPtrs
    // no nsCOMPtrs are allowed to be alive when you call NS_ShutdownXPCOM
    rv = NS_ShutdownXPCOM(nsnull);
    return rv;
}

Here is the call graph for this function:

nsresult makeAbsTest ( const char *  i_BaseURI,
const char *  relativePortion,
const char *  expectedResult 
)

Definition at line 239 of file urltest.cpp.

{
    if (!i_BaseURI)
        return NS_ERROR_FAILURE;

    // build up the base URL
    nsresult status;
    nsCOMPtr<nsIURI> baseURL = do_CreateInstance(kStdURLCID, &status);
    if (NS_FAILED(status))
    {
        printf("CreateInstance failed\n");
        return status;
    }
    status = baseURL->SetSpec(nsDependentCString(i_BaseURI));
    if (NS_FAILED(status)) return status;


    // get the new spec
    nsCAutoString newURL;
    status = baseURL->Resolve(nsDependentCString(relativePortion), newURL);
    if (NS_FAILED(status)) return status;

    nsCAutoString temp;
    baseURL->GetSpec(temp);

    printf("Analyzing %s\n", temp.get());
    printf("With      %s\n", relativePortion);

    printf("Got       %s\n", newURL.get());
    if (expectedResult) {
        printf("Expect    %s\n", expectedResult);
        int res = PL_strcmp(newURL.get(), expectedResult);
        if (res == 0) {
            printf("\tPASSED\n\n");
            return NS_OK;
        } else {
            printf("\tFAILED\n\n");
            return NS_ERROR_FAILURE;
        }
    }
    return NS_OK;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static NS_DEFINE_CID ( kIOServiceCID  ,
NS_IOSERVICE_CID   
) [static]
static NS_DEFINE_CID ( kStdURLCID  ,
NS_STANDARDURL_CID   
) [static]

Definition at line 397 of file urltest.cpp.

{
    printf("urltest [-std] [-file <filename>] <URL> "
           " [-abs <relative>]\n\n"
           "\t-std  : Generate results using nsStdURL.\n"
           "\t-file : Read URLs from file.\n"
           "\t-abs  : Make an absolute URL from the base (<URL>) and the\n"
           "\t\trelative path specified. If -abs is given without\n"
           "\t\ta base URI standard RFC 2396 relative URL tests\n"
           "\t\tare performed. Implies -std.\n"
           "\t<URL> : The string representing the URL.\n");
}

Here is the caller graph for this function:

nsresult testURL ( const char *  i_pURL,
PRInt32  urlFactory = URL_FACTORY_DEFAULT 
)

Definition at line 168 of file urltest.cpp.

{

    if (i_pURL)
        return writeout(i_pURL, urlFactory);

    if (!gFileIO)
        return NS_ERROR_FAILURE;

    FILE *testfile = fopen(gFileIO, "rt");
    if (!testfile) 
    {
        fprintf(stderr, "Cannot open testfile: %s\n", gFileIO);
        return NS_ERROR_FAILURE;
    }

    char temp[512];
    int count=0;
    int failed=0;
    char* prevResult = nsnull;
    char* tempurl = nsnull;

    while (fgets(temp,512,testfile))
    {
        if (*temp == '#' || !*temp)
            continue;

        if (0 == count%3)
        {
            if (prevResult) delete[] prevResult;
            printf("Testing:  %s\n", temp);
            writeoutto(temp, &prevResult, urlFactory);
        }
        else if (1 == count%3) {
            if (tempurl) delete[] tempurl;
            tempurl = nsCRT::strdup(temp);
        } else { 
            if (!prevResult)
                printf("no results to compare to!\n");
            else 
            {
                PRInt32 res;
                printf("Result:   %s\n", prevResult);
                if (urlFactory != URL_FACTORY_DEFAULT) {
                    printf("Expected: %s\n", tempurl);
                    res = PL_strcmp(tempurl, prevResult);
                } else {
                    printf("Expected: %s\n", temp);
                    res = PL_strcmp(temp, prevResult);
                }

                if (res == 0)
                    printf("\tPASSED\n\n");
                else 
                {
                    printf("\tFAILED\n\n");
                    failed++;
                }
            }
        }
        count++;
    }
    if (failed>0) {
        printf("%d tests FAILED out of %d\n", failed, count/3);
        return NS_ERROR_FAILURE;
    } else {
        printf("All %d tests PASSED.\n", count/3);
        return NS_OK;
    }
}

Here is the call graph for this function:

Here is the caller graph for this function:

nsresult writeout ( const char *  i_pURL,
PRInt32  urlFactory = URL_FACTORY_DEFAULT 
)

Definition at line 156 of file urltest.cpp.

{
    char* temp = 0;
    if (!i_pURL) return NS_ERROR_FAILURE;
    int rv = writeoutto(i_pURL, &temp, urlFactory);
    printf("%s\n%s\n", i_pURL, temp);
    delete[] temp;
    return rv;
}

Here is the call graph for this function:

Here is the caller graph for this function:

nsresult writeoutto ( const char *  i_pURL,
char **  o_Result,
PRInt32  urlFactory = URL_FACTORY_DEFAULT 
)

Definition at line 70 of file urltest.cpp.

{
    if (!o_Result || !i_pURL)
        return NS_ERROR_FAILURE;
    *o_Result = 0;
    nsCOMPtr<nsIURI> pURL;
    nsresult result = NS_OK;

    switch (urlFactory) {
        case URL_FACTORY_STDURL: {
            nsIURI* url;
            result = CallCreateInstance(kStdURLCID, &url);
            if (NS_FAILED(result))
            {
                printf("CreateInstance failed\n");
                return NS_ERROR_FAILURE;
            }
            pURL = url;
            pURL->SetSpec(nsDependentCString(i_pURL));
            break;
        }
        case URL_FACTORY_DEFAULT: {
            nsCOMPtr<nsIIOService> pService = 
                     do_GetService(kIOServiceCID, &result);
            if (NS_FAILED(result)) 
            {
                printf("Service failed!\n");
                return NS_ERROR_FAILURE;
            }   
            result = pService->NewURI(nsDependentCString(i_pURL), nsnull, nsnull, getter_AddRefs(pURL));
        }
    }

    nsCString output;
    if (NS_SUCCEEDED(result))
    {
        nsCOMPtr<nsIURL> tURL = do_QueryInterface(pURL);
        nsCAutoString temp;
        PRInt32 port;
        nsresult rv;

#define RESULT() NS_SUCCEEDED(rv) ? temp.get() : ""

        rv = tURL->GetScheme(temp);
        output += RESULT();
        output += ',';
        rv = tURL->GetUsername(temp);
        output += RESULT();
        output += ',';
        rv = tURL->GetPassword(temp);
        output += RESULT();
        output += ',';
        rv = tURL->GetHost(temp);
        output += RESULT();
        output += ',';
        rv = tURL->GetPort(&port);
        output.AppendInt(port);
        output += ',';
        rv = tURL->GetDirectory(temp);
        output += RESULT();
        output += ',';
        rv = tURL->GetFileBaseName(temp);
        output += RESULT();
        output += ',';
        rv = tURL->GetFileExtension(temp);
        output += RESULT();
        output += ',';
        rv = tURL->GetParam(temp);
        output += RESULT();
        output += ',';
        rv = tURL->GetQuery(temp);
        output += RESULT();
        output += ',';
        rv = tURL->GetRef(temp);
        output += RESULT();
        output += ',';
        rv = tURL->GetSpec(temp);
        output += RESULT();
        *o_Result = ToNewCString(output);
    } else {
        output = "Can not create URL";
        *o_Result = ToNewCString(output);
    }
    return NS_OK;
}

Here is the call graph for this function:

Here is the caller graph for this function:


Variable Documentation

char* gFileIO = 0

Definition at line 63 of file urltest.cpp.