15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2010 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sstream> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/renderer/net/predictor_queue.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Single threaded tests of DnsQueue functionality. 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DnsQueueTest : public testing::Test { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Define a helper class that does Push'es and Pop's of numbers. 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This makes it easy to test a LOT of reads, and keep the expected Pop 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// value in sync with the Push value. 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DnsQueueSequentialTester { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DnsQueueSequentialTester(DnsQueue& buffer, int32 read_counter = 0, 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 write_counter = 0); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return of false means buffer was full, or would not take entry. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Push(void); // Push the string value of next number. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return of false means buffer returned wrong value. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Pop(void); // Validate string value of next read. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DnsQueue* buffer_; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 read_counter_; // expected value of next read string. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 write_counter_; // Numerical value to write next string. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DnsQueueSequentialTester); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DnsQueueSequentialTester::DnsQueueSequentialTester( 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DnsQueue& buffer, int32 read_counter, int32 write_counter) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : buffer_(&buffer), 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_counter_(read_counter), 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) write_counter_(write_counter) { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DnsQueueSequentialTester::Push(void) { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::ostringstream value; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value << write_counter_; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Exercise both write methods intermittently. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DnsQueue::PushResult result = (write_counter_ % 2) ? 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer_->Push(value.str().c_str(), value.str().size()) : 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer_->Push(value.str()); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (DnsQueue::SUCCESSFUL_PUSH == result) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) write_counter_++; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return DnsQueue::OVERFLOW_PUSH != result; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DnsQueueSequentialTester::Pop(void) { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string string; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (buffer_->Pop(&string)) { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::ostringstream expected_value; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_value << read_counter_++; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ(expected_value.str().c_str(), string.c_str()) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Pop did not match write for value " << read_counter_; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(DnsQueueTest, BufferUseCheck) { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use a small buffer so we can see that we can't write a string as soon as it 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // gets longer than one less than the buffer size. The extra empty character 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is used to keep read and write pointers from overlapping when buffer is 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // full. This shows the buffer size can constrain writes (and we're not 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // scribbling all over memory). 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int buffer_size = 3; // Just room for 2 digts plus '\0' plus blank. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string string; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DnsQueue buffer(buffer_size); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DnsQueueSequentialTester tester(buffer); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tester.Pop()) << "Pop from empty buffer succeeded"; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < 102; i++) { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!tester.Push()) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; // String was too large. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tester.Pop()) << "Unable to read back data " << i; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(buffer.Pop(&string)) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "read from empty buffer not flagged"; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(i, 100) << "Can't write 2 digit strings in 4 character buffer"; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LT(i, 101) << "We wrote 3 digit strings into a 4 character buffer"; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(DnsQueueTest, SubstringUseCheck) { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that only substring is written/read. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int buffer_size = 100; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char big_string[] = "123456789"; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string string; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DnsQueue buffer(buffer_size); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(buffer.Pop(&string)) << "Initial buffer not empty"; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(DnsQueue::SUCCESSFUL_PUSH, buffer.Push(big_string, 3)) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Can't write string"; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(DnsQueue::SUCCESSFUL_PUSH, buffer.Push(big_string, 0)) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Can't write null string"; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(DnsQueue::SUCCESSFUL_PUSH, buffer.Push(big_string, 5)) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Can't write string"; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(buffer.Pop(&string)) << "Filled buffer marked as empty"; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ(string.c_str(), "123") << "Can't read actual data"; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(buffer.Pop(&string)) << "Filled buffer marked as empty"; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ(string.c_str(), "") << "Can't read null string"; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(buffer.Pop(&string)) << "Filled buffer marked as empty"; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ(string.c_str(), "12345") << "Can't read actual data"; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(buffer.Pop(&string)) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "read from empty buffer not flagged"; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(DnsQueueTest, SizeCheck) { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that size is correctly accounted for in buffer. 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int buffer_size = 100; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string input_string = "Hello"; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string string; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DnsQueue buffer(buffer_size); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0U, buffer.Size()); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(buffer.Pop(&string)); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(DnsQueue::SUCCESSFUL_PUSH, buffer.Push(input_string)); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1U, buffer.Size()); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(DnsQueue::SUCCESSFUL_PUSH, buffer.Push("Hi There")); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2U, buffer.Size()); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(buffer.Pop(&string)); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1U, buffer.Size()); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(buffer.Pop(&string)); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0U, buffer.Size()); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(DnsQueue::SUCCESSFUL_PUSH, buffer.Push(input_string)); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1U, buffer.Size()); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check to see that the first string, if repeated, is discarded. 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(DnsQueue::REDUNDANT_PUSH, buffer.Push(input_string)); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1U, buffer.Size()); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(DnsQueueTest, FillThenEmptyCheck) { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use a big buffer so we'll get a bunch of writes in. 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This tests to be sure the buffer holds many strings. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We also make sure they all come out intact. 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t buffer_size = 1000; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t byte_usage_counter = 1; // Separation character between pointer. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DnsQueue buffer(buffer_size); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DnsQueueSequentialTester tester(buffer); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t write_success; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (write_success = 0; write_success < buffer_size; write_success++) { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!tester.Push()) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(buffer.Size(), write_success + 1); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (write_success > 99) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_usage_counter += 4; // 3 digit plus '\0'. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (write_success > 9) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_usage_counter += 3; // 2 digits plus '\0'. 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_usage_counter += 2; // Digit plus '\0'. 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LE(byte_usage_counter, buffer_size) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Written data exceeded buffer size"; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(byte_usage_counter, buffer_size - 4) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Buffer does not appear to have filled"; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(write_success, 10U) << "Couldn't even write 10 one digit strings " 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "in " << buffer_size << " byte buffer"; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (1) { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!tester.Pop()) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) write_success--; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(write_success, 0U) << "Push and Pop count were different"; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tester.Pop()) << "Read from empty buffer succeeded"; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(DnsQueueTest, ClearCheck) { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use a big buffer so we'll get a bunch of writes in. 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t buffer_size = 1000; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DnsQueue buffer(buffer_size); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string string("ABC"); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DnsQueueSequentialTester tester(buffer); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t write_success; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (write_success = 0; write_success < buffer_size; write_success++) { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!tester.Push()) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(buffer.Size(), write_success + 1); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer.Clear(); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(buffer.Size(), 0U); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t write_success2; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (write_success2 = 0; write_success2 < buffer_size; write_success2++) { 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!tester.Push()) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(buffer.Size(), write_success2 + 1); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (; write_success2 > 0; write_success2--) { 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(buffer.Size(), write_success2); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(buffer.Pop(&string)); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(buffer.Size(), 0U); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer.Clear(); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(buffer.Size(), 0U); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(DnsQueueTest, WrapOnVariousSubstrings) { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use a prime number for the allocated buffer size so that we tend 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to exercise all possible edge conditions (in circular text buffer). 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Once we're over 10 writes, all our strings are 2 digits long, 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with a '\0' terminator added making 3 characters per write. 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since 3 is relatively prime to 23, we'll soon wrap (about 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // every 6 writes). Hence after 18 writes, we'll have tested all 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // edge conditions. We'll first do this where we empty the buffer 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // after each write, and then again where there are some strings 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // still in the buffer after each write. 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int prime_number = 23; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Circular buffer needs an extra extra space to distinguish full from empty. 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int buffer_size = prime_number - 1; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DnsQueue buffer(buffer_size); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DnsQueueSequentialTester tester(buffer); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First test empties between each write. Second loop 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // has writes for each pop. Third has three pushes per pop. 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Third has two items pending during each write. 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int j = 0; j < 3; j++) { 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Each group does 30 tests, which is more than 10+18 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which was needed to get into the thorough testing zone 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // mentioned above. 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 30; i++) { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tester.Push()) << "write failed with only " << j 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " blocks in buffer"; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tester.Pop()) << "Unable to read back data "; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tester.Push()); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Read back the accumulated 3 extra blocks. 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tester.Pop()); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tester.Pop()); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tester.Pop()); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tester.Pop()); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; // namespace 263