summaryrefslogtreecommitdiff
path: root/src/third_party/wiredtiger/dist/test_tag.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/third_party/wiredtiger/dist/test_tag.py')
-rw-r--r--src/third_party/wiredtiger/dist/test_tag.py203
1 files changed, 203 insertions, 0 deletions
diff --git a/src/third_party/wiredtiger/dist/test_tag.py b/src/third_party/wiredtiger/dist/test_tag.py
new file mode 100644
index 00000000000..defa9906e1c
--- /dev/null
+++ b/src/third_party/wiredtiger/dist/test_tag.py
@@ -0,0 +1,203 @@
+import os
+import sys
+
+##### LOCAL VARIABLES AND CONSTANTS #####
+component = ""
+testing_area = ""
+test_type = ""
+
+is_end = False
+is_file_ignored = False
+is_file_tagged = False
+is_start = False
+show_info = False
+show_missing_files = False
+
+nb_ignored_files = 0
+nb_missing_files = 0
+nb_valid_files = 0
+
+sorted_tags = []
+test_files = []
+
+tagged_files = {}
+valid_tags = {}
+
+END_TAG = "[END_TAGS]"
+IGNORE_FILE = "ignored_file"
+NB_TAG_ARGS = 3
+START_TAG = "[TEST_TAGS]"
+#####
+
+##### PROCESS ARGS #####
+for arg in sys.argv:
+ if arg == "-h":
+ print("Usage: python test_tag.py [options]")
+ print("Options:")
+ print("\t-i\tShow info")
+ print("\t-p\tShow files with no test tags")
+ exit()
+ elif arg == "-i":
+ show_info = True
+ elif arg == "-p":
+ show_missing_files = True
+#####
+
+##### GET ALL TEST FILES #####
+for root, dirs, files in os.walk("../test/"):
+ path = root.split(os.sep)
+ for file in files:
+ filename = os.path.join('/'.join(path), file)
+ if filename.endswith("main.c") or filename.endswith(".py"):
+ test_files.append(filename)
+#####
+
+##### RETRIEVE VALID TAGS #####
+validation_file = open("test_tags.ok", "r")
+
+# The file has the following pattern
+# <COMPONENT>:<TESTING_TYPE>:<TESTING_AREA>:<DESCRIPTION>
+# A tag is made of the three first values: COMPONENT, TEST_TYPE and TESTING_AREA
+tags = validation_file.readlines()
+tags = [tag.replace('\n', '') for tag in tags]
+
+for tag in tags:
+ current_line = tag.split(':')
+ # Createa key value pair <TAG>:<DESCRIPTION>
+ valid_tags[':'.join(current_line[:NB_TAG_ARGS])] = ':'.join(current_line[NB_TAG_ARGS:])
+
+validation_file.close()
+#####
+
+##### PARSE TEST FILES #####
+for filename in test_files:
+ input_file = open(filename, "r")
+ lines = input_file.readlines()
+
+ is_start = False
+ is_end = False
+ is_file_ignored = False
+ is_file_tagged = False
+
+ # Read line by line
+ for line in lines:
+ # Format line
+ line = line.replace('\n', '').replace('\r', '') \
+ .replace(' ', '').replace('#', '') \
+ .replace('*', '')
+
+ # Check if line is valid
+ if not line:
+ # Check if invalid line after START_TAG
+ if is_start == True:
+ print("Error syntax in file " + filename)
+ exit()
+ else:
+ continue
+
+ # Check if end of test tag
+ if END_TAG in line:
+ # END_TAG should not be before START_TAG
+ if is_start == False:
+ print("Error syntax in file " + filename + ". Unexpected tag: " + END_TAG)
+ exit()
+ # END_TAG should not be met before a test tag
+ if is_file_ignored == False and is_file_tagged == False:
+ print("Error syntax in file " + filename + ". Missing test tag.")
+ exit()
+ is_end = True
+ nb_valid_files = nb_valid_files + 1
+ # Go to next file
+ break
+
+ # Check if start of test tag
+ if START_TAG in line:
+ # Only one START_TAG is allowed
+ if is_start == True:
+ print("Error syntax in file " + filename + ". Unexpected tag: " + START_TAG)
+ exit()
+ is_start = True
+ continue
+
+ if is_start == True:
+ # Check if file is ignored
+ if is_file_ignored == True:
+ print("Unexpected value in ignored file: " + filename)
+ exit()
+ if line == IGNORE_FILE:
+ nb_ignored_files = nb_ignored_files + 1
+ is_file_ignored = True
+ continue
+ # Check if current tag is valid
+ if not line in valid_tags:
+ print("Tag is not valid ! Add the new tag to test_tags.ok:\n" + line)
+ exit()
+ else:
+ is_file_tagged = True
+ # Check if current tag has already matched test files
+ if line in tagged_files:
+ tagged_files[line].append(filename)
+ else:
+ tagged_files[line] = [filename]
+
+ if is_file_ignored == False and is_file_tagged == False:
+ nb_missing_files = nb_missing_files + 1
+ if show_missing_files == True:
+ print("Missing test tag in file: " + filename)
+
+ input_file.close()
+#####
+
+##### GENERATE OUTPUT #####
+output_file = open("../test/test_coverage.md", "w")
+
+# Table headers
+output_file.write("|Component|Test Type|Testing Area|Description|Existing tests|" + '\n')
+output_file.write("|---|---|---|---|---|" + '\n')
+
+# Sort tags
+sorted_tags = list(tagged_files.keys())
+sorted_tags.sort()
+
+for tag in sorted_tags:
+ # Split line
+ current_line = tag.split(":")
+
+ # Parse tag
+ component = current_line[0]
+ test_type = current_line[1]
+ testing_area = current_line[2]
+
+ # Format output
+ component = component.replace("_", " ").title()
+ test_type = test_type.replace("_", " ").title()
+ testing_area = testing_area.replace("_", " ").title()
+
+ # Relative path to test file
+ link = ""
+ for name in tagged_files[tag]:
+ link += "[" + name + "](" + name + "), "
+ # Remove the extra ", " at the end
+ link = link[:-2]
+
+ # Write to output
+ output_file.write('|' + component + '|' + test_type + '|' + \
+ testing_area + '|' + valid_tags[tag] + '|' \
+ + link + '\n')
+
+output_file.close()
+#####
+
+##### STATS #####
+if show_info == True:
+ print("Tagged files:\t" + str(nb_valid_files - nb_ignored_files))
+ print("Missing files:\t" + str(nb_missing_files))
+ print("Ignored files:\t" + str(nb_ignored_files))
+ print("Total files:\t" + str(nb_valid_files + nb_missing_files))
+#####
+
+# Enforce tagging
+#if nb_missing_files > 0:
+# print("Files missing a tag: " + str(nb_missing_files))
+# if show_missing_files == False:
+# print("Call \'python test_tag.py -p\' to list all files with no tags")