Search in sources :

Example 1 with TUnion

use of org.apache.thrift.TUnion in project providence by morimekta.

the class TProtocolSerializerTest method assertConsistent.

@SuppressWarnings("unchecked")
public <Providence extends PMessage<Providence, ProvidenceField>, ProvidenceField extends PField, Thrift extends TBase<Thrift, ThriftField>, ThriftField extends TFieldIdEnum> void assertConsistent(String prefix, Providence providence, Thrift thrift) {
    if (providence.descriptor().getVariant() == PMessageVariant.UNION) {
        TUnion<?, ThriftField> t_union = (TUnion) thrift;
        PUnion<?, ProvidenceField> p_union = (PUnion) providence;
        ThriftField t_field = t_union.getSetField();
        PField p_field = p_union.unionField();
        assertEquals(p_field.getId(), t_field.getThriftFieldId());
    } else {
        for (PField field : providence.descriptor().getFields()) {
            ThriftField thriftField = thrift.fieldForId(field.getId());
            String fieldPath = (prefix.isEmpty() ? "" : prefix + ".") + field.getName();
            assertEquals("has " + fieldPath, providence.has(field.getId()), thrift.isSet(thriftField));
            if (providence.has(field.getId())) {
                switch(field.getType()) {
                    case MESSAGE:
                        assertConsistent(fieldPath, (PMessage) providence.get(field.getId()), (TBase) thrift.getFieldValue(thriftField));
                        break;
                    case ENUM:
                        {
                            PEnumValue<?> pe = providence.get(field.getId());
                            TEnum te = (TEnum) thrift.getFieldValue(thriftField);
                            assertEquals(fieldPath, pe.asInteger(), te.getValue());
                            break;
                        }
                    case BINARY:
                        {
                            Binary pBin = providence.get(field.getId());
                            byte[] tBytes = (byte[]) thrift.getFieldValue(thriftField);
                            Binary tBin = Binary.wrap(tBytes);
                            assertEquals(fieldPath, pBin, tBin);
                            break;
                        }
                    case MAP:
                        {
                            Map pm = providence.get(field.getId());
                            Map tm = (Map) thrift.getFieldValue(thriftField);
                            assertEquals(fieldPath + " size", pm.size(), tm.size());
                            // TODO: Compare actual content.
                            break;
                        }
                    case SET:
                        {
                            Set ps = providence.get(field.getId());
                            Set ts = (Set) thrift.getFieldValue(thriftField);
                            assertEquals(fieldPath + " size", ps.size(), ts.size());
                            // TODO: Compare actual content.
                            break;
                        }
                    case LIST:
                        {
                            List pl = providence.get(field.getId());
                            List tl = (List) thrift.getFieldValue(thriftField);
                            assertEquals(fieldPath + " size", pl.size(), tl.size());
                            for (int i = 0; i < pl.size(); ++i) {
                                String itemPath = fieldPath + "[" + i + "]";
                                Object pi = pl.get(i);
                                Object ti = tl.get(i);
                                if (pi instanceof PMessage) {
                                    assertConsistent(itemPath, (PMessage) pi, (TBase) ti);
                                } else if (pi instanceof Set) {
                                // TODO: Compare actual content.
                                } else if (pi instanceof List) {
                                // TODO: Compare actual content.
                                } else if (pi instanceof Map) {
                                // TODO: Compare actual content.
                                } else if (pi instanceof Binary) {
                                    Binary pb = (Binary) pi;
                                    Binary tb = Binary.wrap(((ByteBuffer) ti).array());
                                    assertEquals(itemPath, pb, tb);
                                } else if (pi instanceof PEnumValue) {
                                    PEnumValue pe = (PEnumValue) pi;
                                    TEnum te = (TEnum) ti;
                                    assertEquals(itemPath, pe.asInteger(), te.getValue());
                                } else {
                                    assertEquals(itemPath, pi, ti);
                                }
                            }
                            break;
                        }
                    default:
                        assertEquals(fieldPath, providence.get(field.getId()), thrift.getFieldValue(thriftField));
                        break;
                }
            }
        }
    }
}
Also used : TUnion(org.apache.thrift.TUnion) Set(java.util.Set) PField(net.morimekta.providence.descriptor.PField) PEnumValue(net.morimekta.providence.PEnumValue) ByteBuffer(java.nio.ByteBuffer) TEnum(org.apache.thrift.TEnum) PMessage(net.morimekta.providence.PMessage) PUnion(net.morimekta.providence.PUnion) ArrayList(java.util.ArrayList) List(java.util.List) TBase(org.apache.thrift.TBase) Binary(net.morimekta.util.Binary) Map(java.util.Map)

Aggregations

ByteBuffer (java.nio.ByteBuffer)1 ArrayList (java.util.ArrayList)1 List (java.util.List)1 Map (java.util.Map)1 Set (java.util.Set)1 PEnumValue (net.morimekta.providence.PEnumValue)1 PMessage (net.morimekta.providence.PMessage)1 PUnion (net.morimekta.providence.PUnion)1 PField (net.morimekta.providence.descriptor.PField)1 Binary (net.morimekta.util.Binary)1 TBase (org.apache.thrift.TBase)1 TEnum (org.apache.thrift.TEnum)1 TUnion (org.apache.thrift.TUnion)1