|
@@ -7,15 +7,20 @@
|
|
|
*/
|
|
|
|
|
|
#define CONFIG_PRIVATE
|
|
|
+#define HS_SERVICE_PRIVATE
|
|
|
|
|
|
#include "test.h"
|
|
|
#include "test_helpers.h"
|
|
|
#include "log_test_helpers.h"
|
|
|
-#include "hs_config.h"
|
|
|
+
|
|
|
#include "config.h"
|
|
|
+#include "hs_common.h"
|
|
|
+#include "hs_config.h"
|
|
|
+#include "hs_service.h"
|
|
|
+#include "rendservice.h"
|
|
|
|
|
|
static int
|
|
|
-helper_config_service_v2(const char *conf, int validate_only)
|
|
|
+helper_config_service(const char *conf, int validate_only)
|
|
|
{
|
|
|
int ret = 0;
|
|
|
or_options_t *options = NULL;
|
|
@@ -29,9 +34,9 @@ helper_config_service_v2(const char *conf, int validate_only)
|
|
|
}
|
|
|
|
|
|
static void
|
|
|
-test_invalid_service_v2(void *arg)
|
|
|
+test_invalid_service(void *arg)
|
|
|
{
|
|
|
- int validate_only = 1, ret;
|
|
|
+ int ret;
|
|
|
|
|
|
(void) arg;
|
|
|
|
|
@@ -39,11 +44,98 @@ test_invalid_service_v2(void *arg)
|
|
|
{
|
|
|
const char *conf =
|
|
|
"HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
|
|
|
- "HiddenServiceVersion 2\n";
|
|
|
+ "HiddenServiceVersion 1\n"; /* Wrong not supported version. */
|
|
|
setup_full_capture_of_logs(LOG_WARN);
|
|
|
- ret = helper_config_service_v2(conf, validate_only);
|
|
|
+ ret = helper_config_service(conf, 1);
|
|
|
tt_int_op(ret, OP_EQ, -1);
|
|
|
- expect_log_msg_containing("with no ports configured.");
|
|
|
+ expect_log_msg_containing("HiddenServiceVersion must be between 2 and 3");
|
|
|
+ teardown_capture_of_logs();
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Bad value of HiddenServiceAllowUnknownPorts. */
|
|
|
+ {
|
|
|
+ const char *conf =
|
|
|
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
|
|
|
+ "HiddenServiceVersion 2\n"
|
|
|
+ "HiddenServiceAllowUnknownPorts 2\n"; /* Should be 0 or 1. */
|
|
|
+ setup_full_capture_of_logs(LOG_WARN);
|
|
|
+ ret = helper_config_service(conf, 1);
|
|
|
+ tt_int_op(ret, OP_EQ, -1);
|
|
|
+ expect_log_msg_containing("HiddenServiceAllowUnknownPorts must be "
|
|
|
+ "between 0 and 1, not 2");
|
|
|
+ teardown_capture_of_logs();
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Bad value of HiddenServiceDirGroupReadable */
|
|
|
+ {
|
|
|
+ const char *conf =
|
|
|
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
|
|
|
+ "HiddenServiceVersion 2\n"
|
|
|
+ "HiddenServiceDirGroupReadable 2\n"; /* Should be 0 or 1. */
|
|
|
+ setup_full_capture_of_logs(LOG_WARN);
|
|
|
+ ret = helper_config_service(conf, 1);
|
|
|
+ tt_int_op(ret, OP_EQ, -1);
|
|
|
+ expect_log_msg_containing("HiddenServiceDirGroupReadable must be "
|
|
|
+ "between 0 and 1, not 2");
|
|
|
+ teardown_capture_of_logs();
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Bad value of HiddenServiceMaxStreamsCloseCircuit */
|
|
|
+ {
|
|
|
+ const char *conf =
|
|
|
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
|
|
|
+ "HiddenServiceVersion 2\n"
|
|
|
+ "HiddenServiceMaxStreamsCloseCircuit 2\n"; /* Should be 0 or 1. */
|
|
|
+ setup_full_capture_of_logs(LOG_WARN);
|
|
|
+ ret = helper_config_service(conf, 1);
|
|
|
+ tt_int_op(ret, OP_EQ, -1);
|
|
|
+ expect_log_msg_containing("HiddenServiceMaxStreamsCloseCircuit must "
|
|
|
+ "be between 0 and 1, not 2");
|
|
|
+ teardown_capture_of_logs();
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Too much max streams. */
|
|
|
+ {
|
|
|
+ const char *conf =
|
|
|
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
|
|
|
+ "HiddenServiceVersion 2\n"
|
|
|
+ "HiddenServicePort 80\n"
|
|
|
+ "HiddenServiceMaxStreams 65536\n"; /* One too many. */
|
|
|
+ setup_full_capture_of_logs(LOG_WARN);
|
|
|
+ ret = helper_config_service(conf, 1);
|
|
|
+ tt_int_op(ret, OP_EQ, -1);
|
|
|
+ expect_log_msg_containing("HiddenServiceMaxStreams must be between "
|
|
|
+ "0 and 65535, not 65536");
|
|
|
+ teardown_capture_of_logs();
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Duplicate directory directive. */
|
|
|
+ {
|
|
|
+ const char *conf =
|
|
|
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
|
|
|
+ "HiddenServiceVersion 2\n"
|
|
|
+ "HiddenServicePort 80\n"
|
|
|
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
|
|
|
+ "HiddenServiceVersion 2\n"
|
|
|
+ "HiddenServicePort 81\n";
|
|
|
+ setup_full_capture_of_logs(LOG_WARN);
|
|
|
+ ret = helper_config_service(conf, 1);
|
|
|
+ tt_int_op(ret, OP_EQ, -1);
|
|
|
+ expect_log_msg_containing("Another hidden service is already "
|
|
|
+ "configured for directory");
|
|
|
+ teardown_capture_of_logs();
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Bad port. */
|
|
|
+ {
|
|
|
+ const char *conf =
|
|
|
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
|
|
|
+ "HiddenServiceVersion 2\n"
|
|
|
+ "HiddenServicePort 65536\n";
|
|
|
+ setup_full_capture_of_logs(LOG_WARN);
|
|
|
+ ret = helper_config_service(conf, 1);
|
|
|
+ tt_int_op(ret, OP_EQ, -1);
|
|
|
+ expect_log_msg_containing("Missing or invalid port");
|
|
|
teardown_capture_of_logs();
|
|
|
}
|
|
|
|
|
@@ -54,23 +146,60 @@ test_invalid_service_v2(void *arg)
|
|
|
"HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
|
|
|
"HiddenServicePort 80\n";
|
|
|
setup_full_capture_of_logs(LOG_WARN);
|
|
|
- ret = helper_config_service_v2(conf, validate_only);
|
|
|
+ ret = helper_config_service(conf, 1);
|
|
|
tt_int_op(ret, OP_EQ, -1);
|
|
|
expect_log_msg_containing("HiddenServiceVersion with no preceding "
|
|
|
"HiddenServiceDir directive");
|
|
|
teardown_capture_of_logs();
|
|
|
}
|
|
|
|
|
|
- /* Bad port. */
|
|
|
+ done:
|
|
|
+ ;
|
|
|
+}
|
|
|
+
|
|
|
+static void
|
|
|
+test_valid_service(void *arg)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ (void) arg;
|
|
|
+
|
|
|
+ /* Mix of v2 and v3. Still valid. */
|
|
|
{
|
|
|
const char *conf =
|
|
|
"HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
|
|
|
"HiddenServiceVersion 2\n"
|
|
|
- "HiddenServicePort 65536\n";
|
|
|
+ "HiddenServicePort 80\n"
|
|
|
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs2\n"
|
|
|
+ "HiddenServiceVersion 3\n"
|
|
|
+ "HiddenServicePort 81\n"
|
|
|
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs3\n"
|
|
|
+ "HiddenServiceVersion 2\n"
|
|
|
+ "HiddenServicePort 82\n";
|
|
|
+ ret = helper_config_service(conf, 1);
|
|
|
+ tt_int_op(ret, OP_EQ, 0);
|
|
|
+ }
|
|
|
+
|
|
|
+ done:
|
|
|
+ ;
|
|
|
+}
|
|
|
+
|
|
|
+static void
|
|
|
+test_invalid_service_v2(void *arg)
|
|
|
+{
|
|
|
+ int validate_only = 1, ret;
|
|
|
+
|
|
|
+ (void) arg;
|
|
|
+
|
|
|
+ /* Try with a missing port configuration. */
|
|
|
+ {
|
|
|
+ const char *conf =
|
|
|
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
|
|
|
+ "HiddenServiceVersion 2\n";
|
|
|
setup_full_capture_of_logs(LOG_WARN);
|
|
|
- ret = helper_config_service_v2(conf, validate_only);
|
|
|
+ ret = helper_config_service(conf, validate_only);
|
|
|
tt_int_op(ret, OP_EQ, -1);
|
|
|
- expect_log_msg_containing("Missing or invalid port");
|
|
|
+ expect_log_msg_containing("with no ports configured.");
|
|
|
teardown_capture_of_logs();
|
|
|
}
|
|
|
|
|
@@ -82,25 +211,25 @@ test_invalid_service_v2(void *arg)
|
|
|
"HiddenServicePort 80\n"
|
|
|
"HiddenServiceNumIntroductionPoints 11\n"; /* One too many. */
|
|
|
setup_full_capture_of_logs(LOG_WARN);
|
|
|
- ret = helper_config_service_v2(conf, validate_only);
|
|
|
+ ret = helper_config_service(conf, validate_only);
|
|
|
tt_int_op(ret, OP_EQ, -1);
|
|
|
expect_log_msg_containing("HiddenServiceNumIntroductionPoints should "
|
|
|
"be between 0 and 10, not 11");
|
|
|
teardown_capture_of_logs();
|
|
|
}
|
|
|
|
|
|
- /* Too much max streams. */
|
|
|
+ /* Too little introduction points. */
|
|
|
{
|
|
|
const char *conf =
|
|
|
"HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
|
|
|
"HiddenServiceVersion 2\n"
|
|
|
"HiddenServicePort 80\n"
|
|
|
- "HiddenServiceMaxStreams 65536\n"; /* One too many. */
|
|
|
+ "HiddenServiceNumIntroductionPoints -1\n";
|
|
|
setup_full_capture_of_logs(LOG_WARN);
|
|
|
- ret = helper_config_service_v2(conf, validate_only);
|
|
|
+ ret = helper_config_service(conf, validate_only);
|
|
|
tt_int_op(ret, OP_EQ, -1);
|
|
|
- expect_log_msg_containing("HiddenServiceMaxStreams should be between "
|
|
|
- "0 and 65535, not 65536");
|
|
|
+ expect_log_msg_containing("HiddenServiceNumIntroductionPoints should "
|
|
|
+ "be between 0 and 10, not -1");
|
|
|
teardown_capture_of_logs();
|
|
|
}
|
|
|
|
|
@@ -112,27 +241,110 @@ test_invalid_service_v2(void *arg)
|
|
|
"HiddenServicePort 80\n"
|
|
|
"HiddenServiceAuthorizeClient blah alice,bob\n"; /* blah is no good. */
|
|
|
setup_full_capture_of_logs(LOG_WARN);
|
|
|
- ret = helper_config_service_v2(conf, validate_only);
|
|
|
+ ret = helper_config_service(conf, validate_only);
|
|
|
tt_int_op(ret, OP_EQ, -1);
|
|
|
expect_log_msg_containing("HiddenServiceAuthorizeClient contains "
|
|
|
"unrecognized auth-type");
|
|
|
teardown_capture_of_logs();
|
|
|
}
|
|
|
|
|
|
- /* Duplicate directory directive. */
|
|
|
+ done:
|
|
|
+ ;
|
|
|
+}
|
|
|
+
|
|
|
+static void
|
|
|
+test_valid_service_v2(void *arg)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ (void) arg;
|
|
|
+
|
|
|
+ /* Valid complex configuration. Basic client authorization. */
|
|
|
{
|
|
|
const char *conf =
|
|
|
"HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
|
|
|
"HiddenServiceVersion 2\n"
|
|
|
"HiddenServicePort 80\n"
|
|
|
- "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
|
|
|
+ "HiddenServicePort 22 localhost:22\n"
|
|
|
+ "HiddenServicePort 42 unix:/path/to/socket\n"
|
|
|
+ "HiddenServiceAuthorizeClient basic alice,bob,eve\n"
|
|
|
+ "HiddenServiceAllowUnknownPorts 1\n"
|
|
|
+ "HiddenServiceMaxStreams 42\n"
|
|
|
+ "HiddenServiceMaxStreamsCloseCircuit 0\n"
|
|
|
+ "HiddenServiceDirGroupReadable 1\n"
|
|
|
+ "HiddenServiceNumIntroductionPoints 7\n";
|
|
|
+ ret = helper_config_service(conf, 1);
|
|
|
+ tt_int_op(ret, OP_EQ, 0);
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Valid complex configuration. Stealth client authorization. */
|
|
|
+ {
|
|
|
+ const char *conf =
|
|
|
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs2\n"
|
|
|
"HiddenServiceVersion 2\n"
|
|
|
- "HiddenServicePort 81\n";
|
|
|
+ "HiddenServicePort 65535\n"
|
|
|
+ "HiddenServicePort 22 1.1.1.1:22\n"
|
|
|
+ "HiddenServicePort 9000 unix:/path/to/socket\n"
|
|
|
+ "HiddenServiceAuthorizeClient stealth charlie,romeo\n"
|
|
|
+ "HiddenServiceAllowUnknownPorts 0\n"
|
|
|
+ "HiddenServiceMaxStreams 42\n"
|
|
|
+ "HiddenServiceMaxStreamsCloseCircuit 0\n"
|
|
|
+ "HiddenServiceDirGroupReadable 1\n"
|
|
|
+ "HiddenServiceNumIntroductionPoints 8\n";
|
|
|
+ ret = helper_config_service(conf, 1);
|
|
|
+ tt_int_op(ret, OP_EQ, 0);
|
|
|
+ }
|
|
|
+
|
|
|
+ done:
|
|
|
+ ;
|
|
|
+}
|
|
|
+
|
|
|
+static void
|
|
|
+test_invalid_service_v3(void *arg)
|
|
|
+{
|
|
|
+ int validate_only = 1, ret;
|
|
|
+
|
|
|
+ (void) arg;
|
|
|
+
|
|
|
+ /* Try with a missing port configuration. */
|
|
|
+ {
|
|
|
+ const char *conf =
|
|
|
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
|
|
|
+ "HiddenServiceVersion 3\n";
|
|
|
setup_full_capture_of_logs(LOG_WARN);
|
|
|
- ret = helper_config_service_v2(conf, validate_only);
|
|
|
+ ret = helper_config_service(conf, validate_only);
|
|
|
tt_int_op(ret, OP_EQ, -1);
|
|
|
- expect_log_msg_containing("Another hidden service is already "
|
|
|
- "configured for directory");
|
|
|
+ expect_log_msg_containing("with no ports configured.");
|
|
|
+ teardown_capture_of_logs();
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Too many introduction points. */
|
|
|
+ {
|
|
|
+ const char *conf =
|
|
|
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
|
|
|
+ "HiddenServiceVersion 3\n"
|
|
|
+ "HiddenServicePort 80\n"
|
|
|
+ "HiddenServiceNumIntroductionPoints 21\n"; /* One too many. */
|
|
|
+ setup_full_capture_of_logs(LOG_WARN);
|
|
|
+ ret = helper_config_service(conf, validate_only);
|
|
|
+ tt_int_op(ret, OP_EQ, -1);
|
|
|
+ expect_log_msg_containing("HiddenServiceNumIntroductionPoints must "
|
|
|
+ "be between 3 and 20, not 21.");
|
|
|
+ teardown_capture_of_logs();
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Too little introduction points. */
|
|
|
+ {
|
|
|
+ const char *conf =
|
|
|
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
|
|
|
+ "HiddenServiceVersion 3\n"
|
|
|
+ "HiddenServicePort 80\n"
|
|
|
+ "HiddenServiceNumIntroductionPoints 1\n";
|
|
|
+ setup_full_capture_of_logs(LOG_WARN);
|
|
|
+ ret = helper_config_service(conf, validate_only);
|
|
|
+ tt_int_op(ret, OP_EQ, -1);
|
|
|
+ expect_log_msg_containing("HiddenServiceNumIntroductionPoints must "
|
|
|
+ "be between 3 and 20, not 1.");
|
|
|
teardown_capture_of_logs();
|
|
|
}
|
|
|
|
|
@@ -141,45 +353,59 @@ test_invalid_service_v2(void *arg)
|
|
|
}
|
|
|
|
|
|
static void
|
|
|
-test_valid_service_v2(void *arg)
|
|
|
+test_valid_service_v3(void *arg)
|
|
|
{
|
|
|
int ret;
|
|
|
|
|
|
(void) arg;
|
|
|
|
|
|
- /* Valid complex configuration. Basic client authorization. */
|
|
|
+ /* Valid complex configuration. */
|
|
|
{
|
|
|
const char *conf =
|
|
|
"HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
|
|
|
- "HiddenServiceVersion 2\n"
|
|
|
+ "HiddenServiceVersion 3\n"
|
|
|
"HiddenServicePort 80\n"
|
|
|
"HiddenServicePort 22 localhost:22\n"
|
|
|
"HiddenServicePort 42 unix:/path/to/socket\n"
|
|
|
- "HiddenServiceAuthorizeClient basic alice,bob,eve\n"
|
|
|
"HiddenServiceAllowUnknownPorts 1\n"
|
|
|
"HiddenServiceMaxStreams 42\n"
|
|
|
"HiddenServiceMaxStreamsCloseCircuit 0\n"
|
|
|
"HiddenServiceDirGroupReadable 1\n"
|
|
|
"HiddenServiceNumIntroductionPoints 7\n";
|
|
|
- ret = helper_config_service_v2(conf, 1);
|
|
|
+ ret = helper_config_service(conf, 1);
|
|
|
tt_int_op(ret, OP_EQ, 0);
|
|
|
}
|
|
|
|
|
|
- /* Valid complex configuration. Stealth client authorization. */
|
|
|
+ /* Valid complex configuration. */
|
|
|
{
|
|
|
const char *conf =
|
|
|
"HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs2\n"
|
|
|
- "HiddenServiceVersion 2\n"
|
|
|
+ "HiddenServiceVersion 3\n"
|
|
|
"HiddenServicePort 65535\n"
|
|
|
"HiddenServicePort 22 1.1.1.1:22\n"
|
|
|
"HiddenServicePort 9000 unix:/path/to/socket\n"
|
|
|
- "HiddenServiceAuthorizeClient stealth charlie,romeo\n"
|
|
|
"HiddenServiceAllowUnknownPorts 0\n"
|
|
|
"HiddenServiceMaxStreams 42\n"
|
|
|
"HiddenServiceMaxStreamsCloseCircuit 0\n"
|
|
|
"HiddenServiceDirGroupReadable 1\n"
|
|
|
- "HiddenServiceNumIntroductionPoints 8\n";
|
|
|
- ret = helper_config_service_v2(conf, 1);
|
|
|
+ "HiddenServiceNumIntroductionPoints 20\n";
|
|
|
+ ret = helper_config_service(conf, 1);
|
|
|
+ tt_int_op(ret, OP_EQ, 0);
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Mix of v2 and v3. Still valid. */
|
|
|
+ {
|
|
|
+ const char *conf =
|
|
|
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs1\n"
|
|
|
+ "HiddenServiceVersion 2\n"
|
|
|
+ "HiddenServicePort 80\n"
|
|
|
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs2\n"
|
|
|
+ "HiddenServiceVersion 3\n"
|
|
|
+ "HiddenServicePort 81\n"
|
|
|
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs3\n"
|
|
|
+ "HiddenServiceVersion 2\n"
|
|
|
+ "HiddenServicePort 82\n";
|
|
|
+ ret = helper_config_service(conf, 1);
|
|
|
tt_int_op(ret, OP_EQ, 0);
|
|
|
}
|
|
|
|
|
@@ -187,12 +413,65 @@ test_valid_service_v2(void *arg)
|
|
|
;
|
|
|
}
|
|
|
|
|
|
+static void
|
|
|
+test_staging_service_v3(void *arg)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ (void) arg;
|
|
|
+
|
|
|
+ /* We don't validate a service object, this is the service test that are in
|
|
|
+ * charge of doing so. We just check for the stable state after
|
|
|
+ * registration. */
|
|
|
+
|
|
|
+ hs_init();
|
|
|
+
|
|
|
+ /* Time for a valid v3 service that should get staged. */
|
|
|
+ const char *conf =
|
|
|
+ "HiddenServiceDir /tmp/tor-test-hs-RANDOM/hs2\n"
|
|
|
+ "HiddenServiceVersion 3\n"
|
|
|
+ "HiddenServicePort 65535\n"
|
|
|
+ "HiddenServicePort 22 1.1.1.1:22\n"
|
|
|
+ "HiddenServicePort 9000 unix:/path/to/socket\n"
|
|
|
+ "HiddenServiceAllowUnknownPorts 0\n"
|
|
|
+ "HiddenServiceMaxStreams 42\n"
|
|
|
+ "HiddenServiceMaxStreamsCloseCircuit 0\n"
|
|
|
+ "HiddenServiceDirGroupReadable 1\n"
|
|
|
+ "HiddenServiceNumIntroductionPoints 20\n";
|
|
|
+ ret = helper_config_service(conf, 0);
|
|
|
+ tt_int_op(ret, OP_EQ, 0);
|
|
|
+ /* Ok, we have a service in our map! Registration went well. */
|
|
|
+ tt_int_op(get_hs_service_staging_list_size(), OP_EQ, 1);
|
|
|
+ /* Make sure we don't have a magic v2 service out of this. */
|
|
|
+ tt_int_op(num_rend_services(), OP_EQ, 0);
|
|
|
+
|
|
|
+ done:
|
|
|
+ hs_free_all();
|
|
|
+}
|
|
|
+
|
|
|
struct testcase_t hs_config_tests[] = {
|
|
|
+ /* Invalid service not specific to any version. */
|
|
|
+ { "invalid_service", test_invalid_service, TT_FORK,
|
|
|
+ NULL, NULL },
|
|
|
+ { "valid_service", test_valid_service, TT_FORK,
|
|
|
+ NULL, NULL },
|
|
|
+
|
|
|
+ /* Test case only for version 2. */
|
|
|
{ "invalid_service_v2", test_invalid_service_v2, TT_FORK,
|
|
|
NULL, NULL },
|
|
|
{ "valid_service_v2", test_valid_service_v2, TT_FORK,
|
|
|
NULL, NULL },
|
|
|
|
|
|
+ /* Test case only for version 3. */
|
|
|
+ { "invalid_service_v3", test_invalid_service_v3, TT_FORK,
|
|
|
+ NULL, NULL },
|
|
|
+ { "valid_service_v3", test_valid_service_v3, TT_FORK,
|
|
|
+ NULL, NULL },
|
|
|
+
|
|
|
+ /* Test service staging. */
|
|
|
+ { "staging_service_v3", test_staging_service_v3, TT_FORK,
|
|
|
+ NULL, NULL },
|
|
|
+
|
|
|
END_OF_TESTCASES
|
|
|
};
|
|
|
|