Get QueueTimelineTests back

MapAsync -> OnSubmittedWorkDone and OnSubmittedWorkDone ->
OnSubmittedWorkDone are still supposed to be guaranteed.

Bug: dawn:404
Bug: dawn:1705

Change-Id: Ia42b090bb260dce77d5429a0bc55c47a533bcaf6
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/135661
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Austin Eng <enga@chromium.org>
Commit-Queue: Jie A Chen <jie.a.chen@intel.com>
diff --git a/src/dawn/tests/BUILD.gn b/src/dawn/tests/BUILD.gn
index 01888d5..4760567 100644
--- a/src/dawn/tests/BUILD.gn
+++ b/src/dawn/tests/BUILD.gn
@@ -543,6 +543,7 @@
     "end2end/PrimitiveTopologyTests.cpp",
     "end2end/QueryTests.cpp",
     "end2end/QueueTests.cpp",
+    "end2end/QueueTimelineTests.cpp",
     "end2end/ReadOnlyDepthStencilAttachmentTests.cpp",
     "end2end/RenderAttachmentTests.cpp",
     "end2end/RenderBundleTests.cpp",
diff --git a/src/dawn/tests/end2end/QueueTimelineTests.cpp b/src/dawn/tests/end2end/QueueTimelineTests.cpp
new file mode 100644
index 0000000..6c14dc0
--- /dev/null
+++ b/src/dawn/tests/end2end/QueueTimelineTests.cpp
@@ -0,0 +1,107 @@
+// Copyright 2020 The Dawn Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <memory>
+
+#include "dawn/tests/DawnTest.h"
+#include "gmock/gmock.h"
+
+using testing::InSequence;
+
+class MockMapCallback {
+  public:
+    MOCK_METHOD(void, Call, (WGPUBufferMapAsyncStatus status, void* userdata));
+};
+
+static std::unique_ptr<MockMapCallback> mockMapCallback;
+static void ToMockMapCallback(WGPUBufferMapAsyncStatus status, void* userdata) {
+    EXPECT_EQ(status, WGPUBufferMapAsyncStatus_Success);
+    mockMapCallback->Call(status, userdata);
+}
+
+class MockQueueWorkDoneCallback {
+  public:
+    MOCK_METHOD(void, Call, (WGPUQueueWorkDoneStatus status, void* userdata));
+};
+
+static std::unique_ptr<MockQueueWorkDoneCallback> mockQueueWorkDoneCallback;
+static void ToMockQueueWorkDone(WGPUQueueWorkDoneStatus status, void* userdata) {
+    mockQueueWorkDoneCallback->Call(status, userdata);
+}
+
+static std::unique_ptr<MockQueueWorkDoneCallback> mockQueueWorkDoneCallback1;
+static void ToMockQueueWorkDone1(WGPUQueueWorkDoneStatus status, void* userdata) {
+    mockQueueWorkDoneCallback1->Call(status, userdata);
+}
+
+class QueueTimelineTests : public DawnTest {
+  protected:
+    void SetUp() override {
+        DawnTest::SetUp();
+
+        mockMapCallback = std::make_unique<MockMapCallback>();
+        mockQueueWorkDoneCallback = std::make_unique<MockQueueWorkDoneCallback>();
+        mockQueueWorkDoneCallback1 = std::make_unique<MockQueueWorkDoneCallback>();
+
+        wgpu::BufferDescriptor descriptor;
+        descriptor.size = 4;
+        descriptor.usage = wgpu::BufferUsage::MapRead;
+        mMapReadBuffer = device.CreateBuffer(&descriptor);
+    }
+
+    void TearDown() override {
+        mockMapCallback = nullptr;
+        mockQueueWorkDoneCallback = nullptr;
+        mockQueueWorkDoneCallback1 = nullptr;
+        DawnTest::TearDown();
+    }
+
+    wgpu::Buffer mMapReadBuffer;
+};
+
+// Test that mMapReadBuffer.MapAsync callback happens before queue.OnWorkDone callback
+// when queue.OnSubmittedWorkDone is called after mMapReadBuffer.MapAsync. The callback order should
+// happen in the order the functions are called.
+TEST_P(QueueTimelineTests, MapRead_OnWorkDone) {
+    InSequence sequence;
+    EXPECT_CALL(*mockMapCallback, Call(WGPUBufferMapAsyncStatus_Success, this)).Times(1);
+    EXPECT_CALL(*mockQueueWorkDoneCallback, Call(WGPUQueueWorkDoneStatus_Success, this)).Times(1);
+
+    mMapReadBuffer.MapAsync(wgpu::MapMode::Read, 0, wgpu::kWholeMapSize, ToMockMapCallback, this);
+
+    queue.OnSubmittedWorkDone(0u, ToMockQueueWorkDone, this);
+
+    WaitForAllOperations();
+    mMapReadBuffer.Unmap();
+}
+
+// Test that the OnSubmittedWorkDone callbacks should happen in the order the functions are called.
+TEST_P(QueueTimelineTests, OnWorkDone_OnWorkDone) {
+    InSequence sequence;
+    EXPECT_CALL(*mockQueueWorkDoneCallback, Call(WGPUQueueWorkDoneStatus_Success, this)).Times(1);
+    EXPECT_CALL(*mockQueueWorkDoneCallback1, Call(WGPUQueueWorkDoneStatus_Success, this)).Times(1);
+
+    queue.OnSubmittedWorkDone(0u, ToMockQueueWorkDone, this);
+    queue.OnSubmittedWorkDone(0u, ToMockQueueWorkDone1, this);
+
+    WaitForAllOperations();
+}
+
+DAWN_INSTANTIATE_TEST(QueueTimelineTests,
+                      D3D11Backend(),
+                      D3D12Backend(),
+                      MetalBackend(),
+                      OpenGLBackend(),
+                      OpenGLESBackend(),
+                      VulkanBackend());