Index: tools/traffic_annotation/auditor/traffic_annotation_auditor.py |
diff --git a/tools/traffic_annotation/auditor/traffic_annotation_auditor.py b/tools/traffic_annotation/auditor/traffic_annotation_auditor.py |
index 56e82d99b3d8ef4c607d2c484986221b2f35d024..631b6dc3552a445570e7854ab5d83ad0473dd21c 100755 |
--- a/tools/traffic_annotation/auditor/traffic_annotation_auditor.py |
+++ b/tools/traffic_annotation/auditor/traffic_annotation_auditor.py |
@@ -75,7 +75,7 @@ def _ParsRawAnnotations(raw_annotations): |
"""Parses raw annotations texts which are received from the clang tool. |
Args: |
raw_annotations: str Serialization of annotations and metadata. Each |
- annotation should have the following lines: |
+ annotation should have either of the following lines: |
1- "==== NEW ANNOTATION ====" |
2- File path. |
3- Name of the function including this position. |
@@ -85,6 +85,13 @@ def _ParsRawAnnotations(raw_annotations): |
7- Completing id or group id, when applicable, empty otherwise. |
8- Serialization of annotation text (several lines) |
n- "==== ANNOTATION ENDS ====" |
+ or: |
+ 1: "==== NEW CALL ====" |
+ 2: File path. |
+ 3: Name of the function in which the call is made. |
+ 4: Name of the called function. |
+ 5: Does the call have an annotation? |
+ 6: "==== CALL ENDS ====" |
Returns: |
annotations: ExtractedNetworkTrafficAnnotation A protobuf including all |
@@ -104,58 +111,71 @@ def _ParsRawAnnotations(raw_annotations): |
try: |
while current < len(lines) - 1: |
- if lines[current] != "==== NEW ANNOTATION ====": |
- raise Exception( |
- "Error at line %i, expected starting new annotaion." % current) |
- if current + 5 >= len(lines): |
- raise Exception( |
- "Not enough header lines at line %i." % current) |
- |
- # Extract header lines. |
- source = traffic_annotation_pb2.NetworkTrafficAnnotation.TrafficSource() |
- source.file = lines[current + 1] |
- source.function = lines[current + 2] |
- source.line = int(lines[current + 3]) |
- unique_id = lines[current + 5] |
- |
- new_metadata = {'function_type': lines[current + 4], |
- 'extra_id': lines[current + 6], |
- 'unique_id_hash': _ComputeStringHash(unique_id)} |
- # Extract serialized proto. |
- current += 7 |
- annotation_text = "" |
- |
- while current < len(lines): |
+ if lines[current] == "==== NEW ANNOTATION ====": |
+ if current + 6 >= len(lines): |
+ raise Exception( |
+ "Not enough header lines at line %i." % current) |
+ |
+ # Extract header lines. |
+ source = traffic_annotation_pb2.NetworkTrafficAnnotation.TrafficSource() |
+ source.file = lines[current + 1] |
+ source.function = lines[current + 2] |
+ source.line = int(lines[current + 3]) |
+ unique_id = lines[current + 5] |
+ |
+ new_metadata = {'function_type': lines[current + 4], |
+ 'extra_id': lines[current + 6], |
+ 'unique_id_hash': _ComputeStringHash(unique_id)} |
+ # Extract serialized proto. |
+ current += 7 |
+ annotation_text = "" |
+ |
+ while current < len(lines): |
+ if lines[current] == "==== ANNOTATION ENDS ====": |
+ break |
+ else: |
+ annotation_text += lines[current] |
+ current += 1 |
+ else: |
+ raise Exception( |
+ "Error at line %i, expected annotation end tag." % current) |
current += 1 |
- if lines[current - 1] == "==== ANNOTATION ENDS ====": |
- break |
+ |
+ # Process unittests and undefined tags. |
+ if unique_id in ("test", "test_partial"): |
+ continue |
+ if unique_id in ("undefined", "missing"): |
+ errors.append("Annotation is not defined for file '%s', line %i." % |
+ (source.file, source.line)) |
+ continue |
+ |
+ # Decode serialized proto. |
+ annotation_proto = traffic_annotation_pb2.NetworkTrafficAnnotation() |
+ try: |
+ text_format.Parse(annotation_text, annotation_proto) |
+ except Exception as error: |
+ errors.append("Annotation in file '%s', line %i, has an error: %s" % |
+ (source.file, source.line, error)) |
+ |
+ # Add new proto. |
+ annotation_proto.unique_id = unique_id |
+ annotation_proto.source.CopyFrom(source) |
+ annotations.network_traffic_annotation.add().CopyFrom(annotation_proto) |
+ metadata.append(new_metadata) |
+ elif lines[current] == "==== NEW CALL ====": |
+ # Ignore calls for now. |
+ while current < len(lines): |
+ if lines[current] == "==== CALL ENDS ====": |
+ break |
+ current += 1 |
else: |
- annotation_text += lines[current - 1] |
- else: |
+ raise Exception( |
+ "Error at line %i, expected call end tag." % current) |
+ current += 1 |
+ else: # The line is neither new annotation nor new call. |
raise Exception( |
- "Error at line %i, expected annotation end tag." % current) |
- |
- # Process unittests and undefined tags. |
- if unique_id in ("test", "test_partial"): |
- continue |
- if unique_id in ("undefined", "missing"): |
- errors.append("Annotation is not defined for file '%s', line %i." % |
- (source.file, source.line)) |
- continue |
- |
- # Decode serialized proto. |
- annotation_proto = traffic_annotation_pb2.NetworkTrafficAnnotation() |
- try: |
- text_format.Parse(annotation_text, annotation_proto) |
- except Exception as error: |
- errors.append("Annotation in file '%s', line %i, has error: %s" % |
- (source.file, source.line, error)) |
- |
- # Add new proto. |
- annotation_proto.unique_id = unique_id |
- annotation_proto.source.CopyFrom(source) |
- annotations.network_traffic_annotation.add().CopyFrom(annotation_proto) |
- metadata.append(new_metadata) |
+ "Error at line %i, expected starting new annotation or call." % |
+ current) |
except Exception as error: |
errors.append(str(error)) |