summaryrefslogtreecommitdiffstats
path: root/vespalib/src/tests/net/socket_spec/socket_spec_test.cpp
blob: 8e2e2f0e8b7c995083c3b1a8e8ac34f8e5cd1341 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#include <vespa/vespalib/testkit/test_kit.h>
#include <vespa/vespalib/net/socket_spec.h>

using namespace vespalib;

void verify(const SocketSpec &spec, bool valid,
            const vespalib::string &path, const vespalib::string &name,
            const vespalib::string &host, int port)
{
    EXPECT_EQUAL(spec.valid(), valid);
    EXPECT_EQUAL(spec.path(), path);
    EXPECT_EQUAL(spec.name(), name);
    EXPECT_EQUAL(spec.host(), host);
    EXPECT_EQUAL(spec.port(), port);
}

void verify_path(const SocketSpec &spec, const vespalib::string &path) {
    TEST_DO(verify(spec, true, path, "", "", -1));
}

void verify_name(const SocketSpec &spec, const vespalib::string &name) {
    TEST_DO(verify(spec, true, "", name, "", -1));
}

void verify_host_port(const SocketSpec &spec, const vespalib::string &host, int port) {
    TEST_DO(verify(spec, true, "", "", host, port));
}

void verify_port(const SocketSpec &spec, int port) {
    TEST_DO(verify(spec, true, "", "", "", port));
}

void verify_invalid(const SocketSpec &spec) {
    TEST_DO(verify(spec, false, "", "", "", -1));
}

void verify_spec(const vespalib::string &str, const vespalib::string &expect) {
    vespalib::string actual = SocketSpec(str).spec();
    EXPECT_EQUAL(actual, expect);
}

void verify_spec(const vespalib::string &str) {
    TEST_DO(verify_spec(str, str));
}

//-----------------------------------------------------------------------------

TEST("require that socket spec can be created directly from path") {
    TEST_DO(verify_path(SocketSpec::from_path("my_path"), "my_path"));
}

TEST("require that socket spec can be created directly from name") {
    TEST_DO(verify_name(SocketSpec::from_name("my_name"), "my_name"));
}

TEST("require that socket spec can be created directly from host and port") {
    TEST_DO(verify_host_port(SocketSpec::from_host_port("my_host", 123), "my_host", 123));
}

TEST("require that socket spec can be created directly from port only") {
    TEST_DO(verify_port(SocketSpec::from_port(123), 123));
}

TEST("require that socket spec parsing works as expected") {
    TEST_DO(verify_invalid(SocketSpec("")));
    TEST_DO(verify_invalid(SocketSpec("bogus")));
    TEST_DO(verify_path(SocketSpec("ipc/file:my_path"), "my_path"));
    TEST_DO(verify_invalid(SocketSpec("ipc/file:")));
    TEST_DO(verify_name(SocketSpec("ipc/name:my_name"), "my_name"));
    TEST_DO(verify_invalid(SocketSpec("ipc/name:")));
    TEST_DO(verify_host_port(SocketSpec("tcp/my_host:123"), "my_host", 123));
    TEST_DO(verify_port(SocketSpec("tcp/123"), 123));
    TEST_DO(verify_port(SocketSpec("tcp/0"), 0));
    TEST_DO(verify_invalid(SocketSpec("tcp/:123")));
    TEST_DO(verify_invalid(SocketSpec("tcp/:0")));
    TEST_DO(verify_invalid(SocketSpec("tcp/host:xyz")));
    TEST_DO(verify_invalid(SocketSpec("tcp/xyz")));
    TEST_DO(verify_invalid(SocketSpec("tcp/host:-123")));
    TEST_DO(verify_invalid(SocketSpec("tcp/-123")));
    TEST_DO(verify_invalid(SocketSpec("tcp/host:")));
    TEST_DO(verify_invalid(SocketSpec("tcp/")));
    TEST_DO(verify_host_port(SocketSpec("tcp/[my:host]:123"), "my:host", 123));
    TEST_DO(verify_invalid(SocketSpec("tcp/[]:123")));
    TEST_DO(verify_host_port(SocketSpec("tcp/[:123"), "[", 123));
    TEST_DO(verify_host_port(SocketSpec("tcp/]:123"), "]", 123));
    TEST_DO(verify_host_port(SocketSpec("tcp/my:host:123"), "my:host", 123));
}

TEST("require that socket spec to string transform works as expected") {
    TEST_DO(verify_spec("invalid"));
    TEST_DO(verify_spec("bogus", "invalid"));
    TEST_DO(verify_spec("ipc/file:my_path"));
    TEST_DO(verify_spec("ipc/name:my_name"));
    TEST_DO(verify_spec("tcp/123"));
    TEST_DO(verify_spec("tcp/0"));
    TEST_DO(verify_spec("tcp/host:123"));
    TEST_DO(verify_spec("tcp/[my:host]:123"));
    TEST_DO(verify_spec("tcp/[host]:123", "tcp/host:123"));
}

TEST("require that port-only spec resolves to wildcard server address") {
    EXPECT_TRUE(SocketSpec("tcp/123").server_address().is_wildcard());
}

TEST("require that port-only spec resolves to non-wildcard client address") {
    EXPECT_TRUE(!SocketSpec("tcp/123").client_address().is_wildcard());
}

TEST_MAIN() { TEST_RUN_ALL(); }