|  | # Copyright (C) 2020 The Android Open Source Project | 
|  | # | 
|  | # Licensed 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. | 
|  |  | 
|  | from __future__ import absolute_import | 
|  |  | 
|  | import os | 
|  | import subprocess | 
|  | import tempfile | 
|  |  | 
|  | from google.protobuf import descriptor, descriptor_pb2, message_factory, descriptor_pool | 
|  | from google.protobuf import reflection, text_format | 
|  |  | 
|  |  | 
|  | ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) | 
|  |  | 
|  |  | 
|  | def create_message_factory(descriptor_file_paths, proto_type): | 
|  | pool = descriptor_pool.DescriptorPool() | 
|  | for file_path in descriptor_file_paths: | 
|  | descriptor = read_descriptor(file_path) | 
|  | for file in descriptor.file: | 
|  | pool.Add(file) | 
|  |  | 
|  | return message_factory.MessageFactory().GetPrototype( | 
|  | pool.FindMessageTypeByName(proto_type)) | 
|  |  | 
|  |  | 
|  | def read_descriptor(file_name): | 
|  | with open(file_name, 'rb') as f: | 
|  | contents = f.read() | 
|  |  | 
|  | descriptor = descriptor_pb2.FileDescriptorSet() | 
|  | descriptor.MergeFromString(contents) | 
|  |  | 
|  | return descriptor | 
|  |  | 
|  |  | 
|  | def serialize_textproto_trace(trace_descriptor_path, extension_descriptor_paths, | 
|  | text_proto_path, out_stream): | 
|  | proto = create_message_factory([trace_descriptor_path] + | 
|  | extension_descriptor_paths, | 
|  | 'perfetto.protos.Trace')() | 
|  |  | 
|  | with open(text_proto_path, 'r') as text_proto_file: | 
|  | text_format.Merge(text_proto_file.read(), proto) | 
|  | out_stream.write(proto.SerializeToString()) | 
|  | out_stream.flush() | 
|  |  | 
|  |  | 
|  | def serialize_python_trace(trace_descriptor_path, python_trace_path, | 
|  | out_stream): | 
|  | python_cmd = [ | 
|  | 'python3', | 
|  | python_trace_path, | 
|  | trace_descriptor_path, | 
|  | ] | 
|  |  | 
|  | # Add the test dir to the PYTHONPATH to allow synth_common to be found. | 
|  | env = os.environ.copy() | 
|  | if 'PYTHONPATH' in env: | 
|  | env['PYTHONPATH'] = "{}:{}".format( | 
|  | os.path.join(ROOT_DIR, 'test'), env['PYTHONPATH']) | 
|  | else: | 
|  | env['PYTHONPATH'] = os.path.join(ROOT_DIR, 'test') | 
|  | subprocess.check_call(python_cmd, env=env, stdout=out_stream) |