From 508b3bdf3bba9a5d8fba46cfd8e529adb9e62fc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vincent=20Stehl=C3=A9?= Date: Tue, 17 Aug 2021 12:48:04 +0200 Subject: [PATCH 01/17] Add contributed EBBR sequence files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It is convenient to have those sequence files at hand to analyse results obtained with the different ACS-IR published versions. Signed-off-by: Vincent Stehlé --- README.md | 16 ++++++++++++++++ contrib/v21.05_0.8_BETA-0/EBBR.seq | Bin 0 -> 171572 bytes contrib/v21.07_0.9_BETA/EBBR.seq | Bin 0 -> 172586 bytes contrib/v21.07_0.9_BETA/EBBR_manual.seq | Bin 0 -> 176800 bytes 4 files changed, 16 insertions(+) create mode 100644 contrib/v21.05_0.8_BETA-0/EBBR.seq create mode 100644 contrib/v21.07_0.9_BETA/EBBR.seq create mode 100644 contrib/v21.07_0.9_BETA/EBBR_manual.seq diff --git a/README.md b/README.md index 717e092..da83348 100644 --- a/README.md +++ b/README.md @@ -326,3 +326,19 @@ their test run according to the log file. We create artificial tests entries for those dropped tests sets, with the "result" fields set to "SKIPPED". + +## Contributed files + +A few contributed files are stored in sub-folders under `contrib` for +convenience: + +------------------------------------------------------------------------------- + Sub-folder Contents +--------------------- -------------------------------------------------------- + `v21.05_0.8_BETA-0/` EBBR sequence file from [ACS-IR v21.05_0.8_BETA-0]. + + `v21.07_0.9_BETA/` EBBR sequence files from [ACS-IR v21.07_0.9_BETA]. +------------------------------------------------------------------------------- + +[ACS-IR v21.05_0.8_BETA-0]: https://github.com/ARM-software/arm-systemready/tree/main/IR/prebuilt_images/v21.05_0.8_BETA-0 +[ACS-IR v21.07_0.9_BETA]: https://github.com/ARM-software/arm-systemready/tree/main/IR/prebuilt_images/v21.07_0.9_BETA diff --git a/contrib/v21.05_0.8_BETA-0/EBBR.seq b/contrib/v21.05_0.8_BETA-0/EBBR.seq new file mode 100644 index 0000000000000000000000000000000000000000..1f0cb8ac84aa9a5ec595a3778bb8930536c78bbf GIT binary patch literal 171572 zcmd_zTaR4VvF-VKZlJ%z{sIDgmF)*V=(@LYd^@&mKQtPKEKxFH-I|na>wNgrJ%9Q4 z+*xa7R#wrbvpCrxBo?!>D6O#~MvNE{bLId0zyGhB4{n~^Jiqz+=09%Ux%qH>_2lON zzWG0I{*RmAjIaKB^K`uO^ybT(FK&K%^PQW&-+XucyI1j zFaL7pvZT|C8~5_U_HI@n8At`1;w+AIE#X8UHsQ9p3q?@yf@C*ZaSFe|-1$ zFaM7}8-IhJ{BZoDQcl`VPaeZ&x{CHsUqjAll z^7a9hw+9xGcw@Zh-NW~PJl^-+@iRZZ`N??qoA;vf>%-Okc`faxK7AGR-?L%C>F@BdfxJJGD?!f1*@y~nXl^+kx@c1^L{^zJgYRk8av5VUB z{c*K&L2Y_tT>o3+nq|}v##e72UaNk;J6==Meb>+ZWT5fh_*zZhqCqh{zxnFGCv?PG zwHnj@U_`~chkH$<$Rk$?lOK)ORU?t|y@8PLzB&H%=J@4jesuUn^K3D>9U&{_%Xi21 zy*;j9-l#UN7XszW55{+BJlBtt)n@8Vz-5cZX@snViKh#;=9TZF7rCijgcMfRy`F%}(=jP`(zaHQJa%kSqhg$h!=oP5F>a|$(|Kt!6 z-~C54d}mx+N=>DC>ku_K_r3A8TJ+}l=iTw=HwOwLOXb-s{?HI7Umv*ji<{q$ujv0T zZa!TCmmiHgUS~t8Vvo1Szr_t6N%MN`-SJE0$e{0zclh^r#_vBF{}xr-%-Q1dY@h)b zJqJ@!y(WQwmaDZYiAjG^5ig_}hbo-J<9#mX-Z)%f|q zxESuS{{cKDRqc4$a{6$uz?CRx2XJbT>alRY%-mM=?koY z4Gk(E@P|r-NxpZ;5!lf4uqk37N4LPj&rrO6QU6

VR%D?TXmYrSFVu!@u$>MBX15 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 XI$RIjq?5-uT%U93T#liCG)n(J%0SyL literal 0 HcmV?d00001 diff --git a/contrib/v21.07_0.9_BETA/EBBR_manual.seq b/contrib/v21.07_0.9_BETA/EBBR_manual.seq new file mode 100644 index 0000000000000000000000000000000000000000..243314f8cfc0183f6d1cdec4e6ae232f0b9a1518 GIT binary patch literal 176800 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 literal 0 HcmV?d00001 -- GitLab From f2d2a60834e726090655253b1f941e25f6532742 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vincent=20Stehl=C3=A9?= Date: Tue, 17 Aug 2021 14:37:31 +0200 Subject: [PATCH 02/17] parser.py: use combined db for legacy search MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reduces the use of db1 in the code for clarity. Signed-off-by: Vincent Stehlé --- parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parser.py b/parser.py index 7cd9789..c7275d9 100755 --- a/parser.py +++ b/parser.py @@ -740,7 +740,7 @@ if __name__ == '__main__': # command line argument 3&4, key are to support a key & value search. # these will be displayed in CLI if args.find_key is not None and args.find_value is not None: - found = key_value_find(db1, args.find_key, args.find_value) + found = key_value_find(cross_check, args.find_key, args.find_value) #print the dict print("found:",len(found),"items with search constraints") for x in found: -- GitLab From cde02292974c81e157661b8725a617a671d921b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vincent=20Stehl=C3=A9?= Date: Tue, 17 Aug 2021 15:27:50 +0200 Subject: [PATCH 03/17] parser.py: isolate ekl and seq file loading MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This makes the main path more concise and prepares for future re-reading of the .md summary. While at it, reformat a bit. Signed-off-by: Vincent Stehlé --- parser.py | 54 ++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/parser.py b/parser.py index c7275d9..c3d66e5 100755 --- a/parser.py +++ b/parser.py @@ -578,6 +578,35 @@ def combine_dbs(db1, db2): return cross_check +# Read the .ekl log file and the .seq file and combine them into a single +# database, which we return. +def read_log_and_seq(log_file, seq_file): + # ekl file to open + # "database 1" all tests. + db1 = list() + logging.debug(f'Read {log_file}') + + # files are encoded in utf-16 + with open(log_file, "r", encoding="utf-16") as f: + db1 = ekl_parser(f.readlines()) + + logging.debug('{} test(s)'.format(len(db1))) + + # seq file to open + # "database 2" all test sets that should run + db2 = dict() + logging.debug(f'Read {seq_file}') + + # files are encoded in utf-16 + with open(seq_file, "r", encoding="utf-16") as f: + db2 = seq_parser(f) + + logging.debug('{} test set(s)'.format(len(db2))) + + # Produce a single cross_check database from our two db1 and db2 databases. + return combine_dbs(db1, db2) + + if __name__ == '__main__': parser = argparse.ArgumentParser( description='Process SCT results.' @@ -624,26 +653,11 @@ if __name__ == '__main__': format='%(levelname)s %(funcName)s: %(message)s', level=logging.DEBUG if args.debug else logging.INFO) - #Command line argument 1, ekl file to open - db1 = list() #"database 1" all tests. - logging.debug(f'Read {args.log_file}') - - with open(args.log_file,"r",encoding="utf-16") as f: #files are encoded in utf-16 - db1 = ekl_parser(f.readlines()) - - logging.debug('{} test(s)'.format(len(db1))) - - #Command line argument 2, seq file to open - db2 = dict() #"database 2" all test sets that should run - logging.debug(f'Read {args.seq_file}') - - with open(args.seq_file,"r",encoding="utf-16") as f: #files are encoded in utf-16 - db2 = seq_parser(f) - - logging.debug('{} test set(s)'.format(len(db2))) - - # Produce a single cross_check database from our two db1 and db2 databases. - cross_check = combine_dbs(db1, db2) + # Command line argument 1 is the ekl file to open. Command line argument 2 + # is the seq file to open. Read both and combine them into a single + # cross_check database. + cross_check = read_log_and_seq(args.log_file, args.seq_file) + logging.debug('{} combined test(s)'.format(len(cross_check))) # Take configuration file into account. This can perform transformations on # the tests results. -- GitLab From 6410b6deac4585900930734e6e2b5548f534fdcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vincent=20Stehl=C3=A9?= Date: Tue, 17 Aug 2021 16:09:51 +0200 Subject: [PATCH 04/17] Add checkers and fix all errors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a checker for python scripts and a checker for shell scripts to the `make check' target. Fix all issues reported by the checker in parser.py. Signed-off-by: Vincent Stehlé --- Makefile | 5 +- README.md | 14 +++++- parser.py | 141 +++++++++++++++++++++++++++++++----------------------- 3 files changed, 97 insertions(+), 63 deletions(-) diff --git a/Makefile b/Makefile index 5570e8d..128e1ed 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,8 @@ all: doc help: @echo 'Targets:' @echo ' all' - @echo ' check Perform sanity checks (currently yamllint)' + @echo ' check Perform sanity checks' + @echo ' (currently yamllint, shellcheck and flake8)' @echo ' clean' @echo ' doc Generate README.pdf' @echo ' help Print this help.' @@ -18,6 +19,8 @@ doc: README.pdf check: yamllint . + shellcheck $$(find -name '*.sh') + flake8 clean: -rm -f README.pdf diff --git a/README.md b/README.md index da83348..8f755bd 100644 --- a/README.md +++ b/README.md @@ -250,8 +250,18 @@ It is possible to convert this `README.md` into `README.pdf` with pandoc using ### Sanity checks -To perform sanity checks, run `make check`. For the moment this runs `yamllint`, -which will inspect all [YAML] files and report errors. See `make help`. +To perform sanity checks, run `make check`. It runs a number of checkers and +reports errors: + +------------------------------- + Checker Target +------------- ---------------- + `flake8` Python scripts. + `yamllint` [YAML] files. + `shellcheck` Shell scripts. +------------------------------- + +See `make help`. ### db structure: diff --git a/parser.py b/parser.py index c3d66e5..42113af 100755 --- a/parser.py +++ b/parser.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -#SCT log parser +# SCT log parser import sys @@ -33,7 +33,7 @@ else: yaml_load_args = {} -#based loosley on https://stackoverflow.com/a/4391978 +# based loosley on https://stackoverflow.com/a/4391978 # returns a filtered dict of dicts that meet some Key-value pair. # I.E. key="result" value="FAILURE" def key_value_find(list_1, key, value): @@ -44,21 +44,25 @@ def key_value_find(list_1, key, value): return found -#Were we intrept test logs into test dicts +# Were we intrept test logs into test dicts def test_parser(string, current): test_list = { - "name": string[2], #FIXME:Sometimes, SCT has name and Description, - "result": string[1], - **current, - "guid": string[0], #FIXME:GUID's overlap - #"comment": string[-1], #FIXME:need to hash this out, sometime there is no comments - "log": ' '.join(string[3:]) + "name": string[2], + # FIXME:Sometimes, SCT has name and Description, + "result": string[1], + **current, + "guid": string[0], + # FIXME:GUID's overlap + # "comment": string[-1], # FIXME:need to hash this out, + # sometime there is no comments + "log": ' '.join(string[3:]) } return test_list -#Parse the ekl file, and create a map of the tests -def ekl_parser (file): - #create our "database" dict + +# Parse the ekl file, and create a map of the tests +def ekl_parser(file): + # create our "database" dict temp_list = list() # All tests are grouped by the "HEAD" line, which precedes them. current = {} @@ -122,14 +126,17 @@ def ekl_parser (file): 'device path': '|'.join(split_line[13:]), } - #FIXME:? EKL file has an inconsistent line structure, + # FIXME:? EKL file has an inconsistent line structure, # sometime we see a line that consits ' dump of GOP->I\n' - #easiest way to skip is check for blank space in the first char + # easiest way to skip is check for blank space in the first char elif split_line[0] != '' and split_line[0][0] != " ": try: - #deliminiate on ':' for tests - split_test = [new_string for old_string in split_line for new_string in old_string.split(':')] - #put the test into a dict, and then place that dict in another dict with GUID as key + # deliminiate on ':' for tests + split_test = [new_string for old_string in + split_line for new_string in + old_string.split(':')] + # put the test into a dict, and then place that dict in another + # dict with GUID as key tmp_dict = test_parser(split_test, current) temp_list.append(tmp_dict) n += 1 @@ -144,74 +151,87 @@ def ekl_parser (file): return temp_list -#Parse Seq file, used to tell which tests should run. + +# Parse Seq file, used to tell which tests should run. def seq_parser(file): temp_dict = list() - lines=file.readlines() - magic=7 #a test in a seq file is 7 lines, if not mod7, something wrong.. - if len(lines)%magic != 0: + lines = file.readlines() + magic = 7 + # a test in a seq file is 7 lines, if not mod7, something wrong.. + if len(lines) % magic != 0: sys.exit("seqfile cut short, should be mod7") - #the utf-16 char makes this looping a bit harder, so we use x+(i) where i is next 0-6th - for x in range(0,len(lines),magic): #loop ever "7 lines" - #(x+0)[Test Case] - #(x+1)Revision=0x10000 - #(x+2)Guid=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX - #(x+3)Name=InstallAcpiTableFunction - #(x+4)Order=0xFFFFFFFF - #(x+5)Iterations=0xFFFFFFFF - #(x+6)(utf-16 char) - #currently only add tests that are supposed to run, should add all? - #0xFFFFFFFF in "Iterations" means the test is NOT supposed to run - if not "0xFFFFFFFF" in lines[x+5]: + # the utf-16 char makes this looping a bit harder, so we use x+(i) where i + # is next 0-6th + # loop ever "7 lines" + for x in range(0, len(lines), magic): + # (x+0)[Test Case] + # (x+1)Revision=0x10000 + # (x+2)Guid=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX + # (x+3)Name=InstallAcpiTableFunction + # (x+4)Order=0xFFFFFFFF + # (x+5)Iterations=0xFFFFFFFF + # (x+6)(utf-16 char) + # currently only add tests that are supposed to run, should add all? + # 0xFFFFFFFF in "Iterations" means the test is NOT supposed to run + if "0xFFFFFFFF" not in lines[x + 5]: seq_dict = { - "name": lines[x+3][5:-1],#from after "Name=" to end (5char long) - "guid": lines[x+2][5:-1],#from after"Guid=" to the end, (5char long) - "Iteration": lines[x+5][11:-1],#from after "Iterations=" (11char long) - "rev": lines[x+1][9:-1],#from after "Revision=" (9char long) - "Order": lines[x+4][6:-1]#from after "Order=" (6char long) + # from after "Name=" to end (5char long) + "name": lines[x + 3][5:-1], + # from after"Guid=" to the end, (5char long) + "guid": lines[x + 2][5:-1], + # from after "Iterations=" (11char long) + "Iteration": lines[x + 5][11:-1], + # from after "Revision=" (9char long) + "rev": lines[x + 1][9:-1], + # from after "Order=" (6char long) + "Order": lines[x + 4][6:-1] } - temp_dict.append(seq_dict) #put in a dict based on guid + # put in a dict based on guid + temp_dict.append(seq_dict) return temp_dict -#group items by key, and print by key -#we slowly iterate through the list, group and print groups -def key_tree_2_md(input_list,file,key): - #make a copy so we don't destroy the first list. + +# group items by key, and print by key +# we slowly iterate through the list, group and print groups +def key_tree_2_md(input_list, file, key): + # make a copy so we don't destroy the first list. temp_list = input_list.copy() while temp_list: test_dict = temp_list.pop() - found, not_found = [test_dict],[] - #go through whole list looking for key match + found, not_found = [test_dict], [] + # go through whole list looking for key match while temp_list: next_dict = temp_list.pop() - if next_dict[key] == test_dict[key]: #if match add to found + # if match add to found + if next_dict[key] == test_dict[key]: found.append(next_dict) - else: #else not found + # else not found + else: not_found.append(next_dict) - temp_list = not_found #start over with found items removed + # start over with found items removed + temp_list = not_found file.write("### " + test_dict[key]) - dict_2_md(found,file) - + dict_2_md(found, file) -#generic writer, takes a list of dicts and turns the dicts into an MD table. -def dict_2_md(input_list,file): +# generic writer, takes a list of dicts and turns the dicts into an MD table. +def dict_2_md(input_list, file): if len(input_list) > 0: file.write("\n\n") - #create header for MD table using dict keys + # create header for MD table using dict keys temp_string1, temp_string2 = "|", "|" for x in (input_list[0].keys()): temp_string1 += (x + "|") temp_string2 += ("---|") - file.write(temp_string1+"\n"+temp_string2+"\n") - #print each item from the dict into the table + file.write(temp_string1 + "\n" + temp_string2 + "\n") + # print each item from the dict into the table for x in input_list: test_string = "|" for y in x.keys(): test_string += (x[y] + "|") - file.write(test_string+'\n') - #seprate table from other items in MD + file.write(test_string + '\n') + # seprate table from other items in MD file.write("\n\n") @@ -674,7 +694,8 @@ if __name__ == '__main__': # search for failures, warnings, passes & others # We detect all present keys in additions to the expected ones. This is - # handy with config rules overriding the result field with arbitrary values. + # handy with config rules overriding the result field + # with arbitrary values. res_keys = set(['DROPPED', 'FAILURE', 'WARNING', 'PASS']) for x in cross_check: @@ -755,8 +776,8 @@ if __name__ == '__main__': # these will be displayed in CLI if args.find_key is not None and args.find_value is not None: found = key_value_find(cross_check, args.find_key, args.find_value) - #print the dict - print("found:",len(found),"items with search constraints") + # print the dict + print("found:", len(found), "items with search constraints") for x in found: print( x["guid"], ":", x["name"], "with", args.find_key, ":", -- GitLab From 5435cca9976ef0dd9f1ce609579b5c1d1237124a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vincent=20Stehl=C3=A9?= Date: Tue, 17 Aug 2021 19:35:33 +0200 Subject: [PATCH 05/17] parser.py: rework key_tree_2_md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Simplify the printing by group, to help debugging. As a bonus, this is more efficient. Signed-off-by: Vincent Stehlé --- parser.py | 40 ++++++++++++++++++---------------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/parser.py b/parser.py index 42113af..bf81dab 100755 --- a/parser.py +++ b/parser.py @@ -192,27 +192,23 @@ def seq_parser(file): return temp_dict -# group items by key, and print by key -# we slowly iterate through the list, group and print groups -def key_tree_2_md(input_list, file, key): - # make a copy so we don't destroy the first list. - temp_list = input_list.copy() - while temp_list: - test_dict = temp_list.pop() - found, not_found = [test_dict], [] - # go through whole list looking for key match - while temp_list: - next_dict = temp_list.pop() - # if match add to found - if next_dict[key] == test_dict[key]: - found.append(next_dict) - # else not found - else: - not_found.append(next_dict) - # start over with found items removed - temp_list = not_found - file.write("### " + test_dict[key]) - dict_2_md(found, file) +# Print items by "group" +def key_tree_2_md(input_list, file): + h = {} + + # Bin by group + for t in input_list: + g = t['group'] + + if g not in h: + h[g] = [] + + h[g].append(t) + + # Print each group + for g in sorted(h.keys()): + file.write("### " + g) + dict_2_md(h[g], file) # generic writer, takes a list of dicts and turns the dicts into an MD table. @@ -737,7 +733,7 @@ if __name__ == '__main__': for k in sorted(res_keys_np): resultfile.write("## {}. {} by group\n\n".format(n, k.title())) - key_tree_2_md(bins[k], resultfile, "group") + key_tree_2_md(bins[k], resultfile) n += 1 # Generate yaml config template if requested -- GitLab From 62319115948445c262656efab116ff1d596acfba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vincent=20Stehl=C3=A9?= Date: Tue, 17 Aug 2021 19:40:06 +0200 Subject: [PATCH 06/17] parser.py: fix dict_2_md printing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit dict_2_md implicitly relies on the tests all having the same order for their dict keys during printing. This works well with all the tests read from the .ekl log file but does not work with the "artificial" SPURIOUS test entries, which end up having their keys in a different order. Fix the keys order to fix .md printing. Signed-off-by: Vincent Stehlé --- parser.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/parser.py b/parser.py index bf81dab..9a67924 100755 --- a/parser.py +++ b/parser.py @@ -215,16 +215,17 @@ def key_tree_2_md(input_list, file): def dict_2_md(input_list, file): if len(input_list) > 0: file.write("\n\n") + k = input_list[0].keys() # create header for MD table using dict keys temp_string1, temp_string2 = "|", "|" - for x in (input_list[0].keys()): + for x in k: temp_string1 += (x + "|") temp_string2 += ("---|") file.write(temp_string1 + "\n" + temp_string2 + "\n") # print each item from the dict into the table for x in input_list: test_string = "|" - for y in x.keys(): + for y in k: test_string += (x[y] + "|") file.write(test_string + '\n') # seprate table from other items in MD -- GitLab From 22497f27b11962c7de27c46869b0b1ee6258be2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vincent=20Stehl=C3=A9?= Date: Tue, 17 Aug 2021 22:06:28 +0200 Subject: [PATCH 07/17] parser.py: isolate markdown generation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This simplifies the main path and prepares for future conditional .md generation. Signed-off-by: Vincent Stehlé --- parser.py | 53 +++++++++++++++++++++++++++++------------------------ 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/parser.py b/parser.py index 9a67924..c3d0c7b 100755 --- a/parser.py +++ b/parser.py @@ -624,6 +624,34 @@ def read_log_and_seq(log_file, seq_file): return combine_dbs(db1, db2) +# generate MD summary +def gen_md(md, res_keys, bins): + logging.debug(f'Generate {md}') + + with open(md, 'w') as resultfile: + resultfile.write("# SCT Summary \n\n") + resultfile.write("| | |\n") + resultfile.write("|--|--|\n") + + # Loop on all the result values we found for the summary + for k in sorted(res_keys): + resultfile.write( + "|{}:|{}|\n".format(k.title(), len(bins[k]))) + + resultfile.write("\n\n") + + # Loop on all the result values we found (except PASS) for the sections + # listing the tests by group + n = 1 + res_keys_np = set(res_keys) + res_keys_np.remove('PASS') + + for k in sorted(res_keys_np): + resultfile.write("## {}. {} by group\n\n".format(n, k.title())) + key_tree_2_md(bins[k], resultfile) + n += 1 + + if __name__ == '__main__': parser = argparse.ArgumentParser( description='Process SCT results.' @@ -712,30 +740,7 @@ if __name__ == '__main__': logging.info(', '.join(s)) # generate MD summary - logging.debug(f'Generate {args.md}') - - with open(args.md, 'w') as resultfile: - resultfile.write("# SCT Summary \n\n") - resultfile.write("| | |\n") - resultfile.write("|--|--|\n") - - # Loop on all the result values we found for the summary - for k in sorted(res_keys): - resultfile.write( - "|{}:|{}|\n".format(k.title(), len(bins[k]))) - - resultfile.write("\n\n") - - # Loop on all the result values we found (except PASS) for the sections - # listing the tests by group - n = 1 - res_keys_np = set(res_keys) - res_keys_np.remove('PASS') - - for k in sorted(res_keys_np): - resultfile.write("## {}. {} by group\n\n".format(n, k.title())) - key_tree_2_md(bins[k], resultfile) - n += 1 + gen_md(args.md, res_keys, bins) # Generate yaml config template if requested if 'template' in args and args.template is not None: -- GitLab From 1256fcf8fb350610533f900516d3468d87397783 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vincent=20Stehl=C3=A9?= Date: Tue, 17 Aug 2021 17:44:23 +0200 Subject: [PATCH 08/17] parser.py: add an option to re-read markdown result MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is useful to perform further processing. Signed-off-by: Vincent Stehlé --- README.md | 17 ++++++++++++ parser.py | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 89 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 8f755bd..faa61ef 100644 --- a/README.md +++ b/README.md @@ -131,6 +131,23 @@ $ ./parser.py \ --fields 'count,result,name' --uniq --print ... ``` +### Re-reading markdown results + +It is possible to re-read a previously generated markdown results file with the +`--input-md` option. This can be useful to perform further processing on the +tests. + +Example command to read a previously generated markdown: + +``` {.sh} +$ ./parser.py --input-md 'result.md' ... +``` + +* By default an output markdown is still generated, except in the case where the + input and output markdown have the same filename. +* The generated markdown results do not contain the "passed" tests. They can + therefore not be re-read. + ## Configuration file It is possible to use a configuration file with command line option `--config diff --git a/parser.py b/parser.py index c3d0c7b..d81870c 100755 --- a/parser.py +++ b/parser.py @@ -652,6 +652,65 @@ def gen_md(md, res_keys, bins): n += 1 +# Read back results from a previously generated summary markdown file. +# From this, we re-create a database the best we can and we return it. +def read_md(input_md): + logging.debug(f'Read {input_md}') + tables = [] + + with open(input_md, 'r') as f: + t = None + + for i, line in enumerate(f): + line = line.rstrip() + + if re.match(r'^\|', line): + # Split the line. We need to take care of preserving special + # cases such as "Pci(0|0)" for example + line = re.sub(r'\((\w+)\|(\w+)\)', r'(\1%\2)', line) + x = line.split('|') + x = x[1:len(x) - 1] + x = [re.sub(r'%', '|', e) for e in x] + + if t is None: + t = [] + logging.debug(f'Table line {i + 1}, keys: {x}') + + t.append(x) + + elif t is not None: + tables.append(t) + t = None + + assert(t is None) + + # Remove summary table + assert(len(tables[0][0]) == 2) + del tables[0] + + # Transform tables lines to dicts and merge everything + cross_check = [] + + for t in tables: + # Save keys + keys = t.pop(0) + n = len(keys) + # Drop underlines + t.pop(0) + + # Convert lines + for i, x in enumerate(t): + assert(len(x) == n) + y = {} + + for j, k in enumerate(keys): + y[k] = x[j] + + cross_check.append(y) + + return cross_check + + if __name__ == '__main__': parser = argparse.ArgumentParser( description='Process SCT results.' @@ -678,6 +737,7 @@ if __name__ == '__main__': '--uniq', action='store_true', help='Collapse duplicates') parser.add_argument( '--print', action='store_true', help='Print results to stdout') + parser.add_argument('--input-md', help='Input .md filename') parser.add_argument('log_file', help='Input .ekl filename') parser.add_argument('seq_file', help='Input .seq filename') parser.add_argument('find_key', nargs='?', help='Search key') @@ -698,10 +758,14 @@ if __name__ == '__main__': format='%(levelname)s %(funcName)s: %(message)s', level=logging.DEBUG if args.debug else logging.INFO) - # Command line argument 1 is the ekl file to open. Command line argument 2 - # is the seq file to open. Read both and combine them into a single - # cross_check database. - cross_check = read_log_and_seq(args.log_file, args.seq_file) + if args.input_md is not None: + cross_check = read_md(args.input_md) + else: + # Command line argument 1 is the ekl file to open. + # Command line argument 2 is the seq file to open. + # Read both and combine them into a single cross_check database. + cross_check = read_log_and_seq(args.log_file, args.seq_file) + logging.debug('{} combined test(s)'.format(len(cross_check))) # Take configuration file into account. This can perform transformations on @@ -740,7 +804,10 @@ if __name__ == '__main__': logging.info(', '.join(s)) # generate MD summary - gen_md(args.md, res_keys, bins) + # As a special case, we skip generation when we are reading from a markdown + # summary, which has the same name as the output. + if args.input_md is None or args.input_md != args.md: + gen_md(args.md, res_keys, bins) # Generate yaml config template if requested if 'template' in args and args.template is not None: -- GitLab From 98a90d2c2688c57341c1e2b3428076f45b41f1f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vincent=20Stehl=C3=A9?= Date: Wed, 18 Aug 2021 09:21:04 +0200 Subject: [PATCH 09/17] README.md: document HTML generation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refine the documentation of the result.md and explain how to generate HTML with pandoc. Signed-off-by: Vincent Stehlé --- README.md | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index faa61ef..62316c8 100644 --- a/README.md +++ b/README.md @@ -23,12 +23,28 @@ INFO main: 0 dropped(s), 1 failure(s), 93 ignored(s), 106 known u-boot limitatio ``` ## Usage -Usage to generate a "result md" is such. `python3 parser.py ` -If you do no provided any command line arguments it will use `sample.ekl` and `sample.seq`. -The output filename can be specified with `--md `. + +Usage to generate a `result.md` is such: + +``` {.sh} +$ python3 parser.py +``` + +If you do no provided any command line arguments it will use `sample.ekl` and +`sample.seq`. The output filename can be specified with the `--md` option: + +``` {.sh} +$ ./parser.py --md out.md ... +``` An online help is available with the `-h` option. +The generated `result md` can be easily converted to HTML using `pandoc` with: + +``` {.sh} +$ pandoc -oresult.html result.md +``` + ### Custom search For a custom Key:value search, the next two arguments *MUST be included together.* The program will search and display files that met that constraint, without the crosscheck, and display the names, guid, and key:value to the command line. `python3 parser.py ` -- GitLab From 62a7a9492805cb550acc3e9e22ad2aac997ce2fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vincent=20Stehl=C3=A9?= Date: Wed, 18 Aug 2021 15:10:35 +0200 Subject: [PATCH 10/17] parser.py: handle missing keys in md generation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We can stress the markdown generation code a bit more now that we can re-read previously generated markdown result. Make markdown generation more robust to missing keys to avoid exceptions. Signed-off-by: Vincent Stehlé --- parser.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/parser.py b/parser.py index d81870c..9d4ffe8 100755 --- a/parser.py +++ b/parser.py @@ -226,7 +226,8 @@ def dict_2_md(input_list, file): for x in input_list: test_string = "|" for y in k: - test_string += (x[y] + "|") + v = x[y] if y in x else '' + test_string += v + "|" file.write(test_string + '\n') # seprate table from other items in MD file.write("\n\n") -- GitLab From c37de35c6726f60a4ea9341189aeb9b7ebd853da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vincent=20Stehl=C3=A9?= Date: Wed, 18 Aug 2021 16:20:37 +0200 Subject: [PATCH 11/17] Add github workflow definition MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a file to run `make check' on github. Signed-off-by: Vincent Stehlé --- .github/workflows/ci.yaml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .github/workflows/ci.yaml diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..bcadf42 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,14 @@ +--- +name: CI +# yamllint disable-line rule:truthy +on: [push] +jobs: + check: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Install dependencies and check + run: | + sudo apt install flake8 + make check -- GitLab From e5a41d7e773cb8786684b2853c6d2310dbaf6301 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vincent=20Stehl=C3=A9?= Date: Thu, 19 Aug 2021 14:12:44 +0200 Subject: [PATCH 12/17] Move sample files into a sample folder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update the documentation accordingly. While at it, remove obsolete mention of default behaviour. Signed-off-by: Vincent Stehlé --- README.md | 9 ++++----- sample.ekl => sample/sample.ekl | Bin sample.seq => sample/sample.seq | Bin sample.yaml => sample/sample.yaml | 0 4 files changed, 4 insertions(+), 5 deletions(-) rename sample.ekl => sample/sample.ekl (100%) rename sample.seq => sample/sample.seq (100%) rename sample.yaml => sample/sample.yaml (100%) diff --git a/README.md b/README.md index 62316c8..d64dca7 100644 --- a/README.md +++ b/README.md @@ -30,8 +30,7 @@ Usage to generate a `result.md` is such: $ python3 parser.py ``` -If you do no provided any command line arguments it will use `sample.ekl` and -`sample.seq`. The output filename can be specified with the `--md` option: +The output filename can be specified with the `--md` option: ``` {.sh} $ ./parser.py --md out.md ... @@ -223,13 +222,13 @@ tests. ### Sample -A `sample.yaml` configuration file is provided as example, to use with the -`sample.ekl` and `sample.seq` files. +In the folder `sample`, a `sample.yaml` configuration file is provided as +example, to use with the `sample.ekl` and `sample.seq` files. Try it with: ``` {.sh} -$ ./parser.py --config sample.yaml ... +$ ./parser.py --config sample/sample.yaml sample/sample.ekl sample/sample.seq ``` ### Generating a configuration template diff --git a/sample.ekl b/sample/sample.ekl similarity index 100% rename from sample.ekl rename to sample/sample.ekl diff --git a/sample.seq b/sample/sample.seq similarity index 100% rename from sample.seq rename to sample/sample.seq diff --git a/sample.yaml b/sample/sample.yaml similarity index 100% rename from sample.yaml rename to sample/sample.yaml -- GitLab From f4d631c04fb583f921d1f948aa857d54455d7664 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vincent=20Stehl=C3=A9?= Date: Thu, 26 Aug 2021 09:26:55 +0200 Subject: [PATCH 13/17] EBBR.yaml: add new "known acs limitations" category MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Let's classify the ACS-IR BETA 0 MemoryMap failure automatically. Signed-off-by: Vincent Stehlé --- EBBR.yaml | 44 ++++++++++++++++++++++++++------------------ README.md | 4 ++++ 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/EBBR.yaml b/EBBR.yaml index b9d64e8..b2a1144 100644 --- a/EBBR.yaml +++ b/EBBR.yaml @@ -1558,7 +1558,7 @@ ############################################################################### # We force the following tests result as `KNOWN U-BOOT LIMITATION'. They are -# genuine bugs, which much ultimately be fixed. We know about them; they are due +# genuine bugs, which must ultimately be fixed. We know about them; they are due # to U-Boot FAT filesystem implementation limitations and they do not prevent an # OS to boot. @@ -1864,6 +1864,31 @@ update: result: KNOWN U-BOOT LIMITATION +############################################################################### +# Known ACS limitations # +############################################################################### + +# We force the following tests result as `KNOWN ACS LIMITATION'. They are +# genuine bugs, which are fixed in a more recent version of the ACS or which +# must ultimately be fixed and which we know about. + +- rule: Force boot services memory map test failure with ACS-IR + v21.05_0.8_BETA-0 as known ACS limitation + criteria: + descr: SbbrBootServices Tests + device path: No device path + group: BootServicesTest + guid: 58A44F17-760E-478B-BAEF-E20BFBCD7457 + log: MemoryMap Not Found + name: MemoryMap + result: FAILURE + revision: '0x00010000' + set guid: 8540C12D-5413-4A0B-A545-89A8E3C7DA4B + sub set: MemoryMap + test set: SbbrBootServices + update: + result: KNOWN ACS LIMITATION + ############################################################################### # Comments # ############################################################################### @@ -1976,23 +2001,6 @@ # We add comments to the following tests failures for which we know a likely # cause, to help triaging/debugging. -- rule: Add comments to boot services memory map test failure with ACS-IR - v21.05_0.8_BETA-0 - criteria: - descr: SbbrBootServices Tests - device path: No device path - group: BootServicesTest - guid: 58A44F17-760E-478B-BAEF-E20BFBCD7457 - log: MemoryMap Not Found - name: MemoryMap - result: FAILURE - revision: '0x00010000' - set guid: 8540C12D-5413-4A0B-A545-89A8E3C7DA4B - sub set: MemoryMap - test set: SbbrBootServices - update: - comments: This is a known issue with ACS-IR v21.05_0.8_BETA-0 - - rule: Add comments to failure due to missing ESP criteria: descr: Image Services Test diff --git a/README.md b/README.md index d64dca7..847c8f5 100644 --- a/README.md +++ b/README.md @@ -264,6 +264,10 @@ override the result of some tests with the following ones: We know about them; they are due to U-Boot FAT filesystem implementation limitations and they do not prevent an OS to boot. + + `KNOWN ACS LIMITATION` Genuine bugs, which are fixed in a more recent version + of the ACS or which must ultimately be fixed and which + we know about. ------------------------------------------------------------------------------- Some of the rules just add a `comments` field with some help text. -- GitLab From e51e0cbcaf9016f5abfc5c2760603bc9fadf8226 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vincent=20Stehl=C3=A9?= Date: Thu, 26 Aug 2021 09:43:24 +0200 Subject: [PATCH 14/17] EBBR.yaml: add update capsule known u-boot limitations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Classify three UpdateCapsule conformance failures as known u-boot limitations. They are known bugs, which should be fixed in U-Boot ultimately. Those failures are waived and do not prevent certification. Signed-off-by: Vincent Stehlé --- EBBR.yaml | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/EBBR.yaml b/EBBR.yaml index b2a1144..3c70745 100644 --- a/EBBR.yaml +++ b/EBBR.yaml @@ -1864,6 +1864,63 @@ update: result: KNOWN U-BOOT LIMITATION +- rule: Force misc runtime services update capsule conformance failure as known + U-Boot limitation + UpdateCapsule implementation in U-Boot up to (at least) v2021.07 does not + check properly for all invalid inputs conditions + criteria: + descr: Misc Runtime Services Test + device path: No device path + group: RuntimeServicesTest + guid: 304F6960-79D0-4F17-8811-620FC6BDB0D4 + log: Status - Unsupported + name: RT.UpdateCapsule - invoke UpdateCapsule with invalid ScatterGatherList + result: FAILURE + revision: '0x00010000' + set guid: 7227CFAC-CA96-4680-9314-E3FBC60A2A61 + sub set: UpdateCapsule_Conf + test set: MiscRuntimeServicesTest + update: + result: KNOWN U-BOOT LIMITATION + +- rule: Force misc runtime services update capsule conformance failure (2) as + known U-Boot limitation + UpdateCapsule implementation in U-Boot up to (at least) v2021.07 does not + check properly for all invalid inputs conditions + criteria: + descr: Misc Runtime Services Test + device path: No device path + group: RuntimeServicesTest + guid: 18F86BF8-76CF-4225-8E3E-1B1F63432600 + log: Status - Unsupported + name: RT.UpdateCapsule - invoke UpdateCapsule with invalid Flags + result: FAILURE + revision: '0x00010000' + set guid: 7227CFAC-CA96-4680-9314-E3FBC60A2A61 + sub set: UpdateCapsule_Conf + test set: MiscRuntimeServicesTest + update: + result: KNOWN U-BOOT LIMITATION + +- rule: Force misc runtime services update capsule conformance failure (3) as + known U-Boot limitation + UpdateCapsule implementation in U-Boot up to (at least) v2021.07 does not + check properly for all invalid inputs conditions + criteria: + descr: Misc Runtime Services Test + device path: No device path + group: RuntimeServicesTest + guid: 145E4790-3342-4C8C-99F2-7F6500FD26E5 + log: Status - Unsupported + name: RT.UpdateCapsule - invoke UpdateCapsule with invalid Flags + result: FAILURE + revision: '0x00010000' + set guid: 7227CFAC-CA96-4680-9314-E3FBC60A2A61 + sub set: UpdateCapsule_Conf + test set: MiscRuntimeServicesTest + update: + result: KNOWN U-BOOT LIMITATION + ############################################################################### # Known ACS limitations # ############################################################################### -- GitLab From b7f7f3493e59b8901c5a12ab27ca2d6fbcb84412 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vincent=20Stehl=C3=A9?= Date: Thu, 26 Aug 2021 09:56:41 +0200 Subject: [PATCH 15/17] EBBR.yaml: ignore set time failures with rtc emulation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ignore four SetTime failures happening with U-Boot RTC emulation. EBBR has requirements on SetTime only when an RTC is present. Signed-off-by: Vincent Stehlé --- EBBR.yaml | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/EBBR.yaml b/EBBR.yaml index 3c70745..f2eaa7d 100644 --- a/EBBR.yaml +++ b/EBBR.yaml @@ -1553,6 +1553,82 @@ update: result: IGNORED +- rule: Force false-positive time services set time failure as ignored. + SetTime does not retain year properly with U-Boot RTC emulation. + SetTime is required only when an RTC is present (EBBR Table 2.6 + EFI_RUNTIME_SERVICES Implementation Requirements). + criteria: + descr: Time Services Test + device path: No device path + group: RuntimeServicesTest + guid: 3B96A20C-2B1F-44EA-BAA9-F96FEE131D05 + log: Status - Success, TPL - 4 + name: RT.SetTime - Verify year after change + result: FAILURE + revision: '0x00010000' + set guid: 603B46BE-7E14-408A-93D7-DD9DEC732968 + sub set: SetTime_Func + test set: TimeServicesTest + update: + result: IGNORED + +- rule: Force false-positive time services set time failure (2) as ignored. + SetTime does not retain year properly with U-Boot RTC emulation. + SetTime is required only when an RTC is present (EBBR Table 2.6 + EFI_RUNTIME_SERVICES Implementation Requirements). + criteria: + descr: Time Services Test + device path: No device path + group: RuntimeServicesTest + guid: 2D5CDBE5-1055-4EF6-8E90-0C993F93F698 + log: Status - Success, TPL - 4 + name: RT.SetTime - Verify month after change + result: FAILURE + revision: '0x00010000' + set guid: 603B46BE-7E14-408A-93D7-DD9DEC732968 + sub set: SetTime_Func + test set: TimeServicesTest + update: + result: IGNORED + +- rule: Force false-positive time services set time failure (3) as ignored. + SetTime does not retain year properly with U-Boot RTC emulation. + SetTime is required only when an RTC is present (EBBR Table 2.6 + EFI_RUNTIME_SERVICES Implementation Requirements). + criteria: + descr: Time Services Test + device path: No device path + group: RuntimeServicesTest + guid: E664E1D7-B733-410D-BC53-D4CFF2464355 + log: Status - Success, TPL - 8 + name: RT.SetTime - Verify year after change + result: FAILURE + revision: '0x00010000' + set guid: 603B46BE-7E14-408A-93D7-DD9DEC732968 + sub set: SetTime_Func + test set: TimeServicesTest + update: + result: IGNORED + +- rule: Force false-positive time services set time failure (4) as ignored. + SetTime does not retain year properly with U-Boot RTC emulation. + SetTime is required only when an RTC is present (EBBR Table 2.6 + EFI_RUNTIME_SERVICES Implementation Requirements). + criteria: + descr: Time Services Test + device path: No device path + group: RuntimeServicesTest + guid: DA4B19E7-F605-4FB9-A181-CCD335290BFE + log: Status - Success, TPL - 8 + name: RT.SetTime - Verify month after change + result: FAILURE + revision: '0x00010000' + set guid: 603B46BE-7E14-408A-93D7-DD9DEC732968 + sub set: SetTime_Func + test set: TimeServicesTest + update: + result: IGNORED + ############################################################################### # Known U-Boot limitations # ############################################################################### -- GitLab From a1526010654bf4572629931247674868dc41be35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vincent=20Stehl=C3=A9?= Date: Thu, 26 Aug 2021 12:18:32 +0200 Subject: [PATCH 16/17] parser.py: even more robust printing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Handle more cases gracefully during printing, where not all the fields are present for some of the records. This makes the original commit 29d85950f250 ("parser.py: add an option for printing") more robust and fixes a bug in the first hardening attempt of commit f153e7357476 ("parser.py: more robust printing"). Signed-off-by: Vincent Stehlé --- parser.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/parser.py b/parser.py index 9d4ffe8..dc2da20 100755 --- a/parser.py +++ b/parser.py @@ -500,6 +500,7 @@ def gen_template(cross_check, filename): # Print to stdout # The fields to write are supplied as a list +# We handle the case where not all fields are present for all records def do_print(cross_check, fields): logging.debug(f'Print (fields: {fields})') @@ -512,7 +513,7 @@ def do_print(cross_check, fields): for x in cross_check: for f in fm1: - w[f] = max(w[f], len(str(x[f]))) + w[f] = max(w[f], len(str(x[f]) if f in x else '')) # Second pass where we print lf = fields[len(fields) - 1] @@ -523,7 +524,7 @@ def do_print(cross_check, fields): for x in cross_check: print(' '.join([ - *map(lambda f: f"{x[f]:{w[f] if f in x else ''}}", fm1), + *map(lambda f: f"{x[f] if f in x else '':{w[f]}}", fm1), x[lf] if lf in x else ''])) -- GitLab From 9d1ddc376b9658f89d0e2ad29f068a162a40afa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vincent=20Stehl=C3=A9?= Date: Thu, 26 Aug 2021 14:49:16 +0200 Subject: [PATCH 17/17] EBBR.yaml: add create event known acs limitations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a rule to mark four ACS-IR BETA 0 CreateEvent failures as "known acs limitations". The SCT in this ACS version erroneously tests for Tpl level high. Signed-off-by: Vincent Stehlé --- EBBR.yaml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/EBBR.yaml b/EBBR.yaml index f2eaa7d..ec55406 100644 --- a/EBBR.yaml +++ b/EBBR.yaml @@ -2022,6 +2022,27 @@ update: result: KNOWN ACS LIMITATION +- rule: Force event services create event test failures with ACS-IR + v21.05_0.8_BETA-0 as known ACS limitation. + The ACS BETA 0 has an old version of the SCT, which erroneously creates + events with Tpl level high. + This is fixed in ACS BETA 1 and up. + criteria: + descr: Event, Timer, and Task Priority Services Test + device path: No device path + group: BootServicesTest + guid: EF317ADE-8668-456F-BED9-766056672DFF + log: NotifyTpl - 31 + name: BS.CreateEvent - Create event with all valid event type and supported + TPL. + result: FAILURE + revision: '0x00010000' + set guid: 83CF7F0B-C274-4918-AEA6-413DA9CF68CF + sub set: CreateEvent_Func + test set: EventTimerandPriorityServicesTest + update: + result: KNOWN ACS LIMITATION + ############################################################################### # Comments # ############################################################################### -- GitLab