108334c51SBrooks Davis // Copyright 2010 The Kyua Authors.
208334c51SBrooks Davis // All rights reserved.
308334c51SBrooks Davis //
408334c51SBrooks Davis // Redistribution and use in source and binary forms, with or without
508334c51SBrooks Davis // modification, are permitted provided that the following conditions are
608334c51SBrooks Davis // met:
708334c51SBrooks Davis //
808334c51SBrooks Davis // * Redistributions of source code must retain the above copyright
908334c51SBrooks Davis // notice, this list of conditions and the following disclaimer.
1008334c51SBrooks Davis // * Redistributions in binary form must reproduce the above copyright
1108334c51SBrooks Davis // notice, this list of conditions and the following disclaimer in the
1208334c51SBrooks Davis // documentation and/or other materials provided with the distribution.
1308334c51SBrooks Davis // * Neither the name of Google Inc. nor the names of its contributors
1408334c51SBrooks Davis // may be used to endorse or promote products derived from this software
1508334c51SBrooks Davis // without specific prior written permission.
1608334c51SBrooks Davis //
1708334c51SBrooks Davis // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1808334c51SBrooks Davis // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1908334c51SBrooks Davis // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2008334c51SBrooks Davis // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2108334c51SBrooks Davis // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2208334c51SBrooks Davis // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2308334c51SBrooks Davis // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2408334c51SBrooks Davis // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2508334c51SBrooks Davis // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2608334c51SBrooks Davis // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2708334c51SBrooks Davis // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2808334c51SBrooks Davis
2908334c51SBrooks Davis #include "utils/process/systembuf.hpp"
3008334c51SBrooks Davis
3108334c51SBrooks Davis extern "C" {
3208334c51SBrooks Davis #include <sys/stat.h>
3308334c51SBrooks Davis
3408334c51SBrooks Davis #include <fcntl.h>
3508334c51SBrooks Davis #include <unistd.h>
3608334c51SBrooks Davis }
3708334c51SBrooks Davis
3808334c51SBrooks Davis #include <fstream>
3908334c51SBrooks Davis
4008334c51SBrooks Davis #include <atf-c++.hpp>
4108334c51SBrooks Davis
4208334c51SBrooks Davis using utils::process::systembuf;
4308334c51SBrooks Davis
4408334c51SBrooks Davis
4508334c51SBrooks Davis static void
check_data(std::istream & is,std::size_t length)4608334c51SBrooks Davis check_data(std::istream& is, std::size_t length)
4708334c51SBrooks Davis {
4808334c51SBrooks Davis char ch = 'A', chr;
4908334c51SBrooks Davis std::size_t cnt = 0;
5008334c51SBrooks Davis while (is >> chr) {
5108334c51SBrooks Davis ATF_REQUIRE_EQ(ch, chr);
5208334c51SBrooks Davis if (ch == 'Z')
5308334c51SBrooks Davis ch = 'A';
5408334c51SBrooks Davis else
5508334c51SBrooks Davis ch++;
5608334c51SBrooks Davis cnt++;
5708334c51SBrooks Davis }
5808334c51SBrooks Davis ATF_REQUIRE_EQ(cnt, length);
5908334c51SBrooks Davis }
6008334c51SBrooks Davis
6108334c51SBrooks Davis
6208334c51SBrooks Davis static void
write_data(std::ostream & os,std::size_t length)6308334c51SBrooks Davis write_data(std::ostream& os, std::size_t length)
6408334c51SBrooks Davis {
6508334c51SBrooks Davis char ch = 'A';
6608334c51SBrooks Davis for (std::size_t i = 0; i < length; i++) {
6708334c51SBrooks Davis os << ch;
6808334c51SBrooks Davis if (ch == 'Z')
6908334c51SBrooks Davis ch = 'A';
7008334c51SBrooks Davis else
7108334c51SBrooks Davis ch++;
7208334c51SBrooks Davis }
7308334c51SBrooks Davis os.flush();
7408334c51SBrooks Davis }
7508334c51SBrooks Davis
7608334c51SBrooks Davis
7708334c51SBrooks Davis static void
test_read(std::size_t length,std::size_t bufsize)7808334c51SBrooks Davis test_read(std::size_t length, std::size_t bufsize)
7908334c51SBrooks Davis {
8008334c51SBrooks Davis std::ofstream f("test_read.txt");
8108334c51SBrooks Davis write_data(f, length);
8208334c51SBrooks Davis f.close();
8308334c51SBrooks Davis
8408334c51SBrooks Davis int fd = ::open("test_read.txt", O_RDONLY);
8508334c51SBrooks Davis ATF_REQUIRE(fd != -1);
8608334c51SBrooks Davis systembuf sb(fd, bufsize);
8708334c51SBrooks Davis std::istream is(&sb);
8808334c51SBrooks Davis check_data(is, length);
8908334c51SBrooks Davis ::close(fd);
9008334c51SBrooks Davis ::unlink("test_read.txt");
9108334c51SBrooks Davis }
9208334c51SBrooks Davis
9308334c51SBrooks Davis
9408334c51SBrooks Davis static void
test_write(std::size_t length,std::size_t bufsize)9508334c51SBrooks Davis test_write(std::size_t length, std::size_t bufsize)
9608334c51SBrooks Davis {
9708334c51SBrooks Davis int fd = ::open("test_write.txt", O_WRONLY | O_CREAT | O_TRUNC,
9808334c51SBrooks Davis S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
9908334c51SBrooks Davis ATF_REQUIRE(fd != -1);
10008334c51SBrooks Davis systembuf sb(fd, bufsize);
10108334c51SBrooks Davis std::ostream os(&sb);
10208334c51SBrooks Davis write_data(os, length);
10308334c51SBrooks Davis ::close(fd);
10408334c51SBrooks Davis
10508334c51SBrooks Davis std::ifstream is("test_write.txt");
10608334c51SBrooks Davis check_data(is, length);
10708334c51SBrooks Davis is.close();
10808334c51SBrooks Davis ::unlink("test_write.txt");
10908334c51SBrooks Davis }
11008334c51SBrooks Davis
11108334c51SBrooks Davis
11208334c51SBrooks Davis ATF_TEST_CASE(short_read);
ATF_TEST_CASE_HEAD(short_read)11308334c51SBrooks Davis ATF_TEST_CASE_HEAD(short_read)
11408334c51SBrooks Davis {
11508334c51SBrooks Davis set_md_var("descr", "Tests that a short read (one that fits in the "
11608334c51SBrooks Davis "internal buffer) works when using systembuf");
11708334c51SBrooks Davis }
ATF_TEST_CASE_BODY(short_read)11808334c51SBrooks Davis ATF_TEST_CASE_BODY(short_read)
11908334c51SBrooks Davis {
12008334c51SBrooks Davis test_read(64, 1024);
12108334c51SBrooks Davis }
12208334c51SBrooks Davis
12308334c51SBrooks Davis
12408334c51SBrooks Davis ATF_TEST_CASE(long_read);
ATF_TEST_CASE_HEAD(long_read)12508334c51SBrooks Davis ATF_TEST_CASE_HEAD(long_read)
12608334c51SBrooks Davis {
12708334c51SBrooks Davis set_md_var("descr", "Tests that a long read (one that does not fit in "
12808334c51SBrooks Davis "the internal buffer) works when using systembuf");
12908334c51SBrooks Davis }
ATF_TEST_CASE_BODY(long_read)13008334c51SBrooks Davis ATF_TEST_CASE_BODY(long_read)
13108334c51SBrooks Davis {
13208334c51SBrooks Davis test_read(64 * 1024, 1024);
13308334c51SBrooks Davis }
13408334c51SBrooks Davis
13508334c51SBrooks Davis
13608334c51SBrooks Davis ATF_TEST_CASE(short_write);
ATF_TEST_CASE_HEAD(short_write)13708334c51SBrooks Davis ATF_TEST_CASE_HEAD(short_write)
13808334c51SBrooks Davis {
13908334c51SBrooks Davis set_md_var("descr", "Tests that a short write (one that fits in the "
14008334c51SBrooks Davis "internal buffer) works when using systembuf");
14108334c51SBrooks Davis }
ATF_TEST_CASE_BODY(short_write)14208334c51SBrooks Davis ATF_TEST_CASE_BODY(short_write)
14308334c51SBrooks Davis {
14408334c51SBrooks Davis test_write(64, 1024);
14508334c51SBrooks Davis }
14608334c51SBrooks Davis
14708334c51SBrooks Davis
14808334c51SBrooks Davis ATF_TEST_CASE(long_write);
ATF_TEST_CASE_HEAD(long_write)14908334c51SBrooks Davis ATF_TEST_CASE_HEAD(long_write)
15008334c51SBrooks Davis {
15108334c51SBrooks Davis set_md_var("descr", "Tests that a long write (one that does not fit "
15208334c51SBrooks Davis "in the internal buffer) works when using systembuf");
15308334c51SBrooks Davis }
ATF_TEST_CASE_BODY(long_write)15408334c51SBrooks Davis ATF_TEST_CASE_BODY(long_write)
15508334c51SBrooks Davis {
15608334c51SBrooks Davis test_write(64 * 1024, 1024);
15708334c51SBrooks Davis }
15808334c51SBrooks Davis
15908334c51SBrooks Davis
ATF_INIT_TEST_CASES(tcs)16008334c51SBrooks Davis ATF_INIT_TEST_CASES(tcs)
16108334c51SBrooks Davis {
16208334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, short_read);
16308334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, long_read);
16408334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, short_write);
16508334c51SBrooks Davis ATF_ADD_TEST_CASE(tcs, long_write);
16608334c51SBrooks Davis }
167