Index: third_party/WebKit/Source/platform/audio/PushPullFIFOTest.cpp |
diff --git a/third_party/WebKit/Source/platform/audio/PushPullFIFOTest.cpp b/third_party/WebKit/Source/platform/audio/PushPullFIFOTest.cpp |
deleted file mode 100644 |
index 0a9edda2534f63b92a7c0c15addc477c28240377..0000000000000000000000000000000000000000 |
--- a/third_party/WebKit/Source/platform/audio/PushPullFIFOTest.cpp |
+++ /dev/null |
@@ -1,364 +0,0 @@ |
-// Copyright 2017 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "platform/audio/PushPullFIFO.h" |
- |
-#include <memory> |
-#include <vector> |
-#include "platform/audio/AudioUtilities.h" |
-#include "platform/testing/TestingPlatformSupport.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "wtf/PtrUtil.h" |
- |
-namespace blink { |
- |
-namespace { |
- |
-// Check the basic contract of FIFO. |
-TEST(PushPullFIFOBasicTest, BasicTests) { |
- // This suppresses the multi-thread warning for GTest. Potently it increases |
- // the test execution time, but this specific test is very short and simple. |
- ::testing::FLAGS_gtest_death_test_style = "threadsafe"; |
- |
- // FIFO length exceeding the maximum length allowed will cause crash. |
- EXPECT_DEATH(new PushPullFIFO(2, PushPullFIFO::kMaxFIFOLength + 1), |
- "m_fifoLength <= kMaxFIFOLength"); |
- |
- std::unique_ptr<PushPullFIFO> testFifo = |
- WTF::wrapUnique(new PushPullFIFO(2, 1024)); |
- |
- // The input bus length must be |AudioUtilities::kRenderQuantumFrames|. |
- RefPtr<AudioBus> inputBusOf129Frames = |
- AudioBus::create(2, AudioUtilities::kRenderQuantumFrames + 1); |
- EXPECT_DEATH(testFifo->push(inputBusOf129Frames.get()), |
- "inputBus->length.* == .*kRenderQuantumFrames"); |
- RefPtr<AudioBus> inputBusOf127Frames = |
- AudioBus::create(2, AudioUtilities::kRenderQuantumFrames - 1); |
- EXPECT_DEATH(testFifo->push(inputBusOf127Frames.get()), |
- "inputBus->length.* == .*kRenderQuantumFrames"); |
- |
- // Pull request frames cannot exceed the length of output bus. |
- RefPtr<AudioBus> outputBusOf512Frames = AudioBus::create(2, 512); |
- EXPECT_DEATH(testFifo->pull(outputBusOf512Frames.get(), 513), |
- "framesRequested <= outputBus->length.*"); |
- |
- // Pull request frames cannot exceed the length of FIFO. |
- RefPtr<AudioBus> outputBusOf1025Frames = AudioBus::create(2, 1025); |
- EXPECT_DEATH(testFifo->pull(outputBusOf1025Frames.get(), 1025), |
- "framesRequested <= m_fifoLength"); |
-} |
- |
-// Fills each AudioChannel in an AudioBus with a series of linearly increasing |
-// values starting from |startingValue| and incrementing by 1. Then return value |
-// will be |startingValue| + |bus_length|. |
-size_t fillBusWithLinearRamp(AudioBus* targetBus, size_t startingValue) { |
- for (unsigned c = 0; c < targetBus->numberOfChannels(); ++c) { |
- float* busChannel = targetBus->channel(c)->mutableData(); |
- for (size_t i = 0; i < targetBus->channel(c)->length(); ++i) { |
- busChannel[i] = static_cast<float>(startingValue + i); |
- } |
- } |
- return startingValue + targetBus->length(); |
-} |
- |
-// Inspect the content of AudioBus with a given set of index and value across |
-// channels. |
-bool verifyBusValueAtIndex(AudioBus* targetBus, |
- int index, |
- float expectedValue) { |
- for (unsigned c = 0; c < targetBus->numberOfChannels(); ++c) { |
- float* busChannel = targetBus->channel(c)->mutableData(); |
- if (busChannel[index] != expectedValue) { |
- LOG(ERROR) << ">> [FAIL] expected " << expectedValue << " at index " |
- << index << " but got " << busChannel[index] << "."; |
- return false; |
- } |
- } |
- return true; |
-} |
- |
-struct FIFOAction { |
- // The type of action; "PUSH" or "PULL". |
- const char* action; |
- // Number of frames for the operation. |
- const size_t numberOfFrames; |
-}; |
- |
-struct AudioBusSample { |
- // The frame index of a sample in the bus. |
- const size_t index; |
- // The value at the |index| above. |
- const float value; |
-}; |
- |
-struct FIFOTestSetup { |
- // Length of FIFO to be created for test case. |
- const size_t fifoLength; |
- // Channel count of FIFO to be created for test case. |
- const unsigned numberOfChannels; |
- // A list of |FIFOAction| entries to be performed in test case. |
- const std::vector<FIFOAction> fifoActions; |
-}; |
- |
-struct FIFOTestExpectedState { |
- // Expected read index in FIFO. |
- const size_t indexRead; |
- // Expected write index in FIFO. |
- const size_t indexWrite; |
- // Expected overflow count in FIFO. |
- const unsigned overflowCount; |
- // Expected underflow count in FIFO. |
- const unsigned underflowCount; |
- // A list of expected |AudioBusSample| entries for the FIFO bus. |
- const std::vector<AudioBusSample> fifoSamples; |
- // A list of expected |AudioBusSample| entries for the output bus. |
- const std::vector<AudioBusSample> outputSamples; |
-}; |
- |
-// The data structure for the parameterized test cases. |
-struct FIFOTestParam { |
- FIFOTestSetup setup; |
- FIFOTestExpectedState expectedState; |
-}; |
- |
-std::ostream& operator<<(std::ostream& out, const FIFOTestParam& param) { |
- out << "fifoLength=" << param.setup.fifoLength |
- << " numberOfChannels=" << param.setup.numberOfChannels; |
- return out; |
-} |
- |
-class PushPullFIFOFeatureTest : public ::testing::TestWithParam<FIFOTestParam> { |
-}; |
- |
-TEST_P(PushPullFIFOFeatureTest, FeatureTests) { |
- const FIFOTestSetup setup = GetParam().setup; |
- const FIFOTestExpectedState expectedState = GetParam().expectedState; |
- |
- // Create a FIFO with a specified configuration. |
- std::unique_ptr<PushPullFIFO> fifo = WTF::wrapUnique( |
- new PushPullFIFO(setup.numberOfChannels, setup.fifoLength)); |
- |
- RefPtr<AudioBus> outputBus; |
- |
- // Iterate all the scheduled push/pull actions. |
- size_t frameCounter = 0; |
- for (const auto& action : setup.fifoActions) { |
- if (strcmp(action.action, "PUSH") == 0) { |
- RefPtr<AudioBus> inputBus = |
- AudioBus::create(setup.numberOfChannels, action.numberOfFrames); |
- frameCounter = fillBusWithLinearRamp(inputBus.get(), frameCounter); |
- fifo->push(inputBus.get()); |
- LOG(INFO) << "PUSH " << action.numberOfFrames |
- << " frames (frameCounter=" << frameCounter << ")"; |
- } else { |
- outputBus = |
- AudioBus::create(setup.numberOfChannels, action.numberOfFrames); |
- fifo->pull(outputBus.get(), action.numberOfFrames); |
- LOG(INFO) << "PULL " << action.numberOfFrames << " frames"; |
- } |
- } |
- |
- // Get FIFO config data. |
- const PushPullFIFOStateForTest actualState = fifo->getStateForTest(); |
- |
- // Verify the read/write indexes. |
- EXPECT_EQ(expectedState.indexRead, actualState.indexRead); |
- EXPECT_EQ(expectedState.indexWrite, actualState.indexWrite); |
- EXPECT_EQ(expectedState.overflowCount, actualState.overflowCount); |
- EXPECT_EQ(expectedState.underflowCount, actualState.underflowCount); |
- |
- // Verify in-FIFO samples. |
- for (const auto& sample : expectedState.fifoSamples) { |
- EXPECT_TRUE(verifyBusValueAtIndex(fifo->bus(), sample.index, sample.value)); |
- } |
- |
- // Verify samples from the most recent output bus. |
- for (const auto& sample : expectedState.outputSamples) { |
- EXPECT_TRUE( |
- verifyBusValueAtIndex(outputBus.get(), sample.index, sample.value)); |
- } |
-} |
- |
-FIFOTestParam featureTestParams[] = { |
- // Test cases 0 ~ 3: Regular operation on various channel configuration. |
- // - Mono, Stereo, Quad, 5.1. |
- // - FIFO length and pull size are RQ-aligned. |
- {{512, 1, {{"PUSH", 128}, {"PUSH", 128}, {"PULL", 256}}}, |
- {256, 256, 0, 0, {{0, 0}}, {{0, 0}, {255, 255}}}}, |
- |
- {{512, 2, {{"PUSH", 128}, {"PUSH", 128}, {"PULL", 256}}}, |
- {256, 256, 0, 0, {{0, 0}}, {{0, 0}, {255, 255}}}}, |
- |
- {{512, 4, {{"PUSH", 128}, {"PUSH", 128}, {"PULL", 256}}}, |
- {256, 256, 0, 0, {{0, 0}}, {{0, 0}, {255, 255}}}}, |
- |
- {{512, 6, {{"PUSH", 128}, {"PUSH", 128}, {"PULL", 256}}}, |
- {256, 256, 0, 0, {{0, 0}}, {{0, 0}, {255, 255}}}}, |
- |
- // Test case 4: Pull size less than or equal to 128. |
- {{128, 2, {{"PUSH", 128}, {"PULL", 128}, {"PUSH", 128}, {"PULL", 64}}}, |
- {64, 0, 0, 0, {{64, 192}, {0, 128}}, {{0, 128}, {63, 191}}}}, |
- |
- // Test case 5: Unusual FIFO and Pull length. |
- // - FIFO and pull length that are not aligned to render quantum. |
- // - Check if the indexes are wrapping around correctly. |
- // - Check if the output bus starts and ends with correct values. |
- {{997, |
- 1, |
- { |
- {"PUSH", 128}, |
- {"PUSH", 128}, |
- {"PUSH", 128}, |
- {"PUSH", 128}, |
- {"PULL", 449}, |
- {"PUSH", 128}, |
- {"PUSH", 128}, |
- {"PUSH", 128}, |
- {"PUSH", 128}, |
- {"PULL", 449}, |
- }}, |
- // - expectedIndexRead = 898, expectedIndexWrite = 27 |
- // - overflowCount = 0, underflowCount = 0 |
- // - FIFO samples (index, expectedValue) = (898, 898), (27, 27) |
- // - Output bus samples (index, expectedValue) = (0, 499), (448, 897) |
- {898, 27, 0, 0, {{898, 898}, {27, 27}}, {{0, 449}, {448, 897}}}}, |
- |
- // Test case 6: Overflow |
- // - Check overflow counter. |
- // - After the overflow occurs, the read index must be moved to the write |
- // index. Thus pulled frames must not contain overwritten data. |
- {{512, |
- 3, |
- { |
- {"PUSH", 128}, |
- {"PUSH", 128}, |
- {"PUSH", 128}, |
- {"PUSH", 128}, |
- {"PUSH", 128}, |
- {"PULL", 256}, |
- }}, |
- // - expectedIndexRead = 384, expectedIndexWrite = 128 |
- // - overflowCount = 1, underflowCount = 0 |
- // - FIFO samples (index, expectedValue) = (384, 384), (128, 128) |
- // - Output bus samples (index, expectedValue) = (0, 128), (255, 383) |
- {384, 128, 1, 0, {{384, 384}, {128, 128}}, {{0, 128}, {255, 383}}}}, |
- |
- // Test case 7: Overflow in unusual FIFO and pull length. |
- // - Check overflow counter. |
- // - After the overflow occurs, the read index must be moved to the write |
- // index. Thus pulled frames must not contain overwritten data. |
- {{577, |
- 5, |
- { |
- {"PUSH", 128}, |
- {"PUSH", 128}, |
- {"PUSH", 128}, |
- {"PUSH", 128}, |
- {"PUSH", 128}, |
- {"PULL", 227}, |
- }}, |
- // - expectedIndexRead = 290, expectedIndexWrite = 63 |
- // - overflowCount = 1, underflowCount = 0 |
- // - FIFO samples (index, expectedValue) = (63, 63), (290, 290) |
- // - Output bus samples (index, expectedValue) = (0, 63), (226, 289) |
- {290, 63, 1, 0, {{63, 63}, {290, 290}}, {{0, 63}, {226, 289}}}}, |
- |
- // Test case 8: Underflow |
- // - Check underflow counter. |
- // - After the underflow occurs, the write index must be moved to the read |
- // index. Frames pulled after FIFO underflows must be zeroed. |
- {{512, |
- 7, |
- { |
- {"PUSH", 128}, |
- {"PUSH", 128}, |
- {"PUSH", 128}, |
- {"PULL", 384}, |
- {"PUSH", 128}, |
- {"PUSH", 128}, |
- {"PULL", 384}, |
- }}, |
- // - expectedIndexRead = 128, expectedIndexWrite = 128 |
- // - overflowCount = 0, underflowCount = 1 |
- // - FIFO samples (index, expectedValue) = (128, 128) |
- // - Output bus samples (index, expectedValue) = (0, 384), (255, 639) |
- // (256, 0), (383, 0) |
- {128, |
- 128, |
- 0, |
- 1, |
- {{128, 128}}, |
- {{0, 384}, {255, 639}, {256, 0}, {383, 0}}}}, |
- |
- // Test case 9: Underflow in unusual FIFO and pull length. |
- // - Check underflow counter. |
- // - After the underflow occurs, the write index must be moved to the read |
- // index. Frames pulled after FIFO underflows must be zeroed. |
- {{523, |
- 11, |
- { |
- {"PUSH", 128}, |
- {"PUSH", 128}, |
- {"PUSH", 128}, |
- {"PULL", 383}, |
- {"PUSH", 128}, |
- {"PUSH", 128}, |
- {"PULL", 383}, |
- }}, |
- // - expectedIndexRead = 117, expectedIndexWrite = 117 |
- // - overflowCount = 0, underflowCount = 1 |
- // - FIFO samples (index, expectedValue) = (117, 117) |
- // - Output bus samples (index, expectedValue) = (0, 383), (256, 639) |
- // (257, 0), (382, 0) |
- {117, |
- 117, |
- 0, |
- 1, |
- {{117, 117}}, |
- {{0, 383}, {256, 639}, {257, 0}, {382, 0}}}}, |
- |
- // Test case 10: Multiple pull from an empty FIFO. |
- // - Check underflow counter. |
- // - After the underflow occurs, the write index must be moved to the read |
- // index. Frames pulled after FIFO underflows must be zeroed. |
- {{1024, |
- 11, |
- { |
- {"PUSH", 128}, |
- {"PUSH", 128}, |
- {"PULL", 440}, |
- {"PULL", 440}, |
- {"PULL", 440}, |
- {"PULL", 440}, |
- {"PULL", 440}, |
- }}, |
- // - expectedIndexRead = 117, expectedIndexWrite = 117 |
- // - overflowCount = 0, underflowCount = 1 |
- // - FIFO samples (index, expectedValue) = (117, 117) |
- // - Output bus samples (index, expectedValue) = (0, 383), (256, 639) |
- // (257, 0), (382, 0) |
- {256, 256, 0, 5, {{256, 0}}, {{0, 0}, {439, 0}}}}, |
- |
- // Test case 11: Multiple pull from an empty FIFO. (zero push) |
- {{1024, |
- 11, |
- { |
- {"PULL", 144}, |
- {"PULL", 144}, |
- {"PULL", 144}, |
- {"PULL", 144}, |
- }}, |
- // - expectedIndexRead = 0, expectedIndexWrite = 0 |
- // - overflowCount = 0, underflowCount = 4 |
- // - FIFO samples (index, expectedValue) = (0, 0), (1023, 0) |
- // - Output bus samples (index, expectedValue) = (0, 0), (143, 0) |
- {0, 0, 0, 4, {{0, 0}, {1023, 0}}, {{0, 0}, {143, 0}}}}}; |
- |
-INSTANTIATE_TEST_CASE_P(PushPullFIFOFeatureTest, |
- PushPullFIFOFeatureTest, |
- ::testing::ValuesIn(featureTestParams)); |
- |
-} // namespace |
- |
-} // namespace blink |