| //===-- Unittests for posix_spwan_file_actions_t manipulation -------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "src/spawn/file_actions.h" |
| #include "src/spawn/posix_spawn_file_actions_addclose.h" |
| #include "src/spawn/posix_spawn_file_actions_adddup2.h" |
| #include "src/spawn/posix_spawn_file_actions_addopen.h" |
| #include "src/spawn/posix_spawn_file_actions_destroy.h" |
| #include "src/spawn/posix_spawn_file_actions_init.h" |
| #include "test/UnitTest/Test.h" |
| |
| #include <errno.h> |
| #include <spawn.h> |
| #include <stdint.h> |
| |
| TEST(LlvmLibcPosixSpawnFileActionsTest, AddActions) { |
| posix_spawn_file_actions_t actions; |
| ASSERT_EQ(LIBC_NAMESPACE::posix_spawn_file_actions_init(&actions), 0); |
| |
| ASSERT_EQ(uintptr_t(actions.__front), uintptr_t(nullptr)); |
| ASSERT_EQ(uintptr_t(actions.__back), uintptr_t(nullptr)); |
| |
| ASSERT_EQ(LIBC_NAMESPACE::posix_spawn_file_actions_addclose(&actions, 10), 0); |
| ASSERT_NE(uintptr_t(actions.__front), uintptr_t(nullptr)); |
| ASSERT_NE(uintptr_t(actions.__back), uintptr_t(nullptr)); |
| |
| ASSERT_EQ(LIBC_NAMESPACE::posix_spawn_file_actions_adddup2(&actions, 11, 12), |
| 0); |
| ASSERT_EQ(LIBC_NAMESPACE::posix_spawn_file_actions_addopen( |
| &actions, 13, "path/to/file", 0, 0), |
| 0); |
| |
| LIBC_NAMESPACE::BaseSpawnFileAction *act = |
| reinterpret_cast<LIBC_NAMESPACE::BaseSpawnFileAction *>(actions.__front); |
| int action_count = 0; |
| while (act != nullptr) { |
| ++action_count; |
| if (action_count == 1) { |
| ASSERT_EQ(act->type, LIBC_NAMESPACE::BaseSpawnFileAction::CLOSE); |
| } |
| if (action_count == 2) { |
| ASSERT_EQ(act->type, LIBC_NAMESPACE::BaseSpawnFileAction::DUP2); |
| } |
| if (action_count == 3) { |
| ASSERT_EQ(act->type, LIBC_NAMESPACE::BaseSpawnFileAction::OPEN); |
| } |
| act = act->next; |
| } |
| ASSERT_EQ(action_count, 3); |
| ASSERT_EQ(LIBC_NAMESPACE::posix_spawn_file_actions_destroy(&actions), 0); |
| } |
| |
| TEST(LlvmLibcPosixSpawnFileActionsTest, InvalidActions) { |
| ASSERT_EQ(LIBC_NAMESPACE::posix_spawn_file_actions_addclose(nullptr, 1), |
| EINVAL); |
| ASSERT_EQ(LIBC_NAMESPACE::posix_spawn_file_actions_adddup2(nullptr, 1, 2), |
| EINVAL); |
| ASSERT_EQ(LIBC_NAMESPACE::posix_spawn_file_actions_addopen(nullptr, 1, |
| nullptr, 0, 0), |
| EINVAL); |
| ASSERT_EQ(LIBC_NAMESPACE::posix_spawn_file_actions_destroy(nullptr), EINVAL); |
| |
| posix_spawn_file_actions_t actions; |
| ASSERT_EQ(LIBC_NAMESPACE::posix_spawn_file_actions_init(&actions), 0); |
| ASSERT_EQ(LIBC_NAMESPACE::posix_spawn_file_actions_addclose(&actions, -1), |
| EBADF); |
| ASSERT_EQ(LIBC_NAMESPACE::posix_spawn_file_actions_adddup2(&actions, -1, 2), |
| EBADF); |
| ASSERT_EQ(LIBC_NAMESPACE::posix_spawn_file_actions_adddup2(&actions, 1, -2), |
| EBADF); |
| ASSERT_EQ(LIBC_NAMESPACE::posix_spawn_file_actions_addopen(&actions, -1, |
| nullptr, 0, 0), |
| EBADF); |
| ASSERT_EQ(LIBC_NAMESPACE::posix_spawn_file_actions_destroy(&actions), 0); |
| } |