(deopt: &Deopt)
| 242 | } |
| 243 | |
| 244 | fn eval_api_cov_map(deopt: &Deopt) -> Result<APICovRank> { |
| 245 | let mut global_rank: APICovRank = APICovRank::new(); |
| 246 | let seed_dir = deopt.get_library_succ_seed_dir()?; |
| 247 | |
| 248 | for seed_path in crate::deopt::utils::read_sort_dir(&seed_dir)? { |
| 249 | let seed_program = Program::load_from_path(&seed_path)?; |
| 250 | let seed_id = seed_program.id; |
| 251 | let coverage_file = deopt.get_seed_coverage_file(seed_id)?; |
| 252 | if !coverage_file.exists() { |
| 253 | let executor = Executor::new(deopt)?; |
| 254 | executor.eval_seed_coverage(seed_id)?; |
| 255 | } |
| 256 | let coverage = deopt |
| 257 | .get_seed_coverage(seed_id) |
| 258 | .context("cannot find coverage file")?; |
| 259 | let mut observer = Observer::from_coverage(&coverage, deopt); |
| 260 | let api_coverage = observer.compute_library_api_coverage()?; |
| 261 | for (api, cov) in api_coverage { |
| 262 | if !seed_program.get_quality().library_calls.contains(api) { |
| 263 | continue; |
| 264 | } |
| 265 | let entry = global_rank.entry(api.to_string()).or_default(); |
| 266 | entry.push((*cov, seed_id)); |
| 267 | } |
| 268 | } |
| 269 | for value in global_rank.values_mut() { |
| 270 | value.sort_by(|a, b| a.0.partial_cmp(&b.0).unwrap_or(std::cmp::Ordering::Less)); |
| 271 | value.reverse(); |
| 272 | } |
| 273 | Ok(global_rank) |
| 274 | } |
| 275 | |
| 276 | /// Find a program that achieved the most coverage of an API. |
| 277 | fn find_testbed_program(func: &str, deopt: &Deopt) -> Vec<usize> { |
no test coverage detected