|
22 | 22 | #include <fcntl.h> // O_RDONLY |
23 | 23 | #include <stdlib.h> |
24 | 24 | #include <memory> |
| 25 | +#include <cstring> |
25 | 26 | #include <butil/files/temp_file.h> // TempFile |
26 | 27 | #include <butil/containers/flat_map.h> |
27 | 28 | #include <butil/macros.h> |
@@ -1785,4 +1786,108 @@ TEST_F(IOBufTest, acquire_tls_block) { |
1785 | 1786 | ASSERT_NE(butil::iobuf::block_cap(b), butil::iobuf::block_size(b)); |
1786 | 1787 | } |
1787 | 1788 |
|
| 1789 | +TEST_F(IOBufTest, reserve_aligned) { |
| 1790 | + { |
| 1791 | + butil::IOReserveAlignedBuf buf(16); |
| 1792 | + auto area = buf.reserve(1024); |
| 1793 | + ASSERT_NE(area, butil::IOBuf::INVALID_AREA); |
| 1794 | + butil::IOBufAsZeroCopyInputStream wrapper(buf); |
| 1795 | + const void* data; |
| 1796 | + int size; |
| 1797 | + int total_size = 0; |
| 1798 | + while (wrapper.Next(&data, &size)) { |
| 1799 | + ASSERT_EQ(reinterpret_cast<uintptr_t>(data) % 16, 0); |
| 1800 | + ASSERT_EQ(size % 16, 0); |
| 1801 | + total_size += size; |
| 1802 | + } |
| 1803 | + ASSERT_EQ(total_size, 1024); |
| 1804 | + } |
| 1805 | + { |
| 1806 | + butil::IOReserveAlignedBuf buf(4096); |
| 1807 | + auto area = buf.reserve(1024); |
| 1808 | + ASSERT_NE(area, butil::IOBuf::INVALID_AREA); |
| 1809 | + butil::IOBufAsZeroCopyInputStream wrapper(buf); |
| 1810 | + const void* data; |
| 1811 | + int size; |
| 1812 | + int total_size = 0; |
| 1813 | + while (wrapper.Next(&data, &size)) { |
| 1814 | + ASSERT_EQ(reinterpret_cast<uintptr_t>(data) % 4096, 0); |
| 1815 | + ASSERT_EQ(size % 4096, 0); |
| 1816 | + total_size += size; |
| 1817 | + } |
| 1818 | + ASSERT_EQ(total_size, 4096); |
| 1819 | + } |
| 1820 | + { |
| 1821 | + butil::IOReserveAlignedBuf buf(4096); |
| 1822 | + auto area = buf.reserve(8191); |
| 1823 | + ASSERT_NE(area, butil::IOBuf::INVALID_AREA); |
| 1824 | + butil::IOBufAsZeroCopyInputStream wrapper(buf); |
| 1825 | + const void* data; |
| 1826 | + int size; |
| 1827 | + int total_size = 0; |
| 1828 | + while (wrapper.Next(&data, &size)) { |
| 1829 | + ASSERT_EQ(reinterpret_cast<uintptr_t>(data) % 4096, 0); |
| 1830 | + ASSERT_EQ(size % 4096, 0); |
| 1831 | + total_size += size; |
| 1832 | + } |
| 1833 | + ASSERT_EQ(total_size, 8192); |
| 1834 | + } |
| 1835 | + { |
| 1836 | + butil::IOReserveAlignedBuf buf(4096); |
| 1837 | + auto area = buf.reserve(4096 * 10 - 1); |
| 1838 | + ASSERT_NE(area, butil::IOBuf::INVALID_AREA); |
| 1839 | + butil::IOBufAsZeroCopyInputStream wrapper(buf); |
| 1840 | + const void* data; |
| 1841 | + int size; |
| 1842 | + int total_size = 0; |
| 1843 | + while (wrapper.Next(&data, &size)) { |
| 1844 | + ASSERT_EQ(reinterpret_cast<uintptr_t>(data) % 4096, 0); |
| 1845 | + ASSERT_EQ(size % 4096, 0); |
| 1846 | + total_size += size; |
| 1847 | + } |
| 1848 | + ASSERT_EQ(total_size, 4096 * 10); |
| 1849 | + } |
| 1850 | + { |
| 1851 | + butil::IOReserveAlignedBuf buf(4095); |
| 1852 | + auto area = buf.reserve(4096); |
| 1853 | + ASSERT_EQ(area, butil::IOBuf::INVALID_AREA); |
| 1854 | + } |
| 1855 | + { |
| 1856 | + butil::IOReserveAlignedBuf buf(8192); |
| 1857 | + auto area = buf.reserve(4096 * 10 + 1); |
| 1858 | + ASSERT_NE(area, butil::IOBuf::INVALID_AREA); |
| 1859 | + butil::IOBufAsZeroCopyInputStream wrapper(buf); |
| 1860 | + const void* data; |
| 1861 | + int size; |
| 1862 | + int total_size = 0; |
| 1863 | + while (wrapper.Next(&data, &size)) { |
| 1864 | + ASSERT_EQ(reinterpret_cast<uintptr_t>(data) % 4096, 0); |
| 1865 | + ASSERT_EQ(size % 4096, 0); |
| 1866 | + total_size += size; |
| 1867 | + } |
| 1868 | + ASSERT_EQ(total_size, 4096 * 10 + 8192); |
| 1869 | + } |
| 1870 | + { |
| 1871 | + butil::IOReserveAlignedBuf buf(4096); |
| 1872 | + auto area = buf.reserve(1024 * 1024 * 3); |
| 1873 | + ASSERT_NE(area, butil::IOBuf::INVALID_AREA); |
| 1874 | + butil::IOBufAsZeroCopyInputStream wrapper(buf); |
| 1875 | + const void* data; |
| 1876 | + int size; |
| 1877 | + int count = 0; |
| 1878 | + int total_size = 0; |
| 1879 | + std::stringstream ss; |
| 1880 | + while (wrapper.Next(&data, &size)) { |
| 1881 | + ASSERT_EQ(reinterpret_cast<uintptr_t>(data) % 4096, 0); |
| 1882 | + ASSERT_EQ(size % 4096, 0); |
| 1883 | + std::string str(size, 'A' + count++); |
| 1884 | + ss << str; |
| 1885 | + std::memcpy(const_cast<void*>(data), str.data(), str.size()); |
| 1886 | + total_size += size; |
| 1887 | + } |
| 1888 | + ASSERT_EQ(total_size, 3145728); |
| 1889 | + ASSERT_EQ(ss.str(), buf.to_string()); |
| 1890 | + } |
| 1891 | +} |
| 1892 | + |
1788 | 1893 | } // namespace |
0 commit comments