# Copyright 2018 The Fuchsia 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("//build/board.gni")

declare_args() {
  # Whether to include tests that are known to fail on NUC with ASan.
  # Should be set to false in the infra builders that have board == "x64" and
  # "asan" in variants.
  include_tests_that_fail_on_nuc_asan = true

  # The list of environment names to include in "basic_envs".
  basic_env_names = [ "emu" ]

  # Adds GCE as a basic env if true.
  enable_test_on_gce = false
}

_all_named_envs = []

### Individual test environments
# Please keep alphabetized.

aemu_env = {
  dimensions = {
    device_type = "AEMU"
  }
}
_all_named_envs += [
  {
    name = "aemu"
    env = aemu_env
  },
]

astro_env = {
  dimensions = {
    device_type = "Astro"
  }
}
_all_named_envs += [
  {
    name = "astro"
    env = astro_env
  },
]

linux_env = {
  dimensions = {
    os = "Linux"
    cpu = current_cpu
  }
}
_all_named_envs += [
  {
    name = "linux"
    env = linux_env
  },
]

luis_env = {
  dimensions = {
    device_type = "Luis"
  }
}
_all_named_envs += [
  {
    name = "luis"
    env = luis_env
  },
]

mac_env = {
  dimensions = {
    os = "Mac"
    cpu = current_cpu
  }

  # When running tests for a mac build, we only wish to run mac tests; we attach
  # the "mac" tag in that case to filter out other tests.
  tags = [ "mac" ]
}
_all_named_envs += [
  {
    name = "mac"
    env = mac_env
  },
]

nelson_env = {
  dimensions = {
    device_type = "Nelson"
  }
}
_all_named_envs += [
  {
    name = "nelson"
    env = nelson_env
  },
]

nuc_env = {
  dimensions = {
    device_type = "Intel NUC Kit NUC7i5DNHE"
  }
}
_all_named_envs += [
  {
    name = "nuc"
    env = nuc_env
  },
]

qemu_env = {
  dimensions = {
    device_type = "QEMU"
  }
}
_all_named_envs += [
  {
    name = "qemu"
    env = qemu_env
  },
]

sherlock_env = {
  dimensions = {
    device_type = "Sherlock"
  }
}
_all_named_envs += [
  {
    name = "sherlock"
    env = sherlock_env
  },
]

vim3_env = {
  dimensions = {
    device_type = "Vim3"
  }
}
_all_named_envs += [
  {
    name = "vim3"
    env = vim3_env
  },
]

if (enable_test_on_gce) {
  basic_env_names += [ "gce" ]
  gce_env = {
    dimensions = {
      device_type = "GCE"
    }
  }

  _all_named_envs += [
    {
      name = "gce"
      env = gce_env
    },
  ]
}

### END Individual test environments

### Aliases ###

if (host_os == "linux") {
  host_env = linux_env
} else if (host_os == "mac") {
  host_env = mac_env
}

# Allow selection of AEMU as the default EMU.
emu_env = qemu_env
if (target_cpu == "x64") {
  emu_env = {
  }
  emu_env = aemu_env
}
_all_named_envs += [
  {
    name = "emu"
    env = emu_env
  },
]

### Select environment lists ###

# Tests that fail on a NUC in ASan but otherwise want to run on a NUC should
# use this.
nuc_env_fails_on_asan = []
if (include_tests_that_fail_on_nuc_asan) {
  nuc_env_fails_on_asan += [ nuc_env ]
}

basic_envs = []
foreach(name, basic_env_names) {
  foreach(named_env, _all_named_envs) {
    if (name == named_env.name) {
      basic_envs += [ named_env.env ]
    }
  }
}
