1c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org/*
2c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org *
4c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org *  Use of this source code is governed by a BSD-style license
5c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org *  that can be found in the LICENSE file in the root of the source
6c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org *  tree. An additional intellectual property rights grant can be found
7c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org *  in the file PATENTS.  All contributing project authors may
8c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org */
10c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org
1198f53510b222f71fdd8b799b2f33737ceeb28c61Henrik Kjellander#include "webrtc/system_wrappers/include/data_log.h"
12ba21c95e156eb57501ffcf36e2f8216b937fb80cphoglund@webrtc.org
13c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org#include <map>
14c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org#include <string>
15c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org
16acaf3a1b131e049000552c53c8cbfe737e2d8f58pbos@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
1798f53510b222f71fdd8b799b2f33737ceeb28c61Henrik Kjellander#include "webrtc/system_wrappers/include/data_log_c.h"
18ba21c95e156eb57501ffcf36e2f8216b937fb80cphoglund@webrtc.org#include "webrtc/system_wrappers/source/data_log_c_helpers_unittest.h"
19c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org
20c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.orgusing ::webrtc::DataLog;
21c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org
22c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org// A class for storing the values expected from a log table column when
23c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org// verifying a log table file.
24c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.orgstruct ExpectedValues {
25c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org public:
26c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  ExpectedValues()
27e8ef807a2dc8320115af99ef222c8a3c3ddd3af6brykt@google.com    : values(),
28c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org      multi_value_length(1) {
29c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  }
30c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org
31c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  ExpectedValues(std::vector<std::string> expected_values,
32c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                 int expected_multi_value_length)
33c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    : values(expected_values),
34c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org      multi_value_length(expected_multi_value_length) {
35c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  }
36c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org
37c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  std::vector<std::string> values;
38c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  int multi_value_length;
39c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org};
40c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org
41c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.orgtypedef std::map<std::string, ExpectedValues> ExpectedValuesMap;
42c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org
43c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org// A static class used for parsing and verifying data log files.
44c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.orgclass DataLogParser {
45c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org public:
46c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  // Verifies that the log table stored in the file "log_file" corresponds to
47c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  // the cells and columns specified in "columns".
48c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  static int VerifyTable(FILE* log_file, const ExpectedValuesMap& columns) {
49c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    int row = 0;
50c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    char line_buffer[kMaxLineLength];
51c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    char* ret = fgets(line_buffer, kMaxLineLength, log_file);
52c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    EXPECT_FALSE(ret == NULL);
53c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    if (ret == NULL)
54c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org      return -1;
55c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org
56c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    std::string line(line_buffer, kMaxLineLength);
57c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    VerifyHeader(line, columns);
58c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    while (fgets(line_buffer, kMaxLineLength, log_file) != NULL) {
59c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org      line = std::string(line_buffer, kMaxLineLength);
60c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org      size_t line_position = 0;
61c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org
62c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org      for (ExpectedValuesMap::const_iterator it = columns.begin();
63c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org           it != columns.end(); ++it) {
64c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org        std::string str = ParseElement(line, &line_position,
65c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                                       it->second.multi_value_length);
66c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org        EXPECT_EQ(str, it->second.values[row]);
67c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org        if (str != it->second.values[row])
68c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org          return -1;
69c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org      }
70c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org      ++row;
71c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    }
72c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    return 0;
73c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  }
74c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org
75c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  // Verifies the table header stored in "line" to correspond with the header
76c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  // specified in "columns".
77c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  static int VerifyHeader(const std::string& line,
78c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                          const ExpectedValuesMap& columns) {
79c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    size_t line_position = 0;
80c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    for (ExpectedValuesMap::const_iterator it = columns.begin();
81c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org         it != columns.end(); ++it) {
82c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org      std::string str = ParseElement(line, &line_position,
83c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                                     it->second.multi_value_length);
84c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org      EXPECT_EQ(str, it->first);
85c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org      if (str != it->first)
86c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org        return -1;
87c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    }
88c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    return 0;
89c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  }
90c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org
91c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  // Parses out and returns one element from the string "line", which contains
92c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  // one line read from a log table file. An element can either be a column
93c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  // header or a cell of a row.
94c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  static std::string ParseElement(const std::string& line,
95c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                                  size_t* line_position,
96c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                                  int multi_value_length) {
97c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    std::string parsed_cell;
98c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    parsed_cell = "";
99c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    for (int i = 0; i < multi_value_length; ++i) {
100c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org      size_t next_separator = line.find(',', *line_position);
101c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org      EXPECT_NE(next_separator, std::string::npos);
102c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org      if (next_separator == std::string::npos)
103c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org        break;
104c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org      parsed_cell += line.substr(*line_position,
105c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                                 next_separator - *line_position + 1);
106c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org      *line_position = next_separator + 1;
107c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    }
108c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    return parsed_cell;
109c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  }
110c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org
111c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  // This constant defines the maximum line length the DataLogParser can
112c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  // parse.
113c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  enum { kMaxLineLength = 100 };
114c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org};
115c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org
116c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.orgTEST(TestDataLog, CreateReturnTest) {
117c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  for (int i = 0; i < 10; ++i)
118c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    ASSERT_EQ(DataLog::CreateLog(), 0);
1193bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org  ASSERT_EQ(DataLog::AddTable(DataLog::Combine("a proper table", 1)), 0);
120c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  for (int i = 0; i < 10; ++i)
121c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    DataLog::ReturnLog();
1223bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org  ASSERT_LT(DataLog::AddTable(DataLog::Combine("table failure", 1)), 0);
123c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org}
124c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org
1255dedd0ee386c55d6dbafcdd53c0ad67ea0b2140ehenrik.lundin@webrtc.orgTEST(TestDataLog, VerifyCombineMethod) {
1265dedd0ee386c55d6dbafcdd53c0ad67ea0b2140ehenrik.lundin@webrtc.org  EXPECT_EQ(std::string("a proper table_1"),
1275dedd0ee386c55d6dbafcdd53c0ad67ea0b2140ehenrik.lundin@webrtc.org            DataLog::Combine("a proper table", 1));
1285dedd0ee386c55d6dbafcdd53c0ad67ea0b2140ehenrik.lundin@webrtc.org}
1295dedd0ee386c55d6dbafcdd53c0ad67ea0b2140ehenrik.lundin@webrtc.org
130c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.orgTEST(TestDataLog, VerifySingleTable) {
131c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  DataLog::CreateLog();
1323bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org  DataLog::AddTable(DataLog::Combine("table", 1));
1333bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org  DataLog::AddColumn(DataLog::Combine("table", 1), "arrival", 1);
1343bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org  DataLog::AddColumn(DataLog::Combine("table", 1), "timestamp", 1);
1353bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org  DataLog::AddColumn(DataLog::Combine("table", 1), "size", 5);
136046deb9b2050ebdf98a41e2d22f852e104dd365apbos@webrtc.org  uint32_t sizes[5] = {1400, 1500, 1600, 1700, 1800};
137c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  for (int i = 0; i < 10; ++i) {
1383bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org    DataLog::InsertCell(DataLog::Combine("table", 1), "arrival",
1393bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org                        static_cast<double>(i));
1403bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org    DataLog::InsertCell(DataLog::Combine("table", 1), "timestamp",
141046deb9b2050ebdf98a41e2d22f852e104dd365apbos@webrtc.org                        static_cast<int64_t>(4354 + i));
1423bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org    DataLog::InsertCell(DataLog::Combine("table", 1), "size", sizes, 5);
1433bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org    DataLog::NextRow(DataLog::Combine("table", 1));
144c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  }
145c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  DataLog::ReturnLog();
146c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  // Verify file
1473bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org  FILE* table = fopen("table_1.txt", "r");
148c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  ASSERT_FALSE(table == NULL);
149c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  // Read the column names and verify with the expected columns.
150c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  // Note that the columns are written to file in alphabetical order.
151c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  // Data expected from parsing the file
152c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  const int kNumberOfRows = 10;
153c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  std::string string_arrival[kNumberOfRows] = {
154c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    "0,", "1,", "2,", "3,", "4,",
155c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    "5,", "6,", "7,", "8,", "9,"
156c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  };
157c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  std::string string_timestamp[kNumberOfRows] = {
158c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    "4354,", "4355,", "4356,", "4357,",
159c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    "4358,", "4359,", "4360,", "4361,",
160c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    "4362,", "4363,"
161c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  };
162c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  std::string string_sizes = "1400,1500,1600,1700,1800,";
163c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  ExpectedValuesMap expected;
164c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  expected["arrival,"] = ExpectedValues(
165c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                           std::vector<std::string>(string_arrival,
166c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                                                    string_arrival +
167c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                                                    kNumberOfRows),
168c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                           1);
169c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  expected["size[5],,,,,"] = ExpectedValues(
170c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                               std::vector<std::string>(10, string_sizes), 5);
171c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  expected["timestamp,"] = ExpectedValues(
172c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                             std::vector<std::string>(string_timestamp,
173c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                                                      string_timestamp +
174c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                                                      kNumberOfRows),
175c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                             1);
176c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  ASSERT_EQ(DataLogParser::VerifyTable(table, expected), 0);
177c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  fclose(table);
178c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org}
179c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org
180c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.orgTEST(TestDataLog, VerifyMultipleTables) {
181c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  DataLog::CreateLog();
1823bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org  DataLog::AddTable(DataLog::Combine("table", 2));
1833bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org  DataLog::AddTable(DataLog::Combine("table", 3));
1843bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org  DataLog::AddColumn(DataLog::Combine("table", 2), "arrival", 1);
1853bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org  DataLog::AddColumn(DataLog::Combine("table", 2), "timestamp", 1);
1863bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org  DataLog::AddColumn(DataLog::Combine("table", 2), "size", 1);
1873bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org  DataLog::AddTable(DataLog::Combine("table", 4));
1883bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org  DataLog::AddColumn(DataLog::Combine("table", 3), "timestamp", 1);
1893bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org  DataLog::AddColumn(DataLog::Combine("table", 3), "arrival", 1);
1903bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org  DataLog::AddColumn(DataLog::Combine("table", 4), "size", 1);
191046deb9b2050ebdf98a41e2d22f852e104dd365apbos@webrtc.org  for (int32_t i = 0; i < 10; ++i) {
1923bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org    DataLog::InsertCell(DataLog::Combine("table", 2), "arrival",
193046deb9b2050ebdf98a41e2d22f852e104dd365apbos@webrtc.org                        static_cast<int32_t>(i));
1943bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org    DataLog::InsertCell(DataLog::Combine("table", 2), "timestamp",
195046deb9b2050ebdf98a41e2d22f852e104dd365apbos@webrtc.org                        static_cast<int32_t>(4354 + i));
1963bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org    DataLog::InsertCell(DataLog::Combine("table", 2), "size",
197046deb9b2050ebdf98a41e2d22f852e104dd365apbos@webrtc.org                        static_cast<int32_t>(1200 + 10 * i));
1983bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org    DataLog::InsertCell(DataLog::Combine("table", 3), "timestamp",
199046deb9b2050ebdf98a41e2d22f852e104dd365apbos@webrtc.org                        static_cast<int32_t>(4354 + i));
2003bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org    DataLog::InsertCell(DataLog::Combine("table", 3), "arrival",
201046deb9b2050ebdf98a41e2d22f852e104dd365apbos@webrtc.org                        static_cast<int32_t>(i));
2023bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org    DataLog::InsertCell(DataLog::Combine("table", 4), "size",
203046deb9b2050ebdf98a41e2d22f852e104dd365apbos@webrtc.org                        static_cast<int32_t>(1200 + 10 * i));
2043bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org    DataLog::NextRow(DataLog::Combine("table", 4));
2053bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org    DataLog::NextRow(DataLog::Combine("table", 2));
2063bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org    DataLog::NextRow(DataLog::Combine("table", 3));
207c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  }
208c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  DataLog::ReturnLog();
209c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org
210c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  // Data expected from parsing the file
211c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  const int kNumberOfRows = 10;
212c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  std::string string_arrival[kNumberOfRows] = {
213c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    "0,", "1,", "2,", "3,", "4,",
214c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    "5,", "6,", "7,", "8,", "9,"
215c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  };
216c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  std::string string_timestamp[kNumberOfRows] = {
217c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    "4354,", "4355,", "4356,", "4357,",
218c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    "4358,", "4359,", "4360,", "4361,",
219c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    "4362,", "4363,"
220c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  };
221c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  std::string string_size[kNumberOfRows] = {
222c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    "1200,", "1210,", "1220,", "1230,",
223c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    "1240,", "1250,", "1260,", "1270,",
224c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    "1280,", "1290,"
225c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  };
226c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org
227c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  // Verify table 2
228c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  {
2293bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org    FILE* table = fopen("table_2.txt", "r");
230c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    ASSERT_FALSE(table == NULL);
231c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    ExpectedValuesMap expected;
232c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    expected["arrival,"] = ExpectedValues(
233c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                             std::vector<std::string>(string_arrival,
234c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                                                      string_arrival +
235c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                                                      kNumberOfRows),
236c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                             1);
237c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    expected["size,"] = ExpectedValues(
238c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                          std::vector<std::string>(string_size,
239c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                                                   string_size + kNumberOfRows),
240c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                          1);
241c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    expected["timestamp,"] = ExpectedValues(
242c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                               std::vector<std::string>(string_timestamp,
243c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                                                        string_timestamp +
244c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                                                        kNumberOfRows),
245c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                               1);
246c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    ASSERT_EQ(DataLogParser::VerifyTable(table, expected), 0);
247c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    fclose(table);
248c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  }
249c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org
250c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  // Verify table 3
251c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  {
2523bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org    FILE* table = fopen("table_3.txt", "r");
253c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    ASSERT_FALSE(table == NULL);
254c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    ExpectedValuesMap expected;
255c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    expected["arrival,"] = ExpectedValues(
256c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                             std::vector<std::string>(string_arrival,
257c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                                                      string_arrival +
2583bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org                                                      kNumberOfRows),
259c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                             1);
260c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    expected["timestamp,"] = ExpectedValues(
261ba21c95e156eb57501ffcf36e2f8216b937fb80cphoglund@webrtc.org                               std::vector<std::string>(string_timestamp,
262ba21c95e156eb57501ffcf36e2f8216b937fb80cphoglund@webrtc.org                                                        string_timestamp +
263ba21c95e156eb57501ffcf36e2f8216b937fb80cphoglund@webrtc.org                                                        kNumberOfRows),
264c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                               1);
265c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    ASSERT_EQ(DataLogParser::VerifyTable(table, expected), 0);
266c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    fclose(table);
267c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  }
268c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org
269c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  // Verify table 4
270c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  {
2713bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org    FILE* table = fopen("table_4.txt", "r");
272c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    ASSERT_FALSE(table == NULL);
273c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    ExpectedValuesMap expected;
274c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    expected["size,"] = ExpectedValues(
275c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                          std::vector<std::string>(string_size,
276c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                                                   string_size +
2773bbe41aad624506577b728efc98bf30a7406d700stefan@webrtc.org                                                   kNumberOfRows),
278c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org                          1);
279c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    ASSERT_EQ(DataLogParser::VerifyTable(table, expected), 0);
280c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org    fclose(table);
281c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org  }
282c9cff24ff0e08f4d1dd1b1282102c9e097e1061bstefan@webrtc.org}
283d855bd4d6fb129945ea2747525eecfe582faff54henrik.lundin@webrtc.org
284d855bd4d6fb129945ea2747525eecfe582faff54henrik.lundin@webrtc.orgTEST(TestDataLogCWrapper, VerifyCWrapper) {
285d855bd4d6fb129945ea2747525eecfe582faff54henrik.lundin@webrtc.org  // Simply call all C wrapper log functions through the C helper unittests.
286d855bd4d6fb129945ea2747525eecfe582faff54henrik.lundin@webrtc.org  // Main purpose is to make sure that the linkage is correct.
287d855bd4d6fb129945ea2747525eecfe582faff54henrik.lundin@webrtc.org
288d855bd4d6fb129945ea2747525eecfe582faff54henrik.lundin@webrtc.org  EXPECT_EQ(0, WebRtcDataLogCHelper_TestCreateLog());
289d855bd4d6fb129945ea2747525eecfe582faff54henrik.lundin@webrtc.org  EXPECT_EQ(0, WebRtcDataLogCHelper_TestCombine());
290d855bd4d6fb129945ea2747525eecfe582faff54henrik.lundin@webrtc.org  EXPECT_EQ(0, WebRtcDataLogCHelper_TestAddTable());
291d855bd4d6fb129945ea2747525eecfe582faff54henrik.lundin@webrtc.org  EXPECT_EQ(0, WebRtcDataLogCHelper_TestAddColumn());
292d855bd4d6fb129945ea2747525eecfe582faff54henrik.lundin@webrtc.org  EXPECT_EQ(0, WebRtcDataLogCHelper_TestInsertCell_int());
293d855bd4d6fb129945ea2747525eecfe582faff54henrik.lundin@webrtc.org  EXPECT_EQ(0, WebRtcDataLogCHelper_TestInsertArray_int());
294d855bd4d6fb129945ea2747525eecfe582faff54henrik.lundin@webrtc.org  EXPECT_EQ(0, WebRtcDataLogCHelper_TestNextRow());
295d855bd4d6fb129945ea2747525eecfe582faff54henrik.lundin@webrtc.org  EXPECT_EQ(0, WebRtcDataLogCHelper_TestInsertCell_float());
296d855bd4d6fb129945ea2747525eecfe582faff54henrik.lundin@webrtc.org  EXPECT_EQ(0, WebRtcDataLogCHelper_TestInsertArray_float());
297d855bd4d6fb129945ea2747525eecfe582faff54henrik.lundin@webrtc.org  EXPECT_EQ(0, WebRtcDataLogCHelper_TestNextRow());
298d855bd4d6fb129945ea2747525eecfe582faff54henrik.lundin@webrtc.org  EXPECT_EQ(0, WebRtcDataLogCHelper_TestInsertCell_double());
299d855bd4d6fb129945ea2747525eecfe582faff54henrik.lundin@webrtc.org  EXPECT_EQ(0, WebRtcDataLogCHelper_TestInsertArray_double());
300d855bd4d6fb129945ea2747525eecfe582faff54henrik.lundin@webrtc.org  EXPECT_EQ(0, WebRtcDataLogCHelper_TestNextRow());
301d855bd4d6fb129945ea2747525eecfe582faff54henrik.lundin@webrtc.org  EXPECT_EQ(0, WebRtcDataLogCHelper_TestInsertCell_int32());
302d855bd4d6fb129945ea2747525eecfe582faff54henrik.lundin@webrtc.org  EXPECT_EQ(0, WebRtcDataLogCHelper_TestInsertArray_int32());
303d855bd4d6fb129945ea2747525eecfe582faff54henrik.lundin@webrtc.org  EXPECT_EQ(0, WebRtcDataLogCHelper_TestNextRow());
304d855bd4d6fb129945ea2747525eecfe582faff54henrik.lundin@webrtc.org  EXPECT_EQ(0, WebRtcDataLogCHelper_TestInsertCell_uint32());
305d855bd4d6fb129945ea2747525eecfe582faff54henrik.lundin@webrtc.org  EXPECT_EQ(0, WebRtcDataLogCHelper_TestInsertArray_uint32());
306d855bd4d6fb129945ea2747525eecfe582faff54henrik.lundin@webrtc.org  EXPECT_EQ(0, WebRtcDataLogCHelper_TestNextRow());
307d855bd4d6fb129945ea2747525eecfe582faff54henrik.lundin@webrtc.org  EXPECT_EQ(0, WebRtcDataLogCHelper_TestInsertCell_int64());
308d855bd4d6fb129945ea2747525eecfe582faff54henrik.lundin@webrtc.org  EXPECT_EQ(0, WebRtcDataLogCHelper_TestInsertArray_int64());
309d855bd4d6fb129945ea2747525eecfe582faff54henrik.lundin@webrtc.org  EXPECT_EQ(0, WebRtcDataLogCHelper_TestNextRow());
310d855bd4d6fb129945ea2747525eecfe582faff54henrik.lundin@webrtc.org  EXPECT_EQ(0, WebRtcDataLogCHelper_TestReturnLog());
311d855bd4d6fb129945ea2747525eecfe582faff54henrik.lundin@webrtc.org}
312