# 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 os
import glob
import subprocess

out_file = open("resources.gni", "w")

out_file.write(
    """\
### NOTE: This file auto-generated from gen.py

cts_resources = [
  {
    source = rebase_path("../external/vulkancts/mustpass/master/vk-default.txt")
    dest = "data/vk-default.txt"
  },
  {
    source = rebase_path("../external/vulkancts/mustpass/master/vk-default.txt")
    dest = "data/external/vulkancts/mustpass/master/vk-default.txt"
  },
  {
    source = rebase_path("../external/vulkancts/mustpass/master/vk-fraction-mandatory-tests.txt")
    dest = "data/external/vulkancts/mustpass/master/vk-fraction-mandatory-tests.txt"
  },
  {
    source = rebase_path("fuchsia-ci-waivers.xml")
    dest = "data/fuchsia-ci-waivers.xml"
  },
""")

files = subprocess.check_output(
    ["find", "../external/vulkancts/data/vulkan", "-type", "f"])
file_lines = files.decode("utf-8").splitlines()

for file in sorted(file_lines):
    file_split = file.split("/")
    file_split = file_split[4:]
    out_file.write("  {\n")
    out_file.write('    source = rebase_path("%s")\n' % file)
    out_file.write('    dest = "data/%s"\n' % "/".join(file_split))
    out_file.write("  },\n")

out_file.write("]\n")
out_file.close()

cts_version = "master"
dirs_to_delete = ["data", "meta"]
for dir_delete in dirs_to_delete:
    assert (os.path.isdir(os.path.join("split-cts", dir_delete)))

for f in glob.glob("split-cts/meta/*.cml"):
    os.remove(f)

for f in glob.glob("split-cts/meta/*.cmx"):
    os.remove(f)

for f in glob.glob("split-cts/data/*.txt"):
    os.remove(f)

out_file = open("split-cts/BUILD.gn", "w")

out_file.write(
    """# Copyright 2019 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.
# File generated by ../gen.py - do not modify.

import("//build/components/fuchsia_test_package.gni")
import("//src/graphics/lib/magma/gnbuild/magma.gni")
import("../resources.gni")

# Add a label of "vulkan-cts" for each environment given in the list
# of general hardware environments for magma tests. The label ensures
# that the Vulkan CTS will not be run in the general test pipeline;
# the label will be keyed on so that the suite may be run in a special
# builder.
labeled_magma_hardware_envs = []
foreach(env, magma_hardware_envs) {
  labeled_env = {
  }  # Clear from previous iteration.
  labeled_env = {
    forward_variables_from(env, "*")
    if (defined(tags)) {
      tags += [ "vulkan-cts" ]
    } else {
      tags = [ "vulkan-cts" ]
    }
  }
  labeled_magma_hardware_envs += [ labeled_env ]
}
""")

cts_file_list = open(
    "../external/vulkancts/mustpass/%s/vk-default.txt" % cts_version,
    "r").read().split("\n")

chunk_size = 1000
cts_chunks = []
while cts_file_list:
    first_section = cts_file_list[:chunk_size]
    cts_file_list = cts_file_list[chunk_size:]
    cts_chunks.append(first_section)

component_list = []
component_name_list = []
for chunk_num in range(len(cts_chunks)):
    component_name = "vulkan-cts-%03d" % chunk_num
    out_file.write(
        """
resource("%s-data") {
  sources = [ "data/vulkan-%03d.txt" ]
  outputs = [ "data/vk-list-%03d.txt" ]
}
fuchsia_component("%s") {
  testonly = true
  manifest = "meta/%s.cml"
  deps = [
    ":%s-data",
    "..:cts-deps",
  ]
}
""" % (
            component_name, chunk_num, chunk_num, component_name,
            component_name, component_name))
    component_name_list.append('":' + component_name + '"')

for current_index in range(len(cts_chunks)):
    with open("split-cts/data/vulkan-%03d.txt" % current_index, "w") as f:
        f.write("\n".join(cts_chunks[current_index]))
    with open("split-cts/meta/vulkan-cts-%03d.cml" % current_index, "w") as f:
        f.write(
            """// NOTE: This file auto-generated from gen.py
{
    include: [ "//third_party/vulkan-cts/fuchsia/meta/vulkan-cts.shard.cml" ],
    program: {
        args: [
            "--deqp-caselist-file=/pkg/data/vk-list-%03d.txt",
            "--deqp-log-images=disable",
            "--deqp-log-shader-sources=disable",
            "--deqp-log-filename=/artifacts/TestResults.qpa",
            "--deqp-archive-dir=/pkg/data",
            "--deqp-log-flush=disable",
            "--deqp-shadercache-filename=/tmp/shadercache.bin",
            "--deqp-waiver-file=/pkg/data/fuchsia-ci-waivers.xml",
        ],
    },
}
""" % (current_index))

combined_component_list = "".join(
    "    " + x + ",\n" for x in component_name_list)
out_file.write(
    """
fuchsia_test_package("vulkan-cts-split") {
  test_components = [
%s  ]
  test_specs = {
    environments = labeled_magma_hardware_envs
  }
}

group("split-cts") {
  testonly = true
  deps = [ ":vulkan-cts-split" ]
}
""" % (combined_component_list))

out_file.close()

upstream_split_dir = "upstream-split-cts"
dirs_to_delete = ["meta"]
for dir_delete in dirs_to_delete:
    assert (os.path.isdir(os.path.join(upstream_split_dir, dir_delete)))
    for f in glob.glob(os.path.join(upstream_split_dir, dir_delete) + "/*.cml"):
        os.remove(f)

# According to the Vulkan CTS README, the fraction count can be at most 8 for
# conformance submissions.
FRACTION_COUNT = 8
for i in range(FRACTION_COUNT):
    with open("%s/meta/vulkan-cts-upstream-split-%d.cml" %
              (upstream_split_dir, i), "w") as out_file:
        # Only pass arguments allowed by the conformance submission process.
        out_file.write(
            """// NOTE: This file auto-generated from gen.py
{
    include: [ "//third_party/vulkan-cts/fuchsia/meta/vulkan-cts.shard.cml" ],
    program: {
        args: [
            "--deqp-caselist-file=/pkg/data/external/vulkancts/mustpass/master/vk-default.txt",
            "--deqp-log-images=disable",
            "--deqp-log-shader-sources=disable",
            "--deqp-log-filename=/artifacts/TestResults.qpa",
            "--deqp-archive-dir=/pkg/data",
            "--deqp-log-flush=disable",
            "--deqp-fraction=%d,%d",
            "--deqp-fraction-mandatory-caselist-file=/pkg/data/external/vulkancts/mustpass/master/vk-fraction-mandatory-tests.txt",
            "--deqp-shadercache-filename=/tmp/shadercache.bin",
        ],
    },
}
""" % (i, FRACTION_COUNT))
