Add tests for map buffer twice

This patch add end2end tests for map buffer twice for map read, map
write, and SetSubData.

BUG=dawn:278

Change-Id: Ibe57d7923310d2513e314fa9bf185677a706d6da
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/13801
Commit-Queue: Yunchao He <yunchao.he@intel.com>
Reviewed-by: Austin Eng <enga@chromium.org>
diff --git a/src/tests/end2end/BufferTests.cpp b/src/tests/end2end/BufferTests.cpp
index c29e34f..7dd69a9 100644
--- a/src/tests/end2end/BufferTests.cpp
+++ b/src/tests/end2end/BufferTests.cpp
@@ -58,6 +58,35 @@
     buffer.Unmap();
 }
 
+// Map, read and unmap twice. Test that both of these two iterations work.
+TEST_P(BufferMapReadTests, MapTwice) {
+    // TODO(http://crbug.com/dawn/278): the second read doesn't get updated data
+    // on D3D12, Metal and Vulkan.
+    // TODO(http://crbug.com/dawn/280): the second read doesn't get updated data
+    // on OpenGL wire.
+    DAWN_SKIP_TEST_IF(IsD3D12() || IsMetal() || IsVulkan() || UsesWire());
+    wgpu::BufferDescriptor descriptor;
+    descriptor.size = 4;
+    descriptor.usage = wgpu::BufferUsage::MapRead | wgpu::BufferUsage::CopyDst;
+    wgpu::Buffer buffer = device.CreateBuffer(&descriptor);
+
+    uint32_t myData = 0x01020304;
+    buffer.SetSubData(0, sizeof(myData), &myData);
+
+    const void* mappedData = MapReadAsyncAndWait(buffer);
+    EXPECT_EQ(myData, *reinterpret_cast<const uint32_t*>(mappedData));
+
+    buffer.Unmap();
+
+    myData = 0x05060708;
+    buffer.SetSubData(0, sizeof(myData), &myData);
+
+    const void* mappedData1 = MapReadAsyncAndWait(buffer);
+    EXPECT_EQ(myData, *reinterpret_cast<const uint32_t*>(mappedData1));
+
+    buffer.Unmap();
+}
+
 // Test mapping a large buffer.
 TEST_P(BufferMapReadTests, LargeRead) {
     constexpr uint32_t kDataSize = 1000 * 1000;
@@ -126,6 +155,28 @@
     EXPECT_BUFFER_U32_EQ(myData, buffer, 0);
 }
 
+// Map, write and unmap twice. Test that both of these two iterations work.
+TEST_P(BufferMapWriteTests, MapTwice) {
+    wgpu::BufferDescriptor descriptor;
+    descriptor.size = 4;
+    descriptor.usage = wgpu::BufferUsage::MapWrite | wgpu::BufferUsage::CopySrc;
+    wgpu::Buffer buffer = device.CreateBuffer(&descriptor);
+
+    uint32_t myData = 2934875;
+    void* mappedData = MapWriteAsyncAndWait(buffer);
+    memcpy(mappedData, &myData, sizeof(myData));
+    buffer.Unmap();
+
+    EXPECT_BUFFER_U32_EQ(myData, buffer, 0);
+
+    myData = 9999999;
+    void* mappedData1 = MapWriteAsyncAndWait(buffer);
+    memcpy(mappedData1, &myData, sizeof(myData));
+    buffer.Unmap();
+
+    EXPECT_BUFFER_U32_EQ(myData, buffer, 0);
+}
+
 // Test mapping a large buffer.
 TEST_P(BufferMapWriteTests, LargeWrite) {
     constexpr uint32_t kDataSize = 1000 * 1000;
@@ -193,6 +244,24 @@
     EXPECT_BUFFER_U32_EQ(value, buffer, 0);
 }
 
+// Call SetSubData at offset 0 via a u32 twice. Test that data is updated accoordingly.
+TEST_P(BufferSetSubDataTests, SetTwice) {
+    wgpu::BufferDescriptor descriptor;
+    descriptor.size = 4;
+    descriptor.usage = wgpu::BufferUsage::CopySrc | wgpu::BufferUsage::CopyDst;
+    wgpu::Buffer buffer = device.CreateBuffer(&descriptor);
+
+    uint32_t value = 0x01020304;
+    buffer.SetSubData(0, sizeof(value), &value);
+
+    EXPECT_BUFFER_U32_EQ(value, buffer, 0);
+
+    value = 0x05060708;
+    buffer.SetSubData(0, sizeof(value), &value);
+
+    EXPECT_BUFFER_U32_EQ(value, buffer, 0);
+}
+
 // Test that SetSubData offset works.
 TEST_P(BufferSetSubDataTests, SmallDataAtOffset) {
     wgpu::BufferDescriptor descriptor;