| /* |
| * 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.metadata; |
| |
| import java.io.ByteArrayInputStream; |
| import java.io.ByteArrayOutputStream; |
| import java.io.DataInputStream; |
| import java.io.DataOutputStream; |
| import java.io.IOException; |
| import java.util.Properties; |
| |
| import org.junit.Assert; |
| import org.junit.Test; |
| |
| /** |
| * JUnit based tests of class |
| * {@link org.apache.nutch.metadata.SpellCheckedMetadata}. |
| * |
| * @author Chris Mattmann |
| * @author Jérôme Charron |
| */ |
| public class TestSpellCheckedMetadata { |
| |
| private static final int NUM_ITERATIONS = 10000; |
| |
| /** Test for the <code>getNormalizedName(String)</code> method. */ |
| @Test |
| public void testGetNormalizedName() { |
| Assert.assertEquals("Content-Type", |
| SpellCheckedMetadata.getNormalizedName("Content-Type")); |
| Assert.assertEquals("Content-Type", |
| SpellCheckedMetadata.getNormalizedName("ContentType")); |
| Assert.assertEquals("Content-Type", |
| SpellCheckedMetadata.getNormalizedName("Content-type")); |
| Assert.assertEquals("Content-Type", |
| SpellCheckedMetadata.getNormalizedName("contenttype")); |
| Assert.assertEquals("Content-Type", |
| SpellCheckedMetadata.getNormalizedName("contentype")); |
| Assert.assertEquals("Content-Type", |
| SpellCheckedMetadata.getNormalizedName("contntype")); |
| } |
| |
| /** Test for the <code>add(String, String)</code> method. */ |
| @Test |
| public void testAdd() { |
| String[] values = null; |
| SpellCheckedMetadata meta = new SpellCheckedMetadata(); |
| |
| values = meta.getValues("contentype"); |
| Assert.assertEquals(0, values.length); |
| |
| meta.add("contentype", "value1"); |
| values = meta.getValues("contentype"); |
| Assert.assertEquals(1, values.length); |
| Assert.assertEquals("value1", values[0]); |
| |
| meta.add("Content-Type", "value2"); |
| values = meta.getValues("contentype"); |
| Assert.assertEquals(2, values.length); |
| Assert.assertEquals("value1", values[0]); |
| Assert.assertEquals("value2", values[1]); |
| |
| // NOTE : For now, the same value can be added many times. |
| // Should it be changed? |
| meta.add("ContentType", "value1"); |
| values = meta.getValues("Content-Type"); |
| Assert.assertEquals(3, values.length); |
| Assert.assertEquals("value1", values[0]); |
| Assert.assertEquals("value2", values[1]); |
| Assert.assertEquals("value1", values[2]); |
| } |
| |
| /** Test for the <code>set(String, String)</code> method. */ |
| @Test |
| public void testSet() { |
| String[] values = null; |
| SpellCheckedMetadata meta = new SpellCheckedMetadata(); |
| |
| values = meta.getValues("contentype"); |
| Assert.assertEquals(0, values.length); |
| |
| meta.set("contentype", "value1"); |
| values = meta.getValues("contentype"); |
| Assert.assertEquals(1, values.length); |
| Assert.assertEquals("value1", values[0]); |
| |
| meta.set("Content-Type", "value2"); |
| values = meta.getValues("contentype"); |
| Assert.assertEquals(1, values.length); |
| Assert.assertEquals("value2", values[0]); |
| |
| meta.set("contenttype", "new value 1"); |
| meta.add("contenttype", "new value 2"); |
| values = meta.getValues("contentype"); |
| Assert.assertEquals(2, values.length); |
| Assert.assertEquals("new value 1", values[0]); |
| Assert.assertEquals("new value 2", values[1]); |
| } |
| |
| /** Test for <code>setAll(Properties)</code> method. */ |
| @Test |
| public void testSetProperties() { |
| String[] values = null; |
| SpellCheckedMetadata meta = new SpellCheckedMetadata(); |
| Properties props = new Properties(); |
| |
| meta.setAll(props); |
| Assert.assertEquals(0, meta.size()); |
| |
| props.setProperty("name-one", "value1.1"); |
| meta.setAll(props); |
| Assert.assertEquals(1, meta.size()); |
| values = meta.getValues("name-one"); |
| Assert.assertEquals(1, values.length); |
| Assert.assertEquals("value1.1", values[0]); |
| |
| props.setProperty("name-two", "value2.1"); |
| meta.setAll(props); |
| Assert.assertEquals(2, meta.size()); |
| values = meta.getValues("name-one"); |
| Assert.assertEquals(1, values.length); |
| Assert.assertEquals("value1.1", values[0]); |
| values = meta.getValues("name-two"); |
| Assert.assertEquals(1, values.length); |
| Assert.assertEquals("value2.1", values[0]); |
| } |
| |
| /** Test for <code>get(String)</code> method. */ |
| @Test |
| public void testGet() { |
| SpellCheckedMetadata meta = new SpellCheckedMetadata(); |
| Assert.assertNull(meta.get("a-name")); |
| |
| meta.add("a-name", "value-1"); |
| Assert.assertEquals("value-1", meta.get("a-name")); |
| meta.add("a-name", "value-2"); |
| Assert.assertEquals("value-1", meta.get("a-name")); |
| } |
| |
| /** Test for <code>isMultiValued()</code> method. */ |
| @Test |
| public void testIsMultiValued() { |
| SpellCheckedMetadata meta = new SpellCheckedMetadata(); |
| Assert.assertFalse(meta.isMultiValued("key")); |
| meta.add("key", "value1"); |
| Assert.assertFalse(meta.isMultiValued("key")); |
| meta.add("key", "value2"); |
| Assert.assertTrue(meta.isMultiValued("key")); |
| } |
| |
| /** Test for <code>names</code> method. */ |
| @Test |
| public void testNames() { |
| String[] names = null; |
| SpellCheckedMetadata meta = new SpellCheckedMetadata(); |
| names = meta.names(); |
| Assert.assertEquals(0, names.length); |
| |
| meta.add("name-one", "value"); |
| names = meta.names(); |
| Assert.assertEquals(1, names.length); |
| Assert.assertEquals("name-one", names[0]); |
| meta.add("name-two", "value"); |
| names = meta.names(); |
| Assert.assertEquals(2, names.length); |
| } |
| |
| /** Test for <code>remove(String)</code> method. */ |
| @Test |
| public void testRemove() { |
| SpellCheckedMetadata meta = new SpellCheckedMetadata(); |
| meta.remove("name-one"); |
| Assert.assertEquals(0, meta.size()); |
| meta.add("name-one", "value-1.1"); |
| meta.add("name-one", "value-1.2"); |
| meta.add("name-two", "value-2.2"); |
| Assert.assertEquals(2, meta.size()); |
| Assert.assertNotNull(meta.get("name-one")); |
| Assert.assertNotNull(meta.get("name-two")); |
| meta.remove("name-one"); |
| Assert.assertEquals(1, meta.size()); |
| Assert.assertNull(meta.get("name-one")); |
| Assert.assertNotNull(meta.get("name-two")); |
| meta.remove("name-two"); |
| Assert.assertEquals(0, meta.size()); |
| Assert.assertNull(meta.get("name-one")); |
| Assert.assertNull(meta.get("name-two")); |
| } |
| |
| /** Test for <code>equals(Object)</code> method. */ |
| @Test |
| public void testObject() { |
| SpellCheckedMetadata meta1 = new SpellCheckedMetadata(); |
| SpellCheckedMetadata meta2 = new SpellCheckedMetadata(); |
| Assert.assertFalse(meta1.equals(null)); |
| Assert.assertFalse(meta1.equals("String")); |
| Assert.assertTrue(meta1.equals(meta2)); |
| meta1.add("name-one", "value-1.1"); |
| Assert.assertFalse(meta1.equals(meta2)); |
| meta2.add("name-one", "value-1.1"); |
| Assert.assertTrue(meta1.equals(meta2)); |
| meta1.add("name-one", "value-1.2"); |
| Assert.assertFalse(meta1.equals(meta2)); |
| meta2.add("name-one", "value-1.2"); |
| Assert.assertTrue(meta1.equals(meta2)); |
| meta1.add("name-two", "value-2.1"); |
| Assert.assertFalse(meta1.equals(meta2)); |
| meta2.add("name-two", "value-2.1"); |
| Assert.assertTrue(meta1.equals(meta2)); |
| meta1.add("name-two", "value-2.2"); |
| Assert.assertFalse(meta1.equals(meta2)); |
| meta2.add("name-two", "value-2.x"); |
| Assert.assertFalse(meta1.equals(meta2)); |
| } |
| |
| /** Test for <code>Writable</code> implementation. */ |
| @Test |
| public void testWritable() { |
| SpellCheckedMetadata result = null; |
| SpellCheckedMetadata meta = new SpellCheckedMetadata(); |
| result = writeRead(meta); |
| Assert.assertEquals(0, result.size()); |
| meta.add("name-one", "value-1.1"); |
| result = writeRead(meta); |
| meta.add("Contenttype", "text/html"); |
| Assert.assertEquals(1, result.size()); |
| Assert.assertEquals(1, result.getValues("name-one").length); |
| Assert.assertEquals("value-1.1", result.get("name-one")); |
| meta.add("name-two", "value-2.1"); |
| meta.add("name-two", "value-2.2"); |
| result = writeRead(meta); |
| Assert.assertEquals(3, result.size()); |
| Assert.assertEquals(1, result.getValues("name-one").length); |
| Assert.assertEquals("value-1.1", result.getValues("name-one")[0]); |
| Assert.assertEquals(2, result.getValues("name-two").length); |
| Assert.assertEquals("value-2.1", result.getValues("name-two")[0]); |
| Assert.assertEquals("value-2.2", result.getValues("name-two")[1]); |
| Assert.assertEquals("text/html", result.get(Metadata.CONTENT_TYPE)); |
| } |
| |
| /** |
| * IO Test method, usable only when you plan to do changes in metadata to |
| * measure relative performance impact. |
| */ |
| @Test |
| public final void testHandlingSpeed() { |
| @SuppressWarnings("unused") |
| SpellCheckedMetadata result; |
| long start = System.currentTimeMillis(); |
| for (int i = 0; i < NUM_ITERATIONS; i++) { |
| SpellCheckedMetadata scmd = constructSpellCheckedMetadata(); |
| result = writeRead(scmd); |
| } |
| System.out.println(NUM_ITERATIONS + " spellchecked metadata I/O time:" |
| + (System.currentTimeMillis() - start) + "ms."); |
| } |
| |
| private SpellCheckedMetadata writeRead(SpellCheckedMetadata meta) { |
| SpellCheckedMetadata readed = new SpellCheckedMetadata(); |
| try { |
| ByteArrayOutputStream out = new ByteArrayOutputStream(); |
| meta.write(new DataOutputStream(out)); |
| readed.readFields(new DataInputStream(new ByteArrayInputStream(out |
| .toByteArray()))); |
| } catch (IOException ioe) { |
| Assert.fail(ioe.toString()); |
| } |
| return readed; |
| } |
| |
| /** |
| * Assembles a Spellchecked metadata Object. |
| */ |
| public static final SpellCheckedMetadata constructSpellCheckedMetadata() { |
| SpellCheckedMetadata scmd = new SpellCheckedMetadata(); |
| scmd.add("Content-type", "foo/bar"); |
| scmd.add("Connection", "close"); |
| scmd.add("Last-Modified", "Sat, 09 Dec 2006 15:09:57 GMT"); |
| scmd.add("Server", "Foobar"); |
| scmd.add("Date", "Sat, 09 Dec 2006 18:07:20 GMT"); |
| scmd.add("Accept-Ranges", "bytes"); |
| scmd.add("ETag", "\"1234567-89-01234567\""); |
| scmd.add("Content-Length", "123"); |
| scmd.add(Nutch.SEGMENT_NAME_KEY, "segmentzzz"); |
| scmd.add(Nutch.SIGNATURE_KEY, "123"); |
| return scmd; |
| } |
| |
| } |