Serenity Operating System
1/*
2 * Copyright (c) 2021, the SerenityOS developers.
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include <LibCore/DeprecatedFile.h>
8#include <LibTest/TestCase.h>
9#include <unistd.h>
10
11static bool files_have_same_contents(DeprecatedString filename1, DeprecatedString filename2)
12{
13 auto file1 = Core::DeprecatedFile::open(filename1, Core::OpenMode::ReadOnly).value();
14 auto file2 = Core::DeprecatedFile::open(filename2, Core::OpenMode::ReadOnly).value();
15 auto contents1 = file1->read_all(), contents2 = file2->read_all();
16 return contents1 == contents2;
17}
18
19TEST_CASE(file_readline)
20{
21 auto path = "long_lines.txt";
22 auto file_or_error = Core::DeprecatedFile::open(path, Core::OpenMode::ReadOnly);
23 if (file_or_error.is_error()) {
24 warnln("Failed to open {}: {}", path, file_or_error.error());
25 VERIFY_NOT_REACHED();
26 }
27 auto file = file_or_error.release_value();
28 auto output_path = "/tmp/output.txt";
29 auto outfile_or_error = Core::DeprecatedFile::open(output_path, Core::OpenMode::WriteOnly);
30 auto outputfile = outfile_or_error.release_value();
31 while (file->can_read_line()) {
32 outputfile->write(file->read_line());
33 outputfile->write("\n"sv);
34 }
35 file->close();
36 outputfile->close();
37 VERIFY(files_have_same_contents(path, output_path));
38 unlink(output_path);
39}
40
41TEST_CASE(file_get_read_position)
42{
43 const DeprecatedString path = "10kb.txt";
44 auto file = Core::DeprecatedFile::open(path, Core::OpenMode::ReadOnly).release_value();
45
46 const size_t step_size = 98;
47 for (size_t i = 0; i < 10240 - step_size; i += step_size) {
48 auto read_buffer = file->read(step_size);
49 EXPECT_EQ(read_buffer.size(), step_size);
50
51 for (size_t j = 0; j < read_buffer.size(); j++) {
52 EXPECT_EQ(static_cast<u32>(read_buffer[j] - '0'), (i + j) % 10);
53 }
54
55 off_t offset = 0;
56 VERIFY(file->seek(0, SeekMode::FromCurrentPosition, &offset));
57 EXPECT_EQ(offset, static_cast<off_t>(i + step_size));
58 }
59
60 {
61 off_t offset = 0;
62 VERIFY(file->seek(0, SeekMode::FromEndPosition, &offset));
63 EXPECT_EQ(offset, 10240);
64 }
65
66 {
67 off_t offset = 0;
68 VERIFY(file->seek(0, SeekMode::SetPosition, &offset));
69 EXPECT_EQ(offset, 0);
70 }
71}
72
73TEST_CASE(file_lines_range)
74{
75 auto path = "long_lines.txt";
76 auto file_or_error = Core::DeprecatedFile::open(path, Core::OpenMode::ReadOnly);
77 if (file_or_error.is_error()) {
78 warnln("Failed to open {}: {}", path, file_or_error.error());
79 VERIFY_NOT_REACHED();
80 }
81 auto file = file_or_error.release_value();
82 auto output_path = "/tmp/output.txt";
83 auto outfile_or_error = Core::DeprecatedFile::open(output_path, Core::OpenMode::WriteOnly);
84 auto outputfile = outfile_or_error.release_value();
85 for (auto line : file->lines()) {
86 outputfile->write(line);
87 outputfile->write("\n"sv);
88 }
89 file->close();
90 outputfile->close();
91 VERIFY(files_have_same_contents(path, output_path));
92 unlink(output_path);
93}