1*6dbdd20aSAndroid Build Coastguard Worker /*
2*6dbdd20aSAndroid Build Coastguard Worker * Copyright (C) 2017 The Android Open Source Project
3*6dbdd20aSAndroid Build Coastguard Worker *
4*6dbdd20aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*6dbdd20aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*6dbdd20aSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*6dbdd20aSAndroid Build Coastguard Worker *
8*6dbdd20aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*6dbdd20aSAndroid Build Coastguard Worker *
10*6dbdd20aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*6dbdd20aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*6dbdd20aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6dbdd20aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*6dbdd20aSAndroid Build Coastguard Worker * limitations under the License.
15*6dbdd20aSAndroid Build Coastguard Worker */
16*6dbdd20aSAndroid Build Coastguard Worker
17*6dbdd20aSAndroid Build Coastguard Worker #ifndef SRC_IPC_TEST_TEST_SOCKET_H_
18*6dbdd20aSAndroid Build Coastguard Worker #define SRC_IPC_TEST_TEST_SOCKET_H_
19*6dbdd20aSAndroid Build Coastguard Worker
20*6dbdd20aSAndroid Build Coastguard Worker #include <stdint.h>
21*6dbdd20aSAndroid Build Coastguard Worker #include <stdio.h>
22*6dbdd20aSAndroid Build Coastguard Worker
23*6dbdd20aSAndroid Build Coastguard Worker #include <cinttypes>
24*6dbdd20aSAndroid Build Coastguard Worker
25*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/base/build_config.h"
26*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/unix_socket.h"
27*6dbdd20aSAndroid Build Coastguard Worker
28*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto {
29*6dbdd20aSAndroid Build Coastguard Worker namespace ipc {
30*6dbdd20aSAndroid Build Coastguard Worker
31*6dbdd20aSAndroid Build Coastguard Worker struct TestSocket {
TestSocketTestSocket32*6dbdd20aSAndroid Build Coastguard Worker explicit constexpr TestSocket(const char* test_name)
33*6dbdd20aSAndroid Build Coastguard Worker : test_name_(test_name) {}
34*6dbdd20aSAndroid Build Coastguard Worker
35*6dbdd20aSAndroid Build Coastguard Worker const char* test_name_;
36*6dbdd20aSAndroid Build Coastguard Worker char buf_[64]{};
37*6dbdd20aSAndroid Build Coastguard Worker
38*6dbdd20aSAndroid Build Coastguard Worker // Inline to avoid multiple definition linker warnings (and avoid a .cc file).
39*6dbdd20aSAndroid Build Coastguard Worker inline base::SockFamily family();
40*6dbdd20aSAndroid Build Coastguard Worker inline const char* name();
41*6dbdd20aSAndroid Build Coastguard Worker inline void Destroy();
42*6dbdd20aSAndroid Build Coastguard Worker };
43*6dbdd20aSAndroid Build Coastguard Worker
44*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
45*6dbdd20aSAndroid Build Coastguard Worker
name()46*6dbdd20aSAndroid Build Coastguard Worker const char* TestSocket::name() {
47*6dbdd20aSAndroid Build Coastguard Worker uint64_t hash = 5381;
48*6dbdd20aSAndroid Build Coastguard Worker for (const char* c = test_name_; *c; c++)
49*6dbdd20aSAndroid Build Coastguard Worker hash = 33 * hash + static_cast<uint64_t>(*c);
50*6dbdd20aSAndroid Build Coastguard Worker snprintf(buf_, sizeof(buf_), "127.0.0.1:%" PRIu64, 40000 + (hash % 20000));
51*6dbdd20aSAndroid Build Coastguard Worker return buf_;
52*6dbdd20aSAndroid Build Coastguard Worker }
family()53*6dbdd20aSAndroid Build Coastguard Worker base::SockFamily TestSocket::family() {
54*6dbdd20aSAndroid Build Coastguard Worker return base::SockFamily::kInet;
55*6dbdd20aSAndroid Build Coastguard Worker }
Destroy()56*6dbdd20aSAndroid Build Coastguard Worker void TestSocket::Destroy() {}
57*6dbdd20aSAndroid Build Coastguard Worker
58*6dbdd20aSAndroid Build Coastguard Worker #elif PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID)
59*6dbdd20aSAndroid Build Coastguard Worker
name()60*6dbdd20aSAndroid Build Coastguard Worker const char* TestSocket::name() {
61*6dbdd20aSAndroid Build Coastguard Worker snprintf(buf_, sizeof(buf_), "@%s", test_name_);
62*6dbdd20aSAndroid Build Coastguard Worker return buf_;
63*6dbdd20aSAndroid Build Coastguard Worker }
family()64*6dbdd20aSAndroid Build Coastguard Worker base::SockFamily TestSocket::family() {
65*6dbdd20aSAndroid Build Coastguard Worker return base::SockFamily::kUnix;
66*6dbdd20aSAndroid Build Coastguard Worker }
Destroy()67*6dbdd20aSAndroid Build Coastguard Worker void TestSocket::Destroy() {}
68*6dbdd20aSAndroid Build Coastguard Worker
69*6dbdd20aSAndroid Build Coastguard Worker #elif PERFETTO_BUILDFLAG(PERFETTO_OS_FUCHSIA)
70*6dbdd20aSAndroid Build Coastguard Worker
name()71*6dbdd20aSAndroid Build Coastguard Worker const char* TestSocket::name() {
72*6dbdd20aSAndroid Build Coastguard Worker return "zx_socket";
73*6dbdd20aSAndroid Build Coastguard Worker }
family()74*6dbdd20aSAndroid Build Coastguard Worker base::SockFamily TestSocket::family() {
75*6dbdd20aSAndroid Build Coastguard Worker return base::SockFamily::kUnix;
76*6dbdd20aSAndroid Build Coastguard Worker }
Destroy()77*6dbdd20aSAndroid Build Coastguard Worker void TestSocket::Destroy() {}
78*6dbdd20aSAndroid Build Coastguard Worker
79*6dbdd20aSAndroid Build Coastguard Worker #else
80*6dbdd20aSAndroid Build Coastguard Worker
name()81*6dbdd20aSAndroid Build Coastguard Worker const char* TestSocket::name() {
82*6dbdd20aSAndroid Build Coastguard Worker snprintf(buf_, sizeof(buf_), "/tmp/%s.sock", test_name_);
83*6dbdd20aSAndroid Build Coastguard Worker return buf_;
84*6dbdd20aSAndroid Build Coastguard Worker }
family()85*6dbdd20aSAndroid Build Coastguard Worker base::SockFamily TestSocket::family() {
86*6dbdd20aSAndroid Build Coastguard Worker return base::SockFamily::kUnix;
87*6dbdd20aSAndroid Build Coastguard Worker }
Destroy()88*6dbdd20aSAndroid Build Coastguard Worker void TestSocket::Destroy() {
89*6dbdd20aSAndroid Build Coastguard Worker remove(name());
90*6dbdd20aSAndroid Build Coastguard Worker }
91*6dbdd20aSAndroid Build Coastguard Worker #endif
92*6dbdd20aSAndroid Build Coastguard Worker
93*6dbdd20aSAndroid Build Coastguard Worker } // namespace ipc
94*6dbdd20aSAndroid Build Coastguard Worker } // namespace perfetto
95*6dbdd20aSAndroid Build Coastguard Worker
96*6dbdd20aSAndroid Build Coastguard Worker #endif // SRC_IPC_TEST_TEST_SOCKET_H_
97