mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Correctly set the test VFS environment variable.
Also fix test bugs uncovered now that they aren't silently skipped on VFS2. Updates #1487. PiperOrigin-RevId: 316415807
This commit is contained in:
committed by
gVisor bot
parent
3b5eaad3c8
commit
f23f62c2c2
@@ -352,11 +352,15 @@ func runTestCaseRunsc(testBin string, tc gtest.TestCase, t *testing.T) {
|
||||
|
||||
// Set environment variables that indicate we are running in gVisor with
|
||||
// the given platform, network, and filesystem stack.
|
||||
// TODO(gvisor.dev/issue/1487): Update this when the runner supports VFS2.
|
||||
platformVar := "TEST_ON_GVISOR"
|
||||
networkVar := "GVISOR_NETWORK"
|
||||
env := append(os.Environ(), platformVar+"="+*platform, networkVar+"="+*network)
|
||||
vfsVar := "GVISOR_VFS"
|
||||
env := append(os.Environ(), platformVar+"="+*platform, networkVar+"="+*network, vfsVar+"=VFS1")
|
||||
if *vfs2 {
|
||||
env = append(env, vfsVar+"=VFS2")
|
||||
} else {
|
||||
env = append(env, vfsVar+"=VFS1")
|
||||
}
|
||||
|
||||
// Remove env variables that cause the gunit binary to write output
|
||||
// files, since they will stomp on eachother, and on the output files
|
||||
|
||||
@@ -68,6 +68,11 @@ syscall_test(
|
||||
vfs2 = "True",
|
||||
)
|
||||
|
||||
syscall_test(
|
||||
test = "//test/syscalls/linux:socket_capability_test",
|
||||
vfs2 = "True",
|
||||
)
|
||||
|
||||
syscall_test(
|
||||
size = "large",
|
||||
shard_count = 50,
|
||||
|
||||
@@ -363,9 +363,24 @@ cc_binary(
|
||||
linkstatic = 1,
|
||||
deps = [
|
||||
":socket_test_util",
|
||||
gtest,
|
||||
"//test/util:file_descriptor",
|
||||
"//test/util:temp_umask",
|
||||
"//test/util:test_main",
|
||||
"//test/util:test_util",
|
||||
],
|
||||
)
|
||||
|
||||
cc_binary(
|
||||
name = "socket_capability_test",
|
||||
testonly = 1,
|
||||
srcs = ["socket_capability.cc"],
|
||||
linkstatic = 1,
|
||||
deps = [
|
||||
":socket_test_util",
|
||||
"//test/util:capability_util",
|
||||
"//test/util:file_descriptor",
|
||||
gtest,
|
||||
"//test/util:temp_umask",
|
||||
"//test/util:test_main",
|
||||
"//test/util:test_util",
|
||||
],
|
||||
|
||||
@@ -86,37 +86,12 @@ TEST(SocketTest, UnixSocketStat) {
|
||||
EXPECT_EQ(statbuf.st_mode, S_IFSOCK | sock_perm & ~mask);
|
||||
|
||||
// Timestamps should be equal and non-zero.
|
||||
EXPECT_NE(statbuf.st_atime, 0);
|
||||
EXPECT_EQ(statbuf.st_atime, statbuf.st_mtime);
|
||||
EXPECT_EQ(statbuf.st_atime, statbuf.st_ctime);
|
||||
}
|
||||
|
||||
TEST(SocketTest, UnixConnectNeedsWritePerm) {
|
||||
SKIP_IF(IsRunningWithVFS1());
|
||||
|
||||
FileDescriptor bound =
|
||||
ASSERT_NO_ERRNO_AND_VALUE(Socket(AF_UNIX, SOCK_STREAM, PF_UNIX));
|
||||
|
||||
struct sockaddr_un addr =
|
||||
ASSERT_NO_ERRNO_AND_VALUE(UniqueUnixAddr(/*abstract=*/false, AF_UNIX));
|
||||
ASSERT_THAT(bind(bound.get(), reinterpret_cast<struct sockaddr*>(&addr),
|
||||
sizeof(addr)),
|
||||
SyscallSucceeds());
|
||||
ASSERT_THAT(listen(bound.get(), 1), SyscallSucceeds());
|
||||
|
||||
// Connect should fail without write perms.
|
||||
ASSERT_THAT(chmod(addr.sun_path, 0500), SyscallSucceeds());
|
||||
FileDescriptor client =
|
||||
ASSERT_NO_ERRNO_AND_VALUE(Socket(AF_UNIX, SOCK_STREAM, PF_UNIX));
|
||||
EXPECT_THAT(connect(client.get(), reinterpret_cast<struct sockaddr*>(&addr),
|
||||
sizeof(addr)),
|
||||
SyscallFailsWithErrno(EACCES));
|
||||
|
||||
// Connect should succeed with write perms.
|
||||
ASSERT_THAT(chmod(addr.sun_path, 0200), SyscallSucceeds());
|
||||
EXPECT_THAT(connect(client.get(), reinterpret_cast<struct sockaddr*>(&addr),
|
||||
sizeof(addr)),
|
||||
SyscallSucceeds());
|
||||
// TODO(b/158882152): Sockets currently don't implement timestamps.
|
||||
if (!IsRunningOnGvisor()) {
|
||||
EXPECT_NE(statbuf.st_atime, 0);
|
||||
EXPECT_EQ(statbuf.st_atime, statbuf.st_mtime);
|
||||
EXPECT_EQ(statbuf.st_atime, statbuf.st_ctime);
|
||||
}
|
||||
}
|
||||
|
||||
using SocketOpenTest = ::testing::TestWithParam<int>;
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
// Copyright 2018 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.
|
||||
|
||||
// Subset of socket tests that need Linux-specific headers (compared to POSIX
|
||||
// headers).
|
||||
|
||||
#include "gtest/gtest.h"
|
||||
#include "test/syscalls/linux/socket_test_util.h"
|
||||
#include "test/util/capability_util.h"
|
||||
#include "test/util/file_descriptor.h"
|
||||
#include "test/util/test_util.h"
|
||||
|
||||
namespace gvisor {
|
||||
namespace testing {
|
||||
|
||||
TEST(SocketTest, UnixConnectNeedsWritePerm) {
|
||||
SKIP_IF(IsRunningWithVFS1());
|
||||
|
||||
FileDescriptor bound =
|
||||
ASSERT_NO_ERRNO_AND_VALUE(Socket(AF_UNIX, SOCK_STREAM, PF_UNIX));
|
||||
|
||||
struct sockaddr_un addr =
|
||||
ASSERT_NO_ERRNO_AND_VALUE(UniqueUnixAddr(/*abstract=*/false, AF_UNIX));
|
||||
ASSERT_THAT(bind(bound.get(), reinterpret_cast<struct sockaddr*>(&addr),
|
||||
sizeof(addr)),
|
||||
SyscallSucceeds());
|
||||
ASSERT_THAT(listen(bound.get(), 1), SyscallSucceeds());
|
||||
|
||||
// Drop capabilites that allow us to override permision checks. Otherwise if
|
||||
// the test is run as root, the connect below will bypass permission checks
|
||||
// and succeed unexpectedly.
|
||||
ASSERT_NO_ERRNO(SetCapability(CAP_DAC_OVERRIDE, false));
|
||||
|
||||
// Connect should fail without write perms.
|
||||
ASSERT_THAT(chmod(addr.sun_path, 0500), SyscallSucceeds());
|
||||
FileDescriptor client =
|
||||
ASSERT_NO_ERRNO_AND_VALUE(Socket(AF_UNIX, SOCK_STREAM, PF_UNIX));
|
||||
ASSERT_THAT(connect(client.get(), reinterpret_cast<struct sockaddr*>(&addr),
|
||||
sizeof(addr)),
|
||||
SyscallFailsWithErrno(EACCES));
|
||||
|
||||
// Connect should succeed with write perms.
|
||||
ASSERT_THAT(chmod(addr.sun_path, 0200), SyscallSucceeds());
|
||||
EXPECT_THAT(connect(client.get(), reinterpret_cast<struct sockaddr*>(&addr),
|
||||
sizeof(addr)),
|
||||
SyscallSucceeds());
|
||||
}
|
||||
|
||||
} // namespace testing
|
||||
} // namespace gvisor
|
||||
Reference in New Issue
Block a user