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:
Rahat Mahmood
2020-06-15 01:09:38 -07:00
committed by gVisor bot
parent 3b5eaad3c8
commit f23f62c2c2
5 changed files with 94 additions and 34 deletions
+6 -2
View File
@@ -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
+5
View File
@@ -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,
+16 -1
View File
@@ -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",
],
+6 -31
View File
@@ -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>;
+61
View File
@@ -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