Source code for swh.graph.e2e_tests

# Copyright (C) 2025  The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU General Public License version 3, or any later version
# See top-level LICENSE file for more information

"""Spawns a gRPC server on a newly compressed graph, and checks responses
are as expected."""

import difflib
import json
import logging
from typing import Optional, Union

from google.protobuf.json_format import MessageToDict

from .webgraph import check_config_compress

logger = logging.getLogger(__name__)


[docs] def run_e2e_test( graph_name: str, in_dir: Optional[str], out_dir: Optional[str], test_flavor: Optional[str], target: str = "release", ): """Empirically test the graph compression correctness. Check for a specific SWHID in the compressed graph and do simple traversal requests to ensure the compression went well. This is a best effort procedure, as it is (generally) not possible to check for every single item in the graph. Args: graph_name: graph base name, relative to in_dir in_dir: input directory, where the uncompressed graph can be found out_dir: output directory, where the compressed graph will be stored test_flavor: which flavor of tests to run target: Which Rust executables to use Raises: Exception: GRPC server unexpectedly stopped """ import socket import time import grpc import swh.graph.grpc.swhgraph_pb2 as swhgraph import swh.graph.grpc.swhgraph_pb2_grpc as swhgraph_grpc from swh.graph.grpc_server import spawn_rust_grpc_server, stop_grpc_server conf = check_config_compress( {"target": target}, graph_name, in_dir, out_dir, test_flavor ) graph_name = conf["graph_name"] in_dir = conf["in_dir"] out_dir = conf["out_dir"] test_flavor = conf["test_flavor"] if test_flavor == "none": logger.info("End to end tests skipped.") return if "graph_path" not in conf: conf["graph_path"] = f"{out_dir}/{graph_name}" server, port = spawn_rust_grpc_server(**conf, path=conf["graph_path"]) # wait for the server to accept connections while True: try: socket.create_connection(("localhost", port)) except Exception: time.sleep(0.1) server.poll() if server.returncode is not None: raise Exception("GRPC server unexpectedly stopped.") else: break # This dictionary is a copy of a few directories retrieved from the graph. It # includes a few well known projects, such as `parmap`, `apt`, or `vim`. The # items have all been directly copied over in the file after having been queried # from the 2024-12-06 graph. # They should not change in the future, as all traversals start from fixed snapshots. # For each project, the `cnt` field corresponds to the project's README, and the # `dir` field is the root directory. test_values: dict[ str, dict[str, dict[str, Union[str, int, object, list[dict[str, str]]]]] ] = { "parmap": { "cnt": { "swhid": "swh:1:cnt:43243e2ae91a64e252170cd922718e8c2af323b6", "cnt": {"length": "7225", "isSkipped": False}, "numSuccessors": "0", }, "dir": { "swhid": "swh:1:dir:bc7ddd62cf3d72ffdc365e1bf2dea6eeaa44e185", "successor": [ { "swhid": "swh:1:cnt:1236c69684fe78ffa93fe0c712b28e7db2e1dec0", "label": [{"name": "TElDRU5TRQ==", "permission": 33188}], }, { "swhid": "swh:1:cnt:0164c78f68e74c1950bb15bb65f26af85409be1b", "label": [{"name": "QVVUSE9SUw==", "permission": 33188}], }, { "swhid": "swh:1:cnt:1e653ecad9bd593e5125d9fc0a67caf5e68684ea", "label": [{"name": "TWFrZWZpbGU=", "permission": 33188}], }, { "swhid": "swh:1:cnt:8d9ac6745d9e09a76bee9254569c07296420dd33", "label": [{"name": "LmdpdGlnbm9yZQ==", "permission": 33188}], }, { "swhid": "swh:1:dir:c4282f28f185d7ff8f437610786210b45da884e3", "label": [{"name": "Y29uZmln", "permission": 16384}], }, { "swhid": "swh:1:cnt:43243e2ae91a64e252170cd922718e8c2af323b6", "label": [{"name": "UkVBRE1FLm1k", "permission": 33188}], }, { "swhid": "swh:1:cnt:6b04cd329678804c29f57c396dc80673f51e6122", "label": [{"name": "Q0hBTkdFUw==", "permission": 33188}], }, { "swhid": "swh:1:dir:8f52ba1f4b26e8ad183b3211ee1a3ae1fed1835e", "label": [{"name": "c3Jj", "permission": 16384}], }, { "swhid": "swh:1:cnt:7fdf9b6bd0d25f2cab20387eda552ffeb4569a75", "label": [{"name": "cGFybWFwLmJpYg==", "permission": 33188}], }, { "swhid": "swh:1:dir:f7b51b7345fb8c3a5fa9f0afebb56f4d2315c83a", "label": [{"name": "dGVzdHM=", "permission": 16384}], }, { "swhid": "swh:1:dir:d3efdba145b4d10c89185976162cb703b21752aa", "label": [{"name": "ZXhhbXBsZQ==", "permission": 16384}], }, { "swhid": "swh:1:cnt:7d71795857dc26d8013bbc28c5a82772ebb0b598", "label": [{"name": "cGFybWFwLm9wYW0=", "permission": 33188}], }, { "swhid": "swh:1:cnt:353bd74b1b29c30b9b47843ddc8dc0180b37a465", "label": [{"name": "ZHVuZS1wcm9qZWN0", "permission": 33188}], }, { "swhid": "swh:1:cnt:7104fab006bbeb57dc12f72d158fe4f2c63a9b27", "label": [ {"name": "Y29kZW1ldGEuanNvbg==", "permission": 33188} ], }, ], "numSuccessors": "14", }, "rev": { "swhid": "swh:1:rev:ecd3744ed558da4ea2bf9eb87b80b8949f417126", "successor": [ {"swhid": "swh:1:rev:963608763589e03de38e744d359884d491e65460"}, {"swhid": "swh:1:rev:a9ce4341ea0e36dd2336fc868e99b577b3ed0b51"}, {"swhid": "swh:1:dir:bc7ddd62cf3d72ffdc365e1bf2dea6eeaa44e185"}, ], "rev": { "author": "54119287", "authorDate": "1731583490", "authorDateOffset": 60, "committer": "72133999", "committerDate": "1731583490", "committerDateOffset": 60, "message": "TWVyZ2UgcHVsbCByZXF1ZXN0ICMxMTUgZnJvbSBhbmxhbWJlcnQvY29kZW1ldGEtZm94LW9yY2lkLXVybHMKCmNvZGVtZXRhLmpzb246IEZpeCBPUkNJRCBVUkxzIGZvciBhdXRob3Jz", # noqa: B950 }, "numSuccessors": "3", }, "snp": {"swhid": "swh:1:snp:8ddca416836fbbc2a7704c69db38739bef6b6cae"}, }, "apt": { "cnt": { "swhid": "swh:1:cnt:b2a0fdb2bed782d674e8799e285e68bd180dd656", "cnt": {"length": "10700", "isSkipped": False}, "numSuccessors": "0", }, "dir": { "swhid": "swh:1:dir:ab89bb001c32fba7ae7350155cb5f3d039c6f7ab", "successor": [ { "swhid": "swh:1:cnt:d159169d1050894d3ea3b98e1c965c4058208fe1", "label": [{"name": "Q09QWUlORy5HUEw=", "permission": 33188}], }, { "swhid": "swh:1:dir:40f85d4a096ee06fd1096092f837f424cc7f7042", "label": [{"name": "dGVzdA==", "permission": 16384}], }, { "swhid": "swh:1:dir:eb23b7c21df055f9863a9556861304710e34a2e4", "label": [{"name": "ZnRwYXJjaGl2ZQ==", "permission": 16384}], }, { "swhid": "swh:1:cnt:21b874fa77fda1b0b17a56381908acd065b70001", "label": [{"name": "Q09QWUlORw==", "permission": 33188}], }, { "swhid": "swh:1:dir:336e401e7b3754ca678d2747db56216f911890a6", "label": [{"name": "ZHNlbGVjdA==", "permission": 16384}], }, { "swhid": "swh:1:cnt:da6e6d8c274e1e5bd9634fe81f1715580dd5fd6c", "label": [ { "name": "Z2l0LWNsYW5nLWZvcm1hdC5zaA==", "permission": 33261, } ], }, { "swhid": "swh:1:cnt:fe9628fd07281a7b47c59d5f376105df48712642", "label": [ {"name": "cHJlcGFyZS1yZWxlYXNl", "permission": 33261} ], }, { "swhid": "swh:1:dir:fb713039f3b513bf2a121f0675e894c65e8c6f97", "label": [{"name": "dmVuZG9y", "permission": 16384}], }, { "swhid": "swh:1:dir:9f63061d148dea34f14b68e422b0bf6f5d2478ca", "label": [{"name": "Y21kbGluZQ==", "permission": 16384}], }, { "swhid": "swh:1:cnt:fb85a73184f07ac5b42be77a3ee89fedda8155e4", "label": [ {"name": "LmdpdGxhYi1jaS55bWw=", "permission": 33188} ], }, { "swhid": "swh:1:dir:8b202bc1e531269de73d51aaaf3054fc1cd12c06", "label": [{"name": "YXB0LXByaXZhdGU=", "permission": 16384}], }, { "swhid": "swh:1:dir:b8eff035d7adf2b7e53b3349a7edaccf171a3ce8", "label": [{"name": "Q01ha2U=", "permission": 16384}], }, { "swhid": "swh:1:dir:4357ce686d75a0e42c965bee77dac683138cf9b1", "label": [{"name": "YXB0LXBrZw==", "permission": 16384}], }, { "swhid": "swh:1:cnt:3a2677ffef7018ef899a265fd83ac7fc0452cb45", "label": [ {"name": "Q01ha2VMaXN0cy50eHQ=", "permission": 33188} ], }, { "swhid": "swh:1:dir:d5ee100ab8b16066a4932c6510022b2ad6e9ddf7", "label": [{"name": "ZGViaWFu", "permission": 16384}], }, { "swhid": "swh:1:dir:3de81b1e6839921a50595680a69bd35a78d8f8b7", "label": [{"name": "bWV0aG9kcw==", "permission": 16384}], }, { "swhid": "swh:1:dir:4f95ea257c58a88f0fe019b7af00ba00b31cabc5", "label": [{"name": "cG8=", "permission": 16384}], }, { "swhid": "swh:1:dir:2fbb3a159982ca77809a63c3987d0e934098a914", "label": [{"name": "ZG9j", "permission": 16384}], }, { "swhid": "swh:1:cnt:cce31e651dddbd043c0dba03438093cff40d663b", "label": [{"name": "QVVUSE9SUw==", "permission": 33188}], }, { "swhid": "swh:1:cnt:c2989f89134d75fe150b543c6bd33886b0cf8fa8", "label": [ {"name": "LmNsYW5nLWZvcm1hdA==", "permission": 33188} ], }, { "swhid": "swh:1:cnt:e7d2bbf5415b24123bf932555463bae0983012df", "label": [ {"name": "bWlycm9yLWZhaWx1cmUucHk=", "permission": 33188} ], }, { "swhid": "swh:1:cnt:aeab4a372153e6c47e682ae4e7cea2dcf86754a1", "label": [{"name": "LmdpdGlnbm9yZQ==", "permission": 33188}], }, { "swhid": "swh:1:cnt:8f1b6f2e39296fc9b89db7cb09b6de5b7d235661", "label": [{"name": "Lm1haWxtYXA=", "permission": 33188}], }, { "swhid": "swh:1:cnt:b2a0fdb2bed782d674e8799e285e68bd180dd656", "label": [{"name": "UkVBRE1FLm1k", "permission": 33188}], }, { "swhid": "swh:1:dir:d902fb47a15534156dcbf05a56f1806d627c6dc1", "label": [{"name": "YWJpY2hlY2s=", "permission": 16384}], }, { "swhid": "swh:1:cnt:c05b7c202ed5d66abcfd4f2cd2d1d3102d6f7b2a", "label": [{"name": "RG9ja2VyZmlsZQ==", "permission": 33188}], }, { "swhid": "swh:1:cnt:f76b0839784f91f6e10eccd6a89a21fe02176e18", "label": [ {"name": "c2hpcHBhYmxlLnltbA==", "permission": 33188} ], }, { "swhid": "swh:1:dir:e45d79e66758a45f210e95204ddf50d4ebc4d914", "label": [{"name": "Y29tcGxldGlvbnM=", "permission": 16384}], }, ], "numSuccessors": "28", }, "rev": { "swhid": "swh:1:rev:a0a76c2e20c1ddefd76a4a539a9350b96d66006e", "successor": [ {"swhid": "swh:1:rev:e62162d010fc7d6374067964ced3ac227b0440b2"}, {"swhid": "swh:1:dir:ab89bb001c32fba7ae7350155cb5f3d039c6f7ab"}, ], "rev": { "author": "78286833", "authorDate": "1711815195", "authorDateOffset": 0, "committer": "78286833", "committerDate": "1711817672", "committerDateOffset": 0, "message": "Rml4IGFuZCB1bmZ1enp5IHByZXZpb3VzIFZDRy9HcmFwaHZpeiBVUkkgY2hhbmdlCgpUaGUgR3JhcGh2aXogY2hhbmdlIGFkYXB0ZWQgb25seSB0aGUgbXNnc3RycyBpbiB0aGUgcG8gZmlsZXMsIHdoaWNoCmZ1enppZWQgYWxsIHRyYW5zbGF0aW9ucyB0aGUgbW9tZW50IHRoZSBtc2dpZHMgd2VyZSB1cGRhdGVkIGJ5IHRoZQptZXJnZSB3aGlsZSBmb3JnZXR0aW5nIGZyLnBvIGFuZCBwbC5wbyBhbmQgaW4gdGhlIFZDRyBjaGFuZ2UgdGhlCm1zZ3N0ciBpbiB0aGUgamEucG8gd2FzIG1pc3NlZC4KClRoaXMgY29tbWl0ICJqdXN0IiB1bmZ1enppZXMgdGhlIHN0cmluZ3MgKGFuZCBmaXhlcyB0aGUgbWlzc2VkIG9uZXMpCnNvIHRoZSB0cmFuc2xhdG9ycyBkb24ndCBoYXZlIHRvIGFzIGludGVuZGVkIGluIHRoZSBjb21taXRzLgoKUmVmZXJlbmNlczogYWU1YzI5MWIwYzc2YjIyYzkzOTY3OWNjZjM1ZTNlYjk0MTMxZTU4NgogZWRmMTAyNWU2OTFlOTRjZGRlMzA1YmMyZDE1NDg0ZmM3ZWU2ZGIxYwo=", # noqa: B950 }, "numSuccessors": "2", }, "snp": {"swhid": "swh:1:snp:4bf4f77adb7659ed2efcbc07d03bba61ee5b9b9b"}, }, "coreutils": { "cnt": { "swhid": "swh:1:cnt:81d292d0719f439334150b3effd673c666a201ed", "cnt": {"length": "6649", "isSkipped": False}, "numSuccessors": "0", }, "dir": { "swhid": "swh:1:dir:0dfb60e64c8fc8f416282e3c7deb163834916d43", "successor": [ { "swhid": "swh:1:dir:d0db55abe96d886906f1b944fbb7ea846aa4296e", "label": [{"name": "dGVzdHM=", "permission": 16384}], }, { "swhid": "swh:1:dir:867d4ff204108f3f94f1f74b83adb9ee1b01d12f", "label": [{"name": "ZG9j", "permission": 16384}], }, { "swhid": "swh:1:dir:de77eeb11434ed6e1f8237531a87c7c44be1c451", "label": [{"name": "bTQ=", "permission": 16384}], }, { "swhid": "swh:1:cnt:6251a2f68681ca468e7e78bcc9ca7cfd2d70664e", "label": [{"name": "TkVXUw==", "permission": 33188}], }, { "swhid": "swh:1:dir:f34b557bb2144ffb9f8419aa0975f2f828d93673", "label": [{"name": "Z2w=", "permission": 16384}], }, { "swhid": "swh:1:cnt:17f9d9c693c0867b5402b77fc18b942173c7a393", "label": [{"name": "VEhBTktTLmlu", "permission": 33188}], }, { "swhid": "swh:1:dir:7868f8d17c6e48982251369e971bb137f6a3dd96", "label": [{"name": "cG8=", "permission": 16384}], }, { "swhid": "swh:1:cnt:62f7fd160b007bd67b308c99dbd6c1b257c5487b", "label": [{"name": "VE9ETw==", "permission": 33188}], }, { "swhid": "swh:1:cnt:3514c6da42efe79c676700c0a7940f4e53663900", "label": [ {"name": "LnZnLXN1cHByZXNzaW9ucw==", "permission": 33188} ], }, { "swhid": "swh:1:cnt:81d292d0719f439334150b3effd673c666a201ed", "label": [{"name": "UkVBRE1F", "permission": 33188}], }, { "swhid": "swh:1:cnt:2512723590f8439f3cd357386968bc2e776ca74c", "label": [{"name": "aW5pdC5jZmc=", "permission": 33188}], }, { "swhid": "swh:1:cnt:8a49f569c924d122eedba668d69d3c15a789f0c0", "label": [{"name": "SEFDS0lORw==", "permission": 33188}], }, { "swhid": "swh:1:dir:0592dbbc83d03fda9631adc82e9802090b094f5a", "label": [{"name": "LmdpdGh1Yg==", "permission": 16384}], }, { "swhid": "swh:1:cnt:5fbea73a8bba09b957fb19461f00e9947c1a5b94", "label": [ {"name": "UkVBRE1FLXZhbGdyaW5k", "permission": 33188} ], }, { "swhid": "swh:1:dir:00dd0c5deef3a7be4c72fd873b81eff86d2441b8", "label": [{"name": "bGli", "permission": 16384}], }, { "swhid": "swh:1:cnt:dd6b48a36815940ae2ab8a31a894fb41472fc9a0", "label": [ {"name": "UkVBRE1FLWhhY2tpbmc=", "permission": 33188} ], }, { "swhid": "swh:1:dir:d9195952fa5a1005bf36802aa0e432ffc9dd07ec", "label": [{"name": "c2NyaXB0cw==", "permission": 16384}], }, { "swhid": "swh:1:cnt:d4a50fcdae7cc5e14f4ed372dd52d4dfad670b2c", "label": [{"name": "LmdpdGlnbm9yZQ==", "permission": 33188}], }, { "swhid": "swh:1:cnt:f2557ce0d1e1889196a9fa3975a943906002795b", "label": [{"name": "Y29uZmlndXJlLmFj", "permission": 33188}], }, { "swhid": "swh:1:dir:511bdd844cf548d1081763fde11c275096010623", "label": [{"name": "YnVpbGQtYXV4", "permission": 16384}], }, { "swhid": "swh:1:cnt:3fd546599594be955f36a6992efd218f3649ee7a", "label": [{"name": "TWFrZWZpbGUuYW0=", "permission": 33188}], }, { "swhid": "swh:1:cnt:d78c8c306487a1015280528adabca091507ab54b", "label": [{"name": "Ym9vdHN0cmFw", "permission": 33261}], }, { "swhid": "swh:1:rev:8f292d0931b1e1f7c5a063bd400ff9dabb3897ff", "label": [{"name": "Z251bGli", "permission": 57344}], }, { "swhid": "swh:1:cnt:cbe5b0ca43c97d3547fe000c8f5dc460d9c5b81c", "label": [ {"name": "Ym9vdHN0cmFwLmNvbmY=", "permission": 33188} ], }, { "swhid": "swh:1:cnt:647b6600edcd9803fefa9190d0c10e5f95c63f56", "label": [{"name": "Y2ZnLm1r", "permission": 33188}], }, { "swhid": "swh:1:cnt:9993f552737a95651e6fb08ea74c4020514cb400", "label": [{"name": "LmdpdG1vZHVsZXM=", "permission": 33188}], }, { "swhid": "swh:1:cnt:9ae4b12af907e40063aff73ab683e6926f4aec13", "label": [ {"name": "UkVBRE1FLXByZXJlcQ==", "permission": 33188} ], }, { "swhid": "swh:1:cnt:bbc03495194b6e2c043ec44ca00779c3dc0f3c7b", "label": [ {"name": "UkVBRE1FLWluc3RhbGw=", "permission": 33188} ], }, { "swhid": "swh:1:cnt:d5c12aa971728f7677fac58afb940a4bd5fbb1fa", "label": [{"name": "QVVUSE9SUw==", "permission": 33188}], }, { "swhid": "swh:1:dir:5fe656bfb22facaeda15875ba1793450ad8b0715", "label": [{"name": "c3Jj", "permission": 16384}], }, { "swhid": "swh:1:dir:305325b2eab7d42bed000d06470c183177ed8e87", "label": [{"name": "Z251bGliLXRlc3Rz", "permission": 16384}], }, { "swhid": "swh:1:dir:61049f2c3bacad3688ff821d5db741182e22e4df", "label": [{"name": "bWFu", "permission": 16384}], }, { "swhid": "swh:1:cnt:592f36ef3a918f5e1a189156a0671e73fc408fdd", "label": [ {"name": "LnByZXYtdmVyc2lvbg==", "permission": 33188} ], }, { "swhid": "swh:1:cnt:081b2d45e493fcee4f2cb1bdecbd575afedfbb54", "label": [ { "name": "UkVBRE1FLXBhY2thZ2UtcmVuYW1lZC10by1jb3JldXRpbHM=", "permission": 33188, } ], }, { "swhid": "swh:1:cnt:45f4d9906402e3ee5a932787a781d86c17e18bcb", "label": [ { "name": "LngtdXBkYXRlLWNvcHlyaWdodA==", "permission": 33188, } ], }, { "swhid": "swh:1:cnt:e03db91a330a4453fcd7e7daf3437c6bbd27d015", "label": [ {"name": "UkVBRE1FLXJlbGVhc2U=", "permission": 33188} ], }, { "swhid": "swh:1:cnt:dc04853c3a10b76a9474fbcea444d304352b4488", "label": [{"name": "Lm1haWxtYXA=", "permission": 33188}], }, { "swhid": "swh:1:cnt:afa24bfd8b2c75947b109317bd5ce15bda02e63a", "label": [ {"name": "ZGlzdC1jaGVjay5taw==", "permission": 33188} ], }, { "swhid": "swh:1:cnt:f288702d2fa16d3cdf0035b15a9fcbc552cd88e7", "label": [{"name": "Q09QWUlORw==", "permission": 33188}], }, { "swhid": "swh:1:cnt:f1c11b3a56f61b425affd674de53dd09dc567d6e", "label": [{"name": "dGhhbmtzLWdlbg==", "permission": 33261}], }, { "swhid": "swh:1:cnt:25e7a99be017f663c80e18887c0f4591328b4afa", "label": [{"name": "VEhBTktTdHQuaW4=", "permission": 33188}], }, { "swhid": "swh:1:cnt:c3b2926c78c939d94358cc63d051a70d38cfea5d", "label": [ {"name": "LmdpdGF0dHJpYnV0ZXM=", "permission": 33188} ], }, ], "numSuccessors": "42", }, "rev": { "swhid": "swh:1:rev:1ae98dbda7322427e8226356fd110d2553f5fac9", "successor": [ {"swhid": "swh:1:rev:83ec7a706a9f931e418ec6a084587b8995ca5388"}, {"swhid": "swh:1:dir:0dfb60e64c8fc8f416282e3c7deb163834916d43"}, ], "rev": { "author": "71999780", "authorDate": "1722312996", "authorDateOffset": -420, "committer": "52538937", "committerDate": "1722326039", "committerDateOffset": 60, "message": "bWFpbnQ6IHJlbW92ZSB1bm5lY2Vzc2FyeSBpbnR0b3N0ciB1c2FnZSBpbiBwcmludGYKCiogc3JjL2Nrc3VtLmMgKG91dHB1dF9jcmMpOiBVc2UgJyVqdScgaW5zdGVhZCBvZiB1bWF4dG9zdHIuCiogc3JjL3NocmVkLmMgKGRvcGFzcyk6IExpa2V3aXNlLgoqIHNyYy9jc3BsaXQuYyAoaGFuZGxlX2xpbmVfZXJyb3IsIHJlZ2V4cF9lcnJvciwgY2xvc2Vfb3V0cHV0X2ZpbGUpCihwYXJzZV9wYXR0ZXJucyk6IFVzZSAnJWpkJyBpbnN0ZWFkIG9mIG9mZnRvc3RyLgoqIHNyYy90YWlsLmMgKHhsc2Vlayk6IExpa2V3aXNlLgoqIHNyYy9oZWFkLmMgKGVsc2Vlayk6IExpa2V3aXNlLgoqIHNyYy9ncm91cC1saXN0LmMgKGdpZHRvc3RyX3B0cik6IFJlbW92ZSBmdW5jdGlvbi4KKGdpZHRvc3RyKTogUmVtb3ZlIG1hY3JvLgoocHJpbnRfZ3JvdXApOiBVc2UgJyVqdScgaW5zdGVhZCBvZiB1bWF4dG9zdHIuCiogc3JjL2lkLmMgKGdpZHRvc3RyX3B0ciwgdWlkdG9zdHJfcHRyKTogUmVtb3ZlIGZ1bmN0aW9ucy4KKGdpZHRvc3RyLCB1aWR0b3N0cik6IFJlbW92ZSBtYWNyb3MuCihwcmludF91c2VyLCBwcmludF9mdWxsX2luZm8pOiBVc2UgJyVqdScgaW5zdGVhZCBvZiB1bWF4dG9zdHIuCiogc3JjL3NvcnQuYyAoc3BlY2lmeV9ubWVyZ2UpOiBVc2UgJyV1JyBpbnN0ZWFkIG9mIHVpbnR0b3N0ci4K", # noqa: B950 }, "numSuccessors": "2", }, "snp": {"swhid": "swh:1:snp:d5ce84405f7d061377512be24870fa001032063f"}, }, "pip": { "cnt": { "swhid": "swh:1:cnt:479ddfd7ba175c2db0b0f13898990656c8bff2c8", "cnt": {"length": "2375", "isSkipped": False}, "numSuccessors": "0", }, "dir": { "swhid": "swh:1:dir:c027aeec1e933aa3ef3d8d51227591c72d5ded33", "successor": [ { "swhid": "swh:1:cnt:8ccefbc6e59f0bc761589c7994c15c7922ce5127", "label": [{"name": "QVVUSE9SUy50eHQ=", "permission": 33188}], }, { "swhid": "swh:1:dir:9f7b3c018c074313a78471abe1f3a80b60319d7f", "label": [{"name": "LmdpdGh1Yg==", "permission": 16384}], }, { "swhid": "swh:1:cnt:3a0319c2356b8337ed335c3ea36c489e9272fa4b", "label": [ { "name": "LnByZS1jb21taXQtY29uZmlnLnlhbWw=", "permission": 33188, } ], }, { "swhid": "swh:1:dir:96a4cb0107e774ff045f15634b8f6edf9649fbe1", "label": [{"name": "dG9vbHM=", "permission": 16384}], }, { "swhid": "swh:1:dir:f9de633517a68fbd7dcfffaaf723a3194f59a22a", "label": [{"name": "dGVzdHM=", "permission": 16384}], }, { "swhid": "swh:1:cnt:711e6bc8485d2f76a44373b90c6cfa48f9f24794", "label": [ {"name": "cHlwcm9qZWN0LnRvbWw=", "permission": 33188} ], }, { "swhid": "swh:1:cnt:5ebf7141b1d7a13a097a3588fb276be7affe5ed7", "label": [{"name": "TkVXUy5yc3Q=", "permission": 33188}], }, { "swhid": "swh:1:dir:6401bb537983a328f98689afaa2b0ac68ea929ae", "label": [{"name": "ZG9jcw==", "permission": 16384}], }, { "swhid": "swh:1:cnt:2051362769c4d356a0d9e9445d92f0b0dfc4c133", "label": [{"name": "bm94ZmlsZS5weQ==", "permission": 33188}], }, { "swhid": "swh:1:cnt:814da8265cabfaf7e95100faba9761253f402b81", "label": [{"name": "TUFOSUZFU1QuaW4=", "permission": 33188}], }, { "swhid": "swh:1:cnt:479ddfd7ba175c2db0b0f13898990656c8bff2c8", "label": [{"name": "UkVBRE1FLnJzdA==", "permission": 33188}], }, { "swhid": "swh:1:dir:3eea23d8575573d0b29cfed5dc3f7e3859deb296", "label": [{"name": "c3Jj", "permission": 16384}], }, { "swhid": "swh:1:dir:3093f76c8ce2f35cbd55c91a0c6dcc1c2086ecc2", "label": [{"name": "bmV3cw==", "permission": 16384}], }, { "swhid": "swh:1:cnt:875dba24ed3f151a2a17c30e325623d78e0792db", "label": [{"name": "Lm1haWxtYXA=", "permission": 33188}], }, { "swhid": "swh:1:cnt:f09b08660e73a7854476c035f2abe0897c5aee97", "label": [ { "name": "LmdpdC1ibGFtZS1pZ25vcmUtcmV2cw==", "permission": 33188, } ], }, { "swhid": "swh:1:cnt:c0d2bba55e930af76612d474cc2882de07633916", "label": [ {"name": "LnJlYWR0aGVkb2NzLnltbA==", "permission": 33188} ], }, { "swhid": "swh:1:cnt:e75a1c0de68c40f2182d3624158460219a229de1", "label": [{"name": "U0VDVVJJVFkubWQ=", "permission": 33188}], }, { "swhid": "swh:1:cnt:6a0fc6943c16498aa56cdb5bfd0612460a68c46b", "label": [ {"name": "LmdpdGF0dHJpYnV0ZXM=", "permission": 33188} ], }, { "swhid": "swh:1:cnt:79b8ab84b06d6f15a23a1d83d2bc4245aaadd70f", "label": [{"name": "LmdpdGlnbm9yZQ==", "permission": 33188}], }, { "swhid": "swh:1:cnt:d0c072fbf96914da51ef441c619cc28f010d5940", "label": [ { "name": "LnJlYWR0aGVkb2NzLWN1c3RvbS1yZWRpcmVjdHMueW1s", "permission": 33188, } ], }, { "swhid": "swh:1:cnt:8e7b65eaf628360e6f32f4140fcdd7ec7c2b7077", "label": [{"name": "TElDRU5TRS50eHQ=", "permission": 33188}], }, ], "numSuccessors": "21", }, "rev": { "swhid": "swh:1:rev:fe0925b3c00bf8956a0d33408df692ac364217d4", "successor": [ {"swhid": "swh:1:dir:c027aeec1e933aa3ef3d8d51227591c72d5ded33"}, {"swhid": "swh:1:rev:099ae9703a2e15a7f90b82fa251c51be0f88d602"}, {"swhid": "swh:1:rev:420435903ff2fc694d6950a47b896427ecaed78f"}, ], "rev": { "author": "13162035", "authorDate": "1731171039", "authorDateOffset": 480, "committer": "72133999", "committerDate": "1731171039", "committerDateOffset": 480, "message": "TWVyZ2UgcHVsbCByZXF1ZXN0ICMxMzA3MyBmcm9tIG1nb3JueS9yaWNoLXBpcGUtaGFuZGxpbmcKCg==", # noqa: B950 }, "numSuccessors": "3", }, "snp": {"swhid": "swh:1:snp:9120fcbbc23b126711fdcac75b44a9234387c09b"}, }, "vim": { "cnt": { "swhid": "swh:1:cnt:cfee68e8a2767b6e252923a6f934115fbb13eb44", "cnt": {"length": "6914", "isSkipped": False}, "numSuccessors": "0", }, "dir": { "swhid": "swh:1:dir:d7b6b8be2f7cedd5a5c12a0df7f9ef6456a70441", "successor": [ { "swhid": "swh:1:cnt:778b8293faa59236d1f7f0046c3ab8dfee269f54", "label": [{"name": "dmltdHV0b3IuY29t", "permission": 33261}], }, { "swhid": "swh:1:cnt:9216dbe8dbb4f532fe9fa632fbfc49f3ee98fbe1", "label": [ {"name": "LmdpdGF0dHJpYnV0ZXM=", "permission": 33188} ], }, { "swhid": "swh:1:cnt:d9d99c655ede93f13e313361ed0c3955c93a6c40", "label": [{"name": "Y29uZmlndXJl", "permission": 33261}], }, { "swhid": "swh:1:cnt:a586af40e2a6fffba0d666833df281e2aaacad12", "label": [ {"name": "LmVkaXRvcmNvbmZpZw==", "permission": 33188} ], }, { "swhid": "swh:1:cnt:6fc84ef10b2543b16495b11a22f6683cd21b7e32", "label": [ {"name": "LmNsYW5nLWZvcm1hdA==", "permission": 33188} ], }, { "swhid": "swh:1:dir:abb3a6ba93bc83c4648209f9b2917499fedadfee", "label": [{"name": "bGFuZw==", "permission": 16384}], }, { "swhid": "swh:1:cnt:cb635a2f59f66c44dc446533fc9c40857e47dda6", "label": [ { "name": "LmdpdC1ibGFtZS1pZ25vcmUtcmV2cw==", "permission": 33188, } ], }, { "swhid": "swh:1:cnt:c5b1b3910c348b69f54ad88c7678c2f5dbacb656", "label": [{"name": "RmlsZWxpc3Q=", "permission": 33188}], }, { "swhid": "swh:1:dir:7441fa7d75af5621ab7c6e8f2e070ecf335f6341", "label": [{"name": "c3Jj", "permission": 16384}], }, { "swhid": "swh:1:dir:06cecb4a8aa7455ea5cc7003ae470c3809824d4e", "label": [{"name": "cGl4bWFwcw==", "permission": 16384}], }, { "swhid": "swh:1:dir:1ed4a821600faf0c4586ce9dffb28ef2be1cb4a6", "label": [{"name": "UkVBRE1FZGly", "permission": 16384}], }, { "swhid": "swh:1:cnt:048ced9db6a6d82f46b8d973200fcb4c9421a4dd", "label": [{"name": "LmdpdGlnbm9yZQ==", "permission": 33188}], }, { "swhid": "swh:1:cnt:5c9754e2ec8fe077488488fcebb9eb12877a8e67", "label": [{"name": "LmhnaWdub3Jl", "permission": 33188}], }, { "swhid": "swh:1:cnt:fddf33c930d58d77b67c75e591da5167d237b687", "label": [{"name": "TWFrZWZpbGU=", "permission": 33188}], }, { "swhid": "swh:1:dir:06c4aff198ccdbcd3ce462594352753581b0fb16", "label": [{"name": "bnNpcw==", "permission": 16384}], }, { "swhid": "swh:1:cnt:6695ee397f5b85f06385d5fceac35d73a6671beb", "label": [{"name": "dmltdHV0b3IuYmF0", "permission": 33188}], }, { "swhid": "swh:1:cnt:e81ed84d7561154ab6e4e9e155fee8d16c20dc86", "label": [{"name": "LmNpcnJ1cy55bWw=", "permission": 33188}], }, { "swhid": "swh:1:cnt:6c5c05b0130f70cbd86f1c174b42c349c8ca6f0f", "label": [{"name": "TElDRU5TRQ==", "permission": 33188}], }, { "swhid": "swh:1:cnt:35da1092107cc4217baf7f54a687db15d5e25ef2", "label": [ {"name": "LmFwcHZleW9yLnltbA==", "permission": 33188} ], }, { "swhid": "swh:1:cnt:ef957779895280b16a987063c554325a1a473003", "label": [{"name": "LmNvZGVjb3YueW1s", "permission": 33188}], }, { "swhid": "swh:1:cnt:c9ce73a2d1ffaa3f116b104cfb12b38a4d3d95eb", "label": [ {"name": "UkVBRE1FX1ZJTTkubWQ=", "permission": 33188} ], }, { "swhid": "swh:1:cnt:960c9109603a0ddccb2a8388a8a8b8e6ea39d111", "label": [ {"name": "dW5pbnN0YWxsLnR4dA==", "permission": 33188} ], }, { "swhid": "swh:1:dir:ee4d69ddf8110f3b0bbb1433efa640609fc5acfb", "label": [{"name": "dG9vbHM=", "permission": 16384}], }, { "swhid": "swh:1:cnt:7d1e0166c9c19379b3dfcfbe79a7628aa68e2cd2", "label": [{"name": "U0VDVVJJVFkubWQ=", "permission": 33188}], }, { "swhid": "swh:1:cnt:99bfcfa2c8c782121baacf12734d0925169da127", "label": [ {"name": "Q09OVFJJQlVUSU5HLm1k", "permission": 33188} ], }, { "swhid": "swh:1:cnt:be909280c8cf2ba5812f79599fb671ecd4662b9c", "label": [ {"name": "UkVBRE1FLnJ1eC50eHQ=", "permission": 33188} ], }, { "swhid": "swh:1:dir:e3c58955679a2e55e42691150e84a9df682e8252", "label": [{"name": "Y2k=", "permission": 16384}], }, { "swhid": "swh:1:cnt:cfee68e8a2767b6e252923a6f934115fbb13eb44", "label": [{"name": "UkVBRE1FLm1k", "permission": 33188}], }, { "swhid": "swh:1:cnt:d90ebbc1fae66f43bc4f62922e068d518f2f9a6d", "label": [{"name": "UkVBRE1FLnR4dA==", "permission": 33188}], }, { "swhid": "swh:1:dir:4a10974550b45f4c99824ddce6446212860737f2", "label": [{"name": "LmdpdGh1Yg==", "permission": 16384}], }, { "swhid": "swh:1:dir:9de4bee64384ba8aff615bfad88fe61d8ea8fabb", "label": [{"name": "cnVudGltZQ==", "permission": 16384}], }, ], "numSuccessors": "31", }, "rev": { "swhid": "swh:1:rev:a01148d2cb2f8d2820a5b95474d11db0d1802360", "successor": [ {"swhid": "swh:1:dir:d7b6b8be2f7cedd5a5c12a0df7f9ef6456a70441"}, {"swhid": "swh:1:rev:d7745acbd8fe1e4feb356a6dc7fc185eeab17d67"}, ], "rev": { "author": "4757105", "authorDate": "1732367998", "authorDateOffset": 60, "committer": "4722660", "committerDate": "1732367998", "committerDateOffset": 60, "message": "cnVudGltZShkb2MpOiBFeHBhbmQgZG9jcyBvbiA6ISB2cy4gOnRlcm0KCmZpeGVzOiAjMTYwNzEKY2xvc2VzOiAjMTYwODkKClNpZ25lZC1vZmYtYnk6IG1hdHZleXQgPG1hdHRoZXd0YXJhc292QHlhbmRleC5ydT4KU2lnbmVkLW9mZi1ieTogQ2hyaXN0aWFuIEJyYWJhbmR0IDxjYkAyNTZiaXQub3JnPgo=", # noqa: B950 }, "numSuccessors": "2", }, "snp": {"swhid": "swh:1:snp:da91e8e97edb59f9e97ee9388e419f77b018d856"}, }, "swh-graph": { "cnt": { "swhid": "swh:1:cnt:d7abf98f65283673a669eeba114f545934153f5d", "cnt": {"length": "1216", "isSkipped": False}, "numSuccessors": "0", }, "dir": { "swhid": "swh:1:dir:1618172adfdc2baef53ff0c27ebbd33899c455b0", "successor": [ { "swhid": "swh:1:cnt:94a9ed024d3859793618152ea559a168bbcbb5e2", "label": [{"name": "TElDRU5TRQ==", "permission": 33188}], }, { "swhid": "swh:1:cnt:c329086f6eacdb10daf84199c6c84f9ef6eca553", "label": [{"name": "QVVUSE9SUw==", "permission": 33188}], }, { "swhid": "swh:1:cnt:ec16ee17aebb01aaa7a41afe002bed9397798810", "label": [ { "name": "LmdpdC1ibGFtZS1pZ25vcmUtcmV2cw==", "permission": 33188, } ], }, { "swhid": "swh:1:cnt:4d665e8f4f2011777a311571234c6799dc70e6dc", "label": [{"name": "Y29uZnRlc3QucHk=", "permission": 33188}], }, { "swhid": "swh:1:dir:40fb2fbffe23f81f42b871cb9c52190f9c84ae32", "label": [{"name": "ZG9ja2Vy", "permission": 16384}], }, { "swhid": "swh:1:dir:b8fa5f3d9e738b3919288177d545ceb731b4979e", "label": [{"name": "cmVwb3J0cw==", "permission": 16384}], }, { "swhid": "swh:1:cnt:0db890fdde68d478e5ba043f0e542291e8b0b54b", "label": [{"name": "Q2FyZ28ubG9jaw==", "permission": 33188}], }, { "swhid": "swh:1:cnt:5e2536575335d59c4ac72043b55829538f6808c2", "label": [ { "name": "LmNvcGllci1hbnN3ZXJzLnltbA==", "permission": 33188, } ], }, { "swhid": "swh:1:cnt:63fd1d0de44bb7608e931c749375db72cdba8a2d", "label": [{"name": "c2V0dXAuY2Zn", "permission": 33188}], }, { "swhid": "swh:1:cnt:982caf51e401acbaa8148c2037666cb8a0cea3c1", "label": [{"name": "dG94LmluaQ==", "permission": 33188}], }, { "swhid": "swh:1:cnt:84f00683b1a2aabcdedfbbb037c60e2cad7b896f", "label": [ {"name": "cHlwcm9qZWN0LnRvbWw=", "permission": 33188} ], }, { "swhid": "swh:1:cnt:d05318c30b051223c74df4efbc9a834b80170692", "label": [ {"name": "TWFrZWZpbGUubG9jYWw=", "permission": 33188} ], }, { "swhid": "swh:1:cnt:c017966a0e7e3e27093f6f877f487dc5cfeab769", "label": [{"name": "cHl0ZXN0LmluaQ==", "permission": 33188}], }, { "swhid": "swh:1:dir:da1ff9757b6ee4ec9a2c301429fdb3db20f3e8c9", "label": [{"name": "cHlvMw==", "permission": 16384}], }, { "swhid": "swh:1:cnt:6f99f9cce04d231c27aff30b29348ff0fb5e55d0", "label": [{"name": "Q2FyZ28udG9tbA==", "permission": 33188}], }, { "swhid": "swh:1:dir:b0fcc18eabf59b8a210601ead1b13608e673c68f", "label": [{"name": "dG9vbHM=", "permission": 16384}], }, { "swhid": "swh:1:cnt:de363f304f4d77d635657649307d0bbab0d6b003", "label": [ { "name": "cmVxdWlyZW1lbnRzLXRlc3QudHh0", "permission": 33188, } ], }, { "swhid": "swh:1:cnt:c2518229482a670e9e42e32addbaa1866a979c2e", "label": [{"name": "Q09OVFJJQlVUT1JT", "permission": 33188}], }, { "swhid": "swh:1:cnt:32e4c4b9383bdd6de264c7adb6c940a4735cd45f", "label": [{"name": "Lm1haWxtYXA=", "permission": 33188}], }, { "swhid": "swh:1:cnt:76223786dcaf6d9cce703e224c0c895c3f87a0cd", "label": [{"name": "bXlweS5pbmk=", "permission": 33188}], }, { "swhid": "swh:1:cnt:c702dcbf5b6d17160c6c62f78b2d1ba1ce8c9945", "label": [ { "name": "cmVxdWlyZW1lbnRzLXN3aC10ZXN0LnR4dA==", "permission": 33188, } ], }, { "swhid": "swh:1:cnt:35a070b2739a7091a888a3fa6d05f2f1ec622c9e", "label": [ {"name": "cmVxdWlyZW1lbnRzLnR4dA==", "permission": 33188} ], }, { "swhid": "swh:1:dir:8ff7d1d0488f445654a7903b0eab52ca8876771b", "label": [{"name": "cHJvdG8=", "permission": 16384}], }, { "swhid": "swh:1:cnt:347a1be25a18cf817291e8c21050bf05321813a8", "label": [ { "name": "cmVxdWlyZW1lbnRzLXN3aC50eHQ=", "permission": 33188, } ], }, { "swhid": "swh:1:dir:fc7439c4c42752076a103d24769894c64f85a1d3", "label": [{"name": "ZG9jcw==", "permission": 16384}], }, { "swhid": "swh:1:cnt:5764e8839103150489b184184aaeb890e12744c7", "label": [ { "name": "LnByZS1jb21taXQtY29uZmlnLnlhbWw=", "permission": 33188, } ], }, { "swhid": "swh:1:dir:2b0e640212e420a1fdc44e68d9da10694eb50f10", "label": [{"name": "c3do", "permission": 16384}], }, { "swhid": "swh:1:cnt:6e2dee929af68f2187dbdadc16fe2028fcfe9dfc", "label": [ {"name": "Q09ERV9PRl9DT05EVUNULm1k", "permission": 33188} ], }, { "swhid": "swh:1:cnt:61c58b5d0f97f579e4cb97f6b937932fcb5ebcaa", "label": [ { "name": "cmVxdWlyZW1lbnRzLWx1aWdpLnR4dA==", "permission": 33188, } ], }, { "swhid": "swh:1:dir:a48a042899bf075849016c41e84c52388cd7495d", "label": [{"name": "cnVzdA==", "permission": 16384}], }, { "swhid": "swh:1:cnt:d7abf98f65283673a669eeba114f545934153f5d", "label": [{"name": "UkVBRE1FLnJzdA==", "permission": 33188}], }, { "swhid": "swh:1:dir:ee848a09897c5c40985e6257cd8dce79d5a1ca5b", "label": [{"name": "LmNhcmdv", "permission": 16384}], }, { "swhid": "swh:1:cnt:5876d2dcbe8e493b9a7a060a0a1cc9e1bbc76535", "label": [{"name": "LmdpdGlnbm9yZQ==", "permission": 33188}], }, { "swhid": "swh:1:cnt:b07918e2110a818adba7db7bd93b2d1f0c95f9df", "label": [{"name": "TWFrZWZpbGU=", "permission": 33188}], }, { "swhid": "swh:1:cnt:13beda51bc0e4ab318d33fd9e79fcb8b3f5bb540", "label": [ { "name": "cmVxdWlyZW1lbnRzLXN3aC1sdWlnaS50eHQ=", "permission": 33188, } ], }, ], "numSuccessors": "35", }, "rev": { "swhid": "swh:1:rev:985dcf705e03fde55285ca8aaff2488f43e9a55f", "successor": [ {"swhid": "swh:1:dir:1618172adfdc2baef53ff0c27ebbd33899c455b0"}, {"swhid": "swh:1:rev:ae81781d7856208349655c434dd788977a99c707"}, ], "rev": { "author": "35558135", "authorDate": "1725351142", "authorDateOffset": 120, "committer": "76456249", "committerDate": "1725358688", "committerDateOffset": 0, "message": "UmVwbGFjZSBtYWR2aXNlIHdpdGggTW1hcEZsYWdzCgpUaGVzZSBmbGFncyB3ZXJlIGFkZGVkIGluIG1tYXBfcnMgdjAuNi4xIGFuZCBzcGFyZSB1cyBzb21lIGJvaWxlcnBsYXRlCg==", # noqa: B950 }, "numSuccessors": "2", }, "snp": {"swhid": "swh:1:snp:d34d87373bb367ba310002693cb7c4c139c3b882"}, }, } if test_flavor == "full": traversal_start = "snp" status_table = { "parmap": {"cnt": False, "dir": False, "rev": False}, "apt": {"cnt": False, "dir": False, "rev": False}, "coreutils": {"cnt": False, "dir": False, "rev": False}, "pip": {"cnt": False, "dir": False, "rev": False}, "vim": {"cnt": False, "dir": False, "rev": False}, "swh-graph": {"cnt": False, "dir": False, "rev": False}, } level_keys = ["rev", "dir", "cnt"] elif test_flavor == "history_hosting": traversal_start = "snp" status_table = { "parmap": {"rev": False}, "apt": {"rev": False}, "coreutils": {"rev": False}, "pip": {"rev": False}, "vim": {"rev": False}, "swh-graph": {"rev": False}, } level_keys = ["rev"] else: # test_flavor == "example" traversal_start = "rev" test_values = { "example": { "dir": { "swhid": "swh:1:dir:0000000000000000000000000000000000000006", "successor": [ { "swhid": "swh:1:cnt:0000000000000000000000000000000000000005", "label": [{"name": "cGFyc2VyLmM=", "permission": 33188}], }, { "swhid": "swh:1:cnt:0000000000000000000000000000000000000004", "label": [{"name": "UkVBRE1FLm1k", "permission": 33188}], }, ], "numSuccessors": "2", }, "rev": {"swhid": "swh:1:rev:0000000000000000000000000000000000000009"}, } } status_table = {"example": {"dir": False}} level_keys = ["dir"] try: with grpc.insecure_channel(f"localhost:{port}") as channel: stub = swhgraph_grpc.TraversalServiceStub(channel) for key, val in test_values.items(): response = stub.Traverse( swhgraph.TraversalRequest(src=[val[traversal_start]["swhid"]]) # type: ignore ) for elt in response: for l_key in level_keys: if elt.swhid == val[l_key]["swhid"]: elt_dict = MessageToDict(elt) if elt_dict == val[l_key]: status_table[key][l_key] = True else: diff = difflib.context_diff( json.dumps( elt_dict, indent=2, sort_keys=True ).splitlines(True), json.dumps( val[l_key], indent=2, sort_keys=True ).splitlines(True), ) logger.error(f"{l_key} mismatch: {''.join(diff)}") finally: stop_grpc_server(server) is_ok = True for project, results in status_table.items(): for level, res in results.items(): if not res: logger.error("Something went wrong with the compression.") logger.error(f"{level} for project {project} is incorrect") is_ok = False if is_ok: logger.info("Compression seems to have gone well.")