stefan@webrtc.org | c9cff24 | 2011-08-29 07:39:02 +0000 | [diff] [blame] | 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 | |
phoglund@webrtc.org | ba21c95 | 2012-12-03 09:01:21 +0000 | [diff] [blame^] | 11 | #include "webrtc/system_wrappers/interface/data_log.h" |
| 12 | |
stefan@webrtc.org | c9cff24 | 2011-08-29 07:39:02 +0000 | [diff] [blame] | 13 | #include <map> |
| 14 | #include <string> |
| 15 | |
stefan@webrtc.org | c9cff24 | 2011-08-29 07:39:02 +0000 | [diff] [blame] | 16 | #include "gtest/gtest.h" |
phoglund@webrtc.org | ba21c95 | 2012-12-03 09:01:21 +0000 | [diff] [blame^] | 17 | #include "webrtc/system_wrappers/interface/data_log_c.h" |
| 18 | #include "webrtc/system_wrappers/source/data_log_c_helpers_unittest.h" |
stefan@webrtc.org | c9cff24 | 2011-08-29 07:39:02 +0000 | [diff] [blame] | 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() |
brykt@google.com | e8ef807 | 2012-11-09 16:16:41 +0000 | [diff] [blame] | 27 | : values(), |
stefan@webrtc.org | c9cff24 | 2011-08-29 07:39:02 +0000 | [diff] [blame] | 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); |
stefan@webrtc.org | 3bbe41a | 2011-09-07 15:31:03 +0000 | [diff] [blame] | 119 | ASSERT_EQ(DataLog::AddTable(DataLog::Combine("a proper table", 1)), 0); |
stefan@webrtc.org | c9cff24 | 2011-08-29 07:39:02 +0000 | [diff] [blame] | 120 | for (int i = 0; i < 10; ++i) |
| 121 | DataLog::ReturnLog(); |
stefan@webrtc.org | 3bbe41a | 2011-09-07 15:31:03 +0000 | [diff] [blame] | 122 | ASSERT_LT(DataLog::AddTable(DataLog::Combine("table failure", 1)), 0); |
stefan@webrtc.org | c9cff24 | 2011-08-29 07:39:02 +0000 | [diff] [blame] | 123 | } |
| 124 | |
henrik.lundin@webrtc.org | 5dedd0e | 2011-10-18 05:45:08 +0000 | [diff] [blame] | 125 | TEST(TestDataLog, VerifyCombineMethod) { |
| 126 | EXPECT_EQ(std::string("a proper table_1"), |
| 127 | DataLog::Combine("a proper table", 1)); |
| 128 | } |
| 129 | |
stefan@webrtc.org | c9cff24 | 2011-08-29 07:39:02 +0000 | [diff] [blame] | 130 | TEST(TestDataLog, VerifySingleTable) { |
| 131 | DataLog::CreateLog(); |
stefan@webrtc.org | 3bbe41a | 2011-09-07 15:31:03 +0000 | [diff] [blame] | 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); |
stefan@webrtc.org | c9cff24 | 2011-08-29 07:39:02 +0000 | [diff] [blame] | 136 | WebRtc_UWord32 sizes[5] = {1400, 1500, 1600, 1700, 1800}; |
| 137 | for (int i = 0; i < 10; ++i) { |
stefan@webrtc.org | 3bbe41a | 2011-09-07 15:31:03 +0000 | [diff] [blame] | 138 | DataLog::InsertCell(DataLog::Combine("table", 1), "arrival", |
| 139 | static_cast<double>(i)); |
| 140 | DataLog::InsertCell(DataLog::Combine("table", 1), "timestamp", |
stefan@webrtc.org | c9cff24 | 2011-08-29 07:39:02 +0000 | [diff] [blame] | 141 | static_cast<WebRtc_Word64>(4354 + i)); |
stefan@webrtc.org | 3bbe41a | 2011-09-07 15:31:03 +0000 | [diff] [blame] | 142 | DataLog::InsertCell(DataLog::Combine("table", 1), "size", sizes, 5); |
| 143 | DataLog::NextRow(DataLog::Combine("table", 1)); |
stefan@webrtc.org | c9cff24 | 2011-08-29 07:39:02 +0000 | [diff] [blame] | 144 | } |
| 145 | DataLog::ReturnLog(); |
| 146 | // Verify file |
stefan@webrtc.org | 3bbe41a | 2011-09-07 15:31:03 +0000 | [diff] [blame] | 147 | FILE* table = fopen("table_1.txt", "r"); |
stefan@webrtc.org | c9cff24 | 2011-08-29 07:39:02 +0000 | [diff] [blame] | 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(); |
stefan@webrtc.org | 3bbe41a | 2011-09-07 15:31:03 +0000 | [diff] [blame] | 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); |
stefan@webrtc.org | c9cff24 | 2011-08-29 07:39:02 +0000 | [diff] [blame] | 191 | for (WebRtc_Word32 i = 0; i < 10; ++i) { |
stefan@webrtc.org | 3bbe41a | 2011-09-07 15:31:03 +0000 | [diff] [blame] | 192 | DataLog::InsertCell(DataLog::Combine("table", 2), "arrival", |
stefan@webrtc.org | c9cff24 | 2011-08-29 07:39:02 +0000 | [diff] [blame] | 193 | static_cast<WebRtc_Word32>(i)); |
stefan@webrtc.org | 3bbe41a | 2011-09-07 15:31:03 +0000 | [diff] [blame] | 194 | DataLog::InsertCell(DataLog::Combine("table", 2), "timestamp", |
stefan@webrtc.org | c9cff24 | 2011-08-29 07:39:02 +0000 | [diff] [blame] | 195 | static_cast<WebRtc_Word32>(4354 + i)); |
stefan@webrtc.org | 3bbe41a | 2011-09-07 15:31:03 +0000 | [diff] [blame] | 196 | DataLog::InsertCell(DataLog::Combine("table", 2), "size", |
stefan@webrtc.org | c9cff24 | 2011-08-29 07:39:02 +0000 | [diff] [blame] | 197 | static_cast<WebRtc_Word32>(1200 + 10 * i)); |
stefan@webrtc.org | 3bbe41a | 2011-09-07 15:31:03 +0000 | [diff] [blame] | 198 | DataLog::InsertCell(DataLog::Combine("table", 3), "timestamp", |
stefan@webrtc.org | c9cff24 | 2011-08-29 07:39:02 +0000 | [diff] [blame] | 199 | static_cast<WebRtc_Word32>(4354 + i)); |
stefan@webrtc.org | 3bbe41a | 2011-09-07 15:31:03 +0000 | [diff] [blame] | 200 | DataLog::InsertCell(DataLog::Combine("table", 3), "arrival", |
stefan@webrtc.org | c9cff24 | 2011-08-29 07:39:02 +0000 | [diff] [blame] | 201 | static_cast<WebRtc_Word32>(i)); |
stefan@webrtc.org | 3bbe41a | 2011-09-07 15:31:03 +0000 | [diff] [blame] | 202 | DataLog::InsertCell(DataLog::Combine("table", 4), "size", |
stefan@webrtc.org | c9cff24 | 2011-08-29 07:39:02 +0000 | [diff] [blame] | 203 | static_cast<WebRtc_Word32>(1200 + 10 * i)); |
stefan@webrtc.org | 3bbe41a | 2011-09-07 15:31:03 +0000 | [diff] [blame] | 204 | DataLog::NextRow(DataLog::Combine("table", 4)); |
| 205 | DataLog::NextRow(DataLog::Combine("table", 2)); |
| 206 | DataLog::NextRow(DataLog::Combine("table", 3)); |
stefan@webrtc.org | c9cff24 | 2011-08-29 07:39:02 +0000 | [diff] [blame] | 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 | { |
stefan@webrtc.org | 3bbe41a | 2011-09-07 15:31:03 +0000 | [diff] [blame] | 229 | FILE* table = fopen("table_2.txt", "r"); |
stefan@webrtc.org | c9cff24 | 2011-08-29 07:39:02 +0000 | [diff] [blame] | 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 | { |
stefan@webrtc.org | 3bbe41a | 2011-09-07 15:31:03 +0000 | [diff] [blame] | 252 | FILE* table = fopen("table_3.txt", "r"); |
stefan@webrtc.org | c9cff24 | 2011-08-29 07:39:02 +0000 | [diff] [blame] | 253 | ASSERT_FALSE(table == NULL); |
| 254 | ExpectedValuesMap expected; |
| 255 | expected["arrival,"] = ExpectedValues( |
| 256 | std::vector<std::string>(string_arrival, |
| 257 | string_arrival + |
stefan@webrtc.org | 3bbe41a | 2011-09-07 15:31:03 +0000 | [diff] [blame] | 258 | kNumberOfRows), |
stefan@webrtc.org | c9cff24 | 2011-08-29 07:39:02 +0000 | [diff] [blame] | 259 | 1); |
| 260 | expected["timestamp,"] = ExpectedValues( |
phoglund@webrtc.org | ba21c95 | 2012-12-03 09:01:21 +0000 | [diff] [blame^] | 261 | std::vector<std::string>(string_timestamp, |
| 262 | string_timestamp + |
| 263 | kNumberOfRows), |
stefan@webrtc.org | c9cff24 | 2011-08-29 07:39:02 +0000 | [diff] [blame] | 264 | 1); |
| 265 | ASSERT_EQ(DataLogParser::VerifyTable(table, expected), 0); |
| 266 | fclose(table); |
| 267 | } |
| 268 | |
| 269 | // Verify table 4 |
| 270 | { |
stefan@webrtc.org | 3bbe41a | 2011-09-07 15:31:03 +0000 | [diff] [blame] | 271 | FILE* table = fopen("table_4.txt", "r"); |
stefan@webrtc.org | c9cff24 | 2011-08-29 07:39:02 +0000 | [diff] [blame] | 272 | ASSERT_FALSE(table == NULL); |
| 273 | ExpectedValuesMap expected; |
| 274 | expected["size,"] = ExpectedValues( |
| 275 | std::vector<std::string>(string_size, |
| 276 | string_size + |
stefan@webrtc.org | 3bbe41a | 2011-09-07 15:31:03 +0000 | [diff] [blame] | 277 | kNumberOfRows), |
stefan@webrtc.org | c9cff24 | 2011-08-29 07:39:02 +0000 | [diff] [blame] | 278 | 1); |
| 279 | ASSERT_EQ(DataLogParser::VerifyTable(table, expected), 0); |
| 280 | fclose(table); |
| 281 | } |
| 282 | } |
henrik.lundin@webrtc.org | d855bd4 | 2011-10-10 08:06:17 +0000 | [diff] [blame] | 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 | } |