mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Internal change.
PiperOrigin-RevId: 265535438
This commit is contained in:
@@ -122,3 +122,6 @@ def sh_test(**kwargs):
|
||||
native.sh_test(
|
||||
**kwargs
|
||||
)
|
||||
|
||||
def select_for_linux(for_linux, for_others = []):
|
||||
return for_linux
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
load("//test/syscalls:build_defs.bzl", "select_for_linux")
|
||||
|
||||
package(
|
||||
default_visibility = ["//:sandbox"],
|
||||
licenses = ["notice"],
|
||||
@@ -108,20 +110,27 @@ cc_library(
|
||||
cc_library(
|
||||
name = "socket_test_util",
|
||||
testonly = 1,
|
||||
srcs = ["socket_test_util.cc"],
|
||||
srcs = [
|
||||
"socket_test_util.cc",
|
||||
] + select_for_linux(
|
||||
[
|
||||
"socket_test_util_impl.cc",
|
||||
],
|
||||
),
|
||||
hdrs = ["socket_test_util.h"],
|
||||
deps = [
|
||||
"@com_google_googletest//:gtest",
|
||||
"@com_google_absl//absl/memory",
|
||||
"@com_google_absl//absl/strings",
|
||||
"@com_google_absl//absl/strings:str_format",
|
||||
"@com_google_absl//absl/time",
|
||||
"//test/util:file_descriptor",
|
||||
"//test/util:posix_error",
|
||||
"//test/util:temp_path",
|
||||
"//test/util:test_util",
|
||||
"//test/util:thread_util",
|
||||
"@com_google_absl//absl/memory",
|
||||
"@com_google_absl//absl/strings",
|
||||
"@com_google_absl//absl/strings:str_format",
|
||||
"@com_google_absl//absl/time",
|
||||
"@com_google_googletest//:gtest",
|
||||
],
|
||||
] + select_for_linux([
|
||||
]),
|
||||
)
|
||||
|
||||
cc_library(
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
// limitations under the License.
|
||||
|
||||
#include <sched.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
||||
|
||||
@@ -30,12 +30,25 @@ TEST(SocketTest, UnixSocketPairProtocol) {
|
||||
close(socks[1]);
|
||||
}
|
||||
|
||||
TEST(SocketTest, Protocol) {
|
||||
TEST(SocketTest, ProtocolUnix) {
|
||||
struct {
|
||||
int domain, type, protocol;
|
||||
} tests[] = {
|
||||
{AF_UNIX, SOCK_STREAM, PF_UNIX}, {AF_UNIX, SOCK_SEQPACKET, PF_UNIX},
|
||||
{AF_UNIX, SOCK_DGRAM, PF_UNIX}, {AF_INET, SOCK_DGRAM, IPPROTO_UDP},
|
||||
{AF_UNIX, SOCK_STREAM, PF_UNIX},
|
||||
{AF_UNIX, SOCK_SEQPACKET, PF_UNIX},
|
||||
{AF_UNIX, SOCK_DGRAM, PF_UNIX},
|
||||
};
|
||||
for (int i = 0; i < ABSL_ARRAYSIZE(tests); i++) {
|
||||
ASSERT_NO_ERRNO_AND_VALUE(
|
||||
Socket(tests[i].domain, tests[i].type, tests[i].protocol));
|
||||
}
|
||||
}
|
||||
|
||||
TEST(SocketTest, ProtocolInet) {
|
||||
struct {
|
||||
int domain, type, protocol;
|
||||
} tests[] = {
|
||||
{AF_INET, SOCK_DGRAM, IPPROTO_UDP},
|
||||
{AF_INET, SOCK_STREAM, IPPROTO_TCP},
|
||||
};
|
||||
for (int i = 0; i < ABSL_ARRAYSIZE(tests); i++) {
|
||||
|
||||
@@ -588,8 +588,9 @@ ssize_t SendLargeSendMsg(const std::unique_ptr<SocketPair>& sockets,
|
||||
return RetryEINTR(sendmsg)(sockets->first_fd(), &msg, 0);
|
||||
}
|
||||
|
||||
PosixErrorOr<int> PortAvailable(int port, AddressFamily family, SocketType type,
|
||||
bool reuse_addr) {
|
||||
namespace internal {
|
||||
PosixErrorOr<int> TryPortAvailable(int port, AddressFamily family,
|
||||
SocketType type, bool reuse_addr) {
|
||||
if (port < 0) {
|
||||
return PosixError(EINVAL, "Invalid port");
|
||||
}
|
||||
@@ -664,10 +665,7 @@ PosixErrorOr<int> PortAvailable(int port, AddressFamily family, SocketType type,
|
||||
|
||||
return available_port;
|
||||
}
|
||||
|
||||
PosixError FreeAvailablePort(int port) {
|
||||
return NoError();
|
||||
}
|
||||
} // namespace internal
|
||||
|
||||
PosixErrorOr<int> SendMsg(int sock, msghdr* msg, char buf[], int buf_size) {
|
||||
struct iovec iov;
|
||||
|
||||
@@ -492,6 +492,11 @@ uint16_t UDPChecksum(struct iphdr iphdr, struct udphdr udphdr,
|
||||
uint16_t ICMPChecksum(struct icmphdr icmphdr, const char* payload,
|
||||
ssize_t payload_len);
|
||||
|
||||
namespace internal {
|
||||
PosixErrorOr<int> TryPortAvailable(int port, AddressFamily family,
|
||||
SocketType type, bool reuse_addr);
|
||||
} // namespace internal
|
||||
|
||||
} // namespace testing
|
||||
} // namespace gvisor
|
||||
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
// Copyright 2019 The gVisor Authors.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#include "test/syscalls/linux/socket_test_util.h"
|
||||
|
||||
namespace gvisor {
|
||||
namespace testing {
|
||||
|
||||
PosixErrorOr<int> PortAvailable(int port, AddressFamily family, SocketType type,
|
||||
bool reuse_addr) {
|
||||
return internal::TryPortAvailable(port, family, type, reuse_addr);
|
||||
}
|
||||
|
||||
PosixError FreeAvailablePort(int port) { return NoError(); }
|
||||
|
||||
} // namespace testing
|
||||
} // namespace gvisor
|
||||
+7
-1
@@ -1,3 +1,5 @@
|
||||
load("//test/syscalls:build_defs.bzl", "select_for_linux")
|
||||
|
||||
package(
|
||||
default_visibility = ["//:sandbox"],
|
||||
licenses = ["notice"],
|
||||
@@ -139,7 +141,11 @@ cc_library(
|
||||
cc_library(
|
||||
name = "save_util",
|
||||
testonly = 1,
|
||||
srcs = ["save_util.cc"],
|
||||
srcs = ["save_util.cc"] +
|
||||
select_for_linux(
|
||||
["save_util_linux.cc"],
|
||||
["save_util_other.cc"],
|
||||
),
|
||||
hdrs = ["save_util.h"],
|
||||
)
|
||||
|
||||
|
||||
@@ -16,8 +16,8 @@
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <atomic>
|
||||
#include <cerrno>
|
||||
|
||||
@@ -61,13 +61,11 @@ void DisableSave::reset() {
|
||||
}
|
||||
}
|
||||
|
||||
void MaybeSave() {
|
||||
if (CooperativeSaveEnabled() && !save_disable.load()) {
|
||||
int orig_errno = errno;
|
||||
syscall(SYS_create_module, nullptr, 0);
|
||||
errno = orig_errno;
|
||||
}
|
||||
namespace internal {
|
||||
bool ShouldSave() {
|
||||
return CooperativeSaveEnabled() && (save_disable.load() == 0);
|
||||
}
|
||||
} // namespace internal
|
||||
|
||||
} // namespace testing
|
||||
} // namespace gvisor
|
||||
|
||||
@@ -41,6 +41,11 @@ class DisableSave {
|
||||
//
|
||||
// errno is guaranteed to be preserved.
|
||||
void MaybeSave();
|
||||
|
||||
namespace internal {
|
||||
bool ShouldSave();
|
||||
} // namespace internal
|
||||
|
||||
} // namespace testing
|
||||
} // namespace gvisor
|
||||
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
// Copyright 2019 The gVisor Authors.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#include <errno.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "test/util/save_util.h"
|
||||
|
||||
namespace gvisor {
|
||||
namespace testing {
|
||||
|
||||
void MaybeSave() {
|
||||
if (internal::ShouldSave()) {
|
||||
int orig_errno = errno;
|
||||
syscall(SYS_create_module, nullptr, 0);
|
||||
errno = orig_errno;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace testing
|
||||
} // namespace gvisor
|
||||
@@ -0,0 +1,23 @@
|
||||
// Copyright 2019 The gVisor Authors.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
namespace gvisor {
|
||||
namespace testing {
|
||||
|
||||
void MaybeSave() {
|
||||
// Saving is never available in a non-linux environment.
|
||||
}
|
||||
|
||||
} // namespace testing
|
||||
} // namespace gvisor
|
||||
+11
-7
@@ -16,7 +16,9 @@
|
||||
#define GVISOR_TEST_UTIL_THREAD_UTIL_H_
|
||||
|
||||
#include <pthread.h>
|
||||
#ifdef __linux__
|
||||
#include <sys/syscall.h>
|
||||
#endif
|
||||
#include <unistd.h>
|
||||
|
||||
#include <functional>
|
||||
@@ -66,13 +68,13 @@ class ScopedThread {
|
||||
|
||||
private:
|
||||
void CreateThread() {
|
||||
TEST_PCHECK_MSG(
|
||||
pthread_create(&pt_, /* attr = */ nullptr,
|
||||
+[](void* arg) -> void* {
|
||||
return static_cast<ScopedThread*>(arg)->f_();
|
||||
},
|
||||
this) == 0,
|
||||
"thread creation failed");
|
||||
TEST_PCHECK_MSG(pthread_create(
|
||||
&pt_, /* attr = */ nullptr,
|
||||
+[](void* arg) -> void* {
|
||||
return static_cast<ScopedThread*>(arg)->f_();
|
||||
},
|
||||
this) == 0,
|
||||
"thread creation failed");
|
||||
}
|
||||
|
||||
std::function<void*()> f_;
|
||||
@@ -81,7 +83,9 @@ class ScopedThread {
|
||||
void* retval_ = nullptr;
|
||||
};
|
||||
|
||||
#ifdef __linux__
|
||||
inline pid_t gettid() { return syscall(SYS_gettid); }
|
||||
#endif
|
||||
|
||||
} // namespace testing
|
||||
} // namespace gvisor
|
||||
|
||||
Reference in New Issue
Block a user