summaryrefslogtreecommitdiffstats
path: root/vespalib/src/tests/net/socket_spec/socket_spec_test.cpp
blob: ca00377f049b072980915a1fa1cb23a13b59cc81 (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
// Copyright 2017 Yahoo Inc. 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 &host, int port) {
    EXPECT_EQUAL(spec.valid(), valid);
    EXPECT_EQUAL(spec.path(), path);
    EXPECT_EQUAL(spec.host(), host);
    EXPECT_EQUAL(spec.port(), port);
}

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

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

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

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

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

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

TEST("require that socket spec can be created directly from host and port") {
    TEST_DO(verify(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(SocketSpec::from_port(123), 123));
}

TEST("require that empty spec is invalid") {
    TEST_DO(verify_invalid(SocketSpec("")));
}

TEST("require that bogus spec is invalid") {
    TEST_DO(verify_invalid(SocketSpec("bogus")));
}

TEST("require that socket spec can parse ipc spec") {
    TEST_DO(verify(SocketSpec("ipc/file:my_path"), "my_path"));
}

TEST("require that empty ipc path gives invalid socket spec") {
    TEST_DO(verify_invalid(SocketSpec("ipc/file:")));
}

TEST("require that socket spec can parse host/port spec") {
    TEST_DO(verify(SocketSpec("tcp/my_host:123"), "my_host", 123));
}

TEST("require that socket spec can parse port only spec") {
    TEST_DO(verify(SocketSpec("tcp/123"), 123));
}

TEST("require that socket spec can parse the one true listen spec") {
    TEST_DO(verify(SocketSpec("tcp/0"), 0));
}

TEST("require that host port separator can be given also without host") {
    TEST_DO(verify(SocketSpec("tcp/:123"), 123));
    TEST_DO(verify(SocketSpec("tcp/:0"), 0));
}

TEST("require that non-number port gives invalid spec") {
    TEST_DO(verify_invalid(SocketSpec("tcp/host:xyz")));
    TEST_DO(verify_invalid(SocketSpec("tcp/xyz")));
}

TEST("require that negative port gives invalid spec") {
    TEST_DO(verify_invalid(SocketSpec("tcp/host:-123")));
    TEST_DO(verify_invalid(SocketSpec("tcp/-123")));
}

TEST("require that missing port number gives invalid spec") {
    TEST_DO(verify_invalid(SocketSpec("tcp/host:")));
    TEST_DO(verify_invalid(SocketSpec("tcp/")));
}

TEST("require that host can be quoted") {
    TEST_DO(verify(SocketSpec("tcp/[my:host]:123"), "my:host", 123));
}

TEST("require that missing host can be quoted") {
    TEST_DO(verify(SocketSpec("tcp/[]:123"), 123));
}

TEST("require that partial quotes are treated as host") {
    TEST_DO(verify(SocketSpec("tcp/[:123"), "[", 123));
    TEST_DO(verify(SocketSpec("tcp/]:123"), "]", 123));
}

TEST("require that inconvenient hosts can be parsed without quotes") {
    TEST_DO(verify(SocketSpec("tcp/my:host:123"), "my:host", 123));
}

TEST_MAIN() { TEST_RUN_ALL(); }