Skip to content

Commit f0c8328

Browse files
committed
Add test case for ApiGraph
1 parent 4fa0930 commit f0c8328

3 files changed

Lines changed: 48 additions & 0 deletions

File tree

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
MyModule #$ use=moduleImport("MyModule")
2+
print MyModule.foo #$ use=moduleImport("MyModule").getReturn("foo")
3+
Kernel.print(e) #$ use=moduleImport("Kernel").getReturn("print")
4+
Object::Kernel #$ use=moduleImport("Kernel")
5+
Object::Kernel.print(e) #$ use=moduleImport("Kernel").getReturn("print")
6+
begin
7+
print MyModule.bar #$ use=moduleImport("MyModule").getReturn("bar")
8+
rescue AttributeError => e #$ use=moduleImport("AttributeError") // missing because there is no dataflow Node for AttributeError
9+
Kernel.print(e) #$ use=moduleImport("Kernel").getReturn("print")
10+
end
11+
Unknown.new.run #$ use=moduleImport("Unknown").instance.getReturn("run")
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
| test1.rb:8:28:8:128 | #$ use=moduleImport("AttributeError") // missing because there is no dataflow Node for AttributeError | Missing result:use=moduleImport("AttributeError") |
2+
| test1.rb:9:22:9:69 | #$ use=moduleImport("Kernel").getReturn("print") | Missing result:use=moduleImport("Kernel").getReturn("print") |
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import ruby
2+
import codeql_ruby.DataFlow
3+
import TestUtilities.InlineExpectationsTest
4+
import codeql_ruby.ApiGraphs
5+
6+
class ApiUseTest extends InlineExpectationsTest {
7+
ApiUseTest() { this = "ApiUseTest" }
8+
9+
override string getARelevantTag() { result = "use" }
10+
11+
private predicate relevant_node(API::Node a, DataFlow::Node n, Location l) {
12+
n = a.getAUse() and
13+
l = n.getLocation()
14+
}
15+
16+
override predicate hasActualResult(Location location, string element, string tag, string value) {
17+
exists(API::Node a, DataFlow::Node n | relevant_node(a, n, location) |
18+
tag = "use" and
19+
// Only report the longest path on this line:
20+
value =
21+
max(API::Node a2, Location l2, DataFlow::Node n2 |
22+
relevant_node(a2, n2, l2) and
23+
l2.getFile() = location.getFile() and
24+
l2.getStartLine() = location.getStartLine()
25+
|
26+
a2.getPath()
27+
order by
28+
size(n2.asExpr().getExpr()), a2.getPath().length() desc, a2.getPath() desc
29+
) and
30+
element = n.toString()
31+
)
32+
}
33+
}
34+
35+
private int size(AstNode n) { result = count(n.getAChild*()) }

0 commit comments

Comments
 (0)