@@ -35,3 +35,160 @@ def test_combine_code_and_description_long_code():
3535 long_code , "wow that's a long code"
3636 )
3737 assert cd == long_code
38+
39+
40+ def test_read_result_rule ():
41+ run = {"tool" :
42+ {"driver" :
43+ {"rules" : [
44+ {"id" : "id0" , "defaultConfiguration" : {"level" : "none" }},
45+ {"id" : "id1" , "defaultConfiguration" : {"level" : "error" }}
46+ ]}}}
47+ rule_id0 = run ["tool" ]["driver" ]["rules" ][0 ]
48+ rule_id1 = run ["tool" ]["driver" ]["rules" ][1 ]
49+
50+ result = {}
51+ (rule , ruleIndex ) = sarif_file_utils .read_result_rule (result , run )
52+ assert rule is None
53+ assert ruleIndex == - 1
54+
55+ result = {"ruleIndex" : 1 }
56+ (rule , ruleIndex ) = sarif_file_utils .read_result_rule (result , run )
57+ assert rule == rule_id1
58+ assert ruleIndex == 1
59+
60+ result = {"rule" : { "index" : 1 }}
61+ (rule , ruleIndex ) = sarif_file_utils .read_result_rule (result , run )
62+ assert rule == rule_id1
63+ assert ruleIndex == 1
64+
65+ result = {"ruleId" : "id1" }
66+ (rule , ruleIndex ) = sarif_file_utils .read_result_rule (result , run )
67+ assert rule == rule_id1
68+ assert ruleIndex == 1
69+
70+ result = {"rule" : { "id" : "id1" }}
71+ (rule , ruleIndex ) = sarif_file_utils .read_result_rule (result , run )
72+ assert rule == rule_id1
73+ assert ruleIndex == 1
74+
75+ result = {"ruleIndex" : 0 }
76+ (rule , ruleIndex ) = sarif_file_utils .read_result_rule (result , run )
77+ assert rule == rule_id0
78+ assert ruleIndex == 0
79+
80+ result = {"ruleIndex" : 0 }
81+ (rule , ruleIndex ) = sarif_file_utils .read_result_rule (result , {})
82+ assert rule is None
83+ assert ruleIndex == - 1
84+
85+
86+ def test_read_result_invocation ():
87+ run = {"invocations" : [
88+ {"foo" : 1 },
89+ {"bar" : "baz" }
90+ ]}
91+
92+ result = {}
93+ invocation = sarif_file_utils .read_result_invocation (result , run )
94+ assert invocation is None
95+
96+ result = {"provenance" : {}}
97+ invocation = sarif_file_utils .read_result_invocation (result , run )
98+ assert invocation is None
99+
100+ result = {"provenance" : {"invocationIndex" : 0 }}
101+ invocation = sarif_file_utils .read_result_invocation (result , {})
102+ assert invocation is None
103+
104+ result = {"provenance" : {"invocationIndex" : - 1 }}
105+ invocation = sarif_file_utils .read_result_invocation (result , run )
106+ assert invocation is None
107+
108+ result = {"provenance" : {"invocationIndex" : 2 }}
109+ invocation = sarif_file_utils .read_result_invocation (result , run )
110+ assert invocation is None
111+
112+ result = {"provenance" : {"invocationIndex" : 1 }}
113+ invocation = sarif_file_utils .read_result_invocation (result , run )
114+ assert invocation == run ["invocations" ][1 ]
115+
116+
117+ def test_read_result_severity ():
118+ result = {"level" : "error" }
119+ severity = sarif_file_utils .read_result_severity (result , {})
120+ assert severity == "error"
121+
122+ # If kind has any value other than "fail", then if level is absent, it SHALL default to "none"...
123+ result = {"kind" : "other" }
124+ severity = sarif_file_utils .read_result_severity (result , {})
125+ assert severity == "none"
126+
127+ run = {"invocations" : [
128+ {"ruleConfigurationOverrides" : [ {"descriptor" : {"id" : "id1" }, "configuration" : {"level" : "note" }} ]},
129+ {"ruleConfigurationOverrides" : [ {"descriptor" : {"index" : 1 }, "configuration" : {"level" : "note" }} ]},
130+ { }
131+ ],
132+ "tool" :
133+ {"driver" :
134+ {"rules" : [
135+ {"id" : "id0" , "defaultConfiguration" : {"level" : "none" }},
136+ {"id" : "id1" , "defaultConfiguration" : {"level" : "error" }}
137+ ]}
138+ }
139+ }
140+
141+ # If kind has the value "fail" and level is absent, then level SHALL be determined by the following procedure:
142+ # IF rule is present THEN
143+ # LET theDescriptor be the reportingDescriptor object that it specifies.
144+ # # Is there a configuration override for the level property?
145+ # IF result.provenance.invocationIndex is >= 0 THEN
146+ # LET theInvocation be the invocation object that it specifies.
147+ # IF theInvocation.ruleConfigurationOverrides is present
148+ # AND it contains a configurationOverride object whose
149+ # descriptor property specifies theDescriptor THEN
150+ # LET theOverride be that configurationOverride object.
151+ # IF theOverride.configuration.level is present THEN
152+ # Set level to theConfiguration.level.
153+ result = {"ruleIndex" : 1 , "provenance" : {"invocationIndex" : 0 }}
154+ severity = sarif_file_utils .read_result_severity (result , run )
155+ assert severity == "note"
156+
157+ result = {"ruleIndex" : 1 , "provenance" : {"invocationIndex" : 1 }}
158+ severity = sarif_file_utils .read_result_severity (result , run )
159+ assert severity == "note"
160+
161+ # ELSE
162+ # # There is no configuration override for level. Is there a default configuration for it?
163+ # IF theDescriptor.defaultConfiguration.level is present THEN
164+ # SET level to theDescriptor.defaultConfiguration.level.
165+
166+ result = {"ruleIndex" : 1 }
167+ severity = sarif_file_utils .read_result_severity (result , run )
168+ assert severity == "error"
169+
170+ result = {"rule" : { "index" : 1 }}
171+ severity = sarif_file_utils .read_result_severity (result , run )
172+ assert severity == "error"
173+
174+ result = {"ruleId" : "id1" }
175+ severity = sarif_file_utils .read_result_severity (result , run )
176+ assert severity == "error"
177+
178+ result = {"rule" : { "id" : "id1" }}
179+ severity = sarif_file_utils .read_result_severity (result , run )
180+ assert severity == "error"
181+
182+ result = {"ruleIndex" : 1 , "provenance" : {"invocationIndex" : 2 }}
183+ severity = sarif_file_utils .read_result_severity (result , run )
184+ assert severity == "error"
185+
186+ # IF level has not yet been set THEN
187+ # SET level to "warning".
188+ result = {}
189+ severity = sarif_file_utils .read_result_severity (result , {})
190+ assert severity == "warning"
191+
192+ result = {"ruleIndex" : - 1 }
193+ severity = sarif_file_utils .read_result_severity (result , {})
194+ assert severity == "warning"
0 commit comments