xref: /aosp_15_r20/external/perfetto/src/ipc/test/test_socket.h (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
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