Author: ab
Date: Wed Jul 21 17:48:20 2010
New Revision: 966330

URL: http://svn.apache.org/viewvc?rev=966330&view=rev
Log:
Make some classes easier to test. Fix unit some unit tests.

Added:
    nutch/branches/nutchbase/src/test/org/apache/nutch/fetcher/TestFetcher.java 
  (with props)
    
nutch/branches/nutchbase/src/test/org/apache/nutch/util/AbstractNutchTest.java  
 (with props)
    nutch/branches/nutchbase/src/test/org/apache/nutch/util/CrawlTestUtil.java  
 (with props)
Removed:
    
nutch/branches/nutchbase/src/test/org/apache/nutch/crawl/CrawlDBTestUtil.java
Modified:
    nutch/branches/nutchbase/src/java/org/apache/nutch/crawl/GeneratorJob.java
    nutch/branches/nutchbase/src/java/org/apache/nutch/crawl/InjectorJob.java
    nutch/branches/nutchbase/src/java/org/apache/nutch/fetcher/FetcherJob.java
    nutch/branches/nutchbase/src/test/org/apache/nutch/crawl/TestGenerator.java
    nutch/branches/nutchbase/src/test/org/apache/nutch/crawl/TestInjector.java

Modified: 
nutch/branches/nutchbase/src/java/org/apache/nutch/crawl/GeneratorJob.java
URL: 
http://svn.apache.org/viewvc/nutch/branches/nutchbase/src/java/org/apache/nutch/crawl/GeneratorJob.java?rev=966330&r1=966329&r2=966330&view=diff
==============================================================================
--- nutch/branches/nutchbase/src/java/org/apache/nutch/crawl/GeneratorJob.java 
(original)
+++ nutch/branches/nutchbase/src/java/org/apache/nutch/crawl/GeneratorJob.java 
Wed Jul 21 17:48:20 2010
@@ -9,6 +9,7 @@ import java.util.Set;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.conf.Configured;
 import org.apache.hadoop.io.Text;
 import org.apache.hadoop.io.WritableComparable;
@@ -32,16 +33,13 @@ public class GeneratorJob extends Config
   public static final String GENERATOR_COUNT_MODE = "generate.count.mode";
   public static final String GENERATOR_COUNT_VALUE_DOMAIN = "domain";
   public static final String GENERATOR_COUNT_VALUE_HOST = "host";
+  public static final String GENERATOR_COUNT_VALUE_IP = "ip";
   public static final String GENERATOR_TOP_N = "generate.topN";
   public static final String GENERATOR_CUR_TIME = "generate.curTime";
   public static final String GENERATOR_DELAY = "crawl.gen.delay";
   public static final String GENERATOR_RANDOM_SEED = "generate.partition.seed";
   public static final String CRAWL_ID = "generate.crawl.id";
 
-  // deprecated parameters
-  public static final String GENERATE_MAX_PER_HOST_BY_IP = 
"generate.max.per.host.by.ip";
-  public static final String GENERATE_MAX_PER_HOST = "generate.max.per.host";
-
   private static final Set<WebPage.Field> FIELDS = new 
HashSet<WebPage.Field>();
 
   static {
@@ -115,13 +113,21 @@ public class GeneratorJob extends Config
                               new SelectorEntryComparator());
   }
 
+  public GeneratorJob() {
+    
+  }
+  
+  public GeneratorJob(Configuration conf) {
+    setConf(conf);
+  }
+  
   /**
    * Mark URLs ready for fetching.
    * @throws ClassNotFoundException
    * @throws InterruptedException
    * */
   public String generate(long topN, long curTime, boolean filter, boolean norm)
-  throws Exception {
+      throws Exception {
 
     LOG.info("GeneratorJob: Selecting best-scoring urls due for fetch.");
     LOG.info("GeneratorJob: starting");
@@ -140,6 +146,16 @@ public class GeneratorJob extends Config
     getConf().set(CRAWL_ID, crawlId);
     getConf().setLong(Nutch.GENERATE_TIME_KEY, System.currentTimeMillis());
     getConf().setBoolean(GENERATOR_NORMALISE, norm);
+    String mode = getConf().get(GENERATOR_COUNT_MODE, 
GENERATOR_COUNT_VALUE_HOST);
+    if (GENERATOR_COUNT_VALUE_HOST.equalsIgnoreCase(mode)) {
+      getConf().set(URLPartitioner.PARTITION_MODE_KEY, 
URLPartitioner.PARTITION_MODE_HOST);
+    } else if (GENERATOR_COUNT_VALUE_DOMAIN.equalsIgnoreCase(mode)) {
+        getConf().set(URLPartitioner.PARTITION_MODE_KEY, 
URLPartitioner.PARTITION_MODE_DOMAIN);
+    } else {
+      LOG.warn("Unknown generator.max.count mode '" + mode + "', using mode=" 
+ GENERATOR_COUNT_VALUE_HOST);
+      getConf().set(GENERATOR_COUNT_MODE, GENERATOR_COUNT_VALUE_HOST);
+      getConf().set(URLPartitioner.PARTITION_MODE_KEY, 
URLPartitioner.PARTITION_MODE_HOST);
+    }
 
     Job job = new NutchJob(getConf(), "generate: " + crawlId);
     StorageUtils.initMapperJob(job, FIELDS, SelectorEntry.class, WebPage.class,

Modified: 
nutch/branches/nutchbase/src/java/org/apache/nutch/crawl/InjectorJob.java
URL: 
http://svn.apache.org/viewvc/nutch/branches/nutchbase/src/java/org/apache/nutch/crawl/InjectorJob.java?rev=966330&r1=966329&r2=966330&view=diff
==============================================================================
--- nutch/branches/nutchbase/src/java/org/apache/nutch/crawl/InjectorJob.java 
(original)
+++ nutch/branches/nutchbase/src/java/org/apache/nutch/crawl/InjectorJob.java 
Wed Jul 21 17:48:20 2010
@@ -169,6 +169,14 @@ public class InjectorJob extends GoraMap
     }
   }
 
+  public InjectorJob() {
+    
+  }
+  
+  public InjectorJob(Configuration conf) {
+    setConf(conf);
+  }
+  
   @Override
   public Configuration getConf() {
     return conf;
@@ -202,7 +210,7 @@ public class InjectorJob extends GoraMap
     context.write(key, row);
   }
 
-  void inject(Path urlDir) throws Exception {
+  public void inject(Path urlDir) throws Exception {
     LOG.info("InjectorJob: starting");
     LOG.info("InjectorJob: urlDir: " + urlDir);
 

Modified: 
nutch/branches/nutchbase/src/java/org/apache/nutch/fetcher/FetcherJob.java
URL: 
http://svn.apache.org/viewvc/nutch/branches/nutchbase/src/java/org/apache/nutch/fetcher/FetcherJob.java?rev=966330&r1=966329&r2=966330&view=diff
==============================================================================
--- nutch/branches/nutchbase/src/java/org/apache/nutch/fetcher/FetcherJob.java 
(original)
+++ nutch/branches/nutchbase/src/java/org/apache/nutch/fetcher/FetcherJob.java 
Wed Jul 21 17:48:20 2010
@@ -38,6 +38,10 @@ public class FetcherJob implements Tool 
   public static final int PERM_REFRESH_TIME = 5;
 
   public static final Utf8 REDIRECT_DISCOVERED = new Utf8("___rdrdsc__");
+  
+  public static final String RESUME_KEY = "fetcher.job.resume";
+  public static final String PARSE_KEY = "fetcher.parse";
+  public static final String THREADS_KEY = "fetcher.threads.fetch";
 
   private static final Collection<WebPage.Field> FIELDS = new 
HashSet<WebPage.Field>();
 
@@ -103,6 +107,14 @@ public class FetcherJob implements Tool 
   public static final Log LOG = LogFactory.getLog(FetcherJob.class);
 
   private Configuration conf;
+  
+  public FetcherJob() {
+    
+  }
+  
+  public FetcherJob(Configuration conf) {
+    setConf(conf);
+  }
 
   @Override
   public Configuration getConf() {
@@ -116,7 +128,7 @@ public class FetcherJob implements Tool 
 
   public Collection<WebPage.Field> getFields(Job job) {
     Collection<WebPage.Field> fields = new HashSet<WebPage.Field>(FIELDS);
-    if (job.getConfiguration().getBoolean("fetcher.parse", true)) {
+    if (job.getConfiguration().getBoolean(PARSE_KEY, true)) {
       ParserJob parserJob = new ParserJob();
       fields.addAll(parserJob.getFields(job));
     }
@@ -126,18 +138,18 @@ public class FetcherJob implements Tool 
     return fields;
   }
 
-  private void fetch(int threads, String crawlId, boolean shouldContinue, 
boolean isParsing)
-  throws Exception {
+  public  void fetch(int threads, String crawlId, boolean shouldResume, 
boolean isParsing)
+      throws Exception {
     LOG.info("FetcherJob: starting");
 
     checkConfiguration();
 
     if (threads > 0) {
-      getConf().setInt("fetcher.threads.fetch", threads);
+      getConf().setInt(THREADS_KEY, threads);
     }
     getConf().set(GeneratorJob.CRAWL_ID, crawlId);
-    getConf().setBoolean("fetcher.parse", isParsing);
-    getConf().setBoolean("job.continue", shouldContinue);
+    getConf().setBoolean(PARSE_KEY, isParsing);
+    getConf().setBoolean(RESUME_KEY, shouldResume);
     
     // set the actual time for the timelimit relative
     // to the beginning of the whole job and not of a specific task
@@ -149,9 +161,9 @@ public class FetcherJob implements Tool 
     }
 
     LOG.info("FetcherJob : timelimit set for : " + timelimit);
-    LOG.info("FetcherJob: threads: " + 
getConf().getInt("fetcher.threads.fetch", 10));
-    LOG.info("FetcherJob: parsing: " + getConf().getBoolean("fetcher.parse", 
true));
-    LOG.info("FetcherJob: continuing: " + getConf().getBoolean("job.continue", 
false));
+    LOG.info("FetcherJob: threads: " + getConf().getInt(THREADS_KEY, 10));
+    LOG.info("FetcherJob: parsing: " + getConf().getBoolean(PARSE_KEY, true));
+    LOG.info("FetcherJob: resuming: " + getConf().getBoolean(RESUME_KEY, 
false));
     if (crawlId.equals(Nutch.ALL_CRAWL_ID_STR)) {
       LOG.info("FetcherJob: fetching all");
     } else {
@@ -170,7 +182,7 @@ public class FetcherJob implements Tool 
     LOG.info("FetcherJob: done");
   }
 
-  private void checkConfiguration() {
+  void checkConfiguration() {
 
     // ensure that a value has been set for the agent name and that that
     // agent name is the first value in the agents we advertise for robot
@@ -206,34 +218,34 @@ public class FetcherJob implements Tool 
   @Override
   public int run(String[] args) throws Exception {
     int threads = -1;
-    boolean shouldContinue = false;
+    boolean shouldResume = false;
     boolean isParsing = true;
     String crawlId;
 
-    String usage = "Usage: FetcherJob (<crawl id> | -all) [-threads N] 
[-noParsing] [-continue]";
+    String usage = "Usage: FetcherJob (<crawl id> | -all) [-threads N] 
[-noParsing] [-resume]";
 
     if (args.length == 0) {
       System.err.println(usage);
-      return 1;
+      return -1;
     }
 
     crawlId = args[0];
-    if (crawlId.equals("-threads") || crawlId.equals("-continue") || 
crawlId.equals("-noParsing")) {
+    if (crawlId.equals("-threads") || crawlId.equals("-resume") || 
crawlId.equals("-noParsing")) {
       System.err.println(usage);
-      return 1;
+      return -1;
     }
     for (int i = 1; i < args.length; i++) {
       if ("-threads".equals(args[i])) {
         // found -threads option
         threads = Integer.parseInt(args[++i]);
-      } else if ("-continue".equals(args[i])) {
-        shouldContinue = true;
+      } else if ("-resume".equals(args[i])) {
+        shouldResume = true;
       } else if ("-noParsing".equals(args[i])) {
         isParsing = false;
       }
     }
 
-    fetch(threads, crawlId, shouldContinue, isParsing); // run the Fetcher
+    fetch(threads, crawlId, shouldResume, isParsing); // run the Fetcher
 
     return 0;
   }

Modified: 
nutch/branches/nutchbase/src/test/org/apache/nutch/crawl/TestGenerator.java
URL: 
http://svn.apache.org/viewvc/nutch/branches/nutchbase/src/test/org/apache/nutch/crawl/TestGenerator.java?rev=966330&r1=966329&r2=966330&view=diff
==============================================================================
--- nutch/branches/nutchbase/src/test/org/apache/nutch/crawl/TestGenerator.java 
(original)
+++ nutch/branches/nutchbase/src/test/org/apache/nutch/crawl/TestGenerator.java 
Wed Jul 21 17:48:20 2010
@@ -20,20 +20,13 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
-
-import junit.framework.TestCase;
-
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.nutch.storage.Mark;
 import org.apache.nutch.storage.WebPage;
+import org.apache.nutch.util.AbstractNutchTest;
 import org.apache.nutch.util.TableUtil;
-import org.gora.query.Query;
-import org.gora.query.Result;
-import org.gora.sql.store.SqlStore;
-import org.gora.store.DataStore;
-import org.gora.store.DataStoreFactory;
 
 /**
  * Basic generator test. 1. Insert entries in webtable 2. Generates entries to
@@ -44,32 +37,14 @@ import org.gora.store.DataStoreFactory;
  * @param <URLWebPage>
  *
  */
-public class TestGenerator extends TestCase {
+public class TestGenerator extends AbstractNutchTest {
 
   public static final Log LOG = LogFactory.getLog(TestGenerator.class);
-
-  Configuration conf;
-
-  private DataStore<String, WebPage> webPageStore;
-
-  @Override
-  protected void setUp() throws Exception {
-    super.setUp();
-    conf = CrawlDBTestUtil.createConfiguration();
-    // using hsqldb in memory
-    
DataStoreFactory.properties.setProperty("gora.sqlstore.jdbc.driver","org.hsqldb.jdbcDriver");
-    
DataStoreFactory.properties.setProperty("gora.sqlstore.jdbc.url","jdbc:hsqldb:mem:.");
-    DataStoreFactory.properties.setProperty("gora.sqlstore.jdbc.user","sa");
-    DataStoreFactory.properties.setProperty("gora.sqlstore.jdbc.password","");
-    webPageStore = DataStoreFactory.getDataStore(SqlStore.class,
-        String.class, WebPage.class);
-  }
-
-  @Override
-  protected void tearDown() throws Exception {
-    webPageStore.close();
-    super.tearDown();
-  }
+  
+  private static String[] FIELDS = new String[] {
+    WebPage.Field.MARKERS.getName(),
+    WebPage.Field.SCORE.getName()
+  };
 
   /**
    * Test that generator generates fetchlish ordered by score (desc).
@@ -89,10 +64,11 @@ public class TestGenerator extends TestC
     for (URLWebPage uwp : list) {
       webPageStore.put(TableUtil.reverseUrl(uwp.getUrl()), uwp.getDatum());
     }
+    webPageStore.flush();
 
     generateFetchlist(NUM_RESULTS, conf, false);
 
-    ArrayList<URLWebPage> l = readContents();
+    ArrayList<URLWebPage> l = readContents(webPageStore, Mark.GENERATE_MARK, 
FIELDS);
 
     // sort urls by score desc
     Collections.sort(l, new ScoreComparator());
@@ -144,77 +120,83 @@ public class TestGenerator extends TestC
     for (URLWebPage uwp : list) {
       webPageStore.put(TableUtil.reverseUrl(uwp.getUrl()), uwp.getDatum());
     }
+    webPageStore.flush();
 
     Configuration myConfiguration = new Configuration(conf);
-    myConfiguration.setInt(GeneratorJob.GENERATE_MAX_PER_HOST, 1);
+    myConfiguration.setInt(GeneratorJob.GENERATOR_MAX_COUNT, 1);
+    myConfiguration.set(GeneratorJob.GENERATOR_COUNT_MODE, 
GeneratorJob.GENERATOR_COUNT_VALUE_HOST);
     generateFetchlist(Integer.MAX_VALUE, myConfiguration, false);
 
-    ArrayList<URLWebPage> fetchList = readContents();
+    ArrayList<URLWebPage> fetchList = readContents(webPageStore, 
Mark.GENERATE_MARK, FIELDS);
 
     // verify we got right amount of records
     assertEquals(1, fetchList.size());
 
     myConfiguration = new Configuration(conf);
-    myConfiguration.setInt(GeneratorJob.GENERATE_MAX_PER_HOST, 2);
+    myConfiguration.setInt(GeneratorJob.GENERATOR_MAX_COUNT, 2);
     generateFetchlist(Integer.MAX_VALUE, myConfiguration, false);
 
-    fetchList = readContents();
+    fetchList = readContents(webPageStore, Mark.GENERATE_MARK, FIELDS);
 
     // verify we got right amount of records
     assertEquals(2, fetchList.size());
 
     myConfiguration = new Configuration(conf);
-    myConfiguration.setInt(GeneratorJob.GENERATE_MAX_PER_HOST, 3);
+    myConfiguration.setInt(GeneratorJob.GENERATOR_MAX_COUNT, 3);
     generateFetchlist(Integer.MAX_VALUE, myConfiguration, false);
 
-    fetchList = readContents();
+    fetchList = readContents(webPageStore, Mark.GENERATE_MARK, FIELDS);
 
     // verify we got right amount of records
     assertEquals(3, fetchList.size());
   }
 
   /**
-   * Test that generator obeys the property "generate.max.per.host" and
-   * "generate.max.per.host.by.ip".
+   * Test that generator obeys the property "generator.max.count" and
+   * "generator.count.value=domain".
    *
    * @throws Exception
    */
-  public void testGenerateHostIPLimit() throws Exception {
+  public void testGenerateDomainLimit() throws Exception {
     ArrayList<URLWebPage> list = new ArrayList<URLWebPage>();
 
-    list.add(createURLWebPage("http://www.example.com/index.html";, 1, 1));
-    list.add(createURLWebPage("http://www.example.net/index.html";, 1, 1));
-    list.add(createURLWebPage("http://www.example.org/index.html";, 1, 1));
+    list.add(createURLWebPage("http://one.example.com/index.html";, 1, 1));
+    list.add(createURLWebPage("http://one.example.com/index1.html";, 1, 1));
+    list.add(createURLWebPage("http://two.example.com/index.html";, 1, 1));
+    list.add(createURLWebPage("http://two.example.com/index1.html";, 1, 1));
+    list.add(createURLWebPage("http://three.example.com/index.html";, 1, 1));
+    list.add(createURLWebPage("http://three.example.com/index1.html";, 1, 1));
 
     for (URLWebPage uwp : list) {
       webPageStore.put(TableUtil.reverseUrl(uwp.getUrl()), uwp.getDatum());
     }
-
+    webPageStore.flush();
+    
     Configuration myConfiguration = new Configuration(conf);
-    myConfiguration.setInt(GeneratorJob.GENERATE_MAX_PER_HOST, 1);
-    myConfiguration.setBoolean(GeneratorJob.GENERATE_MAX_PER_HOST_BY_IP, true);
+    myConfiguration.setInt(GeneratorJob.GENERATOR_MAX_COUNT, 1);
+    myConfiguration.set(GeneratorJob.GENERATOR_COUNT_MODE, 
GeneratorJob.GENERATOR_COUNT_VALUE_DOMAIN);
 
     generateFetchlist(Integer.MAX_VALUE, myConfiguration, false);
 
-    ArrayList<URLWebPage> fetchList = readContents();
+    ArrayList<URLWebPage> fetchList = readContents(webPageStore, 
Mark.GENERATE_MARK, FIELDS);
 
     // verify we got right amount of records
     assertEquals(1, fetchList.size());
 
     myConfiguration = new Configuration(myConfiguration);
-    myConfiguration.setInt(GeneratorJob.GENERATE_MAX_PER_HOST, 2);
+    myConfiguration.setInt(GeneratorJob.GENERATOR_MAX_COUNT, 2);
     generateFetchlist(Integer.MAX_VALUE, myConfiguration, false);
 
-    fetchList = readContents();
+    fetchList = readContents(webPageStore, Mark.GENERATE_MARK, FIELDS);
 
     // verify we got right amount of records
     assertEquals(2, fetchList.size());
 
     myConfiguration = new Configuration(myConfiguration);
-    myConfiguration.setInt(GeneratorJob.GENERATE_MAX_PER_HOST, 3);
+    myConfiguration.setInt(GeneratorJob.GENERATOR_MAX_COUNT, 3);
     generateFetchlist(Integer.MAX_VALUE, myConfiguration, false);
 
-    fetchList = readContents();
+    fetchList = readContents(webPageStore, Mark.GENERATE_MARK, FIELDS);
 
     // verify we got right amount of records
     assertEquals(3, fetchList.size());
@@ -237,19 +219,20 @@ public class TestGenerator extends TestC
     for (URLWebPage uwp : list) {
       webPageStore.put(TableUtil.reverseUrl(uwp.getUrl()), uwp.getDatum());
     }
+    webPageStore.flush();
 
     Configuration myConfiguration = new Configuration(conf);
     myConfiguration.set("urlfilter.suffix.file", "filter-all.txt");
 
     generateFetchlist(Integer.MAX_VALUE, myConfiguration, true);
 
-    ArrayList<URLWebPage> fetchList = readContents();
+    ArrayList<URLWebPage> fetchList = readContents(webPageStore, 
Mark.GENERATE_MARK, FIELDS);
 
     assertEquals(0, fetchList.size());
 
     generateFetchlist(Integer.MAX_VALUE, myConfiguration, false);
 
-    fetchList = readContents();
+    fetchList = readContents(webPageStore, Mark.GENERATE_MARK, FIELDS);
 
     // verify nothing got filtered
     assertEquals(list.size(), fetchList.size());
@@ -257,38 +240,6 @@ public class TestGenerator extends TestC
   }
 
   /**
-   * Read entries marked as fetchable
-   *
-   * @return Generated {...@link URLWebPage} objects
-   * @throws IOException
-   */
-  private ArrayList<URLWebPage> readContents() throws IOException {
-    ArrayList<URLWebPage> l = new ArrayList<URLWebPage>();
-
-    Query<String, WebPage> query = webPageStore.newQuery();
-    query.setFields(WebPage.Field.MARKERS.getName());
-
-    Result<String, WebPage> results = webPageStore.execute(query);
-
-    while (results.next()) {
-      WebPage page = results.get();
-      String url = results.getKey();
-      LOG.info("FOUND IN TABLE :" + url);
-
-      if (page == null)
-        continue;
-
-      if (Mark.GENERATE_MARK.checkMark(page) == null)
-        continue;
-
-      // it has been marked as generated so it is ready for the fetch
-      l.add(new URLWebPage(TableUtil.unreverseUrl(url), page));
-    }
-
-    return l;
-  }
-
-  /**
    * Generate Fetchlist.
    *
    * @param numResults
@@ -303,7 +254,7 @@ public class TestGenerator extends TestC
     // generate segment
     GeneratorJob g = new GeneratorJob();
     g.setConf(config);
-    String crawlId = g.generate(numResults, Long.MAX_VALUE, filter, false);
+    String crawlId = g.generate(numResults, System.currentTimeMillis(), 
filter, false);
     if (crawlId == null)
       throw new RuntimeException("Generator failed");
   }

Modified: 
nutch/branches/nutchbase/src/test/org/apache/nutch/crawl/TestInjector.java
URL: 
http://svn.apache.org/viewvc/nutch/branches/nutchbase/src/test/org/apache/nutch/crawl/TestInjector.java?rev=966330&r1=966329&r2=966330&view=diff
==============================================================================
--- nutch/branches/nutchbase/src/test/org/apache/nutch/crawl/TestInjector.java 
(original)
+++ nutch/branches/nutchbase/src/test/org/apache/nutch/crawl/TestInjector.java 
Wed Jul 21 17:48:20 2010
@@ -27,7 +27,10 @@ import org.apache.avro.util.Utf8;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
+import org.apache.nutch.storage.Mark;
 import org.apache.nutch.storage.WebPage;
+import org.apache.nutch.util.AbstractNutchTest;
+import org.apache.nutch.util.CrawlTestUtil;
 import org.apache.nutch.util.TableUtil;
 import org.gora.query.Query;
 import org.gora.query.Result;
@@ -44,37 +47,14 @@ import org.junit.Before;
  * 
  * @author nutch-dev <nutch-dev at lucene.apache.org>
  */
-public class TestInjector extends TestCase {
-
-  private Configuration conf;
-  private FileSystem fs;
-  final static Path testdir = new Path("build/test/inject-test");
-  private DataStore<String, WebPage> webPageStore;
+public class TestInjector extends AbstractNutchTest {
   Path urlPath;
 
   @Before
   @Override
   public void setUp() throws Exception {
     super.setUp();
-    conf = CrawlDBTestUtil.createConfiguration();
     urlPath = new Path(testdir, "urls");
-    fs = FileSystem.get(conf);
-    if (fs.exists(urlPath))
-      fs.delete(urlPath, false);
-    // using hsqldb in memory
-    
DataStoreFactory.properties.setProperty("gora.sqlstore.jdbc.driver","org.hsqldb.jdbcDriver");
-    
DataStoreFactory.properties.setProperty("gora.sqlstore.jdbc.url","jdbc:hsqldb:mem:.");
-    DataStoreFactory.properties.setProperty("gora.sqlstore.jdbc.user","sa");
-    DataStoreFactory.properties.setProperty("gora.sqlstore.jdbc.password","");
-    webPageStore = DataStoreFactory.getDataStore(SqlStore.class,
-        String.class, WebPage.class);
-  }
-
-  @Override
-  public void tearDown() throws Exception {
-    webPageStore.close();
-    super.tearDown();
-    fs.delete(testdir, true);
   }
 
   public void testInject() throws Exception {
@@ -83,14 +63,14 @@ public class TestInjector extends TestCa
       urls.add("http://zzz.com/"; + i + ".html\tnutch.score=" + i
           + "\tcustom.attribute=" + i);
     }
-    CrawlDBTestUtil.generateSeedList(fs, urlPath, urls);
+    CrawlTestUtil.generateSeedList(fs, urlPath, urls);
 
     InjectorJob injector = new InjectorJob();
     injector.setConf(conf);
     injector.inject(urlPath);
 
     // verify results
-    List<String> read = readCrawldb();
+    List<String> read = readDb();
 
     Collections.sort(read);
     Collections.sort(urls);
@@ -102,15 +82,18 @@ public class TestInjector extends TestCa
 
     // inject more urls
     ArrayList<String> urls2 = new ArrayList<String>();
+    ArrayList<String> urlsCheck = new ArrayList<String>();
     for (int i = 0; i < 100; i++) {
-      urls2.add("http://xxx.com/"; + i + ".html");
+      String u = "http://xxx.com/"; + i + ".html";
+      urls2.add(u);
+      urlsCheck.add(u + "\tnutch.score=1");
     }
-    CrawlDBTestUtil.generateSeedList(fs, urlPath, urls2);
+    CrawlTestUtil.generateSeedList(fs, urlPath, urls2);
     injector.inject(urlPath);
-    urls.addAll(urls2);
+    urls.addAll(urlsCheck);
 
     // verify results
-    read = readCrawldb();
+    read = readDb();
 
     Collections.sort(read);
     Collections.sort(urls);
@@ -121,32 +104,26 @@ public class TestInjector extends TestCa
     assertTrue(urls.containsAll(read));
 
   }
-
-  /**
-   * Read from a Gora datastore + make sure we get the score and custom 
metadata
-   * 
-   * @throws ClassNotFoundException
-   **/
-  private List<String> readCrawldb() throws Exception {
+  
+  private static final String[] fields = new String[] {
+    WebPage.Field.MARKERS.getName(),
+    WebPage.Field.METADATA.getName(),
+    WebPage.Field.SCORE.getName()
+  };
+  
+  private List<String> readDb() throws Exception {
+    List<URLWebPage> pages = readContents(webPageStore, null, fields);
     ArrayList<String> read = new ArrayList<String>();
-
-    Query<String, WebPage> query = webPageStore.newQuery();
-    Result<String, WebPage> result = webPageStore.execute(query);
-
-    while (result.next()) {
-      String skey = result.getKey();
-      WebPage page = result.get();
-      float fscore = page.getScore();
-      String representation = TableUtil.unreverseUrl(skey);
+    for (URLWebPage up : pages) {
+      WebPage page = up.getDatum();
+      String representation = up.getUrl();
+      representation += "\tnutch.score=" + (int)page.getScore();
       ByteBuffer bb = page.getFromMetadata(new Utf8("custom.attribute"));
       if (bb != null) {
-        representation += "\tnutch.score=" + (int) fscore;
         representation += "\tcustom.attribute=" + 
ByteUtils.toString(bb.array());
       }
       read.add(representation);
     }
-    result.close();
     return read;
   }
-
 }

Added: 
nutch/branches/nutchbase/src/test/org/apache/nutch/fetcher/TestFetcher.java
URL: 
http://svn.apache.org/viewvc/nutch/branches/nutchbase/src/test/org/apache/nutch/fetcher/TestFetcher.java?rev=966330&view=auto
==============================================================================
--- nutch/branches/nutchbase/src/test/org/apache/nutch/fetcher/TestFetcher.java 
(added)
+++ nutch/branches/nutchbase/src/test/org/apache/nutch/fetcher/TestFetcher.java 
Wed Jul 21 17:48:20 2010
@@ -0,0 +1,144 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.nutch.fetcher;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.hadoop.fs.Path;
+import org.apache.nutch.crawl.GeneratorJob;
+import org.apache.nutch.crawl.InjectorJob;
+import org.apache.nutch.crawl.URLWebPage;
+import org.apache.nutch.storage.Mark;
+import org.apache.nutch.util.AbstractNutchTest;
+import org.apache.nutch.util.CrawlTestUtil;
+import org.mortbay.jetty.Server;
+
+/**
+ * Basic fetcher test
+ * 1. generate seedlist
+ * 2. inject
+ * 3. generate
+ * 3. fetch
+ * 4. Verify contents
+ * @author nutch-dev <nutch-dev at lucene.apache.org>
+ *
+ */
+public class TestFetcher extends AbstractNutchTest {
+
+  final static Path testdir=new Path("build/test/fetch-test");
+  Path urlPath;
+  Server server;
+
+  public void setUp() throws Exception{
+    super.setUp();
+    urlPath = new Path(testdir, "urls");
+    server = CrawlTestUtil.getServer(conf.getInt("content.server.port",50000), 
"build/test/data/fetch-test-site");
+    server.start();
+  }
+
+  public void tearDown() throws Exception{
+    server.stop();
+    fs.delete(testdir, true);
+  }
+  
+  public void testFetch() throws Exception {
+    
+    //generate seedlist
+    ArrayList<String> urls = new ArrayList<String>();
+    
+    addUrl(urls,"index.html");
+    addUrl(urls,"pagea.html");
+    addUrl(urls,"pageb.html");
+    addUrl(urls,"dup_of_pagea.html");
+    addUrl(urls,"nested_spider_trap.html");
+    addUrl(urls,"exception.html");
+    
+    CrawlTestUtil.generateSeedList(fs, urlPath, urls);
+    
+    //inject
+    InjectorJob injector = new InjectorJob(conf);
+    injector.inject(urlPath);
+
+    //generate
+    long time = System.currentTimeMillis();
+    GeneratorJob g = new GeneratorJob(conf);
+    String crawlId = g.generate(Long.MAX_VALUE, time, false, false);
+
+    //fetch
+    time = System.currentTimeMillis();
+    conf.setBoolean(FetcherJob.PARSE_KEY, true);
+    FetcherJob fetcher = new FetcherJob(conf);
+    fetcher.fetch(1, crawlId, false, true);
+
+    time = System.currentTimeMillis() - time;
+    
+    //verify politeness, time taken should be more than (num_of_pages +1)*delay
+    int minimumTime = (int) ((urls.size() + 1) * 1000 *
+        conf.getFloat("fetcher.server.delay", 5));
+    assertTrue(time > minimumTime);
+    
+    List<URLWebPage> pages = readContents(webPageStore, Mark.FETCH_MARK, null);
+    assertEquals(urls.size(), pages.size());
+    List<String> handledurls = new ArrayList<String>();
+    for (URLWebPage up : pages) {
+      ByteBuffer bb = up.getDatum().getContent();
+      if (bb == null) {
+        continue;
+      }
+      String content = new String(bb.array());
+      if (content.indexOf("Nutch fetcher test page")!=-1) {
+        handledurls.add(up.getUrl());        
+      }
+    }
+    Collections.sort(urls);
+    Collections.sort(handledurls);
+
+    //verify that enough pages were handled
+    assertEquals(urls.size(), handledurls.size());
+
+    //verify that correct pages were handled
+    assertTrue(handledurls.containsAll(urls));
+    assertTrue(urls.containsAll(handledurls));
+  }
+
+  private void addUrl(ArrayList<String> urls, String page) {
+    urls.add("http://127.0.0.1:"; + server.getConnectors()[0].getPort() + "/" + 
page);
+  }
+  
+  public void testAgentNameCheck() {
+
+    boolean failedNoAgentName = false;
+    conf.set("http.agent.name", "");
+
+    try {
+      conf.setBoolean(FetcherJob.PARSE_KEY, true);
+      FetcherJob fetcher = new FetcherJob(conf);
+      fetcher.checkConfiguration();
+    } catch (IllegalArgumentException iae) {
+      String message = iae.getMessage();
+      failedNoAgentName = message.equals("Fetcher: No agents listed in "
+          + "'http.agent.name' property.");
+    } catch (Exception e) {
+    }
+
+    assertTrue(failedNoAgentName);
+  }
+
+}

Propchange: 
nutch/branches/nutchbase/src/test/org/apache/nutch/fetcher/TestFetcher.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
nutch/branches/nutchbase/src/test/org/apache/nutch/util/AbstractNutchTest.java
URL: 
http://svn.apache.org/viewvc/nutch/branches/nutchbase/src/test/org/apache/nutch/util/AbstractNutchTest.java?rev=966330&view=auto
==============================================================================
--- 
nutch/branches/nutchbase/src/test/org/apache/nutch/util/AbstractNutchTest.java 
(added)
+++ 
nutch/branches/nutchbase/src/test/org/apache/nutch/util/AbstractNutchTest.java 
Wed Jul 21 17:48:20 2010
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.nutch.util;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.apache.avro.util.Utf8;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.fs.Path;
+import org.apache.nutch.crawl.URLWebPage;
+import org.apache.nutch.storage.Mark;
+import org.apache.nutch.storage.WebPage;
+import org.apache.nutch.util.TableUtil;
+import org.gora.query.Query;
+import org.gora.query.Result;
+import org.gora.sql.store.SqlStore;
+import org.gora.store.DataStore;
+import org.gora.store.DataStoreFactory;
+import org.gora.util.ByteUtils;
+
+/**
+ * Basic injector test: 1. Creates a text file with urls 2. Injects them into
+ * crawldb 3. Reads crawldb entries and verifies contents 4. Injects more urls
+ * into webdb 5. Reads crawldb entries and verifies contents
+ * 
+ * @author nutch-dev <nutch-dev at lucene.apache.org>
+ */
+public class AbstractNutchTest extends TestCase {
+
+  protected Configuration conf;
+  protected FileSystem fs;
+  protected Path testdir = new Path("build/test/inject-test");
+  protected DataStore<String, WebPage> webPageStore;
+  protected boolean persistentDataStore = false;
+  
+  @Override
+  public void setUp() throws Exception {
+    super.setUp();
+    conf = CrawlTestUtil.createConfiguration();
+    fs = FileSystem.get(conf);
+    // using hsqldb in memory
+    
DataStoreFactory.properties.setProperty("gora.sqlstore.jdbc.driver","org.hsqldb.jdbcDriver");
+    // use separate in-memory db-s for tests
+    
DataStoreFactory.properties.setProperty("gora.sqlstore.jdbc.url","jdbc:hsqldb:mem:"
 + getClass().getName());
+    DataStoreFactory.properties.setProperty("gora.sqlstore.jdbc.user","sa");
+    DataStoreFactory.properties.setProperty("gora.sqlstore.jdbc.password","");
+    if (persistentDataStore) {
+      webPageStore = DataStoreFactory.getDataStore(SqlStore.class,
+          String.class, WebPage.class);      
+    } else {
+      webPageStore = DataStoreFactory.createDataStore(SqlStore.class,
+          String.class, WebPage.class);
+    }
+  }
+
+  @Override
+  public void tearDown() throws Exception {
+    // empty the database after test
+    if (!persistentDataStore) {
+      webPageStore.deleteByQuery(webPageStore.newQuery());
+      webPageStore.flush();
+      webPageStore.close();
+    }
+    super.tearDown();
+    fs.delete(testdir, true);
+  }
+
+  /**
+   * Read entries from a data store
+   *
+   * @return list of matching {...@link URLWebPage} objects
+   * @throws IOException
+   */
+  public static ArrayList<URLWebPage> readContents(DataStore<String,WebPage> 
store,
+      Mark requiredMark, String... fields) throws IOException {
+    ArrayList<URLWebPage> l = new ArrayList<URLWebPage>();
+
+    Query<String, WebPage> query = store.newQuery();
+    if (fields != null) {
+      query.setFields(fields);
+    }
+
+    Result<String, WebPage> results = store.execute(query);
+    while (results.next()) {
+      WebPage page = results.get();
+      String url = results.getKey();
+
+      if (page == null)
+        continue;
+
+      if (requiredMark != null && requiredMark.checkMark(page) == null)
+        continue;
+
+      l.add(new URLWebPage(TableUtil.unreverseUrl(url), 
(WebPage)page.clone()));
+    }
+
+    return l;
+  }
+}

Propchange: 
nutch/branches/nutchbase/src/test/org/apache/nutch/util/AbstractNutchTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
nutch/branches/nutchbase/src/test/org/apache/nutch/util/CrawlTestUtil.java
URL: 
http://svn.apache.org/viewvc/nutch/branches/nutchbase/src/test/org/apache/nutch/util/CrawlTestUtil.java?rev=966330&view=auto
==============================================================================
--- nutch/branches/nutchbase/src/test/org/apache/nutch/util/CrawlTestUtil.java 
(added)
+++ nutch/branches/nutchbase/src/test/org/apache/nutch/util/CrawlTestUtil.java 
Wed Jul 21 17:48:20 2010
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.nutch.util;
+
+import java.io.IOException;
+import java.net.UnknownHostException;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.FSDataOutputStream;
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.fs.Path;
+import org.mortbay.jetty.Handler;
+import org.mortbay.jetty.Server;
+import org.mortbay.jetty.handler.DefaultHandler;
+import org.mortbay.jetty.handler.HandlerList;
+import org.mortbay.jetty.handler.ResourceHandler;
+import org.mortbay.jetty.servlet.Context;
+
+import com.sun.net.httpserver.HttpContext;
+
+public class CrawlTestUtil {
+
+  private static final Log LOG = LogFactory.getLog(CrawlTestUtil.class);
+
+  /**
+   * For now we need to manually construct our Configuration, because we need 
to
+   * override the default one and it is currently not possible to use
+   * dynamically set values.
+   * 
+   * @return
+   * @deprecated Use {...@link #createConfiguration()} instead
+   */
+  public static Configuration create() {
+    return createConfiguration();
+  }
+
+  /**
+   * For now we need to manually construct our Configuration, because we need 
to
+   * override the default one and it is currently not possible to use
+   * dynamically set values.
+   * 
+   * @return
+   */
+  public static Configuration createConfiguration() {
+    Configuration conf = new Configuration();
+    conf.addResource("nutch-default.xml");
+    conf.addResource("nutch-site.xml");
+    conf.addResource("crawl-tests.xml");
+    return conf;
+  }
+
+  /**
+   * Generate seedlist
+   * 
+   * @see TestInjector
+   * @throws IOException
+   */
+  public static void generateSeedList(FileSystem fs, Path urlPath,
+      List<String> contents) throws IOException {
+    FSDataOutputStream out;
+    Path file = new Path(urlPath, "urls.txt");
+    fs.mkdirs(urlPath);
+    out = fs.create(file);
+    Iterator<String> iterator = contents.iterator();
+    while (iterator.hasNext()) {
+      String url = iterator.next();
+      out.writeBytes(url);
+      out.writeBytes("\n");
+    }
+    out.flush();
+    out.close();
+  }
+
+  /**
+   * Creates a new JettyServer with one static root context
+   * 
+   * @param port
+   *          port to listen to
+   * @param staticContent
+   *          folder where static content lives
+   * @throws UnknownHostException
+   */
+  public static Server getServer(int port, String staticContent)
+      throws UnknownHostException {
+    Server webServer = new org.mortbay.jetty.Server(port);
+    ResourceHandler handler = new ResourceHandler();
+    handler.setResourceBase(staticContent);
+    HandlerList handlers = new HandlerList();
+    handlers.setHandlers(new Handler[]{handler, new DefaultHandler()});
+    webServer.setHandler(handlers);
+    return webServer;
+  }
+}

Propchange: 
nutch/branches/nutchbase/src/test/org/apache/nutch/util/CrawlTestUtil.java
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to