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