# Copyright 2012 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. import("../../../scripts/dawn_overrides_with_defaults.gni") import("//testing/test.gni") import("${dawn_root}/generator/dawn_generator.gni") import("${dawn_root}/scripts/dawn_features.gni") group("tests") { testonly = true deps = [ ":dawn_end2end_tests", ":dawn_perf_tests", ":dawn_unittests", ] } ############################################################################### # Gtest Gmock - Handle building inside and outside of Chromium. ############################################################################### # When building outside of Chromium we need to define our own targets for GTest # and GMock. However when compiling inside of Chromium we need to reuse the # existing targets, both because Chromium has a special harness for swarming # and because otherwise the "gn check" fails. if (!build_with_chromium) { # When we aren't in Chromium we define out own targets based on the location # of the googletest repo. googletest_dir = dawn_googletest_dir config("gtest_config") { include_dirs = [ "${googletest_dir}/googletest", "${googletest_dir}/googletest/include", ] } static_library("gtest") { testonly = true sources = [ "${googletest_dir}/googletest/src/gtest-all.cc" ] public_configs = [ ":gtest_config" ] } config("gmock_config") { include_dirs = [ "${googletest_dir}/googlemock", "${googletest_dir}/googlemock/include", "${googletest_dir}/googletest/include", ] } static_library("gmock") { testonly = true sources = [ "${googletest_dir}/googlemock/src/gmock-all.cc" ] public_configs = [ ":gmock_config" ] } group("gmock_and_gtest") { testonly = true public_deps = [ ":gmock", ":gtest", ] } } else { # When we are in Chromium we reuse its targets, and also add some deps that # are needed to launch the test in swarming mode. group("gmock_and_gtest") { testonly = true public_deps = [ "//base", "//base/test:test_support", "//testing/gmock", "//testing/gtest", ] } } ############################################################################### # Wrapping of Chromium targets ############################################################################### # These targets are separated because they are Chromium sources files that # can't use the dawn_internal config, otherwise Dawn's warning flags get # applied while compiling a bunch of Chromium's //base (via header inclusion) if (build_with_chromium) { source_set("unittests_main") { testonly = true deps = [ ":gmock_and_gtest" ] sources = [ "//gpu/dawn_unittests_main.cc" ] } source_set("end2end_tests_main") { testonly = true deps = [ ":gmock_and_gtest" ] sources = [ "//gpu/dawn_end2end_tests_main.cc" ] } source_set("perf_tests_main") { testonly = true deps = [ ":gmock_and_gtest" ] sources = [ "//gpu/dawn_perf_tests_main.cc" ] } } ############################################################################### # Dawn test template ############################################################################### template("dawn_test") { test(target_name) { # Copy all variables except "configs", which has a default value forward_variables_from(invoker, "*", [ "configs" ]) if (defined(invoker.configs)) { configs += invoker.configs } configs += [ "${dawn_root}/src/dawn/common:internal_config" ] } } ############################################################################### # Dawn unittests ############################################################################### dawn_json_generator("mock_webgpu_gen") { target = "mock_api" outputs = [ "src/dawn/mock_webgpu.h", "src/dawn/mock_webgpu.cpp", ] } # Source code for mocks used for unit testing are separated from the rest of # sources so that they aren't included in non-test builds. source_set("native_mocks_sources") { testonly = true deps = [ ":gmock_and_gtest", "${dawn_root}/src/dawn/native:sources", "${dawn_root}/src/dawn/native:static", "${dawn_root}/src/dawn/utils", ] # Add internal dawn native config for internal unittests. configs += [ "${dawn_root}/src/dawn/native:internal" ] sources = [ "unittests/native/mocks/BindGroupLayoutMock.cpp", "unittests/native/mocks/BindGroupLayoutMock.h", "unittests/native/mocks/BindGroupMock.cpp", "unittests/native/mocks/BindGroupMock.h", "unittests/native/mocks/BufferMock.cpp", "unittests/native/mocks/BufferMock.h", "unittests/native/mocks/CommandBufferMock.cpp", "unittests/native/mocks/CommandBufferMock.h", "unittests/native/mocks/ComputePipelineMock.cpp", "unittests/native/mocks/ComputePipelineMock.h", "unittests/native/mocks/DeviceMock.h", "unittests/native/mocks/ExternalTextureMock.cpp", "unittests/native/mocks/ExternalTextureMock.h", "unittests/native/mocks/PipelineLayoutMock.cpp", "unittests/native/mocks/PipelineLayoutMock.h", "unittests/native/mocks/QuerySetMock.cpp", "unittests/native/mocks/QuerySetMock.h", "unittests/native/mocks/RenderPipelineMock.cpp", "unittests/native/mocks/RenderPipelineMock.h", "unittests/native/mocks/SamplerMock.cpp", "unittests/native/mocks/SamplerMock.h", "unittests/native/mocks/ShaderModuleMock.cpp", "unittests/native/mocks/ShaderModuleMock.h", "unittests/native/mocks/SwapChainMock.cpp", "unittests/native/mocks/SwapChainMock.h", "unittests/native/mocks/TextureMock.cpp", "unittests/native/mocks/TextureMock.h", ] } dawn_test("dawn_unittests") { deps = [ ":gmock_and_gtest", ":mock_webgpu_gen", ":native_mocks_sources", ":platform_mocks_sources", "${dawn_root}/src/dawn:cpp", "${dawn_root}/src/dawn:proc", "${dawn_root}/src/dawn/common", "${dawn_root}/src/dawn/native:sources", "${dawn_root}/src/dawn/native:static", "${dawn_root}/src/dawn/utils", "${dawn_root}/src/dawn/wire", ] # Add internal dawn native config for internal unittests. configs = [ "${dawn_root}/src/dawn/native:internal" ] sources = get_target_outputs(":mock_webgpu_gen") sources += [ "${dawn_root}/src/dawn/wire/client/ClientMemoryTransferService_mock.cpp", "${dawn_root}/src/dawn/wire/client/ClientMemoryTransferService_mock.h", "${dawn_root}/src/dawn/wire/server/ServerMemoryTransferService_mock.cpp", "${dawn_root}/src/dawn/wire/server/ServerMemoryTransferService_mock.h", "DawnNativeTest.cpp", "DawnNativeTest.h", "MockCallback.h", "ToggleParser.cpp", "ToggleParser.h", "unittests/AsyncTaskTests.cpp", "unittests/BitSetIteratorTests.cpp", "unittests/BuddyAllocatorTests.cpp", "unittests/BuddyMemoryAllocatorTests.cpp", "unittests/ChainUtilsTests.cpp", "unittests/CommandAllocatorTests.cpp", "unittests/ConcurrentCacheTests.cpp", "unittests/EnumClassBitmasksTests.cpp", "unittests/EnumMaskIteratorTests.cpp", "unittests/ErrorTests.cpp", "unittests/FeatureTests.cpp", "unittests/GPUInfoTests.cpp", "unittests/GetProcAddressTests.cpp", "unittests/ITypArrayTests.cpp", "unittests/ITypBitsetTests.cpp", "unittests/ITypSpanTests.cpp", "unittests/ITypVectorTests.cpp", "unittests/LimitsTests.cpp", "unittests/LinkedListTests.cpp", "unittests/MathTests.cpp", "unittests/ObjectBaseTests.cpp", "unittests/PerStageTests.cpp", "unittests/PerThreadProcTests.cpp", "unittests/PlacementAllocatedTests.cpp", "unittests/RefBaseTests.cpp", "unittests/RefCountedTests.cpp", "unittests/ResultTests.cpp", "unittests/RingBufferAllocatorTests.cpp", "unittests/SerialMapTests.cpp", "unittests/SerialQueueTests.cpp", "unittests/SlabAllocatorTests.cpp", "unittests/StackContainerTests.cpp", "unittests/SubresourceStorageTests.cpp", "unittests/SystemUtilsTests.cpp", "unittests/ToBackendTests.cpp", "unittests/TypedIntegerTests.cpp", "unittests/native/BlobTests.cpp", "unittests/native/CacheKeyTests.cpp", "unittests/native/CacheRequestTests.cpp", "unittests/native/CommandBufferEncodingTests.cpp", "unittests/native/CreatePipelineAsyncTaskTests.cpp", "unittests/native/DestroyObjectTests.cpp", "unittests/native/DeviceCreationTests.cpp", "unittests/validation/BindGroupValidationTests.cpp", "unittests/validation/BufferValidationTests.cpp", "unittests/validation/CommandBufferValidationTests.cpp", "unittests/validation/ComputeIndirectValidationTests.cpp", "unittests/validation/ComputeValidationTests.cpp", "unittests/validation/CopyCommandsValidationTests.cpp", "unittests/validation/CopyTextureForBrowserTests.cpp", "unittests/validation/DebugMarkerValidationTests.cpp", "unittests/validation/DeviceValidationTests.cpp", "unittests/validation/DrawIndirectValidationTests.cpp", "unittests/validation/DrawVertexAndIndexBufferOOBValidationTests.cpp", "unittests/validation/DynamicStateCommandValidationTests.cpp", "unittests/validation/ErrorScopeValidationTests.cpp", "unittests/validation/ExternalTextureTests.cpp", "unittests/validation/GetBindGroupLayoutValidationTests.cpp", "unittests/validation/IndexBufferValidationTests.cpp", "unittests/validation/InternalUsageValidationTests.cpp", "unittests/validation/LabelTests.cpp", "unittests/validation/MinimumBufferSizeValidationTests.cpp", "unittests/validation/MultipleDeviceTests.cpp", "unittests/validation/OverridableConstantsValidationTests.cpp", "unittests/validation/PipelineAndPassCompatibilityTests.cpp", "unittests/validation/QueryValidationTests.cpp", "unittests/validation/QueueOnSubmittedWorkDoneValidationTests.cpp", "unittests/validation/QueueSubmitValidationTests.cpp", "unittests/validation/QueueWriteBufferValidationTests.cpp", "unittests/validation/QueueWriteTextureValidationTests.cpp", "unittests/validation/RenderBundleValidationTests.cpp", "unittests/validation/RenderPassDescriptorValidationTests.cpp", "unittests/validation/RenderPipelineValidationTests.cpp", "unittests/validation/ResourceUsageTrackingTests.cpp", "unittests/validation/SamplerValidationTests.cpp", "unittests/validation/ShaderModuleValidationTests.cpp", "unittests/validation/StorageTextureValidationTests.cpp", "unittests/validation/TextureSubresourceTests.cpp", "unittests/validation/TextureValidationTests.cpp", "unittests/validation/TextureViewValidationTests.cpp", "unittests/validation/ToggleValidationTests.cpp", "unittests/validation/UnsafeAPIValidationTests.cpp", "unittests/validation/ValidationTest.cpp", "unittests/validation/ValidationTest.h", "unittests/validation/VertexBufferValidationTests.cpp", "unittests/validation/VertexStateValidationTests.cpp", "unittests/validation/VideoViewsValidationTests.cpp", "unittests/validation/WriteBufferTests.cpp", "unittests/wire/WireAdapterTests.cpp", "unittests/wire/WireArgumentTests.cpp", "unittests/wire/WireBasicTests.cpp", "unittests/wire/WireBufferMappingTests.cpp", "unittests/wire/WireCreatePipelineAsyncTests.cpp", "unittests/wire/WireDisconnectTests.cpp", "unittests/wire/WireErrorCallbackTests.cpp", "unittests/wire/WireExtensionTests.cpp", "unittests/wire/WireInjectDeviceTests.cpp", "unittests/wire/WireInjectInstanceTests.cpp", "unittests/wire/WireInjectSwapChainTests.cpp", "unittests/wire/WireInjectTextureTests.cpp", "unittests/wire/WireInstanceTests.cpp", "unittests/wire/WireMemoryTransferServiceTests.cpp", "unittests/wire/WireOptionalTests.cpp", "unittests/wire/WireQueueTests.cpp", "unittests/wire/WireShaderModuleTests.cpp", "unittests/wire/WireTest.cpp", "unittests/wire/WireTest.h", ] if (is_win) { sources += [ "unittests/WindowsUtilsTests.cpp" ] } if (dawn_enable_d3d12) { sources += [ "unittests/d3d12/CopySplitTests.cpp" ] } # When building inside Chromium, use their gtest main function because it is # needed to run in swarming correctly. if (build_with_chromium) { deps += [ ":unittests_main" ] } else { sources += [ "UnittestsMain.cpp" ] } } ############################################################################### # Dawn test infrastructure targets ############################################################################### source_set("test_infra_sources") { configs += [ "${dawn_root}/src/dawn/native:internal" ] testonly = true deps = [ "${dawn_root}/src/dawn:cpp", "${dawn_root}/src/dawn:proc", "${dawn_root}/src/dawn/common", "${dawn_root}/src/dawn/native:sources", "${dawn_root}/src/dawn/native:static", "${dawn_root}/src/dawn/utils", "${dawn_root}/src/dawn/wire", ] public_deps = [ ":gmock_and_gtest" ] if (dawn_supports_glfw_for_windowing || dawn_enable_opengl) { assert(dawn_supports_glfw_for_windowing) public_deps += [ "${dawn_root}/src/dawn/utils:glfw" ] } sources = [ "DawnTest.cpp", "DawnTest.h", "MockCallback.h", "ParamGenerator.h", "ToggleParser.cpp", "ToggleParser.h", ] } ############################################################################### # Dawn end2end tests targets ############################################################################### # Source code for mocks used for platform testing are separated from the rest of # sources so that they aren't included in non-test builds. source_set("platform_mocks_sources") { configs += [ "${dawn_root}/src/dawn/native:internal" ] testonly = true deps = [ ":gmock_and_gtest", "${dawn_root}/src/dawn/platform", ] sources = [ "mocks/platform/CachingInterfaceMock.cpp", "mocks/platform/CachingInterfaceMock.h", ] } source_set("end2end_tests_sources") { testonly = true deps = [ ":platform_mocks_sources", ":test_infra_sources", "${dawn_root}/src/dawn:cpp", "${dawn_root}/src/dawn:proc", "${dawn_root}/src/dawn/common", "${dawn_root}/src/dawn/native:headers", "${dawn_root}/src/dawn/utils", "${dawn_root}/src/dawn/wire", ] sources = [ "end2end/AdapterDiscoveryTests.cpp", "end2end/BasicTests.cpp", "end2end/BindGroupTests.cpp", "end2end/BufferTests.cpp", "end2end/BufferZeroInitTests.cpp", "end2end/ClipSpaceTests.cpp", "end2end/ColorStateTests.cpp", "end2end/CommandEncoderTests.cpp", "end2end/CompressedTextureFormatTests.cpp", "end2end/ComputeCopyStorageBufferTests.cpp", "end2end/ComputeDispatchTests.cpp", "end2end/ComputeLayoutMemoryBufferTests.cpp", "end2end/ComputeSharedMemoryTests.cpp", "end2end/ComputeStorageBufferBarrierTests.cpp", "end2end/CopyTests.cpp", "end2end/CopyTextureForBrowserTests.cpp", "end2end/CreatePipelineAsyncTests.cpp", "end2end/CullingTests.cpp", "end2end/DebugMarkerTests.cpp", "end2end/DeprecatedAPITests.cpp", "end2end/DepthBiasTests.cpp", "end2end/DepthStencilCopyTests.cpp", "end2end/DepthStencilLoadOpTests.cpp", "end2end/DepthStencilSamplingTests.cpp", "end2end/DepthStencilStateTests.cpp", "end2end/DestroyTests.cpp", "end2end/DeviceInitializationTests.cpp", "end2end/DeviceLifetimeTests.cpp", "end2end/DeviceLostTests.cpp", "end2end/DrawIndexedIndirectTests.cpp", "end2end/DrawIndexedTests.cpp", "end2end/DrawIndirectTests.cpp", "end2end/DrawTests.cpp", "end2end/DynamicBufferOffsetTests.cpp", "end2end/EntryPointTests.cpp", "end2end/ExperimentalDP4aTests.cpp", "end2end/ExternalTextureTests.cpp", "end2end/FirstIndexOffsetTests.cpp", "end2end/GpuMemorySynchronizationTests.cpp", "end2end/IndexFormatTests.cpp", "end2end/MaxLimitTests.cpp", "end2end/MemoryAllocationStressTests.cpp", "end2end/MultisampledRenderingTests.cpp", "end2end/MultisampledSamplingTests.cpp", "end2end/NonzeroBufferCreationTests.cpp", "end2end/NonzeroTextureCreationTests.cpp", "end2end/ObjectCachingTests.cpp", "end2end/OpArrayLengthTests.cpp", "end2end/PipelineCachingTests.cpp", "end2end/PipelineLayoutTests.cpp", "end2end/PrimitiveStateTests.cpp", "end2end/PrimitiveTopologyTests.cpp", "end2end/QueryTests.cpp", "end2end/QueueTests.cpp", "end2end/QueueTimelineTests.cpp", "end2end/ReadOnlyDepthStencilAttachmentTests.cpp", "end2end/RenderAttachmentTests.cpp", "end2end/RenderBundleTests.cpp", "end2end/RenderPassLoadOpTests.cpp", "end2end/RenderPassTests.cpp", "end2end/RequiredBufferSizeInCopyTests.cpp", "end2end/SamplerFilterAnisotropicTests.cpp", "end2end/SamplerTests.cpp", "end2end/ScissorTests.cpp", "end2end/ShaderFloat16Tests.cpp", "end2end/ShaderTests.cpp", "end2end/StorageTextureTests.cpp", "end2end/SubresourceRenderAttachmentTests.cpp", "end2end/Texture3DTests.cpp", "end2end/TextureFormatTests.cpp", "end2end/TextureSubresourceTests.cpp", "end2end/TextureViewTests.cpp", "end2end/TextureZeroInitTests.cpp", "end2end/VertexFormatTests.cpp", "end2end/VertexOnlyRenderPipelineTests.cpp", "end2end/VertexStateTests.cpp", "end2end/ViewportOrientationTests.cpp", "end2end/ViewportTests.cpp", ] libs = [] if (dawn_enable_d3d12) { sources += [ "end2end/D3D12CachingTests.cpp", "end2end/D3D12ResourceWrappingTests.cpp", "end2end/VideoViewsTests_win.cpp", ] libs += [ "d3d11.lib", "dxgi.lib", ] } if (dawn_enable_metal) { sources += [ "end2end/IOSurfaceWrappingTests.cpp", "end2end/VideoViewsTests_mac.cpp", ] frameworks = [ "IOSurface.framework" ] } if (dawn_supports_glfw_for_windowing) { sources += [ "end2end/SwapChainTests.cpp", "end2end/SwapChainValidationTests.cpp", "end2end/WindowSurfaceTests.cpp", ] } if (dawn_enable_d3d12 || (dawn_enable_vulkan && is_chromeos) || dawn_enable_metal) { sources += [ "end2end/VideoViewsTests.cpp", "end2end/VideoViewsTests.h", ] } if (dawn_enable_vulkan && is_chromeos) { sources += [ "end2end/VideoViewsTests_gbm.cpp" ] } } source_set("white_box_tests_sources") { configs += [ "${dawn_root}/src/dawn/native:internal" ] testonly = true deps = [ ":test_infra_sources", "${dawn_root}/src/dawn:cpp", "${dawn_root}/src/dawn:proc", "${dawn_root}/src/dawn/common", # Statically linked and with sources because the end2end white_box tests use Dawn internals. "${dawn_root}/src/dawn/native:sources", "${dawn_root}/src/dawn/native:static", "${dawn_root}/src/dawn/utils", "${dawn_root}/src/dawn/wire", ] sources = [] if (dawn_enable_vulkan) { deps += [ "${dawn_vulkan_headers_dir}:vulkan_headers" ] if (is_chromeos) { sources += [ "white_box/VulkanImageWrappingTests.cpp", "white_box/VulkanImageWrappingTests.h", "white_box/VulkanImageWrappingTests_DmaBuf.cpp", ] } else if (is_linux) { sources += [ "white_box/VulkanImageWrappingTests.cpp", "white_box/VulkanImageWrappingTests.h", "white_box/VulkanImageWrappingTests_OpaqueFD.cpp", ] } if (dawn_enable_error_injection) { sources += [ "white_box/VulkanErrorInjectorTests.cpp" ] } } sources += [ "white_box/BufferAllocatedSizeTests.cpp", "white_box/InternalResourceUsageTests.cpp", "white_box/InternalStorageBufferBindingTests.cpp", "white_box/QueryInternalShaderTests.cpp", ] if (dawn_enable_d3d12) { sources += [ "white_box/D3D12DescriptorHeapTests.cpp", "white_box/D3D12GPUTimestampCalibrationTests.cpp", "white_box/D3D12ResidencyTests.cpp", "white_box/D3D12ResourceHeapTests.cpp", ] } if (dawn_enable_metal) { sources += [ "white_box/MetalAutoreleasePoolTests.mm" ] } if (dawn_enable_opengles) { sources += [ "white_box/EGLImageWrappingTests.cpp" ] include_dirs = [ "//third_party/khronos" ] } libs = [] } dawn_test("dawn_end2end_tests") { deps = [ ":end2end_tests_sources", ":test_infra_sources", ":white_box_tests_sources", ] sources = [] libs = [] # When building inside Chromium, use their gtest main function because it is # needed to run in swarming correctly. if (build_with_chromium) { deps += [ ":end2end_tests_main" ] } else { sources += [ "End2EndTestsMain.cpp" ] } if (is_chromeos) { libs += [ "gbm" ] } } ############################################################################### # Dawn perf tests ############################################################################### dawn_test("dawn_perf_tests") { deps = [ ":test_infra_sources", "${dawn_root}/src/dawn:cpp", "${dawn_root}/src/dawn:proc", "${dawn_root}/src/dawn/common", "${dawn_root}/src/dawn/platform", "${dawn_root}/src/dawn/utils", "${dawn_root}/src/dawn/wire", ] sources = [ "perf_tests/BufferUploadPerf.cpp", "perf_tests/DawnPerfTest.cpp", "perf_tests/DawnPerfTest.h", "perf_tests/DawnPerfTestPlatform.cpp", "perf_tests/DawnPerfTestPlatform.h", "perf_tests/DrawCallPerf.cpp", "perf_tests/ShaderRobustnessPerf.cpp", "perf_tests/SubresourceTrackingPerf.cpp", ] libs = [] # When building inside Chromium, use their gtest main function and the # other perf test scaffolding in order to run in swarming correctly. if (build_with_chromium) { deps += [ ":perf_tests_main" ] data_deps = [ "//testing:run_perf_test" ] } else { sources += [ "PerfTestsMain.cpp" ] } if (dawn_enable_metal) { frameworks = [ "IOSurface.framework" ] } }