(self, test, analysis_result=None)
| 248 | self._try_send_next_test(test) |
| 249 | |
| 250 | def _create_gen(self, test, analysis_result=None): |
| 251 | # It will be called with analysis_result==None only when there is no |
| 252 | # analysis phase at all, so no fuzzer has it's own analyzer. |
| 253 | gens = [] |
| 254 | indexes = [] |
| 255 | for fuzzer_config in self._fuzzer_configs: |
| 256 | analysis_value = None |
| 257 | if analysis_result and fuzzer_config.analyzer: |
| 258 | analysis_value = fuzzer_config.analyzer.do_analysis(analysis_result) |
| 259 | if not analysis_value: |
| 260 | # Skip fuzzer for this test since it doesn't have analysis data |
| 261 | continue |
| 262 | p = fuzzer_config.probability |
| 263 | flag_gen = fuzzer_config.fuzzer.create_flags_generator(self._rng, test, |
| 264 | analysis_value) |
| 265 | indexes += [len(gens)] * p |
| 266 | gens.append((p, flag_gen)) |
| 267 | |
| 268 | if not gens: |
| 269 | # No fuzzers for this test, skip it |
| 270 | return |
| 271 | |
| 272 | i = 0 |
| 273 | while not self._count or i < self._count: |
| 274 | main_index = self._rng.choice(indexes) |
| 275 | _, main_gen = gens[main_index] |
| 276 | |
| 277 | flags = random_extra_flags(self._rng) + next(main_gen) |
| 278 | for index, (p, gen) in enumerate(gens): |
| 279 | if index == main_index: |
| 280 | continue |
| 281 | if self._rng.randint(1, 10) <= p: |
| 282 | flags += next(gen) |
| 283 | |
| 284 | flags.append('--fuzzer-random-seed=%s' % self._next_seed()) |
| 285 | |
| 286 | flags = _drop_contradictory_flags(flags, test.get_flags()) |
| 287 | yield test.create_subtest(self, str(i), flags=flags) |
| 288 | |
| 289 | i += 1 |
| 290 | |
| 291 | def _try_send_next_test(self, test): |
| 292 | for subtest in self._gens[test.procid]: |
no test coverage detected