toolkit/components/feeds/test/shell.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/toolkit/components/feeds/test/shell.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,129 @@
     1.4 +/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
     1.5 + * This Source Code Form is subject to the terms of the Mozilla Public
     1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this
     1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     1.8 +
     1.9 +// shell.js
    1.10 +// This file sets up the unit test environment by building an array of files
    1.11 +// to be tested. It assumes it lives in a folder adjacent to the a folder
    1.12 +// called 'xml', where the testcases live.
    1.13 +//
    1.14 +// The directory layout looks something like this:
    1.15 +//
    1.16 +// tests/ *shell.js*
    1.17 +//       |                  
    1.18 +//       - test.js
    1.19 +//       |
    1.20 +//       - xml/ -- rss1/... 
    1.21 +//              |
    1.22 +//              -- rss2/...
    1.23 +//              |
    1.24 +//              -- atom/testcase.xml
    1.25 +
    1.26 +function trimString(s)
    1.27 +{
    1.28 +  return(s.replace(/^\s+/,'').replace(/\s+$/,''));
    1.29 +}
    1.30 +
    1.31 +var tests = new Array();
    1.32 +const ioService = Components.classes['@mozilla.org/network/io-service;1'].getService(Components.interfaces.nsIIOService);
    1.33 +
    1.34 +// find the directory containing our test XML
    1.35 +
    1.36 +if (0 < arguments.length) {
    1.37 +
    1.38 +  // dir is specified on the command line
    1.39 +  
    1.40 +  var topDir = Components.classes["@mozilla.org/file/local;1"]
    1.41 +    .createInstance(Components.interfaces.nsILocalFile);
    1.42 +  
    1.43 +  topDir.initWithPath(arguments[0]);
    1.44 +}
    1.45 +else {
    1.46 +  const nsIDirectoryServiceProvider
    1.47 +    = Components.interfaces.nsIDirectoryServiceProvider;
    1.48 +  const nsIDirectoryServiceProvider_CONTRACTID
    1.49 +    = "@mozilla.org/file/directory_service;1";
    1.50 +
    1.51 +  var dirServiceProvider 
    1.52 +    = Components.classes[nsIDirectoryServiceProvider_CONTRACTID]
    1.53 +    .getService(nsIDirectoryServiceProvider);
    1.54 +
    1.55 +  var persistent = new Object();
    1.56 +
    1.57 +  var topDir = dirServiceProvider.getFile("CurWorkD", persistent);
    1.58 +}
    1.59 +
    1.60 +var entries = topDir.directoryEntries;
    1.61 +var xmlDir;
    1.62 +while(entries.hasMoreElements()){
    1.63 +  xmlDir = entries.getNext();
    1.64 +  xmlDir.QueryInterface(Components.interfaces.nsILocalFile);
    1.65 +  if(xmlDir.leafName == "xml") 
    1.66 +    break;
    1.67 +  else
    1.68 +    xmlDir = null;
    1.69 +}
    1.70 +
    1.71 +// if we got our xmldir, find our testcases
    1.72 +var testDir;
    1.73 +if(xmlDir){
    1.74 +  entries = xmlDir.directoryEntries;
    1.75 +  while(entries.hasMoreElements()){
    1.76 +    testDir = entries.getNext();
    1.77 +    testDir.QueryInterface(Components.interfaces.nsILocalFile);
    1.78 +    if(testDir.exists() && testDir.isDirectory()){
    1.79 +      var testfiles = testDir.directoryEntries;
    1.80 +      while(testfiles.hasMoreElements()){ // inside an individual testdir, like "rss2"
    1.81 +        var test = testfiles.getNext();
    1.82 +        test.QueryInterface(Components.interfaces.nsILocalFile);
    1.83 +        if(test.exists() && test.isFile()){
    1.84 +          
    1.85 +          // Got a feed file, now we need to add it to our tests
    1.86 +          // and parse out the Description and Expect headers.
    1.87 +          // That lets us write one test.js file and keep the
    1.88 +          // tests with the XML. Convenient method learned from
    1.89 +          // Mark Pilgrim.
    1.90 +
    1.91 +          var istream = Components.classes["@mozilla.org/network/file-input-stream;1"]
    1.92 +                                  .createInstance(Components.interfaces.nsIFileInputStream);
    1.93 +          
    1.94 +          try{
    1.95 +            // open an input stream from file
    1.96 +            istream.init(test, 0x01, 0444, 0);
    1.97 +            istream.QueryInterface(Components.interfaces.nsILineInputStream);
    1.98 +            var line = {}, hasmore, testcase = {}, expectIndex, descIndex;
    1.99 +
   1.100 +            do {
   1.101 +              hasmore = istream.readLine(line);
   1.102 +              expectIndex = line.value.indexOf('Expect:');
   1.103 +              descIndex = line.value.indexOf('Description:');
   1.104 +              baseIndex = line.value.indexOf('Base:');
   1.105 +              if(descIndex > -1)
   1.106 +                testcase.desc = trimString(line.value.substring(line.value.indexOf(':')+1));
   1.107 +              if(expectIndex > -1)
   1.108 +                testcase.expect = trimString(line.value.substring(line.value.indexOf(':')+1));
   1.109 +              if(baseIndex > -1)
   1.110 +                testcase.base = ioService.newURI(trimString(line.value.substring(line.value.indexOf(':')+1)),null,null);
   1.111 +              if(testcase.expect && testcase.desc){
   1.112 +                // got our fields, let's add it to our array and break
   1.113 +                testcase.path = xmlDir.leafName + '/' + testDir.leafName + '/' + test.leafName;
   1.114 +                testcase.file = test;
   1.115 +                tests.push(testcase);
   1.116 +                break; // out of do-while
   1.117 +              }
   1.118 +              
   1.119 +            } while(hasmore);
   1.120 +
   1.121 +          }catch(e){
   1.122 +            dump("FAILED! Error reading test case in file " + test.leafName  + " " + e + "\n"); 
   1.123 +          }finally{
   1.124 +            istream.close();
   1.125 +          }
   1.126 +        }
   1.127 +      }
   1.128 +    }
   1.129 +  }
   1.130 +}
   1.131 +
   1.132 +load(topDir.path+'/test.js');

mercurial