Expand bazel->gn script to support absl/container/BUILD.bazel

Bug: 524565513
Change-Id: I3ca7f040f7187b1d3aed7f6eebb77fe14a886e73
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/8159981
Reviewed-by: Mirko Bonadei <mbonadei@chromium.org>
Commit-Queue: Danil Chapovalov <danilchap@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1669355}
NOKEYCHECK=True
GitOrigin-RevId: 1bff30167c211f22dcf561c73390482cde7a4b53
diff --git a/BUILD.gn b/BUILD.gn
index a5ff686..86c92f9 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -293,7 +293,12 @@
         "absl/container:flat_hash_map_test",
         "absl/container:flat_hash_set_test",
         "absl/container:hash_function_defaults_test",
+        "absl/container:hash_policy_testing_test",
+        "absl/container:hash_policy_traits_test",
+        "absl/container:hashtable_control_bytes_test",
+        "absl/container:hashtablez_sampler_test",
         "absl/container:inlined_vector_test",
+        "absl/container:layout_test",
         "absl/container:linked_hash_map_test",
         "absl/container:linked_hash_set_test",
         "absl/container:node_hash_map_test",
@@ -302,6 +307,9 @@
         "absl/container:raw_hash_set_allocator_test",
         "absl/container:raw_hash_set_resize_impl_test",
         "absl/container:sample_element_size_test",
+        "absl/container:test_instance_tracker_test",
+        "absl/container:unordered_map_test",
+        "absl/container:unordered_set_test",
         "absl/crc:crc32c_test",
         "absl/crc:crc_cord_state_test",
         "absl/crc:crc_memcpy_test",
diff --git a/absl/container/BUILD.gn b/absl/container/BUILD.gn
index a49dc28..021569a 100644
--- a/absl/container/BUILD.gn
+++ b/absl/container/BUILD.gn
@@ -1,6 +1,8 @@
 # Copyright 2018 The Chromium Authors
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
+#
+# Generated file. DO NOT EDIT.
 
 import("//third_party/abseil-cpp/absl.gni")
 
@@ -10,7 +12,7 @@
 }
 
 absl_test("compressed_tuple_test") {
-  public = [ "internal/compressed_tuple_test.cc" ]
+  sources = [ "internal/compressed_tuple_test.cc" ]
   deps = [
     ":compressed_tuple",
     ":test_instance_tracker",
@@ -40,7 +42,6 @@
   deps = [
     ":fixed_array",
     ":test_allocator",
-    ":test_instance_tracker",
     "//third_party/abseil-cpp/absl/base:config",
     "//third_party/abseil-cpp/absl/base:exception_testing",
     "//third_party/abseil-cpp/absl/base:hardening",
@@ -50,8 +51,12 @@
   ]
 }
 
+# skipped because chromium doesn't use c++ exceptions
+# absl_test("fixed_array_exception_safety_test")
+
 absl_source_set("inlined_vector_internal") {
   public = [ "internal/inlined_vector.h" ]
+  visibility = [ ":*" ]
   deps = [
     ":compressed_tuple",
     "//third_party/abseil-cpp/absl/base:base_internal",
@@ -82,11 +87,11 @@
 absl_source_set("test_allocator") {
   testonly = true
   public = [ "internal/test_allocator.h" ]
+  visibility = [ ":*" ]
   deps = [
     "//third_party/abseil-cpp/absl/base:config",
     "//third_party/googletest:gtest",
   ]
-  visibility = [ ":*" ]
 }
 
 absl_test("inlined_vector_test") {
@@ -107,12 +112,20 @@
   ]
 }
 
+# skipped because chromium doesn't use c++ exceptions
+# absl_test("inlined_vector_exception_safety_test")
+
 absl_source_set("test_instance_tracker") {
   testonly = true
   sources = [ "internal/test_instance_tracker.cc" ]
   public = [ "internal/test_instance_tracker.h" ]
-  deps = [ "//third_party/abseil-cpp/absl/types:compare" ]
   visibility = [ "//third_party/abseil-cpp/absl/*" ]
+  deps = [ "//third_party/abseil-cpp/absl/types:compare" ]
+}
+
+absl_test("test_instance_tracker_test") {
+  sources = [ "internal/test_instance_tracker_test.cc" ]
+  deps = [ ":test_instance_tracker" ]
 }
 
 absl_source_set("flat_hash_map") {
@@ -174,6 +187,7 @@
     "//third_party/abseil-cpp/absl/log:check",
     "//third_party/abseil-cpp/absl/memory",
     "//third_party/abseil-cpp/absl/strings",
+    "//third_party/abseil-cpp/absl/strings:string_view",
   ]
 }
 
@@ -236,6 +250,7 @@
 
 absl_source_set("container_memory") {
   public = [ "internal/container_memory.h" ]
+  visibility = [ "//third_party/abseil-cpp/absl/*" ]
   deps = [
     "//third_party/abseil-cpp/absl/base:config",
     "//third_party/abseil-cpp/absl/hash",
@@ -246,21 +261,11 @@
 }
 
 # Disabled because container_memory_test requires -frtti
-# absl_test("container_memory_test") {
-#  sources = [ "internal/container_memory_test.cc" ]
-#  deps = [
-#    ":container_memory",
-#    ":test_instance_tracker",
-#    "//third_party/abseil-cpp/absl/base:config",
-#    "//third_party/abseil-cpp/absl/base:no_destructor",
-#    "//third_party/abseil-cpp/absl/meta:type_traits",
-#    "//third_party/abseil-cpp/absl/strings",
-#  ]
-# }
+# absl_test("container_memory_test")
 
 absl_source_set("hash_function_defaults") {
   public = [ "internal/hash_function_defaults.h" ]
-  visibility = [ "//third_party/abseil-cpp/absl/container:*" ]
+  visibility = [ ":*" ]
   deps = [
     ":common",
     "//third_party/abseil-cpp/absl/base:config",
@@ -291,6 +296,7 @@
     "//third_party/abseil-cpp/absl/strings",
     "//third_party/abseil-cpp/absl/strings:cord",
     "//third_party/abseil-cpp/absl/strings:cord_test_helpers",
+    "//third_party/abseil-cpp/absl/strings:string_view",
   ]
 }
 
@@ -298,6 +304,7 @@
   testonly = true
   sources = [ "internal/hash_generator_testing.cc" ]
   public = [ "internal/hash_generator_testing.h" ]
+  visibility = [ ":*" ]
   deps = [
     ":hash_policy_testing",
     "//third_party/abseil-cpp/absl/base:config",
@@ -305,6 +312,7 @@
     "//third_party/abseil-cpp/absl/memory",
     "//third_party/abseil-cpp/absl/meta:type_traits",
     "//third_party/abseil-cpp/absl/random",
+    "//third_party/abseil-cpp/absl/strings",
     "//third_party/abseil-cpp/absl/strings:string_view",
   ]
 }
@@ -312,14 +320,22 @@
 absl_source_set("hash_policy_testing") {
   testonly = true
   public = [ "internal/hash_policy_testing.h" ]
+  visibility = [ ":*" ]
   deps = [
     "//third_party/abseil-cpp/absl/hash",
+    "//third_party/abseil-cpp/absl/strings",
     "//third_party/abseil-cpp/absl/strings:string_view",
   ]
 }
 
+absl_test("hash_policy_testing_test") {
+  sources = [ "internal/hash_policy_testing_test.cc" ]
+  deps = [ ":hash_policy_testing" ]
+}
+
 absl_source_set("hash_policy_traits") {
   public = [ "internal/hash_policy_traits.h" ]
+  visibility = [ ":*" ]
   deps = [
     ":common_policy_traits",
     ":container_memory",
@@ -327,9 +343,17 @@
   ]
 }
 
+absl_test("hash_policy_traits_test") {
+  sources = [ "internal/hash_policy_traits_test.cc" ]
+  deps = [
+    ":container_memory",
+    ":hash_policy_traits",
+  ]
+}
+
 absl_source_set("common_policy_traits") {
   public = [ "internal/common_policy_traits.h" ]
-  visibility = [ "//third_party/abseil-cpp/absl/container:*" ]
+  visibility = [ ":*" ]
   deps = [ "//third_party/abseil-cpp/absl/meta:type_traits" ]
 }
 
@@ -343,20 +367,23 @@
 
 absl_source_set("hashtable_debug") {
   public = [ "internal/hashtable_debug.h" ]
+  visibility = [ ":*" ]
   deps = [ ":hashtable_debug_hooks" ]
 }
 
 absl_source_set("hashtable_debug_hooks") {
   public = [ "internal/hashtable_debug_hooks.h" ]
+  visibility = [ ":*" ]
   deps = [ "//third_party/abseil-cpp/absl/base:config" ]
 }
 
 absl_source_set("hashtablez_sampler") {
-  public = [ "internal/hashtablez_sampler.h" ]
   sources = [
     "internal/hashtablez_sampler.cc",
     "internal/hashtablez_sampler_force_weak_definition.cc",
   ]
+  public = [ "internal/hashtablez_sampler.h" ]
+  visibility = [ "//third_party/abseil-cpp/absl/*" ]
   deps = [
     "//third_party/abseil-cpp/absl/base",
     "//third_party/abseil-cpp/absl/base:config",
@@ -373,8 +400,26 @@
   ]
 }
 
+absl_test("hashtablez_sampler_test") {
+  sources = [ "internal/hashtablez_sampler_test.cc" ]
+  deps = [
+    ":hashtablez_sampler",
+    "//third_party/abseil-cpp/absl/base:config",
+    "//third_party/abseil-cpp/absl/base:core_headers",
+    "//third_party/abseil-cpp/absl/profiling:sample_recorder",
+    "//third_party/abseil-cpp/absl/random",
+    "//third_party/abseil-cpp/absl/synchronization",
+    "//third_party/abseil-cpp/absl/synchronization:thread_pool",
+    "//third_party/abseil-cpp/absl/time",
+  ]
+  if (is_win) {
+    sources = []
+  }
+}
+
 absl_source_set("node_slot_policy") {
   public = [ "internal/node_slot_policy.h" ]
+  visibility = [ "//third_party/abseil-cpp/absl/*" ]
   deps = [ "//third_party/abseil-cpp/absl/base:config" ]
 }
 
@@ -389,6 +434,7 @@
 
 absl_source_set("raw_hash_map") {
   public = [ "internal/raw_hash_map.h" ]
+  visibility = [ "//third_party/abseil-cpp/absl/*" ]
   deps = [
     ":common_policy_traits",
     ":container_memory",
@@ -402,6 +448,7 @@
 
 absl_source_set("common") {
   public = [ "internal/common.h" ]
+  visibility = [ ":*" ]
   deps = [
     "//third_party/abseil-cpp/absl/meta:type_traits",
     "//third_party/abseil-cpp/absl/types:optional",
@@ -410,6 +457,7 @@
 
 absl_source_set("hashtable_control_bytes") {
   public = [ "internal/hashtable_control_bytes.h" ]
+  visibility = [ ":*" ]
   deps = [
     "//third_party/abseil-cpp/absl/base:config",
     "//third_party/abseil-cpp/absl/base:core_headers",
@@ -418,8 +466,17 @@
   ]
 }
 
+absl_test("hashtable_control_bytes_test") {
+  sources = [ "internal/hashtable_control_bytes_test.cc" ]
+  deps = [
+    ":hashtable_control_bytes",
+    "//third_party/abseil-cpp/absl/base:config",
+  ]
+}
+
 absl_source_set("raw_hash_set_resize_impl") {
   public = [ "internal/raw_hash_set_resize_impl.h" ]
+  visibility = [ ":*" ]
   deps = [ "//third_party/abseil-cpp/absl/base:config" ]
 }
 
@@ -464,6 +521,7 @@
 }
 
 # raw_hash_set_test uses typeid(), i.e., relies on RTTI.
+# absl_test("raw_hash_set_test")
 
 absl_test("raw_hash_set_allocator_test") {
   sources = [ "internal/raw_hash_set_allocator_test.cc" ]
@@ -502,6 +560,7 @@
 absl_source_set("tracked") {
   testonly = true
   public = [ "internal/tracked.h" ]
+  visibility = [ ":*" ]
   deps = [ "//third_party/abseil-cpp/absl/base:config" ]
 }
 
@@ -513,6 +572,7 @@
     ":hash_generator_testing",
     ":hash_policy_testing",
     "//third_party/abseil-cpp/absl/base:config",
+    "//third_party/googletest:gmock",
     "//third_party/googletest:gtest",
   ]
 }
@@ -524,6 +584,7 @@
   deps = [
     ":hash_generator_testing",
     ":hash_policy_testing",
+    "//third_party/googletest:gmock",
     "//third_party/googletest:gtest",
   ]
 }
@@ -535,6 +596,7 @@
   deps = [
     ":hash_generator_testing",
     ":hash_policy_testing",
+    "//third_party/googletest:gmock",
     "//third_party/googletest:gtest",
   ]
 }
@@ -548,6 +610,7 @@
     ":hash_policy_testing",
     "//third_party/abseil-cpp/absl/base:config",
     "//third_party/abseil-cpp/absl/meta:type_traits",
+    "//third_party/googletest:gmock",
     "//third_party/googletest:gtest",
   ]
 }
@@ -558,6 +621,7 @@
   visibility = [ ":*" ]
   deps = [
     "//third_party/abseil-cpp/absl/meta:type_traits",
+    "//third_party/googletest:gmock",
     "//third_party/googletest:gtest",
   ]
 }
@@ -568,6 +632,7 @@
   visibility = [ ":*" ]
   deps = [
     "//third_party/abseil-cpp/absl/meta:type_traits",
+    "//third_party/googletest:gmock",
     "//third_party/googletest:gtest",
   ]
 }
@@ -579,6 +644,7 @@
   deps = [
     ":hash_generator_testing",
     ":hash_policy_testing",
+    "//third_party/googletest:gmock",
     "//third_party/googletest:gtest",
   ]
 }
@@ -590,12 +656,33 @@
   deps = [
     ":hash_generator_testing",
     ":hash_policy_testing",
+    "//third_party/googletest:gmock",
     "//third_party/googletest:gtest",
   ]
 }
 
+absl_test("unordered_set_test") {
+  sources = [ "internal/unordered_set_test.cc" ]
+  deps = [
+    ":unordered_set_constructor_test",
+    ":unordered_set_lookup_test",
+    ":unordered_set_members_test",
+    ":unordered_set_modifiers_test",
+  ]
+}
+
+absl_test("unordered_map_test") {
+  sources = [ "internal/unordered_map_test.cc" ]
+  deps = [
+    ":unordered_map_constructor_test",
+    ":unordered_map_lookup_test",
+    ":unordered_map_members_test",
+    ":unordered_map_modifiers_test",
+  ]
+}
+
 absl_test("sample_element_size_test") {
-  public = [ "sample_element_size_test.cc" ]
+  sources = [ "sample_element_size_test.cc" ]
   deps = [
     ":flat_hash_map",
     ":flat_hash_set",
@@ -628,6 +715,7 @@
     "//third_party/abseil-cpp/absl/hash:weakly_mixed_integer",
     "//third_party/abseil-cpp/absl/memory",
     "//third_party/abseil-cpp/absl/meta:type_traits",
+    "//third_party/abseil-cpp/absl/strings",
     "//third_party/abseil-cpp/absl/strings:cord",
     "//third_party/abseil-cpp/absl/strings:string_view",
     "//third_party/abseil-cpp/absl/types:compare",
@@ -637,6 +725,7 @@
 absl_source_set("btree_test_common") {
   testonly = true
   public = [ "btree_test.h" ]
+  visibility = [ ":*" ]
   deps = [
     ":btree",
     ":flat_hash_set",
@@ -647,24 +736,7 @@
 }
 
 # TODO(mbonadei): Fix issue with EXPECT_DEATH and uncomment.
-# absl_test("btree_test") {
-#   sources = [ "btree_test.cc" ]
-#   deps = [
-#     ":btree",
-#     ":btree_test_common",
-#     ":test_allocator",
-#     ":test_instance_tracker",
-#     "//third_party/abseil-cpp/absl/algorithm:container",
-#     "//third_party/abseil-cpp/absl/base:core_headers",
-#     "//third_party/abseil-cpp/absl/base:raw_logging_internal",
-#     "//third_party/abseil-cpp/absl/flags:flag",
-#     "//third_party/abseil-cpp/absl/hash:hash_testing",
-#     "//third_party/abseil-cpp/absl/memory",
-#     "//third_party/abseil-cpp/absl/random",
-#     "//third_party/abseil-cpp/absl/strings",
-#     "//third_party/abseil-cpp/absl/types:compare",
-#   ]
-# }
+# absl_test("btree_test")
 
 absl_source_set("heterogeneous_lookup_testing") {
   testonly = true
@@ -673,6 +745,7 @@
   deps = [
     "//third_party/abseil-cpp/absl/base:config",
     "//third_party/abseil-cpp/absl/container:test_instance_tracker",
+    "//third_party/googletest:gmock",
     "//third_party/googletest:gtest",
   ]
 }
@@ -705,8 +778,6 @@
   ]
 }
 
-# absl_test("linked_hash_set_benchmark")
-
 absl_source_set("linked_hash_map") {
   public = [ "linked_hash_map.h" ]
   deps = [
@@ -737,8 +808,6 @@
   ]
 }
 
-# absl_test("linked_hash_map_benchmark")
-
 absl_source_set("chunked_queue") {
   sources = [ "internal/chunked_queue.h" ]
   public = [ "chunked_queue.h" ]
@@ -762,4 +831,3 @@
     "//third_party/abseil-cpp/absl/strings",
   ]
 }
-# absl_test("chunked_queue_benchmark")
diff --git a/convert_bazel_to_gn.py b/convert_bazel_to_gn.py
index 7636e2e..368d7db 100755
--- a/convert_bazel_to_gn.py
+++ b/convert_bazel_to_gn.py
@@ -18,6 +18,20 @@
 _SKIP_TARGETS = {
     'types:any_span_test':
     'any_span_test is not ported because relies on RTTI',
+    'container:btree_test':
+    'TODO(mbonadei): Fix issue with EXPECT_DEATH and uncomment.',
+    'container:container_memory_test':
+    'Disabled because container_memory_test requires -frtti',
+    'container:raw_hash_set_test':
+    'raw_hash_set_test uses typeid(), i.e., relies on RTTI.',
+}
+
+# Extra build rules added at the end. The reason they are needed vary per target.
+_ADD_CONTENT = {
+    'container:hashtablez_sampler_test':
+    'if (is_win) { sources = [] }',
+    'container:test_allocator':
+    'deps = [ "//third_party/abseil-cpp/absl/base:config", "//third_party/googletest:gtest" ]',
 }
 
 def _ast_get_value(node):
@@ -65,7 +79,8 @@
                 parts = vis.split(':')
                 pkg = parts[0]
                 rule = parts[1] if len(parts) > 1 else ''
-                gn_pkg = '//third_party/abseil-cpp/' + pkg[2:]
+                gn_pkg = '' if pkg[7:] == self.rel_path else (
+                    '//third_party/abseil-cpp/' + pkg[2:])
                 if rule == '__pkg__':
                     result.append(gn_pkg + ':*')
                 elif rule == '__subpackages__':
@@ -134,6 +149,7 @@
 
             is_test = bt.get('is_test')
             rule = 'absl_test' if is_test else 'absl_source_set'
+            bazel_deps = bt.get('deps', [])
             target_name = f"{self.rel_path}:{name}"
 
             skip = _SKIP_TARGETS.get(target_name)
@@ -143,6 +159,13 @@
                 out.append(f'')
                 continue
 
+            if '//absl/base:exception_safety_testing' in bazel_deps:
+                out.append(
+                    f'# skipped because chromium doesn\'t use c++ exceptions')
+                out.append(f'# {rule}("{name}")')
+                out.append(f'')
+                continue
+
             # Start writing the output.
             out.append(f'{rule}("{name}") {{')
 
@@ -156,7 +179,7 @@
                     out.append(f'"{s}",')
                 out.append(']')
 
-            hdrs = bt.get('hdrs')
+            hdrs = bt.get('hdrs', []) + bt.get('textual_hdrs', [])
             if hdrs:
                 out.append('public = [')
                 for h in sorted(hdrs):
@@ -174,7 +197,7 @@
                 out.append(']')
 
             gn_deps = []
-            for d in bt.get('deps', []):
+            for d in bazel_deps:
                 td = self._translate_dep(d)
                 if td:
                     gn_deps.append(td)
@@ -190,6 +213,7 @@
                     out.append(f'"{d}",')
                 out.append(']')
 
+            out.append(_ADD_CONTENT.get(target_name, ''))
             out.append('}')
             out.append('')
 
@@ -230,6 +254,7 @@
     # TODO: crbug.com/524565513: walk the root dir when script is fully ready to handle all edge cases.
     for folder in [
             'algorithm',
+            'container',
             'crc',
             'functional',
             'memory',