#if ENABLE_UNIT_TESTS #include "il2cpp-config.h" #include "UnitTest++.h" #include "../../File.h" #include "../../Process.h" #include "../File-c-api.h" #include "PathHelper.h" static const char* TEST_FILE_NAME_WITHOUT_PATH = "TESTFILE2"; static const char* TEST_FILE_NAME = CURRENT_DIRECTORY("TESTFILE2"); static const char* DUPLICATE_TEST_FILE_NAME = CURRENT_DIRECTORY("DUP_TESTFILE2"); static const char* BACKUP_TEST_FILE_NAME = CURRENT_DIRECTORY("BACKUP_TESTFILE2"); static const int64_t TEST_FILE_LENGTH = 1234567891L; static const char* TEST_STRING = "THIS IS A TEST"; static il2cpp::os::FileHandle* PrepareTestFile() { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeCreateNew, 0, 0, 0, &error); return handle; } static void CleanupTestFile(il2cpp::os::FileHandle* handle) { int error; il2cpp::os::File::Close(handle, &error); il2cpp::os::File::DeleteFile(TEST_FILE_NAME, &error); } static void WriteSomeCharactersToTestFile(il2cpp::os::FileHandle* handle) { static const char* buffer = TEST_STRING; int error; il2cpp::os::File::Write(handle, buffer, (int)strlen(buffer), &error); } SUITE(File) { struct FileFixture { FileFixture() { handle = PrepareTestFile(); } ~FileFixture() { CleanupTestFile(handle); } il2cpp::os::FileHandle* handle; }; #if !IL2CPP_TARGET_WINRT && !IL2CPP_TARGET_XBOXONE TEST_FIXTURE(FileFixture, FileIsAttyWithValidButNoTTY_ReturnsFalse) { CHECK_MSG(!UnityPalIsatty(handle), "A normal is a TTY, which is not expected."); } TEST(FileIsAttyMatchesClass) { il2cpp::os::FileHandle* handle = il2cpp::os::File::GetStdInput(); CHECK_EQUAL((int32_t)il2cpp::os::File::Isatty(handle), UnityPalIsatty(handle)); } TEST_FIXTURE(FileFixture, FileIsAttyWithValidButNoTTYMatchesClass) { CHECK_EQUAL((int32_t)il2cpp::os::File::Isatty(handle), UnityPalIsatty(handle)); } #endif TEST(FileOpenNoError_ReturnsNonNullHandle) { const char* FILE_NAME = CURRENT_DIRECTORY("TESTFILE2"); int error; UnityPalFileHandle* handle = NULL; handle = UnityPalOpen(FILE_NAME, kFileModeCreateNew, 0, 0, 0, &error); CHECK_NOT_NULL(handle); il2cpp::os::File::Close(handle, &error); il2cpp::os::File::DeleteFile(FILE_NAME, &error); } TEST(FileOpenWithError) { int error = 0; UnityPalFileHandle* handle = NULL; handle = UnityPalOpen(CURRENT_DIRECTORY("file_does_not_exist"), kFileModeOpen, 0, 0, 0, &error); #if IL2CPP_TARGET_PS4 || IL2CPP_TARGET_PS5 CHECK_EQUAL(il2cpp::os::kErrorCodePathNotFound, error); #else CHECK_EQUAL(il2cpp::os::kErrorCodeFileNotFound, error); #endif } TEST(FileOpenWithEmptyPath_ReturnsNull) { int unused = 0; CHECK_NULL(UnityPalOpen("", kFileModeCreateNew, 0, 0, 0, &unused)); } TEST(FileOpenWithFileThatDoesNotExist_ReturnsNull) { int unused = 0; CHECK_NULL(UnityPalOpen("file_that_does_not_exist", kFileModeOpen, 0, 0, 0, &unused)); } TEST(FileOpenWithErrorMatchesClass) { int api_error = 0; UnityPalFileHandle* api_handle = NULL; int class_error = 0; UnityPalFileHandle* class_handle = NULL; api_handle = UnityPalOpen(CURRENT_DIRECTORY("file_does_not_exist"), kFileModeOpen, 0, 0, 0, &api_error); class_handle = il2cpp::os::File::Open(CURRENT_DIRECTORY("file_does_not_exist"), kFileModeOpen, 0, 0, 0, &class_error); CHECK_EQUAL(class_error, api_error); } TEST(GetStdInput_IsNotNull) { CHECK_NOT_NULL(UnityPalGetStdInput()); } TEST(GetStdOutput_IsNotNull) { CHECK_NOT_NULL(UnityPalGetStdOutput()); } TEST(GetStdError_IsNotNull) { CHECK_NOT_NULL(UnityPalGetStdError()); } TEST_FIXTURE(FileFixture, GetFileTypeNormal_IsDisk) { CHECK_EQUAL(kFileTypeDisk, UnityPalGetFileType(handle)); } TEST(GetFileTypeMatchesClass) { CHECK_EQUAL(il2cpp::os::File::GetFileType(UnityPalGetStdError()), UnityPalGetFileType(UnityPalGetStdError())); } TEST_FIXTURE(FileFixture, GetFileTypeErrorMatchesClass) { CHECK_EQUAL(il2cpp::os::File::GetFileType(handle), UnityPalGetFileType(handle)); } TEST_FIXTURE(FileFixture, GetFileAttributesCleanError) { int error; UnityPalFileAttributes attributes = UnityPalGetFileAttributes(TEST_FILE_NAME, &error); CHECK_EQUAL(il2cpp::os::kErrorCodeSuccess, error); } TEST_FIXTURE(FileFixture, GetFileAttributesCleanErrorMatchesClass) { int api_error; int class_error; UnityPalGetFileAttributes(TEST_FILE_NAME, &api_error); il2cpp::os::File::GetFileAttributes(TEST_FILE_NAME, &class_error); CHECK_EQUAL(class_error, api_error); } TEST_FIXTURE(FileFixture, GetFileAttributesMatchesClass) { int api_error; int class_error; UnityPalFileAttributes api_attributes = UnityPalGetFileAttributes(TEST_FILE_NAME, &api_error); UnityPalFileAttributes class_attributes = il2cpp::os::File::GetFileAttributes(TEST_FILE_NAME, &class_error); CHECK_EQUAL(class_attributes, api_attributes); } TEST(GetFileAttributesWithBadPath_ReturnsNegativeOne) { int error; CHECK_EQUAL(-1, UnityPalGetFileAttributes(CURRENT_DIRECTORY("sf&236732q#"), &error)); } TEST(GetFileAttributesWithBadPathMatchesClass) { int api_error; int class_error; UnityPalFileAttributes api_attributes = UnityPalGetFileAttributes(CURRENT_DIRECTORY("#23sfs#"), &api_error); UnityPalFileAttributes class_attributes = il2cpp::os::File::GetFileAttributes(CURRENT_DIRECTORY("#23sfs#"), &class_error); CHECK_EQUAL(class_attributes, api_attributes); } TEST_FIXTURE(FileFixture, SetFileAttributesNormalResult_ReturnsTrue) { int error; CHECK(UnityPalSetFileAttributes(TEST_FILE_NAME, kFileAttributeTemporary, &error)); } TEST(SetFileAttributesNormalError) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); UnityPalSetFileAttributes(TEST_FILE_NAME, kFileAttributeNormal, &error); CleanupTestFile(handle); CHECK_EQUAL(il2cpp::os::kErrorCodeSuccess, error); } TEST(SetFileAttributesBadResult_ReturnsFalse) { int error; CHECK(!UnityPalSetFileAttributes(CURRENT_DIRECTORY("234232345$$"), kFileAttributeTemporary, &error)); } TEST(SetFileAttributesBadError) { int error; UnityPalSetFileAttributes(CURRENT_DIRECTORY("234232345$$"), kFileAttributeTemporary, &error); CHECK_NOT_EQUAL(il2cpp::os::kErrorCodeSuccess, error); } TEST_FIXTURE(FileFixture, SetFileAttributesNormalResultMatchesClass) { int error; CHECK_EQUAL((int32_t)il2cpp::os::File::SetFileAttributes(TEST_FILE_NAME, kFileAttributeTemporary, &error), UnityPalSetFileAttributes(TEST_FILE_NAME, kFileAttributeTemporary, &error)); } TEST(SetFileAttributesNormalAttributeReadMatchesClass) { il2cpp::os::FileHandle* handle = PrepareTestFile(); int error; UnityPalSetFileAttributes(TEST_FILE_NAME, kFileAttributeTemporary, &error); UnityPalFileAttributes api_attributes = UnityPalGetFileAttributes(TEST_FILE_NAME, &error); CleanupTestFile(handle); handle = PrepareTestFile(); il2cpp::os::File::SetFileAttributes(TEST_FILE_NAME, kFileAttributeTemporary, &error); UnityPalFileAttributes class_attributes = il2cpp::os::File::GetFileAttributes(TEST_FILE_NAME, &error); CleanupTestFile(handle); CHECK_EQUAL(api_attributes, class_attributes); } TEST(SetFileAttributesBadResultMatchesClass) { int error; CHECK_EQUAL((int32_t)il2cpp::os::File::SetFileAttributes(CURRENT_DIRECTORY("234232345$$"), kFileAttributeTemporary, &error), UnityPalSetFileAttributes(CURRENT_DIRECTORY("234232345$$"), kFileAttributeTemporary, &error)); } TEST(SetFileAttributesBadErrorMatchesClass) { int api_error; int class_error; UnityPalSetFileAttributes(CURRENT_DIRECTORY("234232345$$"), kFileAttributeTemporary, &api_error); il2cpp::os::File::SetFileAttributes(CURRENT_DIRECTORY("234232345$$"), kFileAttributeTemporary, &class_error); CHECK_EQUAL(class_error, api_error); } TEST_FIXTURE(FileFixture, GetFileStatNormalResult_ReturnsTrue) { int error; UnityPalFileStat fileStat; CHECK(UnityPalGetFileStat(TEST_FILE_NAME, &fileStat, &error)); } TEST_FIXTURE(FileFixture, GetFileStatNormalError) { int error; UnityPalFileStat fileStat; UnityPalGetFileStat(TEST_FILE_NAME, &fileStat, &error); CHECK_EQUAL(il2cpp::os::kErrorCodeSuccess, error); } TEST(GetFileStatBadResult_ReturnsFalse) { int error; UnityPalFileStat fileStat; CHECK(!UnityPalGetFileStat(CURRENT_DIRECTORY("#Q23423"), &fileStat, &error)); } TEST(GetFileStatBadError) { int error; UnityPalFileStat fileStat; UnityPalGetFileStat(CURRENT_DIRECTORY("#Q23423"), &fileStat, &error); CHECK_NOT_EQUAL(il2cpp::os::kErrorCodeSuccess, error); } TEST_FIXTURE(FileFixture, GetFileStatNormalName) { int error; UnityPalFileStat fileStat; UnityPalGetFileStat(TEST_FILE_NAME, &fileStat, &error); CHECK_EQUAL(TEST_FILE_NAME_WITHOUT_PATH, fileStat.name); } TEST_FIXTURE(FileFixture, GetFileStatNormalLength) { int error; UnityPalFileStat fileStat; UnityPalGetFileStat(TEST_FILE_NAME, &fileStat, &error); CHECK_EQUAL(0, fileStat.length); } TEST_FIXTURE(FileFixture, GetFileStatNormalCreationTime) { int error; UnityPalFileStat fileStat; UnityPalGetFileStat(TEST_FILE_NAME, &fileStat, &error); CHECK(fileStat.creation_time > 100000000); } TEST_FIXTURE(FileFixture, GetFileStatNormalLastAccessTime) { int error; UnityPalFileStat fileStat; UnityPalGetFileStat(TEST_FILE_NAME, &fileStat, &error); CHECK(fileStat.last_access_time > 100000000); } TEST_FIXTURE(FileFixture, GetFileStatNormalLastWriteTime) { int error; UnityPalFileStat fileStat; UnityPalGetFileStat(TEST_FILE_NAME, &fileStat, &error); CHECK(fileStat.last_write_time > 100000000); } TEST_FIXTURE(FileFixture, GetFileStatNormalResultMatchesClass) { int error; UnityPalFileStat apiStat; il2cpp::os::FileStat classStat; CHECK_EQUAL((int32_t)il2cpp::os::File::GetFileStat(TEST_FILE_NAME, &classStat, &error), UnityPalGetFileStat(TEST_FILE_NAME, &apiStat, &error)); } TEST_FIXTURE(FileFixture, GetFileStatNormalErrorMatchesClass) { int apiError; int classError; UnityPalFileStat apiStat; il2cpp::os::FileStat classStat; UnityPalGetFileStat(TEST_FILE_NAME, &apiStat, &apiError); il2cpp::os::File::GetFileStat(TEST_FILE_NAME, &classStat, &classError); CHECK_EQUAL(classError, apiError); } TEST(GetFileStatBadResultMatchesClass) { int error; UnityPalFileStat apiStat; il2cpp::os::FileStat classStat; CHECK_EQUAL((int32_t)il2cpp::os::File::GetFileStat(CURRENT_DIRECTORY("#Q23423"), &classStat, &error), UnityPalGetFileStat(CURRENT_DIRECTORY("#Q23423"), &apiStat, &error)); } TEST(GetFileStatBadErrorMatchesClass) { int apiError; int classError; UnityPalFileStat apiStat; il2cpp::os::FileStat classStat; UnityPalGetFileStat(CURRENT_DIRECTORY("#Q23423"), &apiStat, &apiError); il2cpp::os::File::GetFileStat(CURRENT_DIRECTORY("#Q23423"), &classStat, &classError); CHECK_EQUAL(classError, apiError); } TEST_FIXTURE(FileFixture, GetFileStatNormalNameMatchesClass) { int error; UnityPalFileStat apiFileStat; il2cpp::os::FileStat classFileStat; UnityPalGetFileStat(TEST_FILE_NAME, &apiFileStat, &error); il2cpp::os::File::GetFileStat(TEST_FILE_NAME, &classFileStat, &error); CHECK_EQUAL(classFileStat.name, apiFileStat.name); } TEST_FIXTURE(FileFixture, GetFileStatNormalAttributesMatchesClass) { int error; UnityPalFileStat apiFileStat; il2cpp::os::FileStat classFileStat; UnityPalGetFileStat(TEST_FILE_NAME, &apiFileStat, &error); il2cpp::os::File::GetFileStat(TEST_FILE_NAME, &classFileStat, &error); CHECK_EQUAL(classFileStat.attributes, apiFileStat.attributes); } TEST_FIXTURE(FileFixture, GetFileStatNormalLengthMatchesClass) { int error; UnityPalFileStat apiFileStat; il2cpp::os::FileStat classFileStat; UnityPalGetFileStat(TEST_FILE_NAME, &apiFileStat, &error); il2cpp::os::File::GetFileStat(TEST_FILE_NAME, &classFileStat, &error); CHECK_EQUAL(classFileStat.length, apiFileStat.length); } TEST_FIXTURE(FileFixture, GetFileStatNormalCreationTimeMatchesClass) { int error; UnityPalFileStat apiFileStat; il2cpp::os::FileStat classFileStat; UnityPalGetFileStat(TEST_FILE_NAME, &apiFileStat, &error); il2cpp::os::File::GetFileStat(TEST_FILE_NAME, &classFileStat, &error); CHECK_EQUAL(classFileStat.creation_time, apiFileStat.creation_time); } TEST_FIXTURE(FileFixture, GetFileStatNormalLastAccessTimeMatchesClass) { int error; UnityPalFileStat apiFileStat; il2cpp::os::FileStat classFileStat; UnityPalGetFileStat(TEST_FILE_NAME, &apiFileStat, &error); il2cpp::os::File::GetFileStat(TEST_FILE_NAME, &classFileStat, &error); CHECK_EQUAL(classFileStat.last_access_time, apiFileStat.last_access_time); } TEST_FIXTURE(FileFixture, GetFileStatNormalLastWriteTimeMatchesClass) { int error; UnityPalFileStat apiFileStat; il2cpp::os::FileStat classFileStat; UnityPalGetFileStat(TEST_FILE_NAME, &apiFileStat, &error); il2cpp::os::File::GetFileStat(TEST_FILE_NAME, &classFileStat, &error); CHECK_EQUAL(classFileStat.last_write_time, apiFileStat.last_write_time); } TEST_FIXTURE(FileFixture, CopyFileNormalResult_ReturnsTrue) { int error; bool copyResult = UnityPalCopyFile(TEST_FILE_NAME, DUPLICATE_TEST_FILE_NAME, true, &error); UnityPalDeleteFile(DUPLICATE_TEST_FILE_NAME, &error); CHECK(copyResult); } TEST_FIXTURE(FileFixture, CopyFileNormalError) { int error; UnityPalCopyFile(TEST_FILE_NAME, DUPLICATE_TEST_FILE_NAME, true, &error); UnityPalDeleteFile(DUPLICATE_TEST_FILE_NAME, &error); CHECK_EQUAL(il2cpp::os::kErrorCodeSuccess, error); } TEST(CopyFileBadResult_ReturnsFalse) { int error; CHECK(!UnityPalCopyFile(CURRENT_DIRECTORY("#453453"), CURRENT_DIRECTORY("#sdfsdw3"), true, &error)); } TEST(CopyFileBadError) { int error; UnityPalCopyFile(CURRENT_DIRECTORY("#453453"), CURRENT_DIRECTORY("#sdfsdw3"), true, &error); CHECK_NOT_EQUAL(il2cpp::os::kErrorCodeSuccess, error); } TEST_FIXTURE(FileFixture, CopyFileNormalStat) { int error; UnityPalFileStat fileStat; UnityPalCopyFile(TEST_FILE_NAME, DUPLICATE_TEST_FILE_NAME, true, &error); UnityPalGetFileStat(DUPLICATE_TEST_FILE_NAME, &fileStat, &error); UnityPalDeleteFile(DUPLICATE_TEST_FILE_NAME, &error); CHECK(fileStat.last_write_time > 100000000); } TEST_FIXTURE(FileFixture, CopyFileNormalResultMatchesClass) { int error; bool api_result = UnityPalCopyFile(TEST_FILE_NAME, DUPLICATE_TEST_FILE_NAME, true, &error); UnityPalDeleteFile(DUPLICATE_TEST_FILE_NAME, &error); bool class_result = il2cpp::os::File::CopyFile(TEST_FILE_NAME, DUPLICATE_TEST_FILE_NAME, true, &error); il2cpp::os::File::DeleteFile(DUPLICATE_TEST_FILE_NAME, &error); CHECK_EQUAL(class_result, api_result); } TEST_FIXTURE(FileFixture, CopyFileNormalErrorMatchesClass) { int api_error; int class_error; UnityPalCopyFile(TEST_FILE_NAME, DUPLICATE_TEST_FILE_NAME, true, &api_error); UnityPalDeleteFile(DUPLICATE_TEST_FILE_NAME, &api_error); il2cpp::os::File::CopyFile(TEST_FILE_NAME, DUPLICATE_TEST_FILE_NAME, true, &class_error); il2cpp::os::File::DeleteFile(DUPLICATE_TEST_FILE_NAME, &class_error); CHECK_EQUAL(class_error, api_error); } TEST(CopyFileBadResultMatchesClass) { int error; CHECK_EQUAL((int32_t)il2cpp::os::File::CopyFile(CURRENT_DIRECTORY("#453453"), CURRENT_DIRECTORY("#sdfsdw3"), true, &error), UnityPalCopyFile(CURRENT_DIRECTORY("#453453"), CURRENT_DIRECTORY("#sdfsdw3"), true, &error)); } TEST(CopyFileBadErrorMatchesClass) { int api_error; int class_error; UnityPalCopyFile(CURRENT_DIRECTORY("#453453"), CURRENT_DIRECTORY("#sdfsdw3"), true, &api_error); il2cpp::os::File::CopyFile(CURRENT_DIRECTORY("#453453"), CURRENT_DIRECTORY("#sdfsdw3"), true, &class_error); CHECK_EQUAL(class_error, api_error); } TEST(MoveFileBadResult_ReturnsFalse) { int error; CHECK(!UnityPalMoveFile(CURRENT_DIRECTORY("#453453"), CURRENT_DIRECTORY("#sdfsdw3"), &error)); } TEST(MoveFileBadError) { int error; UnityPalMoveFile(CURRENT_DIRECTORY("#453453"), CURRENT_DIRECTORY("#sdfsdw3"), &error); CHECK_NOT_EQUAL(il2cpp::os::kErrorCodeSuccess, error); } TEST(MoveFileNormalResultMatchesClass) { il2cpp::os::FileHandle* handle = PrepareTestFile(); int error; bool api_result = UnityPalMoveFile(TEST_FILE_NAME, DUPLICATE_TEST_FILE_NAME, &error); UnityPalDeleteFile(DUPLICATE_TEST_FILE_NAME, &error); CleanupTestFile(handle); handle = PrepareTestFile(); bool class_result = il2cpp::os::File::MoveFile(TEST_FILE_NAME, DUPLICATE_TEST_FILE_NAME, &error); il2cpp::os::File::DeleteFile(DUPLICATE_TEST_FILE_NAME, &error); CleanupTestFile(handle); CHECK_EQUAL(class_result, api_result); } TEST(MoveFileNormalErrorMatchesClass) { il2cpp::os::FileHandle* handle = PrepareTestFile(); int api_error; int class_error; UnityPalMoveFile(TEST_FILE_NAME, DUPLICATE_TEST_FILE_NAME, &api_error); UnityPalDeleteFile(DUPLICATE_TEST_FILE_NAME, &api_error); CleanupTestFile(handle); handle = PrepareTestFile(); il2cpp::os::File::MoveFile(TEST_FILE_NAME, DUPLICATE_TEST_FILE_NAME, &class_error); il2cpp::os::File::DeleteFile(DUPLICATE_TEST_FILE_NAME, &class_error); CleanupTestFile(handle); CHECK_EQUAL(class_error, api_error); } TEST(MoveFileBadResultMatchesClass) { int error; CHECK_EQUAL((int32_t)il2cpp::os::File::MoveFile(CURRENT_DIRECTORY("#453453"), CURRENT_DIRECTORY("#sdfsdw3"), &error), UnityPalMoveFile(CURRENT_DIRECTORY("#453453"), CURRENT_DIRECTORY("#sdfsdw3"), &error)); } TEST(MoveFileBadErrorMatchesClass) { int api_error; int class_error; UnityPalMoveFile(CURRENT_DIRECTORY("#453453"), CURRENT_DIRECTORY("#sdfsdw3"), &api_error); il2cpp::os::File::MoveFile(CURRENT_DIRECTORY("#453453"), CURRENT_DIRECTORY("#sdfsdw3"), &class_error); CHECK_EQUAL(class_error, api_error); } TEST_FIXTURE(FileFixture, DeleteFileNormalResult_ReturnsTrue) { int error; CHECK(UnityPalDeleteFile(TEST_FILE_NAME, &error)); } TEST_FIXTURE(FileFixture, DeleteFileNormalError) { int error; UnityPalDeleteFile(TEST_FILE_NAME, &error); CHECK_EQUAL(il2cpp::os::kErrorCodeSuccess, error); } TEST(DeleteFileBadResult_ReturnsFalse) { int error; CHECK(!UnityPalDeleteFile(CURRENT_DIRECTORY("#453453"), &error)); } TEST(DeleteFileBadError) { int error; UnityPalDeleteFile(CURRENT_DIRECTORY("#453453"), &error); CHECK_NOT_EQUAL(il2cpp::os::kErrorCodeSuccess, error); } TEST_FIXTURE(FileFixture, DeleteFileNormalStat) { int error; UnityPalFileStat fileStat; UnityPalDeleteFile(TEST_FILE_NAME, &error); error = il2cpp::os::kErrorCodeSuccess; UnityPalGetFileStat(TEST_FILE_NAME, &fileStat, &error); CHECK_NOT_EQUAL(il2cpp::os::kErrorCodeSuccess, error); } TEST(DeleteFileNormalResultMatchesClass) { il2cpp::os::FileHandle* handle = PrepareTestFile(); int error; bool api_result = UnityPalDeleteFile(TEST_FILE_NAME, &error); CleanupTestFile(handle); handle = PrepareTestFile(); bool class_result = il2cpp::os::File::DeleteFile(TEST_FILE_NAME, &error); CleanupTestFile(handle); CHECK_EQUAL(class_result, api_result); } TEST(DeleteFileNormalErrorMatchesClass) { il2cpp::os::FileHandle* handle = PrepareTestFile(); int api_error; int class_error; UnityPalDeleteFile(TEST_FILE_NAME, &api_error); CleanupTestFile(handle); handle = PrepareTestFile(); il2cpp::os::File::DeleteFile(TEST_FILE_NAME, &class_error); CleanupTestFile(handle); CHECK_EQUAL(class_error, api_error); } TEST(DeleteFileBadResultMatchesClass) { int error; CHECK_EQUAL((int32_t)il2cpp::os::File::DeleteFile(CURRENT_DIRECTORY("#453453"), &error), UnityPalDeleteFile(CURRENT_DIRECTORY("#453453"), &error)); } TEST(DeleteFileBadErrorMatchesClass) { int api_error; int class_error; UnityPalDeleteFile(CURRENT_DIRECTORY("#453453"), &api_error); il2cpp::os::File::DeleteFile(CURRENT_DIRECTORY("#453453"), &class_error); CHECK_EQUAL(class_error, api_error); } TEST(OpenFileNormalResult_ReturnsNonNullHandle) { int error; UnityPalFileHandle* handle = NULL; handle = UnityPalOpen(TEST_FILE_NAME, kFileModeCreateNew, 0, 0, 0, &error); CHECK_NOT_NULL(handle); il2cpp::os::File::Close(handle, &error); il2cpp::os::File::DeleteFile(TEST_FILE_NAME, &error); } TEST(OpenFileNormalError) { int error; UnityPalFileHandle* handle = NULL; handle = UnityPalOpen(TEST_FILE_NAME, kFileModeCreateNew, 0, 0, 0, &error); CHECK_EQUAL(il2cpp::os::kErrorCodeSuccess, error); il2cpp::os::File::Close(handle, &error); il2cpp::os::File::DeleteFile(TEST_FILE_NAME, &error); } TEST(OpenFileNormalStat) { int error; UnityPalFileStat fileStat; UnityPalFileHandle* handle = NULL; handle = UnityPalOpen(TEST_FILE_NAME, kFileModeCreateNew, 0, 0, 0, &error); UnityPalGetFileStat(TEST_FILE_NAME, &fileStat, &error); il2cpp::os::File::Close(handle, &error); il2cpp::os::File::DeleteFile(TEST_FILE_NAME, &error); CHECK(fileStat.last_write_time > 1); } TEST(OpenFileNormalErrorMatchesClass) { int error; int api_error; int class_error; UnityPalFileHandle* handle = NULL; handle = UnityPalOpen(TEST_FILE_NAME, kFileModeCreateNew, 0, 0, 0, &api_error); il2cpp::os::File::Close(handle, &error); il2cpp::os::File::DeleteFile(TEST_FILE_NAME, &error); handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeCreateNew, 0, 0, 0, &class_error); il2cpp::os::File::Close(handle, &error); il2cpp::os::File::DeleteFile(TEST_FILE_NAME, &error); CHECK_EQUAL(class_error, api_error); } TEST(OpenFileNormalStatMatchesClass) { int error; UnityPalFileStat api_fileStat; il2cpp::os::FileStat class_fileStat; UnityPalFileHandle* handle = NULL; handle = UnityPalOpen(TEST_FILE_NAME, kFileModeCreateNew, 0, 0, 0, &error); UnityPalGetFileStat(TEST_FILE_NAME, &api_fileStat, &error); il2cpp::os::File::Close(handle, &error); il2cpp::os::File::DeleteFile(TEST_FILE_NAME, &error); handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeCreateNew, 0, 0, 0, &error); il2cpp::os::File::GetFileStat(TEST_FILE_NAME, &class_fileStat, &error); il2cpp::os::File::Close(handle, &error); CHECK_EQUAL(class_fileStat.attributes, api_fileStat.attributes); } #if !IL2CPP_USE_GENERIC_FILE struct TruncateFixture { TruncateFixture() { handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); WriteSomeCharactersToTestFile(handle); } ~TruncateFixture() { CleanupTestFile(handle); } il2cpp::os::FileHandle* handle; int error; int64_t length; }; TEST_FIXTURE(TruncateFixture, TruncateReturnsTrue) { length = UnityPalGetLength(handle, &error); UnityPalSeek(handle, 5, 0, &error); CHECK(UnityPalTruncate(handle, &error)); } TEST_FIXTURE(TruncateFixture, TruncateFileReturnsCleanErrorCode) { UnityPalSeek(handle, 5, 0, &error); UnityPalTruncate(handle, &error); CHECK_EQUAL(il2cpp::os::kErrorCodeSuccess, error); } TEST_FIXTURE(TruncateFixture, TruncateFileSize14TruncatesToSize5Successfully) { UnityPalSeek(handle, 5, 0, &error); UnityPalTruncate(handle, &error); int64_t length = UnityPalGetLength(handle, &error); CHECK_EQUAL(5, length); } TEST_FIXTURE(TruncateFixture, TruncateFileSize14TruncatesToSize20Successfully) { UnityPalSeek(handle, 20, 0, &error); UnityPalTruncate(handle, &error); int64_t length = UnityPalGetLength(handle, &error); CHECK_EQUAL(20, length); } TEST(TruncateBadFileReturnsError) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); CleanupTestFile(handle); UnityPalTruncate(handle, &error); CHECK_NOT_EQUAL(il2cpp::os::kErrorCodeSuccess, error); } TEST(TruncateBadFileReturnsFalse) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); CleanupTestFile(handle); CHECK(!UnityPalTruncate(handle, &error)); } #endif // IL2CPP_USE_GENERIC_FILE // The utime function returns -1 on PS4. I'm not sure why. #if !IL2CPP_TARGET_PS4 || IL2CPP_TARGET_PS5 TEST(SetFileTimeNormal) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); UnityPalFileStat fileStat; bool setFileTimeResult = UnityPalSetFileTime(handle, 131360602701336952, 131360602701336952, 131360602701336952, &error); UnityPalGetFileStat(TEST_FILE_NAME, &fileStat, &error); CleanupTestFile(handle); CHECK(setFileTimeResult); } TEST(SetFileTimeNormalError) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); bool result = UnityPalSetFileTime(handle, 131360602701336952, 131360602701336952, 131360602701336952, &error); CleanupTestFile(handle); CHECK_EQUAL(il2cpp::os::kErrorCodeSuccess, error); } #endif TEST(SetFileTimeNormalMatchesClass) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); bool api_result = UnityPalSetFileTime(handle, 131360602701336952, 131360602701336952, 131360602701336952, &error); bool class_result = il2cpp::os::File::SetFileTime(handle, 131360602701336952, 131360602701336952, 131360602701336952, &error); CleanupTestFile(handle); CHECK_EQUAL(class_result, api_result); } struct SetFileTimeNormalStatFixture { SetFileTimeNormalStatFixture() { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); UnityPalSetFileTime(handle, 131360602701336952, 131360602701336952, 131360602701336952, &error); UnityPalGetFileStat(TEST_FILE_NAME, &api_fileStat, &error); il2cpp::os::File::SetFileTime(handle, 131360602701336952, 131360602701336952, 131360602701336952, &error); il2cpp::os::File::GetFileStat(TEST_FILE_NAME, &class_fileStat, &error); CleanupTestFile(handle); } UnityPalFileStat api_fileStat; il2cpp::os::FileStat class_fileStat; }; TEST_FIXTURE(SetFileTimeNormalStatFixture, CreationTimeMatchesClass) { CHECK_EQUAL(class_fileStat.creation_time, api_fileStat.creation_time); } TEST_FIXTURE(SetFileTimeNormalStatFixture, LastWriteTimeMatchesClass) { CHECK_EQUAL(class_fileStat.last_write_time, api_fileStat.last_write_time); } TEST_FIXTURE(SetFileTimeNormalStatFixture, LastAccessTimeMatchesClass) { CHECK_EQUAL(class_fileStat.last_access_time, api_fileStat.last_access_time); } TEST(SetFileTimeNormalErrorMatchesClass) { int error; int api_error; int class_error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); UnityPalSetFileTime(handle, 131360602701336952, 131360602701336952, 131360602701336952, &api_error); il2cpp::os::File::SetFileTime(handle, 131360602701336952, 131360602701336952, 131360602701336952, &class_error); CleanupTestFile(handle); CHECK_EQUAL(class_error, api_error); } TEST(GetLengthNormal) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); WriteSomeCharactersToTestFile(handle); int64_t length = UnityPalGetLength(handle, &error); CleanupTestFile(handle); CHECK_EQUAL(14, length); } TEST_FIXTURE(FileFixture, GetLengthZero) { int error; CHECK_EQUAL(0, UnityPalGetLength(handle, &error)); } TEST(GetLengthBadFileError) { int error; il2cpp::os::FileHandle* closedHandle = PrepareTestFile(); CleanupTestFile(closedHandle); UnityPalGetLength(closedHandle, &error); CHECK_NOT_EQUAL(il2cpp::os::kErrorCodeSuccess, error); } TEST(GetLengthNormalMatchesClass) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); WriteSomeCharactersToTestFile(handle); int64_t api_length = UnityPalGetLength(handle, &error); int64_t class_length = il2cpp::os::File::GetLength(handle, &error); CleanupTestFile(handle); CHECK_EQUAL(class_length, api_length); } TEST_FIXTURE(FileFixture, GetLengthZeroMatchesClass) { int error; int64_t api_length = UnityPalGetLength(handle, &error); int64_t class_length = il2cpp::os::File::GetLength(handle, &error); CHECK_EQUAL(class_length, api_length); } TEST(GetLengthBadFileErrorMatchesClass) { int api_error; int class_error; il2cpp::os::FileHandle* closedHandle = PrepareTestFile(); CleanupTestFile(closedHandle); UnityPalGetLength(closedHandle, &api_error); il2cpp::os::File::GetLength(closedHandle, &class_error); CHECK_EQUAL(class_error, api_error); } TEST(SetLengthNormalResult) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); bool setLengthResult = UnityPalSetLength(handle, TEST_FILE_LENGTH, &error); CleanupTestFile(handle); CHECK(setLengthResult); } TEST(SetLengthNormalGetLength) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); bool result = UnityPalSetLength(handle, TEST_FILE_LENGTH, &error); int64_t length = il2cpp::os::File::GetLength(handle, &error); CleanupTestFile(handle); CHECK_EQUAL(TEST_FILE_LENGTH, length); } TEST(SetLengthBadResult_ReturnsFalse) { int error; il2cpp::os::FileHandle* closedHandle = PrepareTestFile(); CleanupTestFile(closedHandle); CHECK(!UnityPalSetLength(closedHandle, TEST_FILE_LENGTH, &error)); } TEST(SetLengthBadError) { int error; il2cpp::os::FileHandle* closedHandle = PrepareTestFile(); CleanupTestFile(closedHandle); UnityPalSetLength(closedHandle, TEST_FILE_LENGTH, &error); CHECK_NOT_EQUAL(il2cpp::os::kErrorCodeSuccess, error); } TEST(SetLengthNormalResultMatchesClass) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); bool api_result = UnityPalSetLength(handle, TEST_FILE_LENGTH, &error); CleanupTestFile(handle); handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); bool class_result = il2cpp::os::File::SetLength(handle, TEST_FILE_LENGTH, &error); CleanupTestFile(handle); CHECK_EQUAL(class_result, api_result); } TEST(SetLengthNormalGetLengthMatchesClass) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); UnityPalSetLength(handle, TEST_FILE_LENGTH, &error); int64_t api_length = il2cpp::os::File::GetLength(handle, &error); CleanupTestFile(handle); handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); il2cpp::os::File::SetLength(handle, TEST_FILE_LENGTH, &error); int64_t class_length = il2cpp::os::File::GetLength(handle, &error); CleanupTestFile(handle); CHECK_EQUAL(class_length, api_length); } TEST(SetLengthBadResultMatchesClass) { int error; il2cpp::os::FileHandle* closedHandle = PrepareTestFile(); CleanupTestFile(closedHandle); bool api_result = UnityPalSetLength(closedHandle, TEST_FILE_LENGTH, &error); bool class_result = il2cpp::os::File::SetLength(closedHandle, TEST_FILE_LENGTH, &error); CHECK_EQUAL(class_result, api_result); } TEST(SetLengthBadErrorMatchesClass) { int api_error; int class_error; il2cpp::os::FileHandle* closedHandle = PrepareTestFile(); CleanupTestFile(closedHandle); UnityPalSetLength(closedHandle, TEST_FILE_LENGTH, &api_error); il2cpp::os::File::SetLength(closedHandle, TEST_FILE_LENGTH, &class_error); CHECK_EQUAL(class_error, api_error); } TEST(SeekNormalResult) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); WriteSomeCharactersToTestFile(handle); int64_t result = UnityPalSeek(handle, 10, 0, &error); CleanupTestFile(handle); CHECK_EQUAL(10, result); } TEST(SeekNormalBuffer) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); WriteSomeCharactersToTestFile(handle); int64_t result = UnityPalSeek(handle, 10, 0, &error); char buffer[15]; il2cpp::os::File::Read(handle, buffer, 4, &error); CleanupTestFile(handle); CHECK_EQUAL(0, strncmp("TEST", buffer, 4)); } TEST(SeekBadError) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); CleanupTestFile(handle); UnityPalSeek(handle, 10, 0, &error); CHECK_NOT_EQUAL(il2cpp::os::kErrorCodeSuccess, error); } TEST(SeekNormalResultMatchesClass) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); WriteSomeCharactersToTestFile(handle); int64_t api_result = UnityPalSeek(handle, 10, 0, &error); CleanupTestFile(handle); handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); WriteSomeCharactersToTestFile(handle); int64_t class_result = il2cpp::os::File::Seek(handle, 10, 0, &error); CleanupTestFile(handle); CHECK_EQUAL(class_result, api_result); } TEST(SeekNormalBufferMatchesClass) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); WriteSomeCharactersToTestFile(handle); UnityPalSeek(handle, 10, 0, &error); char api_buffer[15]; char class_buffer[15]; il2cpp::os::File::Read(handle, api_buffer, 4, &error); CleanupTestFile(handle); handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); WriteSomeCharactersToTestFile(handle); il2cpp::os::File::Seek(handle, 10, 0, &error); il2cpp::os::File::Read(handle, class_buffer, 4, &error); CleanupTestFile(handle); CHECK_EQUAL(0, strncmp(class_buffer, api_buffer, 4)); } TEST(SeekBadErrorMatchesClass) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); CleanupTestFile(handle); UnityPalSeek(handle, 10, 0, &error); CHECK_NOT_EQUAL(il2cpp::os::kErrorCodeSuccess, error); } TEST(ReadNormalResult) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); WriteSomeCharactersToTestFile(handle); char buffer[16]; UnityPalSeek(handle, 0, 0, &error); int result = UnityPalRead(handle, buffer, 16, &error); CleanupTestFile(handle); CHECK_EQUAL(14, result); } TEST(ReadNormalBuffer) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); WriteSomeCharactersToTestFile(handle); char buffer[16]; UnityPalSeek(handle, 0, 0, &error); UnityPalRead(handle, buffer, 16, &error); CleanupTestFile(handle); CHECK_EQUAL(0, strncmp(TEST_STRING, buffer, 14)); } TEST(ReadBadResult) { int usused; char buffer[16]; int64_t result = UnityPalRead(NULL, buffer, 16, &usused); CHECK(!result); } TEST(ReadBadError) { int error; char buffer[16]; UnityPalRead(NULL, buffer, 16, &error); CHECK_NOT_EQUAL(il2cpp::os::kErrorCodeSuccess, error); } TEST(ReadNormalResultMatchesClass) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); WriteSomeCharactersToTestFile(handle); UnityPalSeek(handle, 0, 0, &error); char buffer[16]; int api_result = UnityPalRead(handle, buffer, 14, &error); CleanupTestFile(handle); handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); WriteSomeCharactersToTestFile(handle); il2cpp::os::File::Seek(handle, 0, 0, &error); int class_result = il2cpp::os::File::Read(handle, buffer, 14, &error); CleanupTestFile(handle); CHECK_EQUAL(class_result, api_result); } TEST(ReadNormalBufferMatchesClass) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); WriteSomeCharactersToTestFile(handle); UnityPalSeek(handle, 0, 0, &error); char api_buffer[16]; char class_buffer[16]; UnityPalRead(handle, api_buffer, 14, &error); CleanupTestFile(handle); handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); WriteSomeCharactersToTestFile(handle); il2cpp::os::File::Seek(handle, 0, 0, &error); il2cpp::os::File::Read(handle, class_buffer, 14, &error); CleanupTestFile(handle); CHECK_EQUAL(0, strncmp(class_buffer, api_buffer, 14)); } TEST(ReadBadResultMatchesClass) { int unused; char buffer[16]; int64_t api_result = UnityPalRead(NULL, buffer, 14, &unused); int64_t class_result = il2cpp::os::File::Read(NULL, buffer, 14, &unused); CHECK_EQUAL(class_result, api_result); } TEST(ReadBadErrorMatchesClass) { int api_error; int class_error; char buffer[16]; UnityPalRead(NULL, buffer, 14, &api_error); il2cpp::os::File::Read(NULL, buffer, 14, &class_error); CHECK_EQUAL(class_error, api_error); } TEST(WriteNormalResult) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); static const char* buffer = TEST_STRING; int32_t result = UnityPalWrite(handle, buffer, 14, &error); CleanupTestFile(handle); CHECK_EQUAL(14, result); } TEST(WriteNormalError) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); static const char* buffer = TEST_STRING; UnityPalWrite(handle, buffer, 14, &error); CleanupTestFile(handle); CHECK_EQUAL(il2cpp::os::kErrorCodeSuccess, error); } TEST(WriteNormalBufferCheck) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); static const char* buffer = TEST_STRING; UnityPalWrite(handle, buffer, 14, &error); char read_buffer[16]; il2cpp::os::File::Seek(handle, 0, 0, &error); il2cpp::os::File::Read(handle, read_buffer, 16, &error); CleanupTestFile(handle); CHECK_EQUAL(0, strncmp(TEST_STRING, buffer, 14)); } TEST(WriteBadResult) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); CleanupTestFile(handle); static const char* buffer = TEST_STRING; int32_t result = UnityPalWrite(handle, buffer, 14, &error); CHECK_EQUAL(-1, result); } TEST(WriteNormalResultMatchesClass) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); static const char* buffer = TEST_STRING; int32_t api_result = UnityPalWrite(handle, buffer, 14, &error); int32_t class_result = il2cpp::os::File::Write(handle, buffer, 14, &error); CleanupTestFile(handle); CHECK_EQUAL(class_result, api_result); } TEST(WriteNormalBufferCheckMatchesClass) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); static const char* buffer = TEST_STRING; UnityPalWrite(handle, buffer, 14, &error); char api_read_buffer[16]; il2cpp::os::File::Seek(handle, 0, 0, &error); il2cpp::os::File::Read(handle, api_read_buffer, 16, &error); CleanupTestFile(handle); handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); il2cpp::os::File::Write(handle, buffer, 14, &error); char class_read_buffer[16]; il2cpp::os::File::Seek(handle, 0, 0, &error); il2cpp::os::File::Read(handle, class_read_buffer, 16, &error); CleanupTestFile(handle); CHECK_EQUAL(0, strncmp(class_read_buffer, api_read_buffer, 14)); } TEST(WriteBadResultMatchesClass) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); CleanupTestFile(handle); static const char* buffer = TEST_STRING; int32_t api_result = UnityPalWrite(handle, buffer, 14, &error); int32_t class_result = il2cpp::os::File::Write(handle, buffer, 14, &error); CHECK_EQUAL(class_result, api_result); } TEST(WriteBadErrorMatchesClass) { int error; int api_error; int class_error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, 1, 1, 0, 0, &error); CleanupTestFile(handle); static const char* buffer = TEST_STRING; UnityPalWrite(handle, buffer, 14, &api_error); il2cpp::os::File::Write(handle, buffer, 14, &class_error); CHECK_EQUAL(api_error, class_error); } TEST(FlushNormalResult_ReturnsTrue) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); WriteSomeCharactersToTestFile(handle); bool flushResult = UnityPalFlush(handle, &error); CleanupTestFile(handle); CHECK(flushResult); } TEST(FlushNormalError) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); WriteSomeCharactersToTestFile(handle); UnityPalFlush(handle, &error); CleanupTestFile(handle); CHECK_EQUAL(il2cpp::os::kErrorCodeSuccess, error); } TEST(FlushBadResult_ReturnsFalse) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); WriteSomeCharactersToTestFile(handle); CleanupTestFile(handle); CHECK(!UnityPalFlush(handle, &error)); } TEST(FlushBadError) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); WriteSomeCharactersToTestFile(handle); CleanupTestFile(handle); UnityPalFlush(handle, &error); CHECK_NOT_EQUAL(il2cpp::os::kErrorCodeSuccess, error); } TEST(FlushNormalResultMatchesClass) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); WriteSomeCharactersToTestFile(handle); bool api_result = UnityPalFlush(handle, &error); WriteSomeCharactersToTestFile(handle); bool class_result = il2cpp::os::File::Flush(handle, &error); CleanupTestFile(handle); CHECK_EQUAL(class_result, api_result); } TEST(FlushNormalErrorMatchesClass) { int error; int api_error; int class_error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); WriteSomeCharactersToTestFile(handle); UnityPalFlush(handle, &api_error); WriteSomeCharactersToTestFile(handle); il2cpp::os::File::Flush(handle, &class_error); CleanupTestFile(handle); CHECK_EQUAL(class_error, api_error); } TEST(FlushBadResultMatchesClass) { int error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); WriteSomeCharactersToTestFile(handle); CleanupTestFile(handle); bool api_result = UnityPalFlush(handle, &error); bool class_result = il2cpp::os::File::Flush(handle, &error); CHECK_EQUAL(class_result, api_result); } TEST(FlushBadErrorMatchesClass) { int error; int api_error; int class_error; il2cpp::os::FileHandle* handle = il2cpp::os::File::Open(TEST_FILE_NAME, kFileModeOpenOrCreate, kFileAccessReadWrite, 0, 0, &error); WriteSomeCharactersToTestFile(handle); CleanupTestFile(handle); UnityPalFlush(handle, &api_error); il2cpp::os::File::Flush(handle, &class_error); CHECK_EQUAL(class_error, api_error); } #if !IL2CPP_TARGET_PS4 && !IL2CPP_TARGET_PS5 && !IL2CPP_TARGET_WINRT && !IL2CPP_TARGET_XBOXONE TEST(CreatePipeNormalResult_ReturnsTrue) { int error; il2cpp::os::FileHandle* read_handle; il2cpp::os::FileHandle* write_handle; bool createPipeResult = UnityPalCreatePipe(&read_handle, &write_handle); il2cpp::os::File::Close(read_handle, &error); il2cpp::os::File::Close(write_handle, &error); CHECK(createPipeResult); } TEST(CreatePipeNormalBuffer) { int error; il2cpp::os::FileHandle* read_handle; il2cpp::os::FileHandle* write_handle; UnityPalCreatePipe(&read_handle, &write_handle); WriteSomeCharactersToTestFile(write_handle); char buffer[16]; il2cpp::os::File::Read(read_handle, buffer, 4, &error); il2cpp::os::File::Close(read_handle, &error); il2cpp::os::File::Close(write_handle, &error); CHECK_EQUAL(0, strncmp("THIS", buffer, 4)); } TEST(CreatePipeNormalResultMatchesClass) { int error; il2cpp::os::FileHandle* read_handle; il2cpp::os::FileHandle* write_handle; bool api_result = UnityPalCreatePipe(&read_handle, &write_handle); il2cpp::os::File::Close(read_handle, &error); il2cpp::os::File::Close(write_handle, &error); bool class_result = il2cpp::os::File::CreatePipe(&read_handle, &write_handle); il2cpp::os::File::Close(read_handle, &error); il2cpp::os::File::Close(write_handle, &error); CHECK_EQUAL(class_result, api_result); } TEST(CreatePipeNormalBufferMatchesClass) { int error; il2cpp::os::FileHandle* api_read_handle; il2cpp::os::FileHandle* api_write_handle; il2cpp::os::FileHandle* class_read_handle; il2cpp::os::FileHandle* class_write_handle; UnityPalCreatePipe(&api_read_handle, &api_write_handle); WriteSomeCharactersToTestFile(api_write_handle); char api_buffer[16]; il2cpp::os::File::Read(api_read_handle, api_buffer, 4, &error); il2cpp::os::File::Close(api_read_handle, &error); il2cpp::os::File::Close(api_write_handle, &error); il2cpp::os::File::CreatePipe(&class_read_handle, &class_write_handle); WriteSomeCharactersToTestFile(class_write_handle); char class_buffer[16]; il2cpp::os::File::Read(class_read_handle, class_buffer, 4, &error); il2cpp::os::File::Close(class_read_handle, &error); il2cpp::os::File::Close(class_write_handle, &error); CHECK_EQUAL(0, strncmp(class_buffer, api_buffer, 4)); } #endif #if IL2CPP_CAN_CHECK_EXECUTABLE #if !IL2CPP_TARGET_WINDOWS #include #endif struct ExecutableFileFixture { ExecutableFileFixture() : executableFilename("foo.exe"), nonexecutableFilename("foo") { int unused; executableFile = il2cpp::os::File::Open(executableFilename, kFileModeCreate, 0, 0, 0, &unused); nonexecutableFile = il2cpp::os::File::Open(nonexecutableFilename, kFileModeCreate, 0, 0, 0, &unused); #if !IL2CPP_TARGET_WINDOWS chmod(executableFilename, S_IRUSR | S_IWUSR | S_IXUSR); #endif } ~ExecutableFileFixture() { int unused; il2cpp::os::File::Close(executableFile, &unused); il2cpp::os::File::DeleteFile(executableFilename, &unused); il2cpp::os::File::Close(nonexecutableFile, &unused); il2cpp::os::File::DeleteFile(nonexecutableFilename, &unused); } const char* executableFilename; const char* nonexecutableFilename; il2cpp::os::FileHandle* executableFile; il2cpp::os::FileHandle* nonexecutableFile; }; #if IL2CPP_TARGET_WINDOWS TEST_FIXTURE(ExecutableFileFixture, IsExecutable_ReturnsTrueForFileEndingInExe) { CHECK_MSG(UnityPalIsExecutable(executableFilename), "A file ending in the .exe extension is not reported as executable, which is not expected."); } TEST_FIXTURE(ExecutableFileFixture, IsExecutable_ReturnsFalseForFileNotEndingInExe) { CHECK_MSG(!UnityPalIsExecutable(nonexecutableFilename), "A file not ending in the .exe extension is reported as executable, which is not expected."); } #else TEST_FIXTURE(ExecutableFileFixture, IsExecutable_ReturnsTrueForFileWithExecutablePermissions) { CHECK_MSG(UnityPalIsExecutable(executableFilename), "A file with executable permissions is not reported as executable, which is not expected."); } TEST_FIXTURE(ExecutableFileFixture, IsExecutable_ReturnsFalseForFileWithoutExecutablePermissions) { CHECK_MSG(!UnityPalIsExecutable(nonexecutableFilename), "A file without executable permissions is reported as executable, which is not expected."); } #endif #endif // IL2CPP_CAN_CHECK_EXECUTABLE } #endif // ENABLE_UNIT_TESTS