Import Xvfb for testing with Cypress

Signed-off-by: Philipp Schrader <philipp.schrader@gmail.com>
Change-Id: Ib972845e30a04b9ceb3f7fedf4a9d3ad32a7bdf1
diff --git a/WORKSPACE b/WORKSPACE
index 2b3531c..53e54aa 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -185,6 +185,10 @@
     "//debian:libtinfo5_arm64.bzl",
     libtinfo5_arm64_debs = "files",
 )
+load(
+    "//debian:xvfb_amd64.bzl",
+    xvfb_amd64_debs = "files",
+)
 load("//debian:packages.bzl", "generate_repositories_for_debs")
 
 generate_repositories_for_debs(rsync_debs)
@@ -237,6 +241,8 @@
 
 generate_repositories_for_debs(libtinfo5_arm64_debs)
 
+generate_repositories_for_debs(xvfb_amd64_debs)
+
 local_repository(
     name = "com_grail_bazel_toolchain",
     path = "third_party/bazel-toolchain",
@@ -1213,6 +1219,16 @@
     urls = ["https://www.frc971.org/Build-Dependencies/libtinfo5_arm64.tar.gz"],
 )
 
+http_archive(
+    name = "xvfb_amd64",
+    build_file = "//third_party:xvfb/xvfb.BUILD",
+    patch_cmds = [
+        "unlink usr/bin/X11",
+    ],
+    sha256 = "a7491bf6c47ed0037992fa493f9c25af3ab00a695d706e1fdc122a8b798c0d7c",
+    urls = ["https://www.frc971.org/Build-Dependencies/xvfb_amd64.tar.gz"],
+)
+
 local_repository(
     name = "com_github_nlohmann_json",
     path = "third_party/com_github_nlohmann_json",
diff --git a/debian/BUILD b/debian/BUILD
index ca6d134..e40bf8f 100644
--- a/debian/BUILD
+++ b/debian/BUILD
@@ -82,6 +82,10 @@
     ":libtinfo5_arm64.bzl",
     libtinfo5_arm64_debs = "files",
 )
+load(
+    ":xvfb_amd64.bzl",
+    xvfb_amd64_debs = "files",
+)
 load(":packages.bzl", "download_packages", "generate_deb_tarball")
 
 package(default_visibility = ["//visibility:public"])
@@ -423,6 +427,22 @@
     target_compatible_with = ["@platforms//os:linux"],
 )
 
+download_packages(
+    name = "download_xvfb_packages",
+    excludes = [
+        "libglx-mesa0",
+    ],
+    packages = [
+        "xvfb",
+    ],
+)
+
+generate_deb_tarball(
+    name = "xvfb_amd64",
+    files = xvfb_amd64_debs,
+    target_compatible_with = ["@platforms//os:linux"],
+)
+
 exports_files([
     "ssh_wrapper.sh",
     "curl.BUILD",
diff --git a/debian/xvfb_amd64.bzl b/debian/xvfb_amd64.bzl
new file mode 100644
index 0000000..faa9046
--- /dev/null
+++ b/debian/xvfb_amd64.bzl
@@ -0,0 +1,33 @@
+files = {
+    "libaudit-common_3.0-2_all.deb": "0d52f4826a57aea13cea1a85bfae354024c7b2f7b95e39cd1ce225e4db27d0f6",
+    "libaudit1_3.0-2_amd64.deb": "e3aa1383e387dc077a1176f7f3cbfdbc084bcc270a8938f598d5cb119773b268",
+    "libbrotli1_1.0.9-2+b2_amd64.deb": "65ca7d8b03e9dac09c5d544a89dd52d1aeb74f6a19583d32e4ff5f0c77624c24",
+    "libcap-ng0_0.7.9-2.2+b1_amd64.deb": "d34e29769b8ef23e9b9920814afb7905b8ee749db0814e6a8d937ccc4f309830",
+    "libfontenc1_1.1.4-1_amd64.deb": "1d0aa6ea16a34a8de1ea170360c4cb699f3239aeddb292df2d2c4eb6e835de4b",
+    "libfreetype6_2.10.4+dfsg-1+deb11u1_amd64.deb": "b21cfdd12adf6cac4af320c2485fb62a8a5edc6f9768bc2288fd686f4fa6dfdf",
+    "libgcrypt20_1.8.7-6_amd64.deb": "7a2e0eef8e0c37f03f3a5fcf7102a2e3dc70ba987f696ab71949f9abf36f35ef",
+    "libgl1_1.3.2-1_amd64.deb": "f300f9610b5f05f1ce566c4095f1bf2170e512ac5d201c40d895b8fce29dec98",
+    "libglvnd0_1.3.2-1_amd64.deb": "52a4464d181949f5ed8f7e55cca67ba2739f019e93fcfa9d14e8d65efe98fffc",
+    "libglx0_1.3.2-1_amd64.deb": "cb642200f7e28e6dbb4075110a0b441880eeec35c8a00a2198c59c53309e5e17",
+    "libgpg-error0_1.38-2_amd64.deb": "16a507fb20cc58b5a524a0dc254a9cb1df02e1ce758a2d8abde0bc4a3c9b7c26",
+    "libice6_1.0.10-1_amd64.deb": "452796e565c9d42386bd59990000ae9c37d85e142e00ee2b14df0787e2bbf970",
+    "liblz4-1_1.9.3-2_amd64.deb": "79ac6e9ca19c483f2e8effcc3401d723dd9dbb3a4ae324714de802adb21a8117",
+    "libpixman-1-0_0.40.0-1.1~deb11u1_amd64.deb": "1d0b392aec96fc3dc9c9cffa1241f4abfa7be0282f3451fce72492a934477c3e",
+    "libpng16-16_1.6.37-3_amd64.deb": "7d5336af395d1f658d0e66d74d0e1f4c632028750e7e04314d1a650e0317f3d6",
+    "libsm6_1.2.3-1_amd64.deb": "22a420890489023346f30fecef14ea900a0788e7bf959ef826aabb83944fccfb",
+    "libsystemd0_247.3-7+deb11u1_amd64.deb": "0bce44fd32e9fa18b68cb89f4010939b9984b9782db2d1985b041fc96e9a02b8",
+    "libunwind8_1.3.2-2_amd64.deb": "a8cc1181a479375aeb603cfe748cc19dc3a700a47ffdcb09fa025fe02b0c73bf",
+    "libuuid1_2.36.1-8+deb11u1_amd64.deb": "31250af4dd3b7d1519326a9a6764d1466a93d8f498cf6545058761ebc38b2823",
+    "libxaw7_1.0.13-1.1_amd64.deb": "fa30777b3c23421d18ed8cd817df7b4dd29d4532d2af00f9d6d449f4ad00a6d4",
+    "libxfont2_2.0.4-1_amd64.deb": "db5b67a3fc9f3a6adef313cb977a5a2480d751424cca49b286799b4bb98d8694",
+    "libxkbfile1_1.1.0-1_amd64.deb": "7c58d9986f918b71568ad83dbb6f4ab22c185f243461d41acee920cc5e13d347",
+    "libxmu6_1.1.2-2+b3_amd64.deb": "912a1bfb3416f18193824a4ffc5fe8a3a6e6781d9f8e50e26400dd36a7ca5bd0",
+    "libxpm4_3.5.12-1_amd64.deb": "49e64f0923cdecb2aaf6c93f176c25f63b841da2a501651ae23070f998967aa7",
+    "libxt6_1.2.0-1_amd64.deb": "1b2014704c8fb393aa9797da7c6de248f2bbd89eec8dee07bfecd7f2f85cff4d",
+    "lsb-base_11.1.0_all.deb": "89ed6332074d827a65305f9a51e591dff20641d61ff5e11f4e1822a9987e96fe",
+    "x11-common_7.7+22_all.deb": "5d1c3287826f60c3a82158b803b9c0489b8aad845ca23a53a982eba3dbb82aa3",
+    "x11-xkb-utils_7.7+5_amd64.deb": "fffdfdaec5533c33ddfdf25657e95e62bfd0348f375d0594d1727630059d1d3d",
+    "xkb-data_2.29-2_all.deb": "9122cccc67e6b3c3aef2fa9c50ef9d793a12f951c76698a02b1f4ceb9e3634e5",
+    "xserver-common_1.20.11-1+deb11u5_all.deb": "2cf7af2824d158159e2088f667c789ee4b6a5f1f6f776cbe4f867fa1ae5679b5",
+    "xvfb_1.20.11-1+deb11u5_amd64.deb": "3cefb98b07557a68ef0aa521fe34c7ef5755ea6f872141b05d68981433158f6e",
+}
diff --git a/third_party/xvfb/xvfb.BUILD b/third_party/xvfb/xvfb.BUILD
new file mode 100644
index 0000000..91332ff
--- /dev/null
+++ b/third_party/xvfb/xvfb.BUILD
@@ -0,0 +1,43 @@
+load("@bazel_skylib//rules:write_file.bzl", "write_file")
+
+write_file(
+    name = "generate_wrapper",
+    out = "wrapped_bin/Xvfb.sh",
+    content = ["""\
+#!/bin/bash
+
+# --- begin runfiles.bash initialization v2 ---
+# Copy-pasted from the Bazel Bash runfiles library v2.
+set -uo pipefail; set +e; f=bazel_tools/tools/bash/runfiles/runfiles.bash
+source "${RUNFILES_DIR:-/dev/null}/$f" 2>/dev/null || \
+  source "$(grep -sm1 "^$f " "${RUNFILES_MANIFEST_FILE:-/dev/null}" | cut -f2- -d' ')" 2>/dev/null || \
+  source "$0.runfiles/$f" 2>/dev/null || \
+  source "$(grep -sm1 "^$f " "$0.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \
+  source "$(grep -sm1 "^$f " "$0.exe.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \
+  { echo>&2 "ERROR: cannot find $f"; exit 1; }; f=; set -e
+# --- end runfiles.bash initialization v2 ---
+
+
+runfiles_export_envvars
+
+export LD_LIBRARY_PATH="${RUNFILES_DIR}/xvfb_amd64/usr/lib/x86_64-linux-gnu"
+export LD_LIBRARY_PATH+=":${RUNFILES_DIR}/xvfb_amd64/lib/x86_64-linux-gnu"
+
+exec "${RUNFILES_DIR}/xvfb_amd64/usr/bin/Xvfb" "$@"
+"""],
+    is_executable = True,
+)
+
+sh_binary(
+    name = "wrapped_bin/Xvfb",
+    srcs = ["wrapped_bin/Xvfb.sh"],
+    deps = [
+        "@bazel_tools//tools/bash/runfiles",
+    ],
+    data = glob([
+        "usr/lib/**/*",
+        "lib/**/*",
+        "usr/bin/*",
+    ]),
+    visibility = ["//visibility:public"],
+)