def testSerialization(self, sample=None): """Make sure the RDFValue instance can be serialized.""" if sample is None: sample = self.GenerateSample() # Serializing to a string must produce a string. serialized = serialization.ToBytes(sample) self.assertIsInstance(serialized, bytes) # Ensure we can parse it again. rdfvalue_object = serialization.FromBytes(self.rdfvalue_class, serialized) self.CheckRDFValue(rdfvalue_object, sample) # Serializing to data store must produce something the data store can # handle. serialized = serialization.ToWireFormat(sample) protobuf_type = serialization.GetProtobufType(type(sample)) if protobuf_type == "bytes": self.assertIsInstance(serialized, bytes) elif protobuf_type == "string": self.assertIsInstance(serialized, Text) elif protobuf_type in ["unsigned_integer", "integer"]: self.assertIsInstance(serialized, int) else: self.fail("%s has no valid protobuf_type" % self.rdfvalue_class) # Ensure we can parse it again. rdfvalue_object = serialization.FromWireFormat(self.rdfvalue_class, serialized) self.CheckRDFValue(rdfvalue_object, sample)
def GetValue(self, ignore_error=True): """Extracts and returns a single value from a DataBlob.""" if self.HasField("none"): return None field_names = [ "integer", "string", "data", "boolean", "list", "dict", "rdf_value", "float", "set" ] values = [getattr(self, x) for x in field_names if self.HasField(x)] if len(values) != 1: return None if self.HasField("boolean"): return bool(values[0]) # Unpack RDFValues. if self.HasField("rdf_value"): try: rdf_class = rdfvalue.RDFValue.classes[self.rdf_value.name] return serialization.FromBytes(rdf_class, self.rdf_value.data) except (ValueError, KeyError) as e: if ignore_error: logging.exception("Error during GetValue() of %s", self) return e raise elif self.HasField("list"): return [x.GetValue() for x in self.list.content] elif self.HasField("set"): return set([x.GetValue() for x in self.set.content]) else: return values[0]
def testBytes(self): self.assertIs( serialization.FromBytes(bool, serialization.ToBytes(True)), True) self.assertIs( serialization.FromBytes(bool, serialization.ToBytes(False)), False)