Resource Management 4: Stress test buffer writes

Add test for many buffer writes.

BUG=dawn:27

Change-Id: I026c3b9a6d30c7c6634b89db9798902b036150c3
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/9280
Commit-Queue: Bryan Bernhart <bryan.bernhart@intel.com>
Reviewed-by: Austin Eng <enga@chromium.org>
diff --git a/src/tests/end2end/BufferTests.cpp b/src/tests/end2end/BufferTests.cpp
index 3e6a8d5..9315583 100644
--- a/src/tests/end2end/BufferTests.cpp
+++ b/src/tests/end2end/BufferTests.cpp
@@ -100,7 +100,11 @@
               WaitABit();
           }
 
-          return mappedData;
+          // Ensure the prior write's status is updated.
+          void* resultPointer = mappedData;
+          mappedData = nullptr;
+
+          return resultPointer;
       }
 
     private:
@@ -142,6 +146,35 @@
     EXPECT_BUFFER_U32_RANGE_EQ(myData.data(), buffer, 0, kDataSize);
 }
 
+// Stress test mapping many buffers.
+TEST_P(BufferMapWriteTests, ManyWrites) {
+    constexpr uint32_t kDataSize = 1000;
+    std::vector<uint32_t> myData;
+    for (uint32_t i = 0; i < kDataSize; ++i) {
+        myData.push_back(i);
+    }
+
+    std::vector<dawn::Buffer> buffers;
+
+    constexpr uint32_t kBuffers = 100;
+    for (uint32_t i = 0; i < kBuffers; ++i) {
+        dawn::BufferDescriptor descriptor;
+        descriptor.size = static_cast<uint32_t>(kDataSize * sizeof(uint32_t));
+        descriptor.usage = dawn::BufferUsageBit::MapWrite | dawn::BufferUsageBit::CopySrc;
+        dawn::Buffer buffer = device.CreateBuffer(&descriptor);
+
+        void* mappedData = MapWriteAsyncAndWait(buffer);
+        memcpy(mappedData, myData.data(), kDataSize * sizeof(uint32_t));
+        buffer.Unmap();
+
+        buffers.push_back(buffer);  // Destroy buffers upon return.
+    }
+
+    for (uint32_t i = 0; i < kBuffers; ++i) {
+        EXPECT_BUFFER_U32_RANGE_EQ(myData.data(), buffers[i], 0, kDataSize);
+    }
+}
+
 DAWN_INSTANTIATE_TEST(BufferMapWriteTests, D3D12Backend, MetalBackend, OpenGLBackend, VulkanBackend);
 
 class BufferSetSubDataTests : public DawnTest {