You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

133 lines
3.6 KiB

(*
* Copyright (c) 2016 - present Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*)
open! IStd
module L = Logging
module F = Format
module MockTraceElem = struct
type t = Kind1 | Kind2 | Footprint | Unknown [@@deriving compare]
let unknown = Unknown
let call_site _ = CallSite.dummy
let kind t = t
let make ?indexes:_ kind _ = kind
let pp fmt = function
| Kind1
-> F.fprintf fmt "Kind1"
| Kind2
-> F.fprintf fmt "Kind2"
| Footprint
-> F.fprintf fmt "Footprint"
| Unknown
-> F.fprintf fmt "Unknown"
module Kind = struct
type nonrec t = t
let compare = compare
let pp = pp
end
module Set = PrettyPrintable.MakePPSet (struct
type nonrec t = t
let compare = compare
let pp = pp
end)
let with_callsite t _ = t
end
module MockSource = struct
include Source.Make (struct
include MockTraceElem
let get _ _ = assert false
let get_tainted_formals _ = assert false
end)
let equal = [%compare.equal : t]
end
module MockSink = struct
include MockTraceElem
type parameter = {sink: t; index: int}
let get _ = assert false
let indexes _ = IntSet.empty
let equal = [%compare.equal : t]
end
module MockTrace = Trace.Make (struct
module Source = MockSource
module Sink = MockSink
let should_report source sink =
[%compare.equal : MockTraceElem.t] (Source.kind source) (Sink.kind sink)
end)
let tests =
let source1 = MockSource.make MockTraceElem.Kind1 CallSite.dummy in
let source2 = MockSource.make MockTraceElem.Kind2 CallSite.dummy in
let sink1 = MockSink.make MockTraceElem.Kind1 CallSite.dummy in
let sink2 = MockSink.make MockTraceElem.Kind2 CallSite.dummy in
let open OUnit2 in
let get_reports =
let get_reports_ _ =
let trace =
MockTrace.of_source source1 |> MockTrace.add_source source2 |> MockTrace.add_sink sink1
|> MockTrace.add_sink sink2
in
let reports = MockTrace.get_reports trace in
assert_equal (List.length reports) 2 ;
assert_bool "Reports should contain source1 -> sink1"
(List.exists
~f:(fun (source, sink, _) ->
MockSource.equal source source1 && MockSink.equal sink sink1)
reports) ;
assert_bool "Reports should contain source2 -> sink2"
(List.exists
~f:(fun (source, sink, _) ->
MockSource.equal source source2 && MockSink.equal sink sink2)
reports)
in
"get_reports" >:: get_reports_
in
let append =
let append_ _ =
let call_site = CallSite.dummy in
let footprint_ap =
AccessPath.Abs.Exact (AccessPath.of_id (Ident.create_none ()) (Typ.mk Tvoid))
in
let dummy_pdesc =
Cfg.create_proc_desc (Cfg.create_cfg ())
(ProcAttributes.default Typ.Procname.empty_block !Config.curr_language)
in
let footprint_source = MockSource.make_footprint footprint_ap dummy_pdesc in
let source_trace = MockTrace.of_source source1 in
let footprint_trace = MockTrace.of_source footprint_source |> MockTrace.add_sink sink1 in
let expected_trace = MockTrace.of_source source1 |> MockTrace.add_sink sink1 in
assert_bool "Appended trace should contain source and sink"
(MockTrace.equal (MockTrace.append source_trace footprint_trace call_site) expected_trace)
in
"append" >:: append_
in
"trace_domain_suite" >::: [get_reports; append]