You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2019/01/14 03:18:22 UTC

[servicecomb-java-chassis] 16/16: [SCB-1071] update other test case

This is an automated email from the ASF dual-hosted git repository.

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit 41e843aadf787b538ef175ae02829da45003f104
Author: wujimin <wu...@huawei.com>
AuthorDate: Thu Jan 10 22:48:34 2019 +0800

    [SCB-1071] update other test case
---
 .../protobuf/internal/TestModelWrap.java           | 132 ++++++---
 .../protobuf/internal/TestSchemaBase.java          |  56 +++-
 .../internal/bean/TestBeanDescriptorManager.java   |  28 +-
 .../protobuf/internal/model/PrimitiveArrays.java   | 301 +++++++++++++++++++++
 .../internal/model/PrimitiveWrapperArrays.java     | 301 +++++++++++++++++++++
 .../foundation/protobuf/internal/model/User.java   |   7 +
 .../protobuf/internal/schema/TestAnySchema.java    |  10 +-
 .../internal/schema/TestMessageSchema.java         |   2 +-
 .../internal/schema/TestRepeatedSchema.java        | 206 +++++++++++++-
 9 files changed, 976 insertions(+), 67 deletions(-)

diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/TestModelWrap.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/TestModelWrap.java
index 94937c2..26d447c 100644
--- a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/TestModelWrap.java
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/TestModelWrap.java
@@ -18,7 +18,7 @@ package org.apache.servicecomb.foundation.protobuf.internal;
 
 import java.io.IOException;
 import java.util.Arrays;
-import java.util.Collections;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -72,20 +72,43 @@ public class TestModelWrap {
     public Map<String, Map<String, Map<String, User>>> mapMapMapUser;
 
     public void init() {
-      listListUser = Arrays.asList(Arrays.asList(user));
-      listMapUser = Arrays.asList(Collections.singletonMap(user.name, user));
-      mapListUser = Collections.singletonMap("k1", Arrays.asList(user));
-      mapMapUser = Collections.singletonMap("k1", Collections.singletonMap(user.name, user));
-
-      listListListUser = Arrays.asList(Arrays.asList(Arrays.asList(user)));
-      listListMapUser = Arrays.asList(Arrays.asList(Collections.singletonMap(user.name, user)));
-      listMapListUser = Arrays.asList(Collections.singletonMap("k1", Arrays.asList(user)));
-      listMapMapUser = Arrays.asList(Collections.singletonMap("k1", Collections.singletonMap(user.name, user)));
-      mapListListUser = Collections.singletonMap("k1", Arrays.asList(Arrays.asList(user)));
-      mapListMapUser = Collections.singletonMap("k1", Arrays.asList(Collections.singletonMap(user.name, user)));
-      mapMapListUser = Collections.singletonMap("k1", Collections.singletonMap("k1", Arrays.asList(user)));
-      mapMapMapUser = Collections
-          .singletonMap("k1", Collections.singletonMap("k1", Collections.singletonMap(user.name, user)));
+      List<User> listUser = Arrays.asList(user, user);
+
+      Map<String, User> mapUser = new LinkedHashMap<>();
+      mapUser.put("k1", user);
+      mapUser.put("k2", user);
+
+      listListUser = Arrays.asList(listUser, listUser);
+      listMapUser = Arrays.asList(mapUser, mapUser);
+
+      mapListUser = new LinkedHashMap<>();
+      mapListUser.put("k1", listUser);
+      mapListUser.put("k2", listUser);
+
+      mapMapUser = new LinkedHashMap<>();
+      mapMapUser.put("k1", mapUser);
+      mapMapUser.put("k2", mapUser);
+
+      listListListUser = Arrays.asList(listListUser, listListUser);
+      listListMapUser = Arrays.asList(listMapUser, listMapUser);
+      listMapListUser = Arrays.asList(mapListUser, mapListUser);
+      listMapMapUser = Arrays.asList(mapMapUser, mapMapUser);
+
+      mapListListUser = new LinkedHashMap<>();
+      mapListListUser.put("k1", listListUser);
+      mapListListUser.put("k2", listListUser);
+
+      mapListMapUser = new LinkedHashMap<>();
+      mapListMapUser.put("k1", listMapUser);
+      mapListMapUser.put("k2", listMapUser);
+
+      mapMapListUser = new LinkedHashMap<>();
+      mapMapListUser.put("k1", mapListUser);
+      mapMapListUser.put("k2", mapListUser);
+
+      mapMapMapUser = new LinkedHashMap<>();
+      mapMapMapUser.put("k1", mapMapUser);
+      mapMapMapUser.put("k2", mapMapUser);
     }
   }
 
@@ -133,19 +156,36 @@ public class TestModelWrap {
       ProtoMapMapUser protoMapMapUser = new ProtoMapMapUser();
       protoMapMapUser.init();
 
-      listListUser = Arrays.asList(protoListUser);
-      listMapUser = Arrays.asList(protoMapUser);
-      mapListUser = Collections.singletonMap("k1", protoListUser);
-      mapMapUser = Collections.singletonMap("k1", protoMapUser);
-
-      listListListUser = Arrays.asList(protoListListUser);
-      listListMapUser = Arrays.asList(protoListMapUser);
-      listMapListUser = Arrays.asList(protoMapListUser);
-      listMapMapUser = Arrays.asList(protoMapMapUser);
-      mapListListUser = Collections.singletonMap("k1", protoListListUser);
-      mapListMapUser = Collections.singletonMap("k1", protoListMapUser);
-      mapMapListUser = Collections.singletonMap("k1", protoMapListUser);
-      mapMapMapUser = Collections.singletonMap("k1", protoMapMapUser);
+      listListUser = Arrays.asList(protoListUser, protoListUser);
+      listMapUser = Arrays.asList(protoMapUser, protoMapUser);
+      mapListUser = new LinkedHashMap<>();
+      mapListUser.put("k1", protoListUser);
+      mapListUser.put("k2", protoListUser);
+
+      mapMapUser = new LinkedHashMap<>();
+      mapMapUser.put("k1", protoMapUser);
+      mapMapUser.put("k2", protoMapUser);
+
+      listListListUser = Arrays.asList(protoListListUser, protoListListUser);
+      listListMapUser = Arrays.asList(protoListMapUser, protoListMapUser);
+      listMapListUser = Arrays.asList(protoMapListUser, protoMapListUser);
+      listMapMapUser = Arrays.asList(protoMapMapUser, protoMapMapUser);
+
+      mapListListUser = new LinkedHashMap<>();
+      mapListListUser.put("k1", protoListListUser);
+      mapListListUser.put("k2", protoListListUser);
+
+      mapListMapUser = new LinkedHashMap<>();
+      mapListMapUser.put("k1", protoListMapUser);
+      mapListMapUser.put("k2", protoListMapUser);
+
+      mapMapListUser = new LinkedHashMap<>();
+      mapMapListUser.put("k1", protoMapListUser);
+      mapMapListUser.put("k2", protoMapListUser);
+
+      mapMapMapUser = new LinkedHashMap<>();
+      mapMapMapUser.put("k1", protoMapMapUser);
+      mapMapMapUser.put("k2", protoMapMapUser);
     }
   }
 
@@ -155,7 +195,7 @@ public class TestModelWrap {
     public void init() {
       ProtoListUser protoListUser = new ProtoListUser();
       protoListUser.init();
-      value = Arrays.asList(protoListUser);
+      value = Arrays.asList(protoListUser, protoListUser);
     }
   }
 
@@ -165,7 +205,7 @@ public class TestModelWrap {
     public void init() {
       ProtoMapUser protoMapUser = new ProtoMapUser();
       protoMapUser.init();
-      value = Arrays.asList(protoMapUser);
+      value = Arrays.asList(protoMapUser, protoMapUser);
     }
   }
 
@@ -175,7 +215,9 @@ public class TestModelWrap {
     public void init() {
       ProtoListUser protoListUser = new ProtoListUser();
       protoListUser.init();
-      value = Collections.singletonMap("k1", protoListUser);
+      value = new LinkedHashMap<>();
+      value.put("k1", protoListUser);
+      value.put("k2", protoListUser);
     }
   }
 
@@ -185,7 +227,9 @@ public class TestModelWrap {
     public void init() {
       ProtoMapUser protoMapUser = new ProtoMapUser();
       protoMapUser.init();
-      value = Collections.singletonMap("k1", protoMapUser);
+      value = new LinkedHashMap<>();
+      value.put("k1", protoMapUser);
+      value.put("k2", protoMapUser);
     }
   }
 
@@ -193,7 +237,7 @@ public class TestModelWrap {
     public List<User> value;
 
     public void init() {
-      value = Arrays.asList(user);
+      value = Arrays.asList(user, user);
     }
   }
 
@@ -201,20 +245,26 @@ public class TestModelWrap {
     public Map<String, User> value;
 
     public void init() {
-      value = Collections.singletonMap(user.name, user);
+      value = new LinkedHashMap<>();
+      value.put("k1", user);
+      value.put("k2", user);
     }
   }
 
   @SuppressWarnings("unchecked")
   @Test
   public void pojoModel() throws IOException {
-    RootSerializer pojoSerializer = modelProtoMapper.findRootSerializer("PojoModel");
-    RootDeserializer pojoMapDeserializer = modelProtoMapper.createRootDeserializer(Map.class, "PojoModel");
-    RootDeserializer pojoModelDeserializer = modelProtoMapper.createRootDeserializer(PojoModel.class, "PojoModel");
-
-    RootSerializer protoSerializer = modelProtoMapper.findRootSerializer("ProtoModel");
-    RootDeserializer protoMapDeserializer = modelProtoMapper.createRootDeserializer(Map.class, "ProtoModel");
-    RootDeserializer protoModelDeserializer = modelProtoMapper.createRootDeserializer(ProtoModel.class, "ProtoModel");
+    RootSerializer pojoSerializer = modelProtoMapper.createRootSerializer("PojoModel", PojoModel.class);
+    RootDeserializer<Map<String, Object>> pojoMapDeserializer = modelProtoMapper
+        .createRootDeserializer("PojoModel", Map.class);
+    RootDeserializer<PojoModel> pojoModelDeserializer = modelProtoMapper
+        .createRootDeserializer("PojoModel", PojoModel.class);
+
+    RootSerializer protoSerializer = modelProtoMapper.createRootSerializer("ProtoModel", ProtoModel.class);
+    RootDeserializer<Map<String, Object>> protoMapDeserializer = modelProtoMapper
+        .createRootDeserializer("ProtoModel", Map.class);
+    RootDeserializer<ProtoModel> protoModelDeserializer = modelProtoMapper
+        .createRootDeserializer("ProtoModel", ProtoModel.class);
 
     PojoModel pojoModel = new PojoModel();
     pojoModel.init();
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/TestSchemaBase.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/TestSchemaBase.java
index 664be90..2743aa1 100644
--- a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/TestSchemaBase.java
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/TestSchemaBase.java
@@ -24,6 +24,8 @@ import org.apache.servicecomb.foundation.protobuf.ProtoMapper;
 import org.apache.servicecomb.foundation.protobuf.ProtoMapperFactory;
 import org.apache.servicecomb.foundation.protobuf.RootDeserializer;
 import org.apache.servicecomb.foundation.protobuf.RootSerializer;
+import org.apache.servicecomb.foundation.protobuf.internal.model.PrimitiveArrays;
+import org.apache.servicecomb.foundation.protobuf.internal.model.PrimitiveWrapperArrays;
 import org.apache.servicecomb.foundation.protobuf.internal.model.ProtobufRoot;
 import org.apache.servicecomb.foundation.protobuf.internal.model.Root;
 import org.junit.Assert;
@@ -41,6 +43,18 @@ public class TestSchemaBase {
 
   protected static RootDeserializer<Root> rootDeserializer = protoMapper.createRootDeserializer("Root", Root.class);
 
+  protected static RootSerializer primitiveArraysSerializer = protoMapper
+      .createRootSerializer("Root", PrimitiveArrays.class);
+
+  protected static RootDeserializer<Root> primitiveArraysDeserializer = protoMapper
+      .createRootDeserializer("Root", PrimitiveArrays.class);
+
+  protected static RootSerializer primitiveWrapperArraysSerializer = protoMapper
+      .createRootSerializer("Root", PrimitiveWrapperArrays.class);
+
+  protected static RootDeserializer<Root> primitiveWrapperArraysDeserializer = protoMapper
+      .createRootDeserializer("Root", PrimitiveWrapperArrays.class);
+
   protected static RootDeserializer<Map<String, Object>> mapRootDeserializer = protoMapper
       .createRootDeserializer("Root", Map.class);
 
@@ -83,6 +97,44 @@ public class TestSchemaBase {
     }
   }
 
+  protected void checkRepeatedWithPrimitive() throws Exception {
+    check();
+
+    check(primitiveArraysDeserializer, mapRootDeserializer, primitiveArraysSerializer, false);
+    String primitiveFieldName = scbMap.keySet().iterator().next();
+    java.lang.reflect.Field primitiveField = PrimitiveArrays.class.getDeclaredField(primitiveFieldName);
+    primitiveField.setAccessible(true);
+    Object primitiveArray = primitiveField.get(scbRoot);
+
+    check(primitiveWrapperArraysDeserializer, mapRootDeserializer, primitiveWrapperArraysSerializer, false);
+    String wrapperFieldName = scbMap.keySet().iterator().next();
+    java.lang.reflect.Field wrapperField = PrimitiveWrapperArrays.class.getDeclaredField(wrapperFieldName);
+    wrapperField.setAccessible(true);
+    Object[] array = (Object[]) wrapperField.get(scbRoot);
+
+    // dynamic strings
+    String[] strings = new String[array.length];
+    for (int idx = 0; idx < array.length; idx++) {
+      strings[idx] = array[idx].toString();
+    }
+    scbMap.clear();
+    scbMap.put(primitiveFieldName, strings);
+    scbMapBytes = primitiveArraysSerializer.serialize(scbMap);
+    Assert.assertArrayEquals(protobufBytes, scbMapBytes);
+
+    // dynamic primitive array
+    scbMap.clear();
+    scbMap.put(primitiveFieldName, primitiveArray);
+    scbMapBytes = primitiveArraysSerializer.serialize(scbMap);
+    Assert.assertArrayEquals(protobufBytes, scbMapBytes);
+
+    // dynamic array
+    scbMap.clear();
+    scbMap.put(primitiveFieldName, array);
+    scbMapBytes = primitiveArraysSerializer.serialize(scbMap);
+    Assert.assertArrayEquals(protobufBytes, scbMapBytes);
+  }
+
   protected void check() throws IOException {
     check(rootDeserializer, mapRootDeserializer, rootSerializer, false);
   }
@@ -99,11 +151,11 @@ public class TestSchemaBase {
     // 2.weak type deserialize
     scbMap = mapDeserializer.deserialize(protobufBytes);
     // 3.weak type serialize
-    scbMapBytes = rootSerializer.serialize(scbMap);
+    scbMapBytes = serializer.serialize(scbMap);
     // 4.strong type deserialize
     scbRoot = deserializer.deserialize(scbMapBytes);
     // 5.strong type serialize
-    scbRootBytes = rootSerializer.serialize(scbRoot);
+    scbRootBytes = serializer.serialize(scbRoot);
 
     if (print) {
       System.out.println("scbRoot bytes:" + Hex.encodeHexString(scbRootBytes));
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/bean/TestBeanDescriptorManager.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/bean/TestBeanDescriptorManager.java
index dff8e42..9d2994b 100644
--- a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/bean/TestBeanDescriptorManager.java
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/bean/TestBeanDescriptorManager.java
@@ -19,6 +19,10 @@ package org.apache.servicecomb.foundation.protobuf.internal.bean;
 import java.lang.reflect.Method;
 
 import org.apache.servicecomb.foundation.common.utils.ReflectUtils;
+import org.apache.servicecomb.foundation.common.utils.bean.Getter;
+import org.apache.servicecomb.foundation.common.utils.bean.IntGetter;
+import org.apache.servicecomb.foundation.common.utils.bean.IntSetter;
+import org.apache.servicecomb.foundation.common.utils.bean.Setter;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -100,38 +104,42 @@ public class TestBeanDescriptorManager {
     Assert.assertSame(Model.class, beanDescriptor.getJavaType().getRawClass());
   }
 
+  @SuppressWarnings("unchecked")
   @Test
-  public void both() throws Throwable {
+  public void both() {
     PropertyDescriptor propertyDescriptor = beanDescriptor.getPropertyDescriptors().get("both");
-    propertyDescriptor.getSetter().set(model, 1);
-    Assert.assertEquals(1, propertyDescriptor.getGetter().get(model));
+    ((IntSetter<Model>) propertyDescriptor.getSetter()).set(model, 1);
+    Assert.assertEquals(1, ((IntGetter<Model>) propertyDescriptor.getGetter()).get(model));
     Assert.assertEquals(1, model.getBoth());
   }
 
+  @SuppressWarnings("unchecked")
   @Test
-  public void onlyGet() throws Throwable {
+  public void onlyGet() {
     PropertyDescriptor propertyDescriptor = beanDescriptor.getPropertyDescriptors().get("onlyGet");
     Assert.assertNull(propertyDescriptor.getSetter());
 
     model.onlyGet(1);
-    Assert.assertEquals(1, propertyDescriptor.getGetter().get(model));
+    Assert.assertEquals(1, ((IntGetter<Model>) propertyDescriptor.getGetter()).get(model));
     Assert.assertEquals(1, model.getOnlyGet());
   }
 
+  @SuppressWarnings("unchecked")
   @Test
-  public void onlySet() throws Throwable {
+  public void onlySet() {
     PropertyDescriptor propertyDescriptor = beanDescriptor.getPropertyDescriptors().get("onlySet");
     Assert.assertNull(propertyDescriptor.getGetter());
 
-    propertyDescriptor.getSetter().set(model, 1);
+    ((IntSetter<Model>) propertyDescriptor.getSetter()).set(model, 1);
     Assert.assertEquals(1, model.onlySet());
   }
 
+  @SuppressWarnings("unchecked")
   @Test
-  public void direct() throws Throwable {
+  public void direct() {
     PropertyDescriptor propertyDescriptor = beanDescriptor.getPropertyDescriptors().get("direct");
-    propertyDescriptor.getSetter().set(model, 1);
-    Assert.assertEquals(1, propertyDescriptor.getGetter().get(model));
+    ((Setter<Model, Integer>) propertyDescriptor.getSetter()).set(model, 1);
+    Assert.assertEquals(1, (int) ((Getter<Model, Integer>) propertyDescriptor.getGetter()).get(model));
     Assert.assertEquals(1, model.direct);
   }
 }
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/model/PrimitiveArrays.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/model/PrimitiveArrays.java
new file mode 100644
index 0000000..fdaa1f5
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/model/PrimitiveArrays.java
@@ -0,0 +1,301 @@
+/*
+ * 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")Packed; 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.servicecomb.foundation.protobuf.internal.model;
+
+import org.apache.servicecomb.foundation.test.scaffolding.model.Color;
+
+public class PrimitiveArrays {
+  private int[] int32sPacked;
+
+  private long[] int64sPacked;
+
+  private int[] uint32sPacked;
+
+  private long[] uint64sPacked;
+
+  private int[] sint32sPacked;
+
+  private long[] sint64sPacked;
+
+  private int[] fixed32sPacked;
+
+  private long[] fixed64sPacked;
+
+  private int[] sfixed32sPacked;
+
+  private long[] sfixed64sPacked;
+
+  private float[] floatsPacked;
+
+  private double[] doublesPacked;
+
+  private boolean[] boolsPacked;
+
+  private Color[] colorsPacked;
+
+  private int[] int32sNotPacked;
+
+  private long[] int64sNotPacked;
+
+  private int[] uint32sNotPacked;
+
+  private long[] uint64sNotPacked;
+
+  private int[] sint32sNotPacked;
+
+  private long[] sint64sNotPacked;
+
+  private int[] fixed32sNotPacked;
+
+  private long[] fixed64sNotPacked;
+
+  private int[] sfixed32sNotPacked;
+
+  private long[] sfixed64sNotPacked;
+
+  private float[] floatsNotPacked;
+
+  private double[] doublesNotPacked;
+
+  private boolean[] boolsNotPacked;
+
+  private Color[] colorsNotPacked;
+
+  public int[] getInt32sPacked() {
+    return int32sPacked;
+  }
+
+  public void setInt32sPacked(int[] int32sPacked) {
+    this.int32sPacked = int32sPacked;
+  }
+
+  public long[] getInt64sPacked() {
+    return int64sPacked;
+  }
+
+  public void setInt64sPacked(long[] int64sPacked) {
+    this.int64sPacked = int64sPacked;
+  }
+
+  public int[] getUint32sPacked() {
+    return uint32sPacked;
+  }
+
+  public void setUint32sPacked(int[] uint32sPacked) {
+    this.uint32sPacked = uint32sPacked;
+  }
+
+  public long[] getUint64sPacked() {
+    return uint64sPacked;
+  }
+
+  public void setUint64sPacked(long[] uint64sPacked) {
+    this.uint64sPacked = uint64sPacked;
+  }
+
+  public int[] getSint32sPacked() {
+    return sint32sPacked;
+  }
+
+  public void setSint32sPacked(int[] sint32sPacked) {
+    this.sint32sPacked = sint32sPacked;
+  }
+
+  public long[] getSint64sPacked() {
+    return sint64sPacked;
+  }
+
+  public void setSint64sPacked(long[] sint64sPacked) {
+    this.sint64sPacked = sint64sPacked;
+  }
+
+  public int[] getFixed32sPacked() {
+    return fixed32sPacked;
+  }
+
+  public void setFixed32sPacked(int[] fixed32sPacked) {
+    this.fixed32sPacked = fixed32sPacked;
+  }
+
+  public long[] getFixed64sPacked() {
+    return fixed64sPacked;
+  }
+
+  public void setFixed64sPacked(long[] fixed64sPacked) {
+    this.fixed64sPacked = fixed64sPacked;
+  }
+
+  public int[] getSfixed32sPacked() {
+    return sfixed32sPacked;
+  }
+
+  public void setSfixed32sPacked(int[] sfixed32sPacked) {
+    this.sfixed32sPacked = sfixed32sPacked;
+  }
+
+  public long[] getSfixed64sPacked() {
+    return sfixed64sPacked;
+  }
+
+  public void setSfixed64sPacked(long[] sfixed64sPacked) {
+    this.sfixed64sPacked = sfixed64sPacked;
+  }
+
+  public float[] getFloatsPacked() {
+    return floatsPacked;
+  }
+
+  public void setFloatsPacked(float[] floatsPacked) {
+    this.floatsPacked = floatsPacked;
+  }
+
+  public double[] getDoublesPacked() {
+    return doublesPacked;
+  }
+
+  public void setDoublesPacked(double[] doublesPacked) {
+    this.doublesPacked = doublesPacked;
+  }
+
+  public boolean[] getBoolsPacked() {
+    return boolsPacked;
+  }
+
+  public void setBoolsPacked(boolean[] boolsPacked) {
+    this.boolsPacked = boolsPacked;
+  }
+
+  public int[] getInt32sNotPacked() {
+    return int32sNotPacked;
+  }
+
+  public void setInt32sNotPacked(int[] int32sNotPacked) {
+    this.int32sNotPacked = int32sNotPacked;
+  }
+
+  public long[] getInt64sNotPacked() {
+    return int64sNotPacked;
+  }
+
+  public void setInt64sNotPacked(long[] int64sNotPacked) {
+    this.int64sNotPacked = int64sNotPacked;
+  }
+
+  public int[] getUint32sNotPacked() {
+    return uint32sNotPacked;
+  }
+
+  public void setUint32sNotPacked(int[] uint32sNotPacked) {
+    this.uint32sNotPacked = uint32sNotPacked;
+  }
+
+  public long[] getUint64sNotPacked() {
+    return uint64sNotPacked;
+  }
+
+  public void setUint64sNotPacked(long[] uint64sNotPacked) {
+    this.uint64sNotPacked = uint64sNotPacked;
+  }
+
+  public int[] getSint32sNotPacked() {
+    return sint32sNotPacked;
+  }
+
+  public void setSint32sNotPacked(int[] sint32sNotPacked) {
+    this.sint32sNotPacked = sint32sNotPacked;
+  }
+
+  public long[] getSint64sNotPacked() {
+    return sint64sNotPacked;
+  }
+
+  public void setSint64sNotPacked(long[] sint64sNotPacked) {
+    this.sint64sNotPacked = sint64sNotPacked;
+  }
+
+  public int[] getFixed32sNotPacked() {
+    return fixed32sNotPacked;
+  }
+
+  public void setFixed32sNotPacked(int[] fixed32sNotPacked) {
+    this.fixed32sNotPacked = fixed32sNotPacked;
+  }
+
+  public long[] getFixed64sNotPacked() {
+    return fixed64sNotPacked;
+  }
+
+  public void setFixed64sNotPacked(long[] fixed64sNotPacked) {
+    this.fixed64sNotPacked = fixed64sNotPacked;
+  }
+
+  public int[] getSfixed32sNotPacked() {
+    return sfixed32sNotPacked;
+  }
+
+  public void setSfixed32sNotPacked(int[] sfixed32sNotPacked) {
+    this.sfixed32sNotPacked = sfixed32sNotPacked;
+  }
+
+  public long[] getSfixed64sNotPacked() {
+    return sfixed64sNotPacked;
+  }
+
+  public void setSfixed64sNotPacked(long[] sfixed64sNotPacked) {
+    this.sfixed64sNotPacked = sfixed64sNotPacked;
+  }
+
+  public float[] getFloatsNotPacked() {
+    return floatsNotPacked;
+  }
+
+  public void setFloatsNotPacked(float[] floatsNotPacked) {
+    this.floatsNotPacked = floatsNotPacked;
+  }
+
+  public double[] getDoublesNotPacked() {
+    return doublesNotPacked;
+  }
+
+  public void setDoublesNotPacked(double[] doublesNotPacked) {
+    this.doublesNotPacked = doublesNotPacked;
+  }
+
+  public boolean[] getBoolsNotPacked() {
+    return boolsNotPacked;
+  }
+
+  public void setBoolsNotPacked(boolean[] boolsNotPacked) {
+    this.boolsNotPacked = boolsNotPacked;
+  }
+
+  public Color[] getColorsPacked() {
+    return colorsPacked;
+  }
+
+  public void setColorsPacked(Color[] colorsPacked) {
+    this.colorsPacked = colorsPacked;
+  }
+
+  public Color[] getColorsNotPacked() {
+    return colorsNotPacked;
+  }
+
+  public void setColorsNotPacked(Color[] colorsNotPacked) {
+    this.colorsNotPacked = colorsNotPacked;
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/model/PrimitiveWrapperArrays.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/model/PrimitiveWrapperArrays.java
new file mode 100644
index 0000000..23392a9
--- /dev/null
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/model/PrimitiveWrapperArrays.java
@@ -0,0 +1,301 @@
+/*
+ * 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")Packed; 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.servicecomb.foundation.protobuf.internal.model;
+
+import org.apache.servicecomb.foundation.test.scaffolding.model.Color;
+
+public class PrimitiveWrapperArrays {
+  private Integer[] int32sPacked;
+
+  private Long[] int64sPacked;
+
+  private Integer[] uint32sPacked;
+
+  private Long[] uint64sPacked;
+
+  private Integer[] sint32sPacked;
+
+  private Long[] sint64sPacked;
+
+  private Integer[] fixed32sPacked;
+
+  private Long[] fixed64sPacked;
+
+  private Integer[] sfixed32sPacked;
+
+  private Long[] sfixed64sPacked;
+
+  private Float[] floatsPacked;
+
+  private Double[] doublesPacked;
+
+  private Boolean[] boolsPacked;
+
+  private Color[] colorsPacked;
+
+  private Integer[] int32sNotPacked;
+
+  private Long[] int64sNotPacked;
+
+  private Integer[] uint32sNotPacked;
+
+  private Long[] uint64sNotPacked;
+
+  private Integer[] sint32sNotPacked;
+
+  private Long[] sint64sNotPacked;
+
+  private Integer[] fixed32sNotPacked;
+
+  private Long[] fixed64sNotPacked;
+
+  private Integer[] sfixed32sNotPacked;
+
+  private Long[] sfixed64sNotPacked;
+
+  private Float[] floatsNotPacked;
+
+  private Double[] doublesNotPacked;
+
+  private Boolean[] boolsNotPacked;
+
+  private Color[] colorsNotPacked;
+
+  public Integer[] getInt32sPacked() {
+    return int32sPacked;
+  }
+
+  public void setInt32sPacked(Integer[] int32sPacked) {
+    this.int32sPacked = int32sPacked;
+  }
+
+  public Long[] getInt64sPacked() {
+    return int64sPacked;
+  }
+
+  public void setInt64sPacked(Long[] int64sPacked) {
+    this.int64sPacked = int64sPacked;
+  }
+
+  public Integer[] getUint32sPacked() {
+    return uint32sPacked;
+  }
+
+  public void setUint32sPacked(Integer[] uint32sPacked) {
+    this.uint32sPacked = uint32sPacked;
+  }
+
+  public Long[] getUint64sPacked() {
+    return uint64sPacked;
+  }
+
+  public void setUint64sPacked(Long[] uint64sPacked) {
+    this.uint64sPacked = uint64sPacked;
+  }
+
+  public Integer[] getSint32sPacked() {
+    return sint32sPacked;
+  }
+
+  public void setSint32sPacked(Integer[] sint32sPacked) {
+    this.sint32sPacked = sint32sPacked;
+  }
+
+  public Long[] getSint64sPacked() {
+    return sint64sPacked;
+  }
+
+  public void setSint64sPacked(Long[] sint64sPacked) {
+    this.sint64sPacked = sint64sPacked;
+  }
+
+  public Integer[] getFixed32sPacked() {
+    return fixed32sPacked;
+  }
+
+  public void setFixed32sPacked(Integer[] fixed32sPacked) {
+    this.fixed32sPacked = fixed32sPacked;
+  }
+
+  public Long[] getFixed64sPacked() {
+    return fixed64sPacked;
+  }
+
+  public void setFixed64sPacked(Long[] fixed64sPacked) {
+    this.fixed64sPacked = fixed64sPacked;
+  }
+
+  public Integer[] getSfixed32sPacked() {
+    return sfixed32sPacked;
+  }
+
+  public void setSfixed32sPacked(Integer[] sfixed32sPacked) {
+    this.sfixed32sPacked = sfixed32sPacked;
+  }
+
+  public Long[] getSfixed64sPacked() {
+    return sfixed64sPacked;
+  }
+
+  public void setSfixed64sPacked(Long[] sfixed64sPacked) {
+    this.sfixed64sPacked = sfixed64sPacked;
+  }
+
+  public Float[] getFloatsPacked() {
+    return floatsPacked;
+  }
+
+  public void setFloatsPacked(Float[] floatsPacked) {
+    this.floatsPacked = floatsPacked;
+  }
+
+  public Double[] getDoublesPacked() {
+    return doublesPacked;
+  }
+
+  public void setDoublesPacked(Double[] doublesPacked) {
+    this.doublesPacked = doublesPacked;
+  }
+
+  public Boolean[] getBoolsPacked() {
+    return boolsPacked;
+  }
+
+  public void setBoolsPacked(Boolean[] boolsPacked) {
+    this.boolsPacked = boolsPacked;
+  }
+
+  public Integer[] getInt32sNotPacked() {
+    return int32sNotPacked;
+  }
+
+  public void setInt32sNotPacked(Integer[] int32sNotPacked) {
+    this.int32sNotPacked = int32sNotPacked;
+  }
+
+  public Long[] getInt64sNotPacked() {
+    return int64sNotPacked;
+  }
+
+  public void setInt64sNotPacked(Long[] int64sNotPacked) {
+    this.int64sNotPacked = int64sNotPacked;
+  }
+
+  public Integer[] getUint32sNotPacked() {
+    return uint32sNotPacked;
+  }
+
+  public void setUint32sNotPacked(Integer[] uint32sNotPacked) {
+    this.uint32sNotPacked = uint32sNotPacked;
+  }
+
+  public Long[] getUint64sNotPacked() {
+    return uint64sNotPacked;
+  }
+
+  public void setUint64sNotPacked(Long[] uint64sNotPacked) {
+    this.uint64sNotPacked = uint64sNotPacked;
+  }
+
+  public Integer[] getSint32sNotPacked() {
+    return sint32sNotPacked;
+  }
+
+  public void setSint32sNotPacked(Integer[] sint32sNotPacked) {
+    this.sint32sNotPacked = sint32sNotPacked;
+  }
+
+  public Long[] getSint64sNotPacked() {
+    return sint64sNotPacked;
+  }
+
+  public void setSint64sNotPacked(Long[] sint64sNotPacked) {
+    this.sint64sNotPacked = sint64sNotPacked;
+  }
+
+  public Integer[] getFixed32sNotPacked() {
+    return fixed32sNotPacked;
+  }
+
+  public void setFixed32sNotPacked(Integer[] fixed32sNotPacked) {
+    this.fixed32sNotPacked = fixed32sNotPacked;
+  }
+
+  public Long[] getFixed64sNotPacked() {
+    return fixed64sNotPacked;
+  }
+
+  public void setFixed64sNotPacked(Long[] fixed64sNotPacked) {
+    this.fixed64sNotPacked = fixed64sNotPacked;
+  }
+
+  public Integer[] getSfixed32sNotPacked() {
+    return sfixed32sNotPacked;
+  }
+
+  public void setSfixed32sNotPacked(Integer[] sfixed32sNotPacked) {
+    this.sfixed32sNotPacked = sfixed32sNotPacked;
+  }
+
+  public Long[] getSfixed64sNotPacked() {
+    return sfixed64sNotPacked;
+  }
+
+  public void setSfixed64sNotPacked(Long[] sfixed64sNotPacked) {
+    this.sfixed64sNotPacked = sfixed64sNotPacked;
+  }
+
+  public Float[] getFloatsNotPacked() {
+    return floatsNotPacked;
+  }
+
+  public void setFloatsNotPacked(Float[] floatsNotPacked) {
+    this.floatsNotPacked = floatsNotPacked;
+  }
+
+  public Double[] getDoublesNotPacked() {
+    return doublesNotPacked;
+  }
+
+  public void setDoublesNotPacked(Double[] doublesNotPacked) {
+    this.doublesNotPacked = doublesNotPacked;
+  }
+
+  public Boolean[] getBoolsNotPacked() {
+    return boolsNotPacked;
+  }
+
+  public void setBoolsNotPacked(Boolean[] boolsNotPacked) {
+    this.boolsNotPacked = boolsNotPacked;
+  }
+
+  public Color[] getColorsPacked() {
+    return colorsPacked;
+  }
+
+  public void setColorsPacked(Color[] colorsPacked) {
+    this.colorsPacked = colorsPacked;
+  }
+
+  public Color[] getColorsNotPacked() {
+    return colorsNotPacked;
+  }
+
+  public void setColorsNotPacked(Color[] colorsNotPacked) {
+    this.colorsNotPacked = colorsNotPacked;
+  }
+}
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/model/User.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/model/User.java
index 642d381..06c7d2e 100644
--- a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/model/User.java
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/model/User.java
@@ -21,6 +21,13 @@ public class User {
 
   private Root typeRecursive;
 
+  public User() {
+  }
+
+  public User(String name) {
+    this.name = name;
+  }
+
   public String getName() {
     return name;
   }
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/TestAnySchema.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/TestAnySchema.java
index fb2868e..ebdc754 100644
--- a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/TestAnySchema.java
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/TestAnySchema.java
@@ -32,13 +32,11 @@ import org.junit.Test;
 import com.google.protobuf.Any;
 
 public class TestAnySchema extends TestSchemaBase {
-  public TestAnySchema() {
-    initField("any");
-  }
-
   @Test
   public void empty() throws Throwable {
-    Assert.assertEquals(0, serFieldSchema.writeTo(null).length);
+    scbMap = new HashMap<>();
+    scbMap.put("any", null);
+    Assert.assertEquals(0, rootSerializer.serialize(scbMap).length);
   }
 
   @Test
@@ -85,7 +83,7 @@ public class TestAnySchema extends TestSchemaBase {
     Assert.assertThat(root.getAny(), Matchers.instanceOf(Map.class));
     Assert.assertThat((Map<? extends String, ? extends String>) root.getAny(), Matchers.hasEntry("name", "n1"));
 
-    RootDeserializer deserializer = protoMapper.createRootDeserializer(Map.class, "Root");
+    RootDeserializer<Map<String, Object>> deserializer = protoMapper.createRootDeserializer("Root", Map.class);
     map = deserializer.deserialize(scbRootBytes);
     Assert.assertThat((Map<? extends String, ? extends String>) map.get("any"), Matchers.hasEntry("name", "n1"));
   }
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/TestMessageSchema.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/TestMessageSchema.java
index 8da3a5d..56fe453 100644
--- a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/TestMessageSchema.java
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/TestMessageSchema.java
@@ -42,7 +42,7 @@ public class TestMessageSchema extends TestSchemaBase {
   @Test
   public void generic() throws Throwable {
     JavaType javaType = TypeFactory.defaultInstance().constructParametricType(CustomGeneric.class, User.class);
-    RootDeserializer genericDeserializer = protoMapper.createRootDeserializer(javaType, "Root");
+    RootDeserializer<CustomGeneric<User>> genericDeserializer = protoMapper.createRootDeserializer("Root", javaType);
 
     builder.setUser(ProtobufRoot.User.newBuilder().setName("name1").build());
     check(genericDeserializer, mapRootDeserializer, rootSerializer, false);
diff --git a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/TestRepeatedSchema.java b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/TestRepeatedSchema.java
index 48e4c05..c5b9019 100644
--- a/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/TestRepeatedSchema.java
+++ b/foundations/foundation-protobuf/src/test/java/org/apache/servicecomb/foundation/protobuf/internal/schema/TestRepeatedSchema.java
@@ -16,35 +16,227 @@
  */
 package org.apache.servicecomb.foundation.protobuf.internal.schema;
 
+import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 import java.util.List;
 
 import org.apache.servicecomb.foundation.protobuf.internal.TestSchemaBase;
 import org.apache.servicecomb.foundation.protobuf.internal.model.ProtobufRoot;
+import org.apache.servicecomb.foundation.protobuf.internal.model.ProtobufRoot.Color;
+import org.apache.servicecomb.foundation.protobuf.internal.model.User;
 import org.junit.Assert;
 import org.junit.Test;
 
+import com.google.protobuf.ByteString;
+
 public class TestRepeatedSchema extends TestSchemaBase {
   public static class RootWithArray {
-    public String[] sList;
+    public byte[][] bytess;
+
+    public String[] strings;
+
+    public User[] users;
   }
 
   @Test
-  public void sList() throws Throwable {
+  public void fixed32s() throws Exception {
+    builder.addAllFixed32SPacked(Arrays.asList(Integer.MIN_VALUE, 0, Integer.MAX_VALUE));
+    checkRepeatedWithPrimitive();
+  }
+
+  @Test
+  public void fixed32sNotPacked() throws Exception {
+    builder.addAllFixed32SNotPacked(Arrays.asList(Integer.MIN_VALUE, 0, Integer.MAX_VALUE));
+    checkRepeatedWithPrimitive();
+  }
+
+  @Test
+  public void sfixed32s() throws Exception {
+    builder.addAllSfixed32SPacked(Arrays.asList(Integer.MIN_VALUE, 0, Integer.MAX_VALUE));
+    checkRepeatedWithPrimitive();
+  }
+
+  @Test
+  public void sfixed32sNotPacked() throws Exception {
+    builder.addAllSfixed32SNotPacked(Arrays.asList(Integer.MIN_VALUE, 0, Integer.MAX_VALUE));
+    checkRepeatedWithPrimitive();
+  }
+
+  @Test
+  public void int32s() throws Exception {
+    builder.addAllInt32SPacked(Arrays.asList(Integer.MIN_VALUE, 0, Integer.MAX_VALUE));
+    checkRepeatedWithPrimitive();
+  }
+
+  @Test
+  public void int32sNotPacked() throws Exception {
+    builder.addAllInt32SNotPacked(Arrays.asList(Integer.MIN_VALUE, 0, Integer.MAX_VALUE));
+    checkRepeatedWithPrimitive();
+  }
+
+  @Test
+  public void sint32s() throws Exception {
+    builder.addAllSint32SPacked(Arrays.asList(Integer.MIN_VALUE, 0, Integer.MAX_VALUE));
+    checkRepeatedWithPrimitive();
+  }
+
+  @Test
+  public void sint32sNotPacked() throws Exception {
+    builder.addAllSint32SNotPacked(Arrays.asList(Integer.MIN_VALUE, 0, Integer.MAX_VALUE));
+    checkRepeatedWithPrimitive();
+  }
+
+  @Test
+  public void uint32s() throws Exception {
+    builder.addAllUint32SPacked(Arrays.asList(Integer.MIN_VALUE, 0, Integer.MAX_VALUE));
+    checkRepeatedWithPrimitive();
+  }
+
+  @Test
+  public void uint32sNotPacked() throws Exception {
+    builder.addAllUint32SNotPacked(Arrays.asList(Integer.MIN_VALUE, 0, Integer.MAX_VALUE));
+    checkRepeatedWithPrimitive();
+  }
+
+  @Test
+  public void fixed64s() throws Exception {
+    builder.addAllFixed64SPacked(Arrays.asList(Long.MIN_VALUE, 0L, Long.MAX_VALUE));
+    checkRepeatedWithPrimitive();
+  }
+
+  @Test
+  public void fixed64sNotPacked() throws Exception {
+    builder.addAllFixed64SNotPacked(Arrays.asList(Long.MIN_VALUE, 0L, Long.MAX_VALUE));
+    checkRepeatedWithPrimitive();
+  }
+
+  @Test
+  public void sfixed64s() throws Exception {
+    builder.addAllSfixed64SPacked(Arrays.asList(Long.MIN_VALUE, 0L, Long.MAX_VALUE));
+    checkRepeatedWithPrimitive();
+  }
+
+  @Test
+  public void sfixed64sNotPacked() throws Exception {
+    builder.addAllSfixed64SNotPacked(Arrays.asList(Long.MIN_VALUE, 0L, Long.MAX_VALUE));
+    checkRepeatedWithPrimitive();
+  }
+
+  @Test
+  public void int64s() throws Exception {
+    builder.addAllInt64SPacked(Arrays.asList(Long.MIN_VALUE, 0L, Long.MAX_VALUE));
+    checkRepeatedWithPrimitive();
+  }
+
+  @Test
+  public void int64sNotPacked() throws Exception {
+    builder.addAllInt64SNotPacked(Arrays.asList(Long.MIN_VALUE, 0L, Long.MAX_VALUE));
+    checkRepeatedWithPrimitive();
+  }
+
+  @Test
+  public void sint64s() throws Exception {
+    builder.addAllSint64SPacked(Arrays.asList(Long.MIN_VALUE, 0L, Long.MAX_VALUE));
+    checkRepeatedWithPrimitive();
+  }
+
+  @Test
+  public void sint64sNotPacked() throws Exception {
+    builder.addAllSint64SNotPacked(Arrays.asList(Long.MIN_VALUE, 0L, Long.MAX_VALUE));
+    checkRepeatedWithPrimitive();
+  }
+
+  @Test
+  public void uint64s() throws Exception {
+    builder.addAllUint64SPacked(Arrays.asList(Long.MIN_VALUE, 0L, Long.MAX_VALUE));
+    checkRepeatedWithPrimitive();
+  }
+
+  @Test
+  public void uint64sNotPacked() throws Exception {
+    builder.addAllUint64SNotPacked(Arrays.asList(Long.MIN_VALUE, 0L, Long.MAX_VALUE));
+    checkRepeatedWithPrimitive();
+  }
+
+  @Test
+  public void floats() throws Exception {
+    builder.addAllFloatsPacked(Arrays.asList(Float.MIN_VALUE, (float) 0.0, Float.MAX_VALUE));
+    checkRepeatedWithPrimitive();
+  }
+
+  @Test
+  public void floatsNotPacked() throws Exception {
+    builder.addAllFloatsNotPacked(Arrays.asList(Float.MIN_VALUE, (float) 0.0, Float.MAX_VALUE));
+    checkRepeatedWithPrimitive();
+  }
+
+  @Test
+  public void doubles() throws Exception {
+    builder.addAllDoublesPacked(Arrays.asList(Double.MIN_VALUE, 0.0, Double.MAX_VALUE));
+    checkRepeatedWithPrimitive();
+  }
+
+  @Test
+  public void doublesNotPacked() throws Exception {
+    builder.addAllDoublesNotPacked(Arrays.asList(Double.MIN_VALUE, 0.0, Double.MAX_VALUE));
+    checkRepeatedWithPrimitive();
+  }
+
+  @Test
+  public void bools() throws Exception {
+    builder.addAllBoolsPacked(Arrays.asList(Boolean.FALSE, Boolean.TRUE));
+    checkRepeatedWithPrimitive();
+  }
+
+  @Test
+  public void boolsNotPacked() throws Exception {
+    builder.addAllBoolsNotPacked(Arrays.asList(Boolean.FALSE, Boolean.TRUE));
+    checkRepeatedWithPrimitive();
+  }
+
+  @Test
+  public void enums() throws Exception {
+    builder.addAllColorsPacked(Arrays.asList(Color.RED, Color.BLUE));
+    checkRepeatedWithPrimitive();
+  }
+
+  @Test
+  public void enumsNotPacked() throws Exception {
+    builder.addAllColorsNotPacked(Arrays.asList(Color.RED, Color.BLUE));
+    checkRepeatedWithPrimitive();
+  }
+
+  @Test
+  public void bytess() throws Throwable {
+    List<byte[]> sList = Arrays.asList("v1".getBytes(StandardCharsets.UTF_8), "v2".getBytes(StandardCharsets.UTF_8));
+    builder.addAllBytess(Arrays.asList(ByteString.copyFromUtf8("v1"), ByteString.copyFromUtf8("v2")));
+    check();
+
+    RootWithArray rootWithArray = new RootWithArray();
+    rootWithArray.bytess = (byte[][]) sList.toArray();
+    Assert.assertArrayEquals(protobufBytes, rootSerializer.serialize(rootWithArray));
+  }
+
+  @Test
+  public void strings() throws Throwable {
     List<String> sList = Arrays.asList("v1", "v2");
-    builder.addAllSList(sList);
+    builder.addAllStrings(sList);
     check();
 
     RootWithArray rootWithArray = new RootWithArray();
-    rootWithArray.sList = (String[]) sList.toArray();
+    rootWithArray.strings = (String[]) sList.toArray();
     Assert.assertArrayEquals(protobufBytes, rootSerializer.serialize(rootWithArray));
   }
 
   @Test
-  public void pList() throws Throwable {
-    builder.addPList(ProtobufRoot.User.newBuilder().setName("name1").build());
-    builder.addPList(ProtobufRoot.User.newBuilder().setName("name2").build());
+  public void users() throws Throwable {
+    builder.addUsers(ProtobufRoot.User.newBuilder().setName("name1").build());
+    builder.addUsers(ProtobufRoot.User.newBuilder().setName("name2").build());
 
     check();
+
+    RootWithArray rootWithArray = new RootWithArray();
+    rootWithArray.users = new User[] {new User("name1"), new User("name2")};
+    Assert.assertArrayEquals(protobufBytes, rootSerializer.serialize(rootWithArray));
   }
 }