X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=test%2Ffile_group_test.cc;h=f974a37256b3ae19ed6f71f28e4fba1cbb066f36;hp=888834511677c8d95f7cffa76a2c921b0dc3fff9;hb=689fa55d1529ad88449ca464e9107c4dcc54d1cb;hpb=c6c082c4a8016f85ba4207f4b8ccee1d5770e4a4 diff --git a/test/file_group_test.cc b/test/file_group_test.cc index 888834511..f974a3725 100644 --- a/test/file_group_test.cc +++ b/test/file_group_test.cc @@ -1,34 +1,40 @@ /* - Copyright (C) 2013-2014 Carl Hetherington + Copyright (C) 2013-2021 Carl Hetherington - This program is free software; you can redistribute it and/or modify + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, + DCP-o-matic is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + along with DCP-o-matic. If not, see . */ + /** @file test/file_group_test.cc - * @brief Check that FileGroup works. + * @brief Test FileGroup class. + * @ingroup selfcontained */ -#include -#include + +#include "lib/file_group.h" #include #include -#include "lib/file_group.h" +#include +#include + using std::vector; + BOOST_AUTO_TEST_CASE (file_group_test) { /* Random data; must be big enough for all the files */ @@ -36,7 +42,7 @@ BOOST_AUTO_TEST_CASE (file_group_test) for (int i = 0; i < 65536; ++i) { data[i] = rand() & 0xff; } - + int const num_files = 4; int length[] = { @@ -51,16 +57,17 @@ BOOST_AUTO_TEST_CASE (file_group_test) total_length += length[i]; } - vector name; boost::filesystem::create_directories ("build/test/file_group_test"); - name.push_back ("build/test/file_group_test/A"); - name.push_back ("build/test/file_group_test/B"); - name.push_back ("build/test/file_group_test/C"); - name.push_back ("build/test/file_group_test/D"); + vector name = { + "build/test/file_group_test/A", + "build/test/file_group_test/B", + "build/test/file_group_test/C", + "build/test/file_group_test/D" + }; int base = 0; for (int i = 0; i < num_files; ++i) { - FILE* f = fopen (name[i].string().c_str(), "wb"); + auto f = fopen (name[i].string().c_str(), "wb"); fwrite (data + base, 1, length[i], f); fclose (f); base += length[i]; @@ -72,39 +79,51 @@ BOOST_AUTO_TEST_CASE (file_group_test) int pos = 0; /* Basic read from 0 */ - BOOST_CHECK_EQUAL (fg.read (test, 64), 64); - BOOST_CHECK_EQUAL (memcmp (data, test, 64), 0); + BOOST_CHECK_EQUAL (fg.read(test, 64), 64); + BOOST_CHECK_EQUAL (memcmp(data, test, 64), 0); pos += 64; /* Another read following the previous */ - BOOST_CHECK_EQUAL (fg.read (test, 4), 4); - BOOST_CHECK_EQUAL (memcmp (data + pos, test, 4), 0); + BOOST_CHECK_EQUAL (fg.read(test, 4), 4); + BOOST_CHECK_EQUAL (memcmp(data + pos, test, 4), 0); pos += 4; /* Read overlapping A and B */ - BOOST_CHECK_EQUAL (fg.read (test, 128), 128); - BOOST_CHECK_EQUAL (memcmp (data + pos, test, 128), 0); + BOOST_CHECK_EQUAL (fg.read(test, 128), 128); + BOOST_CHECK_EQUAL (memcmp(data + pos, test, 128), 0); pos += 128; - /* Read overlapping B/C/D and over-reading */ - BOOST_CHECK_EQUAL (fg.read (test, total_length * 3), total_length - pos); - BOOST_CHECK_EQUAL (memcmp (data + pos, test, total_length - pos), 0); - - /* Bad seek */ - BOOST_CHECK_EQUAL (fg.seek (total_length * 2, SEEK_SET), -1); + /* Read overlapping B/C/D and over-reading by a lot */ + BOOST_CHECK_EQUAL (fg.read(test, total_length * 3), total_length - pos); + BOOST_CHECK_EQUAL (memcmp(data + pos, test, total_length - pos), 0); + + /* Over-read by a little */ + BOOST_CHECK_EQUAL (fg.seek(0, SEEK_SET), 0); + BOOST_CHECK_EQUAL (fg.read(test, total_length), total_length); + BOOST_CHECK_EQUAL (fg.read(test, 1), 0); + + /* Seeking off the end of the file should not give an error */ + BOOST_CHECK_EQUAL (fg.seek(total_length * 2, SEEK_SET), total_length * 2); + /* and attempting to read should return nothing */ + BOOST_CHECK_EQUAL (fg.read(test, 64), 0); + /* but the requested seek should be remembered, so if we now go back (relatively) */ + BOOST_CHECK_EQUAL (fg.seek(-total_length * 2, SEEK_CUR), 0); + /* we should be at the start again */ + BOOST_CHECK_EQUAL (fg.read(test, 64), 64); + BOOST_CHECK_EQUAL (memcmp(data, test, 64), 0); /* SEEK_SET */ - BOOST_CHECK_EQUAL (fg.seek (999, SEEK_SET), 999); - BOOST_CHECK_EQUAL (fg.read (test, 64), 64); - BOOST_CHECK_EQUAL (memcmp (data + 999, test, 64), 0); + BOOST_CHECK_EQUAL (fg.seek(999, SEEK_SET), 999); + BOOST_CHECK_EQUAL (fg.read(test, 64), 64); + BOOST_CHECK_EQUAL (memcmp(data + 999, test, 64), 0); /* SEEK_CUR */ - BOOST_CHECK_EQUAL (fg.seek (42, SEEK_CUR), 999 + 64 + 42); - BOOST_CHECK_EQUAL (fg.read (test, 64), 64); - BOOST_CHECK_EQUAL (memcmp (data + 999 + 64 + 42, test, 64), 0); + BOOST_CHECK_EQUAL (fg.seek(42, SEEK_CUR), 999 + 64 + 42); + BOOST_CHECK_EQUAL (fg.read(test, 64), 64); + BOOST_CHECK_EQUAL (memcmp(data + 999 + 64 + 42, test, 64), 0); /* SEEK_END */ - BOOST_CHECK_EQUAL (fg.seek (1077, SEEK_END), total_length - 1077); - BOOST_CHECK_EQUAL (fg.read (test, 256), 256); - BOOST_CHECK_EQUAL (memcmp (data + total_length - 1077, test, 256), 0); + BOOST_CHECK_EQUAL (fg.seek(1077, SEEK_END), total_length - 1077); + BOOST_CHECK_EQUAL (fg.read(test, 256), 256); + BOOST_CHECK_EQUAL (memcmp(data + total_length - 1077, test, 256), 0); }