File: test_stream_iterator.cc

package info (click to toggle)
jellyfish 2.3.1-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 3,276 kB
  • sloc: cpp: 35,703; sh: 995; ruby: 578; makefile: 397; python: 165; perl: 36
file content (94 lines) | stat: -rw-r--r-- 2,743 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <stdlib.h>
#include <unistd.h>

#include <gtest/gtest.h>

#include <vector>
#include <iostream>
#include <fstream>
#include <sstream>
#include <stdexcept>

#include <jellyfish/err.hpp>
#include <jellyfish/misc.hpp>
#include <jellyfish/stream_iterator.hpp>

namespace {
namespace err = jellyfish::err;

typedef std::vector<const char*>                  path_vector;
typedef path_vector::const_iterator               path_iterator;
typedef jellyfish::stream_iterator<path_iterator> stream_iterator;

class StreamIterator : public ::testing::Test {
protected:
  static path_vector paths;
  static int         total_lines;
  static char*       tmpdir;

  static void SetUpTestCase() {
    tmpdir = strdup("/tmp/stream_iterator_XXXXXX");
    if(!mkdtemp(tmpdir))
      throw std::runtime_error(err::msg() << "Failed to create tmp directory: " << err::no);

    int nb_files = jellyfish::random_bits(5);
    for(int i = 0; i < nb_files; ++i) {
      std::ostringstream path;
      path << tmpdir << "/" << i;
      paths.push_back(strdup(path.str().c_str()));
      std::ofstream tmp_file(path.str().c_str());
      if(tmp_file.fail())
        throw std::runtime_error(err::msg() << "Failed to open file '" << path.str() << "' for writing");
      int nb_lines = jellyfish::random_bits(6);
      total_lines += nb_lines;
      for(int j = 0; j < nb_lines; ++j)
        tmp_file << "line " << j << "\n";
    }
  }

  static void TearDownTestCase() {
    for(path_iterator it = paths.begin(); it != paths.end(); ++it) {
      if(unlink(*it) == -1)
        throw std::runtime_error(err::msg() << "Failed to unlink file '" << *it << ": " << err::no);
      free((void*)*it);
    }
    if(rmdir(tmpdir) == -1)
      throw std::runtime_error(err::msg() << "Failed to rmdir '" << tmpdir << ": " << err::no);
    free(tmpdir);
  }
};
path_vector StreamIterator::paths;
int         StreamIterator::total_lines = 0;
char*       StreamIterator::tmpdir;

TEST_F(StreamIterator, Empty) {
  stream_iterator sit(paths.begin(), paths.begin());
  stream_iterator send;

  int nb_files = 0;
  int nb_lines = 0;
  for( ; sit != send; ++sit, ++nb_files)
    for(std::string line; std::getline(*sit, line); ++nb_lines) ;

  EXPECT_EQ(0, nb_files);
  EXPECT_EQ(0, nb_lines);
}


TEST_F(StreamIterator, RandomFiles) {
  SCOPED_TRACE(::testing::Message() << "nb_files:" << paths.size() << " nb_lines:" << total_lines);

  stream_iterator sit(paths.begin(), paths.end());
  stream_iterator send;

  int nb_files = 0;
  int nb_lines = 0;
  for( ; sit != send; ++sit, ++nb_files) {
    for(std::string line; std::getline(*sit, line); ++nb_lines) ;
    EXPECT_TRUE(sit->eof());
  }

  EXPECT_EQ(paths.size(), (size_t)nb_files);
  EXPECT_EQ(total_lines, nb_lines);
}
}