// Copyright 2019 The Dawn & Tint Authors // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this // list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // // 3. Neither the name of the copyright holder nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <limits> #include <memory> #include "dawn/common/Assert.h" #include "dawn/tests/unittests/wire/WireFutureTest.h" #include "dawn/tests/unittests/wire/WireTest.h" #include "dawn/wire/WireClient.h" // Define a stream operator for WGPUMapMode outside namespace scope so that it can be found on // resolution for test name generation. // TODO(dawn:2205) Remove this in favor of custom serializer. std::ostream& operator<<(std::ostream& os, const WGPUMapMode& param) { … } namespace dawn::wire { namespace { using testing::_; using testing::InvokeWithoutArgs; using testing::Return; // For the buffer tests, we make passing a map mode optional to reuse the same test fixture for // tests that test multiple modes and tests that are mode specific. By making it an optional, it // allows us to determine whether the map mode is necessary when generating the test names. MapMode; DAWN_WIRE_FUTURE_TEST_PARAM_STRUCT(WireBufferParam, MapMode); using WireBufferMappingTestBase = WireFutureTestWithParams<WGPUBufferMapCallback, WGPUBufferMapCallbackInfo, wgpuBufferMapAsync, wgpuBufferMapAsyncF, WireBufferParam>; // General mapping tests that either do not care about the specific mapping mode, or apply to both. class WireBufferMappingTests : public WireBufferMappingTestBase { … }; DAWN_INSTANTIATE_WIRE_FUTURE_TEST_P(WireBufferMappingTests, { … }; // Check that things work correctly when a validation error happens when mapping the buffer. TEST_P(WireBufferMappingTests, ErrorWhileMapping) { … } // Check the map callback is called with "UnmappedBeforeCallback" when the map request would have // worked, but Unmap() was called. TEST_P(WireBufferMappingTests, UnmapCalledTooEarly) { … } // Check that if Unmap() was called early client-side, we disregard server-side validation errors. TEST_P(WireBufferMappingTests, UnmapCalledTooEarlyServerSideError) { … } // Check the map callback is called with "DestroyedBeforeCallback" when the map request would have // worked, but Destroy() was called. TEST_P(WireBufferMappingTests, DestroyCalledTooEarly) { … } // Check that if Destroy() was called early client-side, we disregard server-side validation errors. TEST_P(WireBufferMappingTests, DestroyCalledTooEarlyServerSideError) { … } // Check the map callback is called with "DestroyedBeforeCallback" when the map request would have // worked, but the device was released. TEST_P(WireBufferMappingTests, DeviceReleasedTooEarly) { … } // Check that if device is released early client-side, we disregard server-side validation errors. TEST_P(WireBufferMappingTests, DeviceReleasedTooEarlyServerSideError) { … } // Check the map callback is called with "DestroyedBeforeCallback" when the map request would have // worked, but the device was destroyed. TEST_P(WireBufferMappingTests, DeviceDestroyedTooEarly) { … } // Check that if device is destroyed early client-side, we disregard server-side validation errors. TEST_P(WireBufferMappingTests, DeviceDestroyedTooEarlyServerSideError) { … } // Test that the callback isn't fired twice when Unmap() is called inside the callback. TEST_P(WireBufferMappingTests, UnmapInsideMapCallback) { … } // Test that the callback isn't fired twice when Destroy() is called inside the callback. TEST_P(WireBufferMappingTests, DestroyInsideMapCallback) { … } // Test that the callback isn't fired twice when Release() is called inside the callback with the // last ref. TEST_P(WireBufferMappingTests, ReleaseInsideMapCallback) { … } // Tests specific to mapping for reading. class WireBufferMappingReadTests : public WireBufferMappingTests { … }; DAWN_INSTANTIATE_WIRE_FUTURE_TEST_P(WireBufferMappingReadTests); // Check mapping for reading a succesfully created buffer. TEST_P(WireBufferMappingReadTests, MappingSuccess) { … } // Check that an error map read while a buffer is already mapped won't changed the result of get // mapped range. TEST_P(WireBufferMappingReadTests, MappingErrorWhileAlreadyMapped) { … } // Tests specific to mapping for writing. class WireBufferMappingWriteTests : public WireBufferMappingTests { … }; DAWN_INSTANTIATE_WIRE_FUTURE_TEST_P(WireBufferMappingWriteTests); // Check mapping for writing a succesfully created buffer. TEST_P(WireBufferMappingWriteTests, MappingSuccess) { … } // Check that an error map write while a buffer is already mapped. TEST_P(WireBufferMappingWriteTests, MappingErrorWhileAlreadyMapped) { … } // Tests specific to mapped at creation. class WireBufferMappedAtCreationTests : public WireBufferMappingTests { … }; DAWN_INSTANTIATE_WIRE_FUTURE_TEST_P(WireBufferMappedAtCreationTests); // Test successful buffer creation with mappedAtCreation=true TEST_F(WireBufferMappedAtCreationTests, Success) { … } // Test that releasing a buffer mapped at creation does not call Unmap TEST_F(WireBufferMappedAtCreationTests, ReleaseBeforeUnmap) { … } // Test that it is valid to map a buffer after it is mapped at creation and unmapped. TEST_P(WireBufferMappedAtCreationTests, MapSuccess) { … } // Test that it is invalid to map a buffer after mappedAtCreation but before Unmap TEST_P(WireBufferMappedAtCreationTests, MapFailure) { … } // Check that trying to create a buffer of size MAX_SIZE_T won't get OOM error at the client side. TEST_F(WireBufferMappingTests, MaxSizeMappableBufferOOMDirectly) { … } // Test that registering a callback then wire disconnect calls the callback with // DeviceLost. TEST_P(WireBufferMappingTests, MapThenDisconnect) { … } // Test that registering a callback after wire disconnect calls the callback with // DeviceLost. TEST_P(WireBufferMappingTests, MapAfterDisconnect) { … } // Test that mapping again while pending map cause an error on the callback. TEST_P(WireBufferMappingTests, PendingMapImmediateError) { … } // Test that GetMapState() returns map state as expected TEST_P(WireBufferMappingTests, GetMapState) { … } // Test that requests inside user callbacks before disconnect are called. TEST_P(WireBufferMappingTests, MapInsideCallbackBeforeDisconnect) { … } // Test that requests inside user callbacks before buffer destroy are called. TEST_P(WireBufferMappingTests, MapInsideCallbackBeforeDestroy) { … } } // anonymous namespace } // namespace dawn::wire