# Copyright 2018 the V8 project authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import random

# List of configuration experiments for correctness fuzzing.
# List of <probability>, <1st config name>, <2nd config name>, <2nd d8>.
# Probabilities must add up to 100.
FOOZZIE_EXPERIMENTS = [
  [10, 'ignition', 'jitless', 'd8'],
  [10, 'ignition', 'slow_path', 'd8'],
  [5, 'ignition', 'slow_path_opt', 'd8'],
  [26, 'ignition', 'ignition_turbo', 'd8'],
  [2, 'ignition_no_ic', 'ignition_turbo', 'd8'],
  [2, 'ignition', 'ignition_turbo_no_ic', 'd8'],
  [18, 'ignition', 'ignition_turbo_opt', 'd8'],
  [2, 'ignition_no_ic', 'ignition_turbo_opt', 'd8'],
  [5, 'ignition_turbo_opt', 'ignition_turbo_opt', 'clang_x86/d8'],
  [5, 'ignition_turbo', 'ignition_turbo', 'clang_x86/d8'],
  [5, 'ignition', 'ignition', 'clang_x86/d8'],
  [5, 'ignition', 'ignition', 'clang_x64_v8_arm64/d8'],
  [5, 'ignition', 'ignition', 'clang_x86_v8_arm/d8'],
]

# Additional flag experiments. List of tuples like
# (<likelihood to use flags in [0,1)>, <flag>).
ADDITIONAL_FLAGS = [
  (0.1, '--stress-marking=100'),
  (0.1, '--stress-scavenge=100'),
  (0.1, '--stress-compaction-random'),
  (0.1, '--random-gc-interval=2000'),
  (0.2, '--noanalyze-environment-liveness'),
  (0.1, '--stress-delay-tasks'),
  (0.01, '--thread-pool-size=1'),
  (0.01, '--thread-pool-size=2'),
  (0.01, '--thread-pool-size=4'),
  (0.01, '--thread-pool-size=8'),
  (0.1, '--interrupt-budget=1000'),
]

class Config(object):
  def __init__(self, name, rng=None, random_seed=None):
    """
    Args:
      name: Name of the used fuzzer.
      rng: Random number generator for generating experiments.
      random_seed: Random-seed used for d8 throughout one fuzz session.
      TODO(machenbach): Remove random_seed after a grace period of a couple of
      days. We only have it to keep bisection stable. Afterwards we can just
      use rng.
    """
    self.name = name
    self.rng = rng or random.Random()
    self.random_seed = random_seed

  def choose_foozzie_flags(self):
    """Randomly chooses a configuration from FOOZZIE_EXPERIMENTS.

    Returns: List of flags to pass to v8_foozzie.py fuzz harness.
    """
    # TODO(machenbach): Temporarily use same RNG state for all test cases in one
    # fuzz session. See also TODO above.
    if self.random_seed is not None:
      flags_rng = random.Random(self.random_seed)
    else:
      flags_rng = random.Random()

    # Add additional flags to second config based on experiment percentages.
    extra_flags = []
    for p, flag in ADDITIONAL_FLAGS:
      if flags_rng.random() < p:
        extra_flags.append('--second-config-extra-flags=%s' % flag)

    # Calculate flags determining the experiment.
    acc = 0
    threshold = self.rng.random() * 100
    for prob, first_config, second_config, second_d8 in FOOZZIE_EXPERIMENTS:
      acc += prob
      if acc > threshold:
        return [
          '--first-config=' + first_config,
          '--second-config=' + second_config,
          '--second-d8=' + second_d8,
        ] + extra_flags
    assert False
