| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/base/elements_upload_data_stream.h" | 5 #include "net/base/elements_upload_data_stream.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <limits> | 10 #include <limits> |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 176 int bytes_read = | 176 int bytes_read = |
| 177 stream->Read(buf.get(), kTestBufferSize, CompletionCallback()); | 177 stream->Read(buf.get(), kTestBufferSize, CompletionCallback()); |
| 178 ASSERT_LE(0, bytes_read); // Not an error. | 178 ASSERT_LE(0, bytes_read); // Not an error. |
| 179 } | 179 } |
| 180 EXPECT_EQ(kTestDataSize, stream->position()); | 180 EXPECT_EQ(kTestDataSize, stream->position()); |
| 181 ASSERT_TRUE(stream->IsEOF()); | 181 ASSERT_TRUE(stream->IsEOF()); |
| 182 } | 182 } |
| 183 | 183 |
| 184 TEST_F(ElementsUploadDataStreamTest, File) { | 184 TEST_F(ElementsUploadDataStreamTest, File) { |
| 185 base::FilePath temp_file_path; | 185 base::FilePath temp_file_path; |
| 186 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), | 186 ASSERT_TRUE( |
| 187 &temp_file_path)); | 187 base::CreateTemporaryFileInDir(temp_dir_.GetPath(), &temp_file_path)); |
| 188 ASSERT_EQ(static_cast<int>(kTestDataSize), | 188 ASSERT_EQ(static_cast<int>(kTestDataSize), |
| 189 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); | 189 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); |
| 190 | 190 |
| 191 element_readers_.push_back(base::WrapUnique(new UploadFileElementReader( | 191 element_readers_.push_back(base::WrapUnique(new UploadFileElementReader( |
| 192 base::ThreadTaskRunnerHandle::Get().get(), temp_file_path, 0, | 192 base::ThreadTaskRunnerHandle::Get().get(), temp_file_path, 0, |
| 193 std::numeric_limits<uint64_t>::max(), base::Time()))); | 193 std::numeric_limits<uint64_t>::max(), base::Time()))); |
| 194 | 194 |
| 195 TestCompletionCallback init_callback; | 195 TestCompletionCallback init_callback; |
| 196 std::unique_ptr<UploadDataStream> stream( | 196 std::unique_ptr<UploadDataStream> stream( |
| 197 new ElementsUploadDataStream(std::move(element_readers_), 0)); | 197 new ElementsUploadDataStream(std::move(element_readers_), 0)); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 209 ERR_IO_PENDING, | 209 ERR_IO_PENDING, |
| 210 stream->Read(buf.get(), kTestBufferSize, read_callback.callback())); | 210 stream->Read(buf.get(), kTestBufferSize, read_callback.callback())); |
| 211 ASSERT_LE(0, read_callback.WaitForResult()); // Not an error. | 211 ASSERT_LE(0, read_callback.WaitForResult()); // Not an error. |
| 212 } | 212 } |
| 213 EXPECT_EQ(kTestDataSize, stream->position()); | 213 EXPECT_EQ(kTestDataSize, stream->position()); |
| 214 ASSERT_TRUE(stream->IsEOF()); | 214 ASSERT_TRUE(stream->IsEOF()); |
| 215 } | 215 } |
| 216 | 216 |
| 217 TEST_F(ElementsUploadDataStreamTest, FileSmallerThanLength) { | 217 TEST_F(ElementsUploadDataStreamTest, FileSmallerThanLength) { |
| 218 base::FilePath temp_file_path; | 218 base::FilePath temp_file_path; |
| 219 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), | 219 ASSERT_TRUE( |
| 220 &temp_file_path)); | 220 base::CreateTemporaryFileInDir(temp_dir_.GetPath(), &temp_file_path)); |
| 221 ASSERT_EQ(static_cast<int>(kTestDataSize), | 221 ASSERT_EQ(static_cast<int>(kTestDataSize), |
| 222 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); | 222 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); |
| 223 const uint64_t kFakeSize = kTestDataSize * 2; | 223 const uint64_t kFakeSize = kTestDataSize * 2; |
| 224 | 224 |
| 225 UploadFileElementReader::ScopedOverridingContentLengthForTests | 225 UploadFileElementReader::ScopedOverridingContentLengthForTests |
| 226 overriding_content_length(kFakeSize); | 226 overriding_content_length(kFakeSize); |
| 227 | 227 |
| 228 element_readers_.push_back(base::WrapUnique(new UploadFileElementReader( | 228 element_readers_.push_back(base::WrapUnique(new UploadFileElementReader( |
| 229 base::ThreadTaskRunnerHandle::Get().get(), temp_file_path, 0, | 229 base::ThreadTaskRunnerHandle::Get().get(), temp_file_path, 0, |
| 230 std::numeric_limits<uint64_t>::max(), base::Time()))); | 230 std::numeric_limits<uint64_t>::max(), base::Time()))); |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 328 EXPECT_THAT(read_callback.WaitForResult(), IsError(ERR_FAILED)); | 328 EXPECT_THAT(read_callback.WaitForResult(), IsError(ERR_FAILED)); |
| 329 EXPECT_EQ(0U, stream->position()); | 329 EXPECT_EQ(0U, stream->position()); |
| 330 EXPECT_FALSE(stream->IsEOF()); | 330 EXPECT_FALSE(stream->IsEOF()); |
| 331 | 331 |
| 332 // The buffer is empty | 332 // The buffer is empty |
| 333 EXPECT_EQ(0, std::count(buf->data(), buf->data() + kTestBufferSize, 0)); | 333 EXPECT_EQ(0, std::count(buf->data(), buf->data() + kTestBufferSize, 0)); |
| 334 } | 334 } |
| 335 | 335 |
| 336 TEST_F(ElementsUploadDataStreamTest, FileAndBytes) { | 336 TEST_F(ElementsUploadDataStreamTest, FileAndBytes) { |
| 337 base::FilePath temp_file_path; | 337 base::FilePath temp_file_path; |
| 338 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), | 338 ASSERT_TRUE( |
| 339 &temp_file_path)); | 339 base::CreateTemporaryFileInDir(temp_dir_.GetPath(), &temp_file_path)); |
| 340 ASSERT_EQ(static_cast<int>(kTestDataSize), | 340 ASSERT_EQ(static_cast<int>(kTestDataSize), |
| 341 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); | 341 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); |
| 342 | 342 |
| 343 const uint64_t kFileRangeOffset = 1; | 343 const uint64_t kFileRangeOffset = 1; |
| 344 const uint64_t kFileRangeLength = 4; | 344 const uint64_t kFileRangeLength = 4; |
| 345 element_readers_.push_back(base::WrapUnique(new UploadFileElementReader( | 345 element_readers_.push_back(base::WrapUnique(new UploadFileElementReader( |
| 346 base::ThreadTaskRunnerHandle::Get().get(), temp_file_path, | 346 base::ThreadTaskRunnerHandle::Get().get(), temp_file_path, |
| 347 kFileRangeOffset, kFileRangeLength, base::Time()))); | 347 kFileRangeOffset, kFileRangeLength, base::Time()))); |
| 348 | 348 |
| 349 element_readers_.push_back( | 349 element_readers_.push_back( |
| (...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 548 IsError(ERR_IO_PENDING)); | 548 IsError(ERR_IO_PENDING)); |
| 549 int error_code = init_callback.WaitForResult(); | 549 int error_code = init_callback.WaitForResult(); |
| 550 if (error_expected) | 550 if (error_expected) |
| 551 ASSERT_THAT(error_code, IsError(ERR_UPLOAD_FILE_CHANGED)); | 551 ASSERT_THAT(error_code, IsError(ERR_UPLOAD_FILE_CHANGED)); |
| 552 else | 552 else |
| 553 ASSERT_THAT(error_code, IsOk()); | 553 ASSERT_THAT(error_code, IsOk()); |
| 554 } | 554 } |
| 555 | 555 |
| 556 TEST_F(ElementsUploadDataStreamTest, FileChanged) { | 556 TEST_F(ElementsUploadDataStreamTest, FileChanged) { |
| 557 base::FilePath temp_file_path; | 557 base::FilePath temp_file_path; |
| 558 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), | 558 ASSERT_TRUE( |
| 559 &temp_file_path)); | 559 base::CreateTemporaryFileInDir(temp_dir_.GetPath(), &temp_file_path)); |
| 560 ASSERT_EQ(static_cast<int>(kTestDataSize), | 560 ASSERT_EQ(static_cast<int>(kTestDataSize), |
| 561 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); | 561 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); |
| 562 | 562 |
| 563 base::File::Info file_info; | 563 base::File::Info file_info; |
| 564 ASSERT_TRUE(base::GetFileInfo(temp_file_path, &file_info)); | 564 ASSERT_TRUE(base::GetFileInfo(temp_file_path, &file_info)); |
| 565 | 565 |
| 566 // Test file not changed. | 566 // Test file not changed. |
| 567 FileChangedHelper(temp_file_path, file_info.last_modified, false); | 567 FileChangedHelper(temp_file_path, file_info.last_modified, false); |
| 568 | 568 |
| 569 // Test file changed. | 569 // Test file changed. |
| 570 FileChangedHelper(temp_file_path, | 570 FileChangedHelper(temp_file_path, |
| 571 file_info.last_modified - base::TimeDelta::FromSeconds(1), | 571 file_info.last_modified - base::TimeDelta::FromSeconds(1), |
| 572 true); | 572 true); |
| 573 } | 573 } |
| 574 | 574 |
| 575 TEST_F(ElementsUploadDataStreamTest, MultipleInit) { | 575 TEST_F(ElementsUploadDataStreamTest, MultipleInit) { |
| 576 base::FilePath temp_file_path; | 576 base::FilePath temp_file_path; |
| 577 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), | 577 ASSERT_TRUE( |
| 578 &temp_file_path)); | 578 base::CreateTemporaryFileInDir(temp_dir_.GetPath(), &temp_file_path)); |
| 579 ASSERT_EQ(static_cast<int>(kTestDataSize), | 579 ASSERT_EQ(static_cast<int>(kTestDataSize), |
| 580 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); | 580 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); |
| 581 | 581 |
| 582 // Prepare data. | 582 // Prepare data. |
| 583 element_readers_.push_back( | 583 element_readers_.push_back( |
| 584 base::WrapUnique(new UploadBytesElementReader(kTestData, kTestDataSize))); | 584 base::WrapUnique(new UploadBytesElementReader(kTestData, kTestDataSize))); |
| 585 element_readers_.push_back(base::WrapUnique(new UploadFileElementReader( | 585 element_readers_.push_back(base::WrapUnique(new UploadFileElementReader( |
| 586 base::ThreadTaskRunnerHandle::Get().get(), temp_file_path, 0, | 586 base::ThreadTaskRunnerHandle::Get().get(), temp_file_path, 0, |
| 587 std::numeric_limits<uint64_t>::max(), base::Time()))); | 587 std::numeric_limits<uint64_t>::max(), base::Time()))); |
| 588 std::unique_ptr<UploadDataStream> stream( | 588 std::unique_ptr<UploadDataStream> stream( |
| (...skipping 22 matching lines...) Expand all Loading... |
| 611 EXPECT_FALSE(stream->IsEOF()); | 611 EXPECT_FALSE(stream->IsEOF()); |
| 612 EXPECT_EQ(kTestDataSize*2, stream->size()); | 612 EXPECT_EQ(kTestDataSize*2, stream->size()); |
| 613 | 613 |
| 614 // Read again. | 614 // Read again. |
| 615 EXPECT_EQ(expected_data, ReadFromUploadDataStream(stream.get())); | 615 EXPECT_EQ(expected_data, ReadFromUploadDataStream(stream.get())); |
| 616 EXPECT_TRUE(stream->IsEOF()); | 616 EXPECT_TRUE(stream->IsEOF()); |
| 617 } | 617 } |
| 618 | 618 |
| 619 TEST_F(ElementsUploadDataStreamTest, MultipleInitAsync) { | 619 TEST_F(ElementsUploadDataStreamTest, MultipleInitAsync) { |
| 620 base::FilePath temp_file_path; | 620 base::FilePath temp_file_path; |
| 621 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), | 621 ASSERT_TRUE( |
| 622 &temp_file_path)); | 622 base::CreateTemporaryFileInDir(temp_dir_.GetPath(), &temp_file_path)); |
| 623 ASSERT_EQ(static_cast<int>(kTestDataSize), | 623 ASSERT_EQ(static_cast<int>(kTestDataSize), |
| 624 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); | 624 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); |
| 625 TestCompletionCallback test_callback; | 625 TestCompletionCallback test_callback; |
| 626 | 626 |
| 627 // Prepare data. | 627 // Prepare data. |
| 628 element_readers_.push_back( | 628 element_readers_.push_back( |
| 629 base::WrapUnique(new UploadBytesElementReader(kTestData, kTestDataSize))); | 629 base::WrapUnique(new UploadBytesElementReader(kTestData, kTestDataSize))); |
| 630 element_readers_.push_back(base::WrapUnique(new UploadFileElementReader( | 630 element_readers_.push_back(base::WrapUnique(new UploadFileElementReader( |
| 631 base::ThreadTaskRunnerHandle::Get().get(), temp_file_path, 0, | 631 base::ThreadTaskRunnerHandle::Get().get(), temp_file_path, 0, |
| 632 std::numeric_limits<uint64_t>::max(), base::Time()))); | 632 std::numeric_limits<uint64_t>::max(), base::Time()))); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 654 EXPECT_FALSE(stream->IsEOF()); | 654 EXPECT_FALSE(stream->IsEOF()); |
| 655 EXPECT_EQ(kTestDataSize*2, stream->size()); | 655 EXPECT_EQ(kTestDataSize*2, stream->size()); |
| 656 | 656 |
| 657 // Read again. | 657 // Read again. |
| 658 EXPECT_EQ(expected_data, ReadFromUploadDataStream(stream.get())); | 658 EXPECT_EQ(expected_data, ReadFromUploadDataStream(stream.get())); |
| 659 EXPECT_TRUE(stream->IsEOF()); | 659 EXPECT_TRUE(stream->IsEOF()); |
| 660 } | 660 } |
| 661 | 661 |
| 662 TEST_F(ElementsUploadDataStreamTest, InitToReset) { | 662 TEST_F(ElementsUploadDataStreamTest, InitToReset) { |
| 663 base::FilePath temp_file_path; | 663 base::FilePath temp_file_path; |
| 664 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), | 664 ASSERT_TRUE( |
| 665 &temp_file_path)); | 665 base::CreateTemporaryFileInDir(temp_dir_.GetPath(), &temp_file_path)); |
| 666 ASSERT_EQ(static_cast<int>(kTestDataSize), | 666 ASSERT_EQ(static_cast<int>(kTestDataSize), |
| 667 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); | 667 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); |
| 668 | 668 |
| 669 // Prepare data. | 669 // Prepare data. |
| 670 element_readers_.push_back( | 670 element_readers_.push_back( |
| 671 base::WrapUnique(new UploadBytesElementReader(kTestData, kTestDataSize))); | 671 base::WrapUnique(new UploadBytesElementReader(kTestData, kTestDataSize))); |
| 672 element_readers_.push_back(base::WrapUnique(new UploadFileElementReader( | 672 element_readers_.push_back(base::WrapUnique(new UploadFileElementReader( |
| 673 base::ThreadTaskRunnerHandle::Get().get(), temp_file_path, 0, | 673 base::ThreadTaskRunnerHandle::Get().get(), temp_file_path, 0, |
| 674 std::numeric_limits<uint64_t>::max(), base::Time()))); | 674 std::numeric_limits<uint64_t>::max(), base::Time()))); |
| 675 std::unique_ptr<UploadDataStream> stream( | 675 std::unique_ptr<UploadDataStream> stream( |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 712 scoped_refptr<IOBuffer> wrapped_buffer2 = new WrappedIOBuffer(&buf2[0]); | 712 scoped_refptr<IOBuffer> wrapped_buffer2 = new WrappedIOBuffer(&buf2[0]); |
| 713 EXPECT_EQ(ERR_IO_PENDING, | 713 EXPECT_EQ(ERR_IO_PENDING, |
| 714 stream->Read( | 714 stream->Read( |
| 715 wrapped_buffer2.get(), buf2.size(), read_callback2.callback())); | 715 wrapped_buffer2.get(), buf2.size(), read_callback2.callback())); |
| 716 EXPECT_EQ(static_cast<int>(buf2.size()), read_callback2.WaitForResult()); | 716 EXPECT_EQ(static_cast<int>(buf2.size()), read_callback2.WaitForResult()); |
| 717 EXPECT_EQ(expected_data, buf2); | 717 EXPECT_EQ(expected_data, buf2); |
| 718 } | 718 } |
| 719 | 719 |
| 720 TEST_F(ElementsUploadDataStreamTest, InitDuringAsyncInit) { | 720 TEST_F(ElementsUploadDataStreamTest, InitDuringAsyncInit) { |
| 721 base::FilePath temp_file_path; | 721 base::FilePath temp_file_path; |
| 722 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), | 722 ASSERT_TRUE( |
| 723 &temp_file_path)); | 723 base::CreateTemporaryFileInDir(temp_dir_.GetPath(), &temp_file_path)); |
| 724 ASSERT_EQ(static_cast<int>(kTestDataSize), | 724 ASSERT_EQ(static_cast<int>(kTestDataSize), |
| 725 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); | 725 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); |
| 726 | 726 |
| 727 // Prepare data. | 727 // Prepare data. |
| 728 element_readers_.push_back( | 728 element_readers_.push_back( |
| 729 base::WrapUnique(new UploadBytesElementReader(kTestData, kTestDataSize))); | 729 base::WrapUnique(new UploadBytesElementReader(kTestData, kTestDataSize))); |
| 730 element_readers_.push_back(base::WrapUnique(new UploadFileElementReader( | 730 element_readers_.push_back(base::WrapUnique(new UploadFileElementReader( |
| 731 base::ThreadTaskRunnerHandle::Get().get(), temp_file_path, 0, | 731 base::ThreadTaskRunnerHandle::Get().get(), temp_file_path, 0, |
| 732 std::numeric_limits<uint64_t>::max(), base::Time()))); | 732 std::numeric_limits<uint64_t>::max(), base::Time()))); |
| 733 std::unique_ptr<UploadDataStream> stream( | 733 std::unique_ptr<UploadDataStream> stream( |
| (...skipping 26 matching lines...) Expand all Loading... |
| 760 EXPECT_EQ(static_cast<int>(buf2.size()), read_callback2.WaitForResult()); | 760 EXPECT_EQ(static_cast<int>(buf2.size()), read_callback2.WaitForResult()); |
| 761 EXPECT_EQ(expected_data, buf2); | 761 EXPECT_EQ(expected_data, buf2); |
| 762 EXPECT_TRUE(stream->IsEOF()); | 762 EXPECT_TRUE(stream->IsEOF()); |
| 763 | 763 |
| 764 // Make sure callbacks are not called for cancelled operations. | 764 // Make sure callbacks are not called for cancelled operations. |
| 765 EXPECT_FALSE(init_callback1.have_result()); | 765 EXPECT_FALSE(init_callback1.have_result()); |
| 766 } | 766 } |
| 767 | 767 |
| 768 TEST_F(ElementsUploadDataStreamTest, InitDuringAsyncRead) { | 768 TEST_F(ElementsUploadDataStreamTest, InitDuringAsyncRead) { |
| 769 base::FilePath temp_file_path; | 769 base::FilePath temp_file_path; |
| 770 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), | 770 ASSERT_TRUE( |
| 771 &temp_file_path)); | 771 base::CreateTemporaryFileInDir(temp_dir_.GetPath(), &temp_file_path)); |
| 772 ASSERT_EQ(static_cast<int>(kTestDataSize), | 772 ASSERT_EQ(static_cast<int>(kTestDataSize), |
| 773 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); | 773 base::WriteFile(temp_file_path, kTestData, kTestDataSize)); |
| 774 | 774 |
| 775 // Prepare data. | 775 // Prepare data. |
| 776 element_readers_.push_back( | 776 element_readers_.push_back( |
| 777 base::WrapUnique(new UploadBytesElementReader(kTestData, kTestDataSize))); | 777 base::WrapUnique(new UploadBytesElementReader(kTestData, kTestDataSize))); |
| 778 element_readers_.push_back(base::WrapUnique(new UploadFileElementReader( | 778 element_readers_.push_back(base::WrapUnique(new UploadFileElementReader( |
| 779 base::ThreadTaskRunnerHandle::Get().get(), temp_file_path, 0, | 779 base::ThreadTaskRunnerHandle::Get().get(), temp_file_path, 0, |
| 780 std::numeric_limits<uint64_t>::max(), base::Time()))); | 780 std::numeric_limits<uint64_t>::max(), base::Time()))); |
| 781 std::unique_ptr<UploadDataStream> stream( | 781 std::unique_ptr<UploadDataStream> stream( |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 819 wrapped_buffer2.get(), buf2.size(), read_callback2.callback())); | 819 wrapped_buffer2.get(), buf2.size(), read_callback2.callback())); |
| 820 EXPECT_EQ(static_cast<int>(buf2.size()), read_callback2.WaitForResult()); | 820 EXPECT_EQ(static_cast<int>(buf2.size()), read_callback2.WaitForResult()); |
| 821 EXPECT_EQ(expected_data, buf2); | 821 EXPECT_EQ(expected_data, buf2); |
| 822 EXPECT_TRUE(stream->IsEOF()); | 822 EXPECT_TRUE(stream->IsEOF()); |
| 823 | 823 |
| 824 // Make sure callbacks are not called for cancelled operations. | 824 // Make sure callbacks are not called for cancelled operations. |
| 825 EXPECT_FALSE(read_callback1.have_result()); | 825 EXPECT_FALSE(read_callback1.have_result()); |
| 826 } | 826 } |
| 827 | 827 |
| 828 } // namespace net | 828 } // namespace net |
| OLD | NEW |