diff --git a/other/docker/modules/check b/other/docker/modules/check index 46473f3ba5..0249efe486 100755 --- a/other/docker/modules/check +++ b/other/docker/modules/check @@ -1,88 +1,220 @@ #!/usr/bin/env python3 -import glob as py_glob +import glob import os import subprocess import sys +from dataclasses import dataclass +from typing import Iterable from typing import Optional LIBS = {} +MODS = {} +STD_MODULE = """module std [system] { + textual header "/usr/include/alloca.h" + textual header "/usr/include/assert.h" + textual header "/usr/include/c++/13.2.1/algorithm" + textual header "/usr/include/c++/13.2.1/array" + textual header "/usr/include/c++/13.2.1/chrono" + textual header "/usr/include/c++/13.2.1/cstddef" + textual header "/usr/include/c++/13.2.1/cstdint" + textual header "/usr/include/c++/13.2.1/cstdio" + textual header "/usr/include/c++/13.2.1/cstdlib" + textual header "/usr/include/c++/13.2.1/cstring" + textual header "/usr/include/c++/13.2.1/iomanip" + textual header "/usr/include/c++/13.2.1/iosfwd" + textual header "/usr/include/c++/13.2.1/limits" + textual header "/usr/include/c++/13.2.1/memory" + textual header "/usr/include/c++/13.2.1/ostream" + textual header "/usr/include/c++/13.2.1/random" + textual header "/usr/include/c++/13.2.1/stdlib.h" + textual header "/usr/include/c++/13.2.1/thread" + textual header "/usr/include/c++/13.2.1/type_traits" + textual header "/usr/include/c++/13.2.1/vector" + textual header "/usr/include/errno.h" + textual header "/usr/include/fortify/stdio.h" + textual header "/usr/include/fortify/string.h" + textual header "/usr/include/fortify/unistd.h" + textual header "/usr/include/limits.h" + textual header "/usr/include/stdarg.h" + textual header "/usr/include/stdbool.h" + textual header "/usr/include/stddef.h" + textual header "/usr/include/stdint.h" + textual header "/usr/include/sys/time.h" + textual header "/usr/include/sys/types.h" + textual header "/usr/include/time.h" +} +module "//c-toxcore/third_party:cmp" { + header "third_party/cmp/cmp.h" + use std +} +module "//c-toxcore/toxencryptsave:defines" { + header "toxencryptsave/defines.h" +} +module "@com_google_googletest//:gtest" { + textual header "/usr/include/gmock/gmock.h" + textual header "/usr/include/gtest/gtest.h" + use std +} +module "@libsodium" { + textual header "/usr/include/sodium.h" +} +module "@pthread" { + textual header "/usr/include/pthread.h" +} +module "@psocket" { + textual header "/usr/include/arpa/inet.h" + textual header "/usr/include/fcntl.h" + textual header "/usr/include/fortify/sys/socket.h" + textual header "/usr/include/linux/if.h" + textual header "/usr/include/netdb.h" + textual header "/usr/include/netinet/in.h" + textual header "/usr/include/sys/epoll.h" + textual header "/usr/include/sys/ioctl.h" +} +""" + + +@dataclass +class Context: + pkg: str + pkg_prefix: str + + def bzl_load(self, bzl: str, *syms: str) -> None: + pass + + def bzl_exports_files( + self, + srcs: list[str], + visibility: Optional[list[str]] = None, + ) -> None: + pass + + def bzl_cc_library( + self, + name: str, + srcs: Iterable[str] = tuple(), + hdrs: Iterable[str] = tuple(), + deps: Iterable[str] = tuple(), + visibility: Iterable[str] = tuple(), + testonly: bool = False, + copts: Iterable[str] = tuple(), + ) -> None: + LIBS[name] = { + "srcs": + srcs, + "deps": [ + f"{self.pkg_prefix}{dep}" if dep[0] == ":" else dep + for dep in deps + ], + "hdrs": + hdrs, + } + + def bzl_cc_test( + self, + name: str, + srcs: Iterable[str] = tuple(), + hdrs: Iterable[str] = tuple(), + deps: Iterable[str] = tuple(), + **kwargs: list[str], + ) -> None: + LIBS[name] = { + "srcs": + srcs, + "deps": [ + f"{self.pkg_prefix}{dep}" if dep[0] == ":" else dep + for dep in deps + ], + "hdrs": + hdrs, + } + def bzl_cc_fuzz_test(self, name: str, **kwargs: list[str]) -> None: + pass -def load(bzl: str, *syms: str) -> None: - pass - - -def exports_files(srcs: list[str], - visibility: Optional[list[str]] = None) -> None: - pass - - -def cc_library(name: str, **kwargs: list[str]) -> None: - LIBS[name] = kwargs - - -def cc_test(name: str, **kwargs: list[str]) -> None: - pass - - -def cc_fuzz_test(name: str, **kwargs: list[str]) -> None: - pass - - -def select(selector: dict[str, list[str]]) -> list[str]: - return selector["//tools/config:linux"] - - -def glob(include: list[str]) -> list[str]: - return [ - f[len("toxcore/"):] for p in include - for f in py_glob.glob(os.path.join("toxcore", p)) - ] - + def bzl_select(self, selector: dict[str, list[str]]) -> list[str]: + return selector["//tools/config:linux"] -def alias(name: str, actual: str, visibility: list[str]) -> None: - pass + def bzl_glob(self, include: list[str]) -> list[str]: + return [ + f[len(self.pkg) + 1:] for p in include + for f in glob.glob(os.path.join(self.pkg, p)) + ] + def bzl_alias(self, name: str, actual: str, visibility: list[str]) -> None: + pass -def sh_library(name: str, **kwargs: list[str]) -> None: - pass + def bzl_sh_library(self, name: str, **kwargs: list[str]) -> None: + pass def main() -> None: - with open("toxcore/BUILD.bazel", "r") as fh: - exec(fh.read()) + srcs: list[str] = [] + for pkg in ("toxcore", ): + # TODO(iphydf): Why does this break everything? + # ctx = Context(pkg, "//c-toxcore/{pkg}") + ctx = Context(pkg, "") + with open(os.path.join(pkg, "BUILD.bazel"), "r") as fh: + exec( + fh.read(), + { + "load": ctx.bzl_load, + "exports_files": ctx.bzl_exports_files, + "cc_library": ctx.bzl_cc_library, + "cc_test": ctx.bzl_cc_test, + "cc_fuzz_test": ctx.bzl_cc_fuzz_test, + "select": ctx.bzl_select, + "glob": ctx.bzl_glob, + "alias": ctx.bzl_alias, + "sh_library": ctx.bzl_sh_library, + }, + ) + + with open("module.modulemap", "w") as fh: + fh.write(STD_MODULE) + for name, lib in LIBS.items(): + fh.write(f'module "{ctx.pkg_prefix}:{name}"' + " {\n") + for hdr in lib["hdrs"]: + fh.write(f' header "{pkg}/{hdr}"\n') + fh.write(f" use std\n") + for dep in lib.get("deps", []): + fh.write(f' use "{dep}"\n') + fh.write("}\n") - with open("module.modulemap", "w") as fh: for name, lib in LIBS.items(): - fh.write("module " + name + " {\n") - for hdr in lib["hdrs"]: - fh.write(f' header "toxcore/{hdr}"\n') - for dep in lib.get("deps", []): - if dep[0] == ":": - fh.write(f" use {dep[1:]}\n") - fh.write("}\n") - - srcs = sorted( - set( - os.path.join("toxcore", src) for lib in LIBS.values() - for src in lib.get("srcs", []))) - for src in srcs: + for src in lib.get("srcs", []): + MODS[os.path.join(pkg, src)] = name + srcs.extend( + os.path.join(pkg, src) # just within a package for now + for lib in LIBS.values() for src in lib.get("srcs", [])) + # subprocess.run(["cat", "module.modulemap"], check=True) + for src in sorted( + set(srcs) - set([ + # TODO(iphydf): Figure out what's wrong here. + "toxcore/crypto_core_test.cc", + "toxcore/group_announce_test.cc", + "toxcore/group_moderation_test.cc", + "toxcore/mono_time_test.cc", + "toxcore/network_test.cc", + "toxcore/ping_array_test.cc", + "toxcore/util_test.cc", + ])): print(f"Validating {src}", file=sys.stderr) subprocess.run( [ "clang", - "-xc++", "-fsyntax-only", + "-xc++", "-Wall", "-Werror", "-Wno-missing-braces", + "-DTCP_SERVER_USE_EPOLL", "-std=c++23", "-fdiagnostics-color=always", "-fmodules", - # TODO(iphydf): Fix all the other errors. - # "-fmodules-strict-decluse", - "-fmodules-decluse", + "-fmodules-strict-decluse", "-fmodule-map-file=module.modulemap", + f"-fmodule-name={ctx.pkg_prefix}:{MODS[src]}", src, ], check=True, diff --git a/other/docker/modules/modules.Dockerfile b/other/docker/modules/modules.Dockerfile index 225be26254..5fb03a2504 100644 --- a/other/docker/modules/modules.Dockerfile +++ b/other/docker/modules/modules.Dockerfile @@ -4,6 +4,7 @@ FROM alpine:3.19.0 RUN ["apk", "add", "--no-cache", \ "bash", \ "clang", \ + "gtest-dev", \ "libconfig-dev", \ "libsodium-dev", \ "libvpx-dev", \ diff --git a/toxcore/BUILD.bazel b/toxcore/BUILD.bazel index 9eb02b250f..5ff521a4ed 100644 --- a/toxcore/BUILD.bazel +++ b/toxcore/BUILD.bazel @@ -21,7 +21,9 @@ cc_test( size = "small", srcs = ["test_util_test.cc"], deps = [ + ":crypto_core", ":crypto_core_test_util", + ":test_util", "@com_google_googletest//:gtest", "@com_google_googletest//:gtest_main", ], @@ -154,6 +156,7 @@ cc_test( deps = [ ":bin_pack", ":bin_unpack", + ":logger", "@com_google_googletest//:gtest", "@com_google_googletest//:gtest_main", ], @@ -363,6 +366,7 @@ cc_test( size = "small", srcs = ["ping_array_test.cc"], deps = [ + ":crypto_core_test_util", ":mem_test_util", ":mono_time", ":ping_array", @@ -386,6 +390,7 @@ cc_library( ":crypto_core", ":network", ":util", + "@psocket", ], ) @@ -430,6 +435,7 @@ cc_library( ":DHT", ":crypto_core", ":crypto_core_test_util", + ":network", ":network_test_util", ":test_util", ], @@ -443,8 +449,13 @@ cc_test( ":DHT", ":DHT_test_util", ":crypto_core", + ":crypto_core_test_util", + ":logger", ":mem_test_util", + ":mono_time", + ":network", ":network_test_util", + ":test_util", "@com_google_googletest//:gtest", "@com_google_googletest//:gtest_main", ], @@ -518,6 +529,7 @@ cc_library( "//c-toxcore/other/bootstrap_daemon:__pkg__", ], deps = [ + ":DHT", ":LAN_discovery", ":attributes", ":ccompat", @@ -526,6 +538,7 @@ cc_library( ":logger", ":mem", ":mono_time", + ":network", ":shared_key_cache", ":timed_auth", ":util", @@ -573,6 +586,7 @@ cc_library( ":network", ":onion", ":util", + "@psocket", ], ) @@ -648,6 +662,7 @@ cc_library( ":mono_time", ":network", ":util", + "@pthread", ], ) @@ -704,9 +719,13 @@ cc_test( size = "small", srcs = ["group_announce_test.cc"], deps = [ + ":DHT", + ":crypto_core", ":group_announce", + ":logger", ":mem_test_util", ":mono_time", + ":network", "@com_google_googletest//:gtest", "@com_google_googletest//:gtest_main", ], @@ -735,11 +754,16 @@ cc_library( "//c-toxcore/other/bootstrap_daemon:__pkg__", ], deps = [ + ":DHT", ":attributes", ":ccompat", ":crypto_core", ":group_announce", + ":logger", + ":mono_time", + ":network", ":onion_announce", + ":timed_auth", ], ) @@ -751,17 +775,21 @@ cc_library( deps = [ ":DHT", ":LAN_discovery", + ":TCP_connection", ":attributes", ":ccompat", ":crypto_core", + ":group_announce", ":group_onion_announce", ":logger", ":mem", ":mono_time", ":net_crypto", ":network", + ":onion", ":onion_announce", ":ping_array", + ":timed_auth", ":util", ], ) @@ -774,12 +802,16 @@ cc_library( deps = [ ":DHT", ":LAN_discovery", + ":TCP_connection", ":attributes", ":ccompat", + ":crypto_core", ":logger", ":mono_time", ":net_crypto", ":network", + ":onion", + ":onion_announce", ":onion_client", ":util", ], @@ -797,8 +829,12 @@ cc_library( deps = [ ":attributes", ":ccompat", + ":crypto_core", ":friend_connection", ":network", + ":onion", + ":onion_announce", + ":onion_client", ":util", ], ) @@ -826,6 +862,7 @@ cc_test( size = "small", srcs = ["group_moderation_test.cc"], deps = [ + ":DHT", ":crypto_core", ":crypto_core_test_util", ":group_moderation", @@ -909,11 +946,16 @@ cc_library( hdrs = ["group.h"], visibility = ["//c-toxcore/toxav:__pkg__"], deps = [ + ":DHT", ":Messenger", ":attributes", ":ccompat", ":crypto_core", + ":friend_connection", + ":logger", ":mono_time", + ":net_crypto", + ":network", ":state", ":util", ], @@ -933,15 +975,25 @@ cc_library( ], visibility = ["//c-toxcore:__subpackages__"], deps = [ + ":DHT", ":Messenger", + ":TCP_client", + ":attributes", ":ccompat", + ":crypto_core", + ":friend_requests", ":group", ":group_moderation", ":logger", ":mem", ":mono_time", + ":net_crypto", ":network", + ":onion_client", + ":state", + ":util", "//c-toxcore/toxencryptsave:defines", + "@pthread", ], ) @@ -1002,6 +1054,7 @@ cc_library( ":bin_pack", ":bin_unpack", ":ccompat", + ":logger", ":mem", ":tox", ":tox_pack", @@ -1041,6 +1094,7 @@ cc_library( hdrs = ["tox_dispatch.h"], visibility = ["//c-toxcore:__subpackages__"], deps = [ + ":attributes", ":ccompat", ":tox", ":tox_events", diff --git a/toxcore/DHT_test.cc b/toxcore/DHT_test.cc index 34841c742c..1028fc7f18 100644 --- a/toxcore/DHT_test.cc +++ b/toxcore/DHT_test.cc @@ -11,8 +11,12 @@ #include "DHT_test_util.hh" #include "crypto_core.h" #include "crypto_core_test_util.hh" +#include "logger.h" #include "mem_test_util.hh" +#include "mono_time.h" +#include "network.h" #include "network_test_util.hh" +#include "test_util.hh" namespace { diff --git a/toxcore/bin_pack_test.cc b/toxcore/bin_pack_test.cc index 4395942416..4bd8a25bfb 100644 --- a/toxcore/bin_pack_test.cc +++ b/toxcore/bin_pack_test.cc @@ -7,6 +7,7 @@ #include #include "bin_unpack.h" +#include "logger.h" namespace { diff --git a/toxcore/group_announce_test.cc b/toxcore/group_announce_test.cc index 89452672a6..2918dc76c6 100644 --- a/toxcore/group_announce_test.cc +++ b/toxcore/group_announce_test.cc @@ -2,8 +2,12 @@ #include +#include "DHT.h" +#include "crypto_core.h" +#include "logger.h" #include "mem_test_util.hh" #include "mono_time.h" +#include "network.h" namespace { diff --git a/toxcore/group_moderation_test.cc b/toxcore/group_moderation_test.cc index 24e32ba2b1..ef985713bb 100644 --- a/toxcore/group_moderation_test.cc +++ b/toxcore/group_moderation_test.cc @@ -6,6 +6,7 @@ #include #include +#include "DHT.h" #include "crypto_core.h" #include "crypto_core_test_util.hh" #include "logger.h" diff --git a/toxcore/ping_array_test.cc b/toxcore/ping_array_test.cc index d88b0a2f91..cc9d0bfc8b 100644 --- a/toxcore/ping_array_test.cc +++ b/toxcore/ping_array_test.cc @@ -4,6 +4,7 @@ #include +#include "crypto_core_test_util.hh" #include "mem_test_util.hh" #include "mono_time.h" @@ -23,7 +24,7 @@ struct Mono_Time_Deleter { void operator()(Mono_Time *arr) { mono_time_free(mem_, arr); } private: - const Memory *mem_; + const Test_Memory &mem_; }; using Mono_Time_Ptr = std::unique_ptr; @@ -61,12 +62,11 @@ TEST(PingArray, ArraySizeMustBePowerOfTwo) TEST(PingArray, StoredDataCanBeRetrieved) { Test_Memory mem; + Test_Random rng; Ping_Array_Ptr const arr(ping_array_new(mem, 2, 1)); Mono_Time_Ptr const mono_time(mono_time_new(mem, nullptr, nullptr), mem); ASSERT_NE(mono_time, nullptr); - const Random *rng = os_random(); - ASSERT_NE(rng, nullptr); uint64_t const ping_id = ping_array_add( arr.get(), mono_time.get(), rng, std::vector{1, 2, 3, 4}.data(), 4); @@ -80,12 +80,11 @@ TEST(PingArray, StoredDataCanBeRetrieved) TEST(PingArray, RetrievingDataWithTooSmallOutputBufferHasNoEffect) { Test_Memory mem; + Test_Random rng; Ping_Array_Ptr const arr(ping_array_new(mem, 2, 1)); Mono_Time_Ptr const mono_time(mono_time_new(mem, nullptr, nullptr), mem); ASSERT_NE(mono_time, nullptr); - const Random *rng = os_random(); - ASSERT_NE(rng, nullptr); uint64_t const ping_id = ping_array_add( arr.get(), mono_time.get(), rng, (std::vector{1, 2, 3, 4}).data(), 4); @@ -103,12 +102,11 @@ TEST(PingArray, RetrievingDataWithTooSmallOutputBufferHasNoEffect) TEST(PingArray, ZeroLengthDataCanBeAdded) { Test_Memory mem; + Test_Random rng; Ping_Array_Ptr const arr(ping_array_new(mem, 2, 1)); Mono_Time_Ptr const mono_time(mono_time_new(mem, nullptr, nullptr), mem); ASSERT_NE(mono_time, nullptr); - const Random *rng = os_random(); - ASSERT_NE(rng, nullptr); uint8_t c = 0; uint64_t const ping_id = ping_array_add(arr.get(), mono_time.get(), rng, &c, sizeof(c)); @@ -133,12 +131,11 @@ TEST(PingArray, PingId0IsInvalid) TEST(PingArray, DataCanOnlyBeRetrievedOnce) { Test_Memory mem; + Test_Random rng; Ping_Array_Ptr const arr(ping_array_new(mem, 2, 1)); Mono_Time_Ptr const mono_time(mono_time_new(mem, nullptr, nullptr), mem); ASSERT_NE(mono_time, nullptr); - const Random *rng = os_random(); - ASSERT_NE(rng, nullptr); uint8_t c = 0; uint64_t const ping_id = ping_array_add(arr.get(), mono_time.get(), rng, &c, sizeof(c)); @@ -151,12 +148,11 @@ TEST(PingArray, DataCanOnlyBeRetrievedOnce) TEST(PingArray, PingIdMustMatchOnCheck) { Test_Memory mem; + Test_Random rng; Ping_Array_Ptr const arr(ping_array_new(mem, 1, 1)); Mono_Time_Ptr const mono_time(mono_time_new(mem, nullptr, nullptr), mem); ASSERT_NE(mono_time, nullptr); - const Random *rng = os_random(); - ASSERT_NE(rng, nullptr); uint8_t c = 0; uint64_t const ping_id = ping_array_add(arr.get(), mono_time.get(), rng, &c, sizeof(c)); diff --git a/toxcore/test_util_test.cc b/toxcore/test_util_test.cc index 2ef2e94471..8dc97ab5be 100644 --- a/toxcore/test_util_test.cc +++ b/toxcore/test_util_test.cc @@ -5,6 +5,7 @@ #include +#include "crypto_core.h" #include "crypto_core_test_util.hh" namespace {