1load(
2    "@bazel-erlang//:bazel_erlang_lib.bzl",
3    "DEFAULT_ERLC_OPTS",
4    "DEFAULT_TEST_ERLC_OPTS",
5    "erlang_lib",
6    "test_erlang_lib",
7)
8load("@bazel-erlang//:ct_sharded.bzl", "ct_suite", "ct_suite_variant")
9load("//:rabbitmq_home.bzl", "rabbitmq_home")
10load("//:rabbitmq_run.bzl", "rabbitmq_run")
11
12RABBITMQ_ERLC_OPTS = DEFAULT_ERLC_OPTS
13
14RABBITMQ_TEST_ERLC_OPTS = DEFAULT_TEST_ERLC_OPTS + [
15    "+nowarn_export_all",
16]
17
18RABBITMQ_DIALYZER_OPTS = [
19    "-Werror_handling",
20    "-Wunmatched_returns",
21]
22
23APP_VERSION = "3.9.0"
24
25ALL_PLUGINS = [
26    "//deps/rabbit:bazel_erlang_lib",
27    "//deps/rabbitmq_amqp1_0:bazel_erlang_lib",
28    "//deps/rabbitmq_auth_backend_cache:bazel_erlang_lib",
29    "//deps/rabbitmq_auth_backend_http:bazel_erlang_lib",
30    "//deps/rabbitmq_auth_backend_ldap:bazel_erlang_lib",
31    "//deps/rabbitmq_auth_backend_oauth2:bazel_erlang_lib",
32    "//deps/rabbitmq_auth_mechanism_ssl:bazel_erlang_lib",
33    "//deps/rabbitmq_consistent_hash_exchange:bazel_erlang_lib",
34    "//deps/rabbitmq_event_exchange:bazel_erlang_lib",
35    "//deps/rabbitmq_federation:bazel_erlang_lib",
36    "//deps/rabbitmq_federation_management:bazel_erlang_lib",
37    "//deps/rabbitmq_jms_topic_exchange:bazel_erlang_lib",
38    "//deps/rabbitmq_management:bazel_erlang_lib",
39    "//deps/rabbitmq_mqtt:bazel_erlang_lib",
40    "//deps/rabbitmq_peer_discovery_aws:bazel_erlang_lib",
41    "//deps/rabbitmq_peer_discovery_consul:bazel_erlang_lib",
42    "//deps/rabbitmq_peer_discovery_etcd:bazel_erlang_lib",
43    "//deps/rabbitmq_peer_discovery_k8s:bazel_erlang_lib",
44    "//deps/rabbitmq_prometheus:bazel_erlang_lib",
45    "//deps/rabbitmq_random_exchange:bazel_erlang_lib",
46    "//deps/rabbitmq_recent_history_exchange:bazel_erlang_lib",
47    "//deps/rabbitmq_sharding:bazel_erlang_lib",
48    "//deps/rabbitmq_shovel:bazel_erlang_lib",
49    "//deps/rabbitmq_shovel_management:bazel_erlang_lib",
50    "//deps/rabbitmq_stomp:bazel_erlang_lib",
51    "//deps/rabbitmq_stream:bazel_erlang_lib",
52    "//deps/rabbitmq_stream_management:bazel_erlang_lib",
53    "//deps/rabbitmq_top:bazel_erlang_lib",
54    "//deps/rabbitmq_tracing:bazel_erlang_lib",
55    "//deps/rabbitmq_trust_store:bazel_erlang_lib",
56    "//deps/rabbitmq_web_dispatch:bazel_erlang_lib",
57    "//deps/rabbitmq_web_mqtt:bazel_erlang_lib",
58    "//deps/rabbitmq_web_stomp:bazel_erlang_lib",
59]
60
61LABELS_WITH_TEST_VERSIONS = [
62    "//deps/amqp10_common:bazel_erlang_lib",
63    "//deps/rabbit_common:bazel_erlang_lib",
64    "//deps/rabbit:bazel_erlang_lib",
65    "//deps/rabbit/apps/rabbitmq_prelaunch:bazel_erlang_lib",
66]
67
68def all_plugins(rabbitmq_workspace = "@rabbitmq-server"):
69    return [rabbitmq_workspace + p for p in ALL_PLUGINS]
70
71def with_test_versions(deps):
72    r = []
73    for d in deps:
74        if d in LABELS_WITH_TEST_VERSIONS:
75            r.append(d.replace(":bazel_erlang_lib", ":test_bazel_erlang_lib"))
76        else:
77            r.append(d)
78    return r
79
80def rabbitmq_lib(
81        app_name = "",
82        app_version = APP_VERSION,
83        app_description = "",
84        app_module = "",
85        app_registered = [],
86        app_env = "[]",
87        extra_apps = [],
88        erlc_opts = RABBITMQ_ERLC_OPTS,
89        test_erlc_opts = RABBITMQ_TEST_ERLC_OPTS,
90        first_srcs = [],
91        extra_priv = [],
92        build_deps = [],
93        deps = [],
94        runtime_deps = []):
95    erlang_lib(
96        app_name = app_name,
97        app_version = app_version,
98        app_description = app_description,
99        app_module = app_module,
100        app_registered = app_registered,
101        app_env = app_env,
102        extra_apps = extra_apps,
103        extra_priv = extra_priv,
104        erlc_opts = erlc_opts,
105        first_srcs = first_srcs,
106        build_deps = build_deps,
107        deps = deps,
108        runtime_deps = runtime_deps,
109    )
110
111    test_erlang_lib(
112        app_name = app_name,
113        app_version = app_version,
114        app_description = app_description,
115        app_module = app_module,
116        app_registered = app_registered,
117        app_env = app_env,
118        extra_apps = extra_apps,
119        extra_priv = extra_priv,
120        erlc_opts = test_erlc_opts,
121        first_srcs = first_srcs,
122        build_deps = with_test_versions(build_deps),
123        deps = with_test_versions(deps),
124        runtime_deps = with_test_versions(runtime_deps),
125    )
126
127def rabbitmq_suite(erlc_opts = [], test_env = {}, **kwargs):
128    ct_suite(
129        erlc_opts = RABBITMQ_TEST_ERLC_OPTS + erlc_opts,
130        test_env = dict({
131            "RABBITMQ_CT_SKIP_AS_ERROR": "true",
132        }.items() + test_env.items()),
133        **kwargs
134    )
135    return kwargs["name"]
136
137def broker_for_integration_suites():
138    rabbitmq_home(
139        name = "broker-for-tests-home",
140        plugins = [
141            "//deps/rabbit:bazel_erlang_lib",
142            ":bazel_erlang_lib",
143        ],
144    )
145
146    rabbitmq_run(
147        name = "rabbitmq-for-tests-run",
148        home = ":broker-for-tests-home",
149    )
150
151def rabbitmq_integration_suite(
152        package,
153        name = None,
154        tags = [],
155        data = [],
156        erlc_opts = [],
157        additional_hdrs = [],
158        additional_srcs = [],
159        test_env = {},
160        tools = [],
161        deps = [],
162        runtime_deps = [],
163        **kwargs):
164    ct_suite(
165        name = name,
166        suite_name = name,
167        tags = tags,
168        erlc_opts = RABBITMQ_TEST_ERLC_OPTS + erlc_opts,
169        additional_hdrs = additional_hdrs,
170        additional_srcs = additional_srcs,
171        data = data,
172        test_env = dict({
173            "SKIP_MAKE_TEST_DIST": "true",
174            "RABBITMQ_CT_SKIP_AS_ERROR": "true",
175            "RABBITMQ_RUN": "$TEST_SRCDIR/$TEST_WORKSPACE/{}/rabbitmq-for-tests-run".format(package),
176            "RABBITMQCTL": "$TEST_SRCDIR/$TEST_WORKSPACE/{}/broker-for-tests-home/sbin/rabbitmqctl".format(package),
177            "RABBITMQ_PLUGINS": "$TEST_SRCDIR/$TEST_WORKSPACE/{}/broker-for-tests-home/sbin/rabbitmq-plugins".format(package),
178            "RABBITMQ_QUEUES": "$TEST_SRCDIR/$TEST_WORKSPACE/{}/broker-for-tests-home/sbin/rabbitmq-queues".format(package),
179        }.items() + test_env.items()),
180        tools = [
181            ":rabbitmq-for-tests-run",
182        ] + tools,
183        runtime_deps = [
184            "//deps/rabbitmq_cli:elixir_as_bazel_erlang_lib",
185            "//deps/rabbitmq_cli:rabbitmqctl",
186            "//deps/rabbitmq_ct_client_helpers:bazel_erlang_lib",
187        ] + runtime_deps,
188        deps = [
189            "//deps/amqp_client:bazel_erlang_lib",
190            "//deps/rabbit_common:bazel_erlang_lib",
191            "//deps/rabbitmq_ct_helpers:bazel_erlang_lib",
192        ] + deps,
193        **kwargs
194    )
195
196    ct_suite_variant(
197        name = name + "-mixed",
198        suite_name = name,
199        tags = tags + ["mixed-version-cluster"],
200        data = data,
201        test_env = dict({
202            "SKIP_MAKE_TEST_DIST": "true",
203            "RABBITMQ_FEATURE_FLAGS": "",
204            "RABBITMQ_RUN": "$TEST_SRCDIR/$TEST_WORKSPACE/{}/rabbitmq-for-tests-run".format(package),
205            "RABBITMQCTL": "$TEST_SRCDIR/$TEST_WORKSPACE/{}/broker-for-tests-home/sbin/rabbitmqctl".format(package),
206            "RABBITMQ_PLUGINS": "$TEST_SRCDIR/$TEST_WORKSPACE/{}/broker-for-tests-home/sbin/rabbitmq-plugins".format(package),
207            "RABBITMQ_QUEUES": "$TEST_SRCDIR/$TEST_WORKSPACE/{}/broker-for-tests-home/sbin/rabbitmq-queues".format(package),
208            "RABBITMQ_RUN_SECONDARY": "$TEST_SRCDIR/rabbitmq-server-generic-unix-3.8.22/rabbitmq-run",
209        }.items() + test_env.items()),
210        tools = [
211            ":rabbitmq-for-tests-run",
212            "@rabbitmq-server-generic-unix-3.8.22//:rabbitmq-run",
213        ] + tools,
214        runtime_deps = [
215            "//deps/rabbitmq_cli:elixir_as_bazel_erlang_lib",
216            "//deps/rabbitmq_cli:rabbitmqctl",
217            "//deps/rabbitmq_ct_client_helpers:bazel_erlang_lib",
218        ] + runtime_deps,
219        deps = [
220            "//deps/amqp_client:bazel_erlang_lib",
221            "//deps/rabbit_common:bazel_erlang_lib",
222            "//deps/rabbitmq_ct_helpers:bazel_erlang_lib",
223        ] + deps,
224        **kwargs
225    )
226
227    return name
228
229def assert_suites(suite_names, suite_files):
230    for f in suite_files:
231        sn = f.rpartition("/")[-1].replace(".erl", "")
232        if not sn in suite_names:
233            fail("A bazel rule has not been defined for {} (expected {} in {}".format(f, sn, suite_names))
234