From 2eb076f0e32e26a42c437033ff8cf216ef3a1f96 Mon Sep 17 00:00:00 2001
From: Pawel Zmarzly <pzmarzly@meta.com>
Date: Mon, 20 Jan 2025 05:58:13 -0800
Subject: [PATCH] [antlir][build_defs] Fix fb_deps and fb_test_deps logic

Summary:
In our build defs, `fb_test_deps` can work when used with `rust_unittest`, but if used with `rust_{binary,library}`, the argument does not get forwarded to unittest rule, but to the main rule (since it starts with `fb_test_`, and we only check for `test_`).

There's also a problem that if we have both `fb_deps` and `fb_test_deps`, one will override the other, instead of merging.

In this diff, I'm changing `_split_rust_kwargs` to be able to turn `kwargs["fb_test_deps"]` into `test_kwargs["fb_deps"]`.

Test Plan: Signals here should catch regressions

Reviewed By: sergeyfd

Differential Revision: D68327867

fbshipit-source-id: aa43b473aec6fcddbf9dcb725e231ee9eeb64f35
---
 antlir/bzl/build_defs.bzl | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)

diff --git a/antlir/bzl/build_defs.bzl b/antlir/bzl/build_defs.bzl
index 6d5cfb6c7a6..a1889bdfadf 100644
--- a/antlir/bzl/build_defs.bzl
+++ b/antlir/bzl/build_defs.bzl
@@ -109,14 +109,23 @@ def _rust_implicit_test(kwargs, test_kwargs):
         test_kwargs.pop("linker_flags", None)
         test_kwargs["srcs"] = test_kwargs.get("srcs", []) + kwargs.get("srcs", [])
         test_kwargs["deps"] = test_kwargs.get("deps", []) + kwargs.get("deps", [])
+        test_kwargs["fb_deps"] = test_kwargs.get("fb_deps", []) + kwargs.get("fb_deps", [])
         _rust_common(shim.rust_unittest, **test_kwargs)
 
-def _split_rust_kwargs(kwargs):
-    test_kwargs = dict(kwargs)
-    test_kwargs = {k: v for k, v in test_kwargs.items() if not k.startswith("test_")}
-    test_kwargs.update({k[len("test_"):]: v for k, v in kwargs.items() if k.startswith("test_")})
-    kwargs = {k: v for k, v in kwargs.items() if not k.startswith("test_")}
+def _is_rust_test_key(key):
+    return key.startswith("test_") or key.startswith("fb_test_")
+
+def _rust_test_key_to_regular_key(key):
+    if key.startswith("test_"):
+        return key[5:]
+    if key.startswith("fb_test_"):
+        return "fb_" + key[8:]
+    return key
 
+def _split_rust_kwargs(kwargs):
+    test_kwargs = {k: v for k, v in kwargs.items() if not _is_rust_test_key(k)}
+    test_kwargs.update({_rust_test_key_to_regular_key(k): v for k, v in kwargs.items() if _is_rust_test_key(k)})
+    kwargs = {k: v for k, v in kwargs.items() if not _is_rust_test_key(k)}
     return kwargs, test_kwargs
 
 def _normalize_rust_dep(dep):