Author: philz
Date: Thu Jan 21 23:19:19 2010
New Revision: 901919

URL: http://svn.apache.org/viewvc?rev=901919&view=rev
Log:
AVRO-363. estSchema had two tests disabled; new test for named schemas named
after primitives. (philz)


Modified:
    hadoop/avro/trunk/CHANGES.txt
    hadoop/avro/trunk/lang/java/src/java/org/apache/avro/Schema.java
    
hadoop/avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericDatumReader.java
    hadoop/avro/trunk/lang/java/src/test/java/org/apache/avro/TestSchema.java

Modified: hadoop/avro/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/hadoop/avro/trunk/CHANGES.txt?rev=901919&r1=901918&r2=901919&view=diff
==============================================================================
--- hadoop/avro/trunk/CHANGES.txt (original)
+++ hadoop/avro/trunk/CHANGES.txt Thu Jan 21 23:19:19 2010
@@ -253,6 +253,9 @@
 
     AVRO-345. Optimization for ResolvingDecoder (thiru)
 
+    AVRO-363. estSchema had two tests disabled; new test for named schemas 
+    named after primitives. (philz)
+
   BUG FIXES
  
     AVRO-176. Safeguard against bad istreams before reading. (sbanacho)

Modified: hadoop/avro/trunk/lang/java/src/java/org/apache/avro/Schema.java
URL: 
http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/java/src/java/org/apache/avro/Schema.java?rev=901919&r1=901918&r2=901919&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/java/src/java/org/apache/avro/Schema.java (original)
+++ hadoop/avro/trunk/lang/java/src/java/org/apache/avro/Schema.java Thu Jan 21 
23:19:19 2010
@@ -185,6 +185,11 @@
   public int getEnumOrdinal(String symbol) {
     throw new AvroRuntimeException("Not an enum: "+this);
   }    
+  
+  /** If this is an enum, returns true if it contains given symbol. */
+  public boolean hasEnumSymbol(String symbol) {
+    throw new AvroRuntimeException("Not an enum: "+this);
+  }
 
   /** If this is a record, enum or fixed, returns its name, otherwise the name
    * of the primitive type. */
@@ -374,6 +379,9 @@
       super(type);
       this.name = name;
       this.doc = doc;
+      if (PRIMITIVES.containsKey(name.full)) {
+        throw new AvroTypeException("Schemas may not be named after 
primitives: " + name.full);
+      }
     }
     public String getName() { return name.name; }
     public String getDoc() { return doc; }
@@ -518,6 +526,8 @@
         ordinals.put(symbol, i++);
     }
     public List<String> getEnumSymbols() { return symbols; }
+    public boolean hasEnumSymbol(String symbol) { 
+      return ordinals.containsKey(symbol); }
     public int getEnumOrdinal(String symbol) { return ordinals.get(symbol); }
     public boolean equals(Object o) {
       if (o == this) return true;
@@ -910,4 +920,5 @@
     }
   }
 
+
 }

Modified: 
hadoop/avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericDatumReader.java
URL: 
http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericDatumReader.java?rev=901919&r1=901918&r2=901919&view=diff
==============================================================================
--- 
hadoop/avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericDatumReader.java
 (original)
+++ 
hadoop/avro/trunk/lang/java/src/java/org/apache/avro/generic/GenericDatumReader.java
 Thu Jan 21 23:19:19 2010
@@ -244,7 +244,12 @@
     String name = expected.getName();
     if (name != null && !name.equals(actual.getName()))
       throw new AvroTypeException("Expected "+expected+", found "+actual);
-    return createEnum(actual.getEnumSymbols().get(in.readEnum()), expected);
+    String symbol = actual.getEnumSymbols().get(in.readEnum());
+    if (expected.hasEnumSymbol(symbol)) {
+      return createEnum(symbol, expected);
+    } else {
+      throw new AvroTypeException("Symbol " + symbol + " not in " + expected);
+    }
   }
 
   /** Called to create an enum value. May be overridden for alternate enum

Modified: 
hadoop/avro/trunk/lang/java/src/test/java/org/apache/avro/TestSchema.java
URL: 
http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/java/src/test/java/org/apache/avro/TestSchema.java?rev=901919&r1=901918&r2=901919&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/java/src/test/java/org/apache/avro/TestSchema.java 
(original)
+++ hadoop/avro/trunk/lang/java/src/test/java/org/apache/avro/TestSchema.java 
Thu Jan 21 23:19:19 2010
@@ -263,7 +263,7 @@
 
   private static void checkParseError(String json) {
     try {
-      Schema schema = Schema.parse(json);
+      Schema.parse(json);
     } catch (SchemaParseException e) {
       return;
     }
@@ -414,23 +414,17 @@
     assertEquals("Wrong toString", expected, 
Schema.parse(expected.toString()));
   }
 
-  @SuppressWarnings(value="unchecked")
-  private static void testNoDefaultField() throws Exception {
+  @Test(expected=AvroTypeException.class)
+  public void testNoDefaultField() throws Exception {
     Schema expected =
       Schema.parse("{\"type\":\"record\", \"name\":\"Foo\", \"fields\":"+
                    "[{\"name\":\"f\", \"type\": \"string\"}]}");
-    DatumReader in = new GenericDatumReader(ACTUAL, expected);
-    try {
-      GenericData.Record record = (GenericData.Record)
-        in.read(null, new BinaryDecoder(new ByteArrayInputStream(new 
byte[0])));
-    } catch (AvroTypeException e) {
-      return;
-    }
-    fail("Should not read: "+expected);
+    DatumReader<Object> in = new GenericDatumReader<Object>(ACTUAL, expected);
+    in.read(null, new BinaryDecoder(new ByteArrayInputStream(new byte[0])));
   }
 
-  @SuppressWarnings(value="unchecked")
-  private static void testEnumMismatch() throws Exception {
+  @Test
+  public void testEnumMismatch() throws Exception {
     Schema actual = Schema.parse
       ("{\"type\":\"enum\",\"name\":\"E\",\"symbols\":[\"X\",\"Y\"]}");
     Schema expected = Schema.parse
@@ -442,14 +436,23 @@
     writer.write("X", encoder);
     byte[] data = out.toByteArray();
     Decoder decoder = new BinaryDecoder(new ByteArrayInputStream(data));
-    DatumReader in = new GenericDatumReader(actual, expected);
+    DatumReader<String> in = new GenericDatumReader<String>(actual, expected);
     assertEquals("Wrong value", "Y", in.read(null, decoder));
     try {
       in.read(null, decoder);
+      fail("Should have thrown exception.");
     } catch (AvroTypeException e) {
-      return;
+      // expected
     }
-    fail("Should not read: "+expected);
   }
 
+  @Test(expected=AvroTypeException.class)
+  public void testRecordWithPrimitiveName() {
+    Schema.parse("{\"type\":\"record\", \"name\":\"string\", \"fields\": []}");
+  }
+  
+  @Test(expected=AvroTypeException.class)
+  public void testEnumWithPrimitiveName() {
+    Schema.parse("{\"type\":\"enum\", \"name\":\"null\", \"symbols\": 
[\"A\"]}");
+  }
 }


Reply via email to