| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2006 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2006 The WebRTC Project Authors. All rights reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 130 bool done; | 130 bool done; |
| 131 size_t count; | 131 size_t count; |
| 132 size_t sec_count; | 132 size_t sec_count; |
| 133 double sum; | 133 double sum; |
| 134 double sum_sq; | 134 double sum_sq; |
| 135 uint32_t samples; | 135 uint32_t samples; |
| 136 }; | 136 }; |
| 137 | 137 |
| 138 class VirtualSocketServerTest : public testing::Test { | 138 class VirtualSocketServerTest : public testing::Test { |
| 139 public: | 139 public: |
| 140 VirtualSocketServerTest() : ss_(new VirtualSocketServer(NULL)), | 140 VirtualSocketServerTest() |
| 141 kIPv4AnyAddress(IPAddress(INADDR_ANY), 0), | 141 : ss_(new VirtualSocketServer(nullptr)), |
| 142 kIPv6AnyAddress(IPAddress(in6addr_any), 0) { | 142 kIPv4AnyAddress(IPAddress(INADDR_ANY), 0), |
| 143 } | 143 kIPv6AnyAddress(IPAddress(in6addr_any), 0) {} |
| 144 | 144 |
| 145 void CheckPortIncrementalization(const SocketAddress& post, | 145 void CheckPortIncrementalization(const SocketAddress& post, |
| 146 const SocketAddress& pre) { | 146 const SocketAddress& pre) { |
| 147 EXPECT_EQ(post.port(), pre.port() + 1); | 147 EXPECT_EQ(post.port(), pre.port() + 1); |
| 148 IPAddress post_ip = post.ipaddr(); | 148 IPAddress post_ip = post.ipaddr(); |
| 149 IPAddress pre_ip = pre.ipaddr(); | 149 IPAddress pre_ip = pre.ipaddr(); |
| 150 EXPECT_EQ(pre_ip.family(), post_ip.family()); | 150 EXPECT_EQ(pre_ip.family(), post_ip.family()); |
| 151 if (post_ip.family() == AF_INET) { | 151 if (post_ip.family() == AF_INET) { |
| 152 in_addr pre_ipv4 = pre_ip.ipv4_address(); | 152 in_addr pre_ipv4 = pre_ip.ipv4_address(); |
| 153 in_addr post_ipv4 = post_ip.ipv4_address(); | 153 in_addr post_ipv4 = post_ip.ipv4_address(); |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 256 SOCK_STREAM); | 256 SOCK_STREAM); |
| 257 sink.Monitor(server); | 257 sink.Monitor(server); |
| 258 EXPECT_NE(0, server->Listen(5)); // Bind required | 258 EXPECT_NE(0, server->Listen(5)); // Bind required |
| 259 EXPECT_EQ(0, server->Bind(initial_addr)); | 259 EXPECT_EQ(0, server->Bind(initial_addr)); |
| 260 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); | 260 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); |
| 261 EXPECT_EQ(0, server->Listen(5)); | 261 EXPECT_EQ(0, server->Listen(5)); |
| 262 EXPECT_EQ(server->GetState(), AsyncSocket::CS_CONNECTING); | 262 EXPECT_EQ(server->GetState(), AsyncSocket::CS_CONNECTING); |
| 263 | 263 |
| 264 // No pending server connections | 264 // No pending server connections |
| 265 EXPECT_FALSE(sink.Check(server, testing::SSE_READ)); | 265 EXPECT_FALSE(sink.Check(server, testing::SSE_READ)); |
| 266 EXPECT_TRUE(NULL == server->Accept(&accept_addr)); | 266 EXPECT_TRUE(nullptr == server->Accept(&accept_addr)); |
| 267 EXPECT_EQ(AF_UNSPEC, accept_addr.family()); | 267 EXPECT_EQ(AF_UNSPEC, accept_addr.family()); |
| 268 | 268 |
| 269 // Attempt connect to listening socket | 269 // Attempt connect to listening socket |
| 270 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); | 270 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); |
| 271 EXPECT_NE(client->GetLocalAddress(), kEmptyAddr); // Implicit Bind | 271 EXPECT_NE(client->GetLocalAddress(), kEmptyAddr); // Implicit Bind |
| 272 EXPECT_NE(AF_UNSPEC, client->GetLocalAddress().family()); // Implicit Bind | 272 EXPECT_NE(AF_UNSPEC, client->GetLocalAddress().family()); // Implicit Bind |
| 273 EXPECT_NE(client->GetLocalAddress(), server->GetLocalAddress()); | 273 EXPECT_NE(client->GetLocalAddress(), server->GetLocalAddress()); |
| 274 | 274 |
| 275 // Client is connecting | 275 // Client is connecting |
| 276 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING); | 276 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING); |
| 277 EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN)); | 277 EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN)); |
| 278 EXPECT_FALSE(sink.Check(client, testing::SSE_CLOSE)); | 278 EXPECT_FALSE(sink.Check(client, testing::SSE_CLOSE)); |
| 279 | 279 |
| 280 ss_->ProcessMessagesUntilIdle(); | 280 ss_->ProcessMessagesUntilIdle(); |
| 281 | 281 |
| 282 // Client still connecting | 282 // Client still connecting |
| 283 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING); | 283 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING); |
| 284 EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN)); | 284 EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN)); |
| 285 EXPECT_FALSE(sink.Check(client, testing::SSE_CLOSE)); | 285 EXPECT_FALSE(sink.Check(client, testing::SSE_CLOSE)); |
| 286 | 286 |
| 287 // Server has pending connection | 287 // Server has pending connection |
| 288 EXPECT_TRUE(sink.Check(server, testing::SSE_READ)); | 288 EXPECT_TRUE(sink.Check(server, testing::SSE_READ)); |
| 289 Socket* accepted = server->Accept(&accept_addr); | 289 Socket* accepted = server->Accept(&accept_addr); |
| 290 EXPECT_TRUE(NULL != accepted); | 290 EXPECT_TRUE(nullptr != accepted); |
| 291 EXPECT_NE(accept_addr, kEmptyAddr); | 291 EXPECT_NE(accept_addr, kEmptyAddr); |
| 292 EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr); | 292 EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr); |
| 293 | 293 |
| 294 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED); | 294 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED); |
| 295 EXPECT_EQ(accepted->GetLocalAddress(), server->GetLocalAddress()); | 295 EXPECT_EQ(accepted->GetLocalAddress(), server->GetLocalAddress()); |
| 296 EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress()); | 296 EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress()); |
| 297 | 297 |
| 298 ss_->ProcessMessagesUntilIdle(); | 298 ss_->ProcessMessagesUntilIdle(); |
| 299 | 299 |
| 300 // Client has connected | 300 // Client has connected |
| (...skipping 22 matching lines...) Expand all Loading... |
| 323 sink.Monitor(server); | 323 sink.Monitor(server); |
| 324 EXPECT_EQ(0, server->Bind(initial_addr)); | 324 EXPECT_EQ(0, server->Bind(initial_addr)); |
| 325 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); | 325 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); |
| 326 // Attempt connect to non-listening socket | 326 // Attempt connect to non-listening socket |
| 327 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); | 327 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); |
| 328 | 328 |
| 329 ss_->ProcessMessagesUntilIdle(); | 329 ss_->ProcessMessagesUntilIdle(); |
| 330 | 330 |
| 331 // No pending server connections | 331 // No pending server connections |
| 332 EXPECT_FALSE(sink.Check(server, testing::SSE_READ)); | 332 EXPECT_FALSE(sink.Check(server, testing::SSE_READ)); |
| 333 EXPECT_TRUE(NULL == server->Accept(&accept_addr)); | 333 EXPECT_TRUE(nullptr == server->Accept(&accept_addr)); |
| 334 EXPECT_EQ(accept_addr, nil_addr); | 334 EXPECT_EQ(accept_addr, nil_addr); |
| 335 | 335 |
| 336 // Connection failed | 336 // Connection failed |
| 337 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); | 337 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); |
| 338 EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN)); | 338 EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN)); |
| 339 EXPECT_TRUE(sink.Check(client, testing::SSE_ERROR)); | 339 EXPECT_TRUE(sink.Check(client, testing::SSE_ERROR)); |
| 340 EXPECT_EQ(client->GetRemoteAddress(), nil_addr); | 340 EXPECT_EQ(client->GetRemoteAddress(), nil_addr); |
| 341 } | 341 } |
| 342 | 342 |
| 343 void CloseDuringConnectTest(const SocketAddress& initial_addr) { | 343 void CloseDuringConnectTest(const SocketAddress& initial_addr) { |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 402 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); | 402 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); |
| 403 | 403 |
| 404 EXPECT_EQ(0, server->Listen(5)); | 404 EXPECT_EQ(0, server->Listen(5)); |
| 405 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); | 405 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); |
| 406 | 406 |
| 407 ss_->ProcessMessagesUntilIdle(); | 407 ss_->ProcessMessagesUntilIdle(); |
| 408 | 408 |
| 409 // Server accepts connection | 409 // Server accepts connection |
| 410 EXPECT_TRUE(sink.Check(server.get(), testing::SSE_READ)); | 410 EXPECT_TRUE(sink.Check(server.get(), testing::SSE_READ)); |
| 411 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); | 411 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); |
| 412 ASSERT_TRUE(NULL != accepted.get()); | 412 ASSERT_TRUE(nullptr != accepted.get()); |
| 413 sink.Monitor(accepted.get()); | 413 sink.Monitor(accepted.get()); |
| 414 | 414 |
| 415 // Client closes before connection complets | 415 // Client closes before connection complets |
| 416 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED); | 416 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED); |
| 417 | 417 |
| 418 // Connected message has not been processed yet. | 418 // Connected message has not been processed yet. |
| 419 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING); | 419 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING); |
| 420 client->Close(); | 420 client->Close(); |
| 421 | 421 |
| 422 ss_->ProcessMessagesUntilIdle(); | 422 ss_->ProcessMessagesUntilIdle(); |
| (...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 679 ASSERT_TRUE(receiver.count >= 5 * 3 * bandwidth / 4); | 679 ASSERT_TRUE(receiver.count >= 5 * 3 * bandwidth / 4); |
| 680 ASSERT_TRUE(receiver.count <= 6 * bandwidth); // queue could drain for 1s | 680 ASSERT_TRUE(receiver.count <= 6 * bandwidth); // queue could drain for 1s |
| 681 | 681 |
| 682 ss_->set_bandwidth(0); | 682 ss_->set_bandwidth(0); |
| 683 } | 683 } |
| 684 | 684 |
| 685 // It is important that initial_addr's port has to be 0 such that the | 685 // It is important that initial_addr's port has to be 0 such that the |
| 686 // incremental port behavior could ensure the 2 Binds result in different | 686 // incremental port behavior could ensure the 2 Binds result in different |
| 687 // address. | 687 // address. |
| 688 void DelayTest(const SocketAddress& initial_addr) { | 688 void DelayTest(const SocketAddress& initial_addr) { |
| 689 time_t seed = ::time(NULL); | 689 time_t seed = ::time(nullptr); |
| 690 LOG(LS_VERBOSE) << "seed = " << seed; | 690 LOG(LS_VERBOSE) << "seed = " << seed; |
| 691 srand(static_cast<unsigned int>(seed)); | 691 srand(static_cast<unsigned int>(seed)); |
| 692 | 692 |
| 693 const uint32_t mean = 2000; | 693 const uint32_t mean = 2000; |
| 694 const uint32_t stddev = 500; | 694 const uint32_t stddev = 500; |
| 695 | 695 |
| 696 ss_->set_delay_mean(mean); | 696 ss_->set_delay_mean(mean); |
| 697 ss_->set_delay_stddev(stddev); | 697 ss_->set_delay_stddev(stddev); |
| 698 ss_->UpdateDelayDistribution(); | 698 ss_->UpdateDelayDistribution(); |
| 699 | 699 |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 759 SOCK_STREAM); | 759 SOCK_STREAM); |
| 760 sink.Monitor(server); | 760 sink.Monitor(server); |
| 761 server->Bind(server_addr); | 761 server->Bind(server_addr); |
| 762 server->Listen(5); | 762 server->Listen(5); |
| 763 | 763 |
| 764 if (shouldSucceed) { | 764 if (shouldSucceed) { |
| 765 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); | 765 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); |
| 766 ss_->ProcessMessagesUntilIdle(); | 766 ss_->ProcessMessagesUntilIdle(); |
| 767 EXPECT_TRUE(sink.Check(server, testing::SSE_READ)); | 767 EXPECT_TRUE(sink.Check(server, testing::SSE_READ)); |
| 768 Socket* accepted = server->Accept(&accept_address); | 768 Socket* accepted = server->Accept(&accept_address); |
| 769 EXPECT_TRUE(NULL != accepted); | 769 EXPECT_TRUE(nullptr != accepted); |
| 770 EXPECT_NE(kEmptyAddr, accept_address); | 770 EXPECT_NE(kEmptyAddr, accept_address); |
| 771 ss_->ProcessMessagesUntilIdle(); | 771 ss_->ProcessMessagesUntilIdle(); |
| 772 EXPECT_TRUE(sink.Check(client, testing::SSE_OPEN)); | 772 EXPECT_TRUE(sink.Check(client, testing::SSE_OPEN)); |
| 773 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress()); | 773 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress()); |
| 774 } else { | 774 } else { |
| 775 // Check that the connection failed. | 775 // Check that the connection failed. |
| 776 EXPECT_EQ(-1, client->Connect(server->GetLocalAddress())); | 776 EXPECT_EQ(-1, client->Connect(server->GetLocalAddress())); |
| 777 ss_->ProcessMessagesUntilIdle(); | 777 ss_->ProcessMessagesUntilIdle(); |
| 778 | 778 |
| 779 EXPECT_FALSE(sink.Check(server, testing::SSE_READ)); | 779 EXPECT_FALSE(sink.Check(server, testing::SSE_READ)); |
| 780 EXPECT_TRUE(NULL == server->Accept(&accept_address)); | 780 EXPECT_TRUE(nullptr == server->Accept(&accept_address)); |
| 781 EXPECT_EQ(accept_address, kEmptyAddr); | 781 EXPECT_EQ(accept_address, kEmptyAddr); |
| 782 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); | 782 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); |
| 783 EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN)); | 783 EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN)); |
| 784 EXPECT_EQ(client->GetRemoteAddress(), kEmptyAddr); | 784 EXPECT_EQ(client->GetRemoteAddress(), kEmptyAddr); |
| 785 } | 785 } |
| 786 } | 786 } |
| 787 | 787 |
| 788 // Test cross-family datagram sending between a client bound to client_addr | 788 // Test cross-family datagram sending between a client bound to client_addr |
| 789 // and a server bound to server_addr. shouldSucceed indicates if sending is | 789 // and a server bound to server_addr. shouldSucceed indicates if sending is |
| 790 // expected to succeed or not. | 790 // expected to succeed or not. |
| (...skipping 20 matching lines...) Expand all Loading... |
| 811 } else { | 811 } else { |
| 812 EXPECT_EQ(-1, client2->SendTo("foo", 3, bound_server_addr)); | 812 EXPECT_EQ(-1, client2->SendTo("foo", 3, bound_server_addr)); |
| 813 EXPECT_TRUE(client1->CheckNoPacket()); | 813 EXPECT_TRUE(client1->CheckNoPacket()); |
| 814 } | 814 } |
| 815 } | 815 } |
| 816 | 816 |
| 817 protected: | 817 protected: |
| 818 virtual void SetUp() { | 818 virtual void SetUp() { |
| 819 Thread::Current()->set_socketserver(ss_); | 819 Thread::Current()->set_socketserver(ss_); |
| 820 } | 820 } |
| 821 virtual void TearDown() { | 821 virtual void TearDown() { Thread::Current()->set_socketserver(nullptr); } |
| 822 Thread::Current()->set_socketserver(NULL); | |
| 823 } | |
| 824 | 822 |
| 825 VirtualSocketServer* ss_; | 823 VirtualSocketServer* ss_; |
| 826 const SocketAddress kIPv4AnyAddress; | 824 const SocketAddress kIPv4AnyAddress; |
| 827 const SocketAddress kIPv6AnyAddress; | 825 const SocketAddress kIPv6AnyAddress; |
| 828 }; | 826 }; |
| 829 | 827 |
| 830 TEST_F(VirtualSocketServerTest, basic_v4) { | 828 TEST_F(VirtualSocketServerTest, basic_v4) { |
| 831 SocketAddress ipv4_test_addr(IPAddress(INADDR_ANY), 5000); | 829 SocketAddress ipv4_test_addr(IPAddress(INADDR_ANY), 5000); |
| 832 BasicTest(ipv4_test_addr); | 830 BasicTest(ipv4_test_addr); |
| 833 } | 831 } |
| (...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1089 for (size_t midx = 0; midx < arraysize(kTestMean); ++midx) { | 1087 for (size_t midx = 0; midx < arraysize(kTestMean); ++midx) { |
| 1090 for (size_t didx = 0; didx < arraysize(kTestDev); ++didx) { | 1088 for (size_t didx = 0; didx < arraysize(kTestDev); ++didx) { |
| 1091 for (size_t sidx = 0; sidx < arraysize(kTestSamples); ++sidx) { | 1089 for (size_t sidx = 0; sidx < arraysize(kTestSamples); ++sidx) { |
| 1092 ASSERT_LT(0u, kTestSamples[sidx]); | 1090 ASSERT_LT(0u, kTestSamples[sidx]); |
| 1093 const uint32_t kStdDev = | 1091 const uint32_t kStdDev = |
| 1094 static_cast<uint32_t>(kTestDev[didx] * kTestMean[midx]); | 1092 static_cast<uint32_t>(kTestDev[didx] * kTestMean[midx]); |
| 1095 VirtualSocketServer::Function* f = | 1093 VirtualSocketServer::Function* f = |
| 1096 VirtualSocketServer::CreateDistribution(kTestMean[midx], | 1094 VirtualSocketServer::CreateDistribution(kTestMean[midx], |
| 1097 kStdDev, | 1095 kStdDev, |
| 1098 kTestSamples[sidx]); | 1096 kTestSamples[sidx]); |
| 1099 ASSERT_TRUE(NULL != f); | 1097 ASSERT_TRUE(nullptr != f); |
| 1100 ASSERT_EQ(kTestSamples[sidx], f->size()); | 1098 ASSERT_EQ(kTestSamples[sidx], f->size()); |
| 1101 double sum = 0; | 1099 double sum = 0; |
| 1102 for (uint32_t i = 0; i < f->size(); ++i) { | 1100 for (uint32_t i = 0; i < f->size(); ++i) { |
| 1103 sum += (*f)[i].second; | 1101 sum += (*f)[i].second; |
| 1104 } | 1102 } |
| 1105 const double mean = sum / f->size(); | 1103 const double mean = sum / f->size(); |
| 1106 double sum_sq_dev = 0; | 1104 double sum_sq_dev = 0; |
| 1107 for (uint32_t i = 0; i < f->size(); ++i) { | 1105 for (uint32_t i = 0; i < f->size(); ++i) { |
| 1108 double dev = (*f)[i].second - mean; | 1106 double dev = (*f)[i].second - mean; |
| 1109 sum_sq_dev += dev * dev; | 1107 sum_sq_dev += dev * dev; |
| 1110 } | 1108 } |
| 1111 const double stddev = sqrt(sum_sq_dev / f->size()); | 1109 const double stddev = sqrt(sum_sq_dev / f->size()); |
| 1112 EXPECT_NEAR(kTestMean[midx], mean, 0.1 * kTestMean[midx]) | 1110 EXPECT_NEAR(kTestMean[midx], mean, 0.1 * kTestMean[midx]) |
| 1113 << "M=" << kTestMean[midx] | 1111 << "M=" << kTestMean[midx] |
| 1114 << " SD=" << kStdDev | 1112 << " SD=" << kStdDev |
| 1115 << " N=" << kTestSamples[sidx]; | 1113 << " N=" << kTestSamples[sidx]; |
| 1116 EXPECT_NEAR(kStdDev, stddev, 0.1 * kStdDev) | 1114 EXPECT_NEAR(kStdDev, stddev, 0.1 * kStdDev) |
| 1117 << "M=" << kTestMean[midx] | 1115 << "M=" << kTestMean[midx] |
| 1118 << " SD=" << kStdDev | 1116 << " SD=" << kStdDev |
| 1119 << " N=" << kTestSamples[sidx]; | 1117 << " N=" << kTestSamples[sidx]; |
| 1120 delete f; | 1118 delete f; |
| 1121 } | 1119 } |
| 1122 } | 1120 } |
| 1123 } | 1121 } |
| 1124 } | 1122 } |
| OLD | NEW |