Browse Source

Add unit tests for supported protocols

Prevents future regressions like #25070.
teor 6 years ago
parent
commit
8bb79ca4a7
1 changed files with 152 additions and 0 deletions
  1. 152 0
      src/test/test_protover.c

+ 152 - 0
src/test/test_protover.c

@@ -8,6 +8,9 @@
 
 #include "protover.h"
 
+#include "or.h"
+#include "connection_or.h"
+
 static void
 test_protover_parse(void *arg)
 {
@@ -250,6 +253,154 @@ test_protover_supports_version(void *arg)
  ;
 }
 
+/* This could be MAX_PROTOCOLS_TO_EXPAND, but that's not exposed by protover */
+#define MAX_PROTOCOLS_TO_TEST 1024
+
+/* LinkAuth and Relay protocol versions.
+ * Hard-coded here, because they are not in the code, or not exposed in the
+ * headers. */
+#define PROTOVER_LINKAUTH_V1 1
+#define PROTOVER_LINKAUTH_V3 3
+
+#define PROTOVER_RELAY_V1 1
+#define PROTOVER_RELAY_V2 2
+
+/* Highest supported HSv2 introduce protocol version.
+ * Hard-coded here, because it does not appear anywhere in the code.
+ * It's not clear if we actually support version 2, see #25068. */
+#define PROTOVER_HSINTRO_V2 3
+
+/* HSv2 Rend and HSDir protocol versions.
+ * Hard-coded here, because they do not appear anywhere in the code. */
+#define PROTOVER_HS_RENDEZVOUS_POINT_V2 1
+#define PROTOVER_HSDIR_V2 1
+
+/* DirCache, Desc, Microdesc, and Cons protocol versions.
+ * Hard-coded here, because they do not appear anywhere in the code. */
+#define PROTOVER_DIRCACHE_V1 1
+#define PROTOVER_DIRCACHE_V2 2
+
+#define PROTOVER_DESC_V1 1
+#define PROTOVER_DESC_V2 2
+
+#define PROTOVER_MICRODESC_V1 1
+#define PROTOVER_MICRODESC_V2 2
+
+#define PROTOVER_CONS_V1 1
+#define PROTOVER_CONS_V2 2
+
+/* Make sure we haven't forgotten any supported protocols */
+static void
+test_protover_supported_protocols(void *arg)
+{
+  (void)arg;
+
+  const char *supported_protocols = protover_get_supported_protocols();
+
+  /* Test for new Link in the code, that hasn't been added to supported
+   * protocols */
+  tt_assert(protocol_list_supports_protocol(supported_protocols,
+                                            PRT_LINK,
+                                            MAX_LINK_PROTO));
+  for (uint16_t i = 0; i < MAX_PROTOCOLS_TO_TEST; i++) {
+    if (is_or_protocol_version_known(i)) {
+      tt_assert(protocol_list_supports_protocol(supported_protocols,
+                                                PRT_LINK,
+                                                i));
+    }
+  }
+
+  /* Legacy LinkAuth does not appear anywhere in the code. */
+  tt_assert(protocol_list_supports_protocol(supported_protocols,
+                                            PRT_LINKAUTH,
+                                            PROTOVER_LINKAUTH_V1));
+  /* Latest LinkAuth is not exposed in the headers. */
+  tt_assert(protocol_list_supports_protocol(supported_protocols,
+                                            PRT_LINKAUTH,
+                                            PROTOVER_LINKAUTH_V3));
+  /* Is there any way to test for new LinkAuth? */
+
+  /* Relay protovers do not appear anywhere in the code. */
+  tt_assert(protocol_list_supports_protocol(supported_protocols,
+                                            PRT_RELAY,
+                                            PROTOVER_RELAY_V1));
+  tt_assert(protocol_list_supports_protocol(supported_protocols,
+                                            PRT_RELAY,
+                                            PROTOVER_RELAY_V2));
+  /* Is there any way to test for new Relay? */
+
+  /* We could test legacy HSIntro by calling rend_service_update_descriptor(),
+   * and checking the protocols field. But that's unlikely to change, so
+   * we just use a hard-coded value. */
+  tt_assert(protocol_list_supports_protocol(supported_protocols,
+                                            PRT_HSINTRO,
+                                            PROTOVER_HSINTRO_V2));
+  /* Test for HSv3 HSIntro */
+  tt_assert(protocol_list_supports_protocol(supported_protocols,
+                                            PRT_HSINTRO,
+                                            PROTOVER_HS_INTRO_V3));
+  /* Is there any way to test for new HSIntro? */
+
+  /* Legacy HSRend does not appear anywhere in the code. */
+  tt_assert(protocol_list_supports_protocol(supported_protocols,
+                                            PRT_HSREND,
+                                            PROTOVER_HS_RENDEZVOUS_POINT_V2));
+  /* Test for HSv3 HSRend */
+  tt_assert(protocol_list_supports_protocol(supported_protocols,
+                                            PRT_HSREND,
+                                            PROTOVER_HS_RENDEZVOUS_POINT_V3));
+  /* Is there any way to test for new HSRend? */
+
+  /* Legacy HSDir does not appear anywhere in the code. */
+  tt_assert(protocol_list_supports_protocol(supported_protocols,
+                                            PRT_HSDIR,
+                                            PROTOVER_HSDIR_V2));
+  /* Test for HSv3 HSDir */
+  tt_assert(protocol_list_supports_protocol(supported_protocols,
+                                            PRT_HSDIR,
+                                            PROTOVER_HSDIR_V3));
+  /* Is there any way to test for new HSDir? */
+
+  /* No DirCache versions appear anywhere in the code. */
+  tt_assert(protocol_list_supports_protocol(supported_protocols,
+                                            PRT_DIRCACHE,
+                                            PROTOVER_DIRCACHE_V1));
+  tt_assert(protocol_list_supports_protocol(supported_protocols,
+                                            PRT_DIRCACHE,
+                                            PROTOVER_DIRCACHE_V2));
+  /* Is there any way to test for new DirCache? */
+
+  /* No Desc versions appear anywhere in the code. */
+  tt_assert(protocol_list_supports_protocol(supported_protocols,
+                                            PRT_DESC,
+                                            PROTOVER_DESC_V1));
+  tt_assert(protocol_list_supports_protocol(supported_protocols,
+                                            PRT_DESC,
+                                            PROTOVER_DESC_V2));
+  /* Is there any way to test for new Desc? */
+
+  /* No Microdesc versions appear anywhere in the code. */
+  tt_assert(protocol_list_supports_protocol(supported_protocols,
+                                            PRT_MICRODESC,
+                                            PROTOVER_MICRODESC_V1));
+  tt_assert(protocol_list_supports_protocol(supported_protocols,
+                                            PRT_MICRODESC,
+                                            PROTOVER_MICRODESC_V2));
+  /* Is there any way to test for new Microdesc? */
+
+  /* No Cons versions appear anywhere in the code. */
+  tt_assert(protocol_list_supports_protocol(supported_protocols,
+                                            PRT_CONS,
+                                            PROTOVER_CONS_V1));
+  tt_assert(protocol_list_supports_protocol(supported_protocols,
+                                            PRT_CONS,
+                                            PROTOVER_CONS_V2));
+  /* Is there any way to test for new Cons? */
+
+ done:
+ ;
+}
+
 #define PV_TEST(name, flags)                       \
   { #name, test_protover_ ##name, (flags), NULL, NULL }
 
@@ -261,6 +412,7 @@ struct testcase_t protover_tests[] = {
   PV_TEST(list_supports_protocol_for_unsupported_returns_false, 0),
   PV_TEST(list_supports_protocol_returns_true, 0),
   PV_TEST(supports_version, 0),
+  PV_TEST(supported_protocols, 0),
   END_OF_TESTCASES
 };