-
Notifications
You must be signed in to change notification settings - Fork 4.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add testing for protoxform scripts. We apply golden testing method for this. Risk Level: Low Testing: none Docs Changes: none Release Notes: Fixes #8428 Signed-off-by: shikugawa <[email protected]>
- Loading branch information
Showing
15 changed files
with
261 additions
and
30 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -535,4 +535,4 @@ def Main(): | |
|
||
|
||
if __name__ == '__main__': | ||
Main() | ||
Main() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
#!/bin/bash | ||
|
||
rm -rf bazel-bin/tools | ||
|
||
declare -r PROTO_TARGETS=$(bazel query "labels(srcs, labels(deps, //tools/testdata/protoxform:protos))") | ||
|
||
BAZEL_BUILD_OPTIONS+=" --remote_download_outputs=all" | ||
|
||
bazel build ${BAZEL_BUILD_OPTIONS} --//tools/api_proto_plugin:default_type_db_target=//tools/testdata/protoxform:protos \ | ||
//tools/testdata/protoxform:protos --aspects //tools/protoxform:protoxform.bzl%protoxform_aspect --output_groups=proto \ | ||
--action_env=CPROFILE_ENABLED=1 --host_force_python=PY3 | ||
|
||
./tools/protoxform_test_helper.py ${PROTO_TARGETS} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
#!/usr/bin/env python3 | ||
|
||
from run_command import runCommand | ||
|
||
import logging | ||
import os | ||
import re | ||
import sys | ||
|
||
|
||
def PathAndFilename(label): | ||
"""Retrieve actual path and filename from bazel label | ||
Args: | ||
label: bazel label to specify target proto. | ||
Returns: | ||
actual path and filename | ||
""" | ||
if label.startswith('/'): | ||
label = label.replace('//', '/', 1) | ||
elif label.startswith('@'): | ||
label = re.sub(r'@.*/', '/', label) | ||
else: | ||
return label | ||
label = label.replace(":", "/") | ||
splitted_label = label.split('/') | ||
return ['/'.join(splitted_label[:len(splitted_label) - 1]), splitted_label[-1]] | ||
|
||
|
||
def GoldenProtoFile(path, filename, version): | ||
"""Retrieve golden proto file path. In general, those are placed in tools/testdata/protoxform. | ||
Args: | ||
path: target proto path | ||
filename: target proto filename | ||
version: api version to specify target golden proto filename | ||
Returns: | ||
actual golden proto absolute path | ||
""" | ||
base = "./" | ||
base += path + "/" + filename + "." + version + ".gold" | ||
return os.path.abspath(base) | ||
|
||
|
||
def ResultProtoFile(path, filename, version): | ||
"""Retrieve result proto file path. In general, those are placed in bazel artifacts. | ||
Args: | ||
path: target proto path | ||
filename: target proto filename | ||
version: api version to specify target result proto filename | ||
Returns: | ||
actual result proto absolute path | ||
""" | ||
base = "./bazel-bin" | ||
base += os.path.join(path, "protos") | ||
base += os.path.join(base, path) | ||
base += "/{0}.{1}.proto".format(filename, version) | ||
return os.path.abspath(base) | ||
|
||
|
||
def Diff(result_file, golden_file): | ||
"""Execute diff command with unified form | ||
Args: | ||
result_file: result proto file | ||
golden_file: golden proto file | ||
Returns: | ||
output and status code | ||
""" | ||
command = 'diff -u ' | ||
command += result_file + ' ' | ||
command += golden_file | ||
status, stdout, stderr = runCommand(command) | ||
return [status, stdout, stderr] | ||
|
||
|
||
def Run(path, filename, version): | ||
"""Run main execution for protoxform test | ||
Args: | ||
path: target proto path | ||
filename: target proto filename | ||
version: api version to specify target result proto filename | ||
Returns: | ||
result message extracted from diff command | ||
""" | ||
message = "" | ||
golden_path = GoldenProtoFile(path, filename, version) | ||
test_path = ResultProtoFile(path, filename, version) | ||
|
||
status, stdout, stderr = Diff(test_path, golden_path) | ||
|
||
if status != 0: | ||
message = '\n'.join([str(line) for line in stdout + stderr]) | ||
|
||
return message | ||
|
||
|
||
if __name__ == "__main__": | ||
messages = "" | ||
logging.basicConfig(format='%(message)s') | ||
path, filename = PathAndFilename(sys.argv[1]) | ||
messages += Run(path, filename, 'v2') | ||
messages += Run(path, filename, 'v3alpha') | ||
|
||
if len(messages) == 0: | ||
logging.warning("PASS") | ||
sys.exit(0) | ||
else: | ||
logging.error("FAILED:\n{}".format(messages)) | ||
sys.exit(1) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
import subprocess | ||
|
||
|
||
# Echoes and runs an OS command, returning exit status and the captured | ||
# stdout and stderr as a string array. | ||
def runCommand(command): | ||
proc = subprocess.run([command], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) | ||
|
||
return proc.returncode, proc.stdout.decode('utf-8').split('\n'), proc.stderr.decode( | ||
'utf-8').split('\n') |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
licenses(["notice"]) # Apache 2 | ||
|
||
proto_library( | ||
name = "protos", | ||
visibility = ["//visibility:public"], | ||
deps = [ | ||
"//tools/testdata/protoxform/envoy/v2:protos", | ||
], | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
licenses(["notice"]) # Apache 2 | ||
|
||
proto_library( | ||
name = "protos", | ||
srcs = [ | ||
"sample.proto", | ||
], | ||
visibility = ["//visibility:public"], | ||
deps = [ | ||
"@com_github_cncf_udpa//udpa/annotations:pkg", | ||
], | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
syntax = "proto3"; | ||
|
||
package envoy.v2; | ||
|
||
import "udpa/annotations/migrate.proto"; | ||
|
||
message Sample { | ||
message Entry { | ||
string key = 1; | ||
string value = 2; | ||
} | ||
repeated Entry entries = 1; | ||
string will_deprecated = 2 [deprecated = true]; | ||
string will_rename_compoent = 3 [(udpa.annotations.field_migrate).rename = "renamed_component"]; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
syntax = "proto3"; | ||
|
||
package envoy.v2; | ||
|
||
option java_package = "io.envoyproxy.envoy.v2"; | ||
option java_outer_classname = "SampleProto"; | ||
option java_multiple_files = true; | ||
|
||
import "udpa/annotations/migrate.proto"; | ||
|
||
message Sample { | ||
message Entry { | ||
string key = 1; | ||
|
||
string value = 2; | ||
} | ||
|
||
repeated Entry entries = 1; | ||
|
||
string will_deprecated = 2 [deprecated = true]; | ||
|
||
string will_rename_compoent = 3 [(udpa.annotations.field_migrate).rename = "renamed_component"]; | ||
} |
Oops, something went wrong.