Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(519)

Unified Diff: media/audio/sounds/wav_audio_handler_unittest.cc

Issue 1453233002: Improve input handling for WaveAudioHandler. (Closed) Base URL: https://chromium.googlesource.com/chromium/src@master
Patch Set: Formatting Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/audio/sounds/wav_audio_handler.cc ('k') | media/media.gyp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/audio/sounds/wav_audio_handler_unittest.cc
diff --git a/media/audio/sounds/wav_audio_handler_unittest.cc b/media/audio/sounds/wav_audio_handler_unittest.cc
index d4ec83a5838243c5df7d488a7146780a0f8d29b4..5f8c6bed297f442b9ec253a1b240e572842d86bb 100644
--- a/media/audio/sounds/wav_audio_handler_unittest.cc
+++ b/media/audio/sounds/wav_audio_handler_unittest.cc
@@ -12,26 +12,179 @@
#include "testing/gtest/include/gtest/gtest.h"
namespace media {
+namespace {
+// WAV header comes first in the test data.
+const size_t kWavHeaderSize = 12;
+const size_t kWavDataSizeIndex = 4;
+
+// "fmt " header comes next.
+const size_t kFormatHeaderIndex = kWavHeaderSize;
+const size_t kFormatHeaderSize = 8;
+const size_t kFormatPayloadSize = 16;
+const size_t kChannelIndex = kWavHeaderSize + kFormatHeaderSize + 2;
+const size_t kBitsPerSampleIndex = kWavHeaderSize + kFormatHeaderSize + 14;
+const size_t kSampleRateIndex = kWavHeaderSize + kFormatHeaderSize + 4;
+
+// "data" header comes last.
+const size_t kDataHeaderIndex =
+ kWavHeaderSize + kFormatHeaderSize + kFormatPayloadSize;
+
+} // namespace
TEST(WavAudioHandlerTest, SampleDataTest) {
- WavAudioHandler handler(base::StringPiece(kTestAudioData,
- arraysize(kTestAudioData)));
- ASSERT_EQ(2u, handler.num_channels());
- ASSERT_EQ(16u, handler.bits_per_sample());
- ASSERT_EQ(48000u, handler.sample_rate());
- ASSERT_EQ(1u, handler.total_frames());
- ASSERT_EQ(20u, handler.GetDuration().InMicroseconds());
-
- ASSERT_EQ(4U, handler.data().size());
+ std::string data(kTestAudioData, kTestAudioDataSize);
+ auto handler = WavAudioHandler::Create(data);
+ ASSERT_TRUE(handler);
+ ASSERT_EQ(2u, handler->num_channels());
+ ASSERT_EQ(16u, handler->bits_per_sample());
+ ASSERT_EQ(48000u, handler->sample_rate());
+ ASSERT_EQ(1u, handler->total_frames());
+ ASSERT_EQ(20u, handler->GetDuration().InMicroseconds());
+
+ ASSERT_EQ(4U, handler->data().size());
const char kData[] = "\x01\x00\x01\x00";
- ASSERT_EQ(base::StringPiece(kData, arraysize(kData) - 1), handler.data());
+ ASSERT_EQ(base::StringPiece(kData, arraysize(kData) - 1), handler->data());
+
+ scoped_ptr<AudioBus> bus =
+ AudioBus::Create(handler->num_channels(),
+ handler->data().size() / handler->num_channels());
+
+ size_t bytes_written = 0u;
+ ASSERT_TRUE(handler->CopyTo(bus.get(), 0, &bytes_written));
+ ASSERT_EQ(static_cast<size_t>(handler->data().size()), bytes_written);
+}
+
+TEST(WavAudioHandlerTest, TestZeroChannelsIsNotValid) {
+ // Read in the sample data and modify the channel field to hold |00|00|.
+ std::string data(kTestAudioData, kTestAudioDataSize);
+ data[kChannelIndex] = '\x00';
+ data[kChannelIndex + 1] = '\x00';
+ auto handler = WavAudioHandler::Create(data);
+ EXPECT_FALSE(handler);
+}
+
+TEST(WavAudioHandlerTest, TestZeroBitsPerSampleIsNotValid) {
+ // Read in the sample data and modify the bits_per_sample field to hold
+ // |00|00|.
+ std::string data(kTestAudioData, kTestAudioDataSize);
+ data[kBitsPerSampleIndex] = '\x00';
+ data[kBitsPerSampleIndex + 1] = '\x00';
+ auto handler = WavAudioHandler::Create(data);
+ EXPECT_FALSE(handler);
+}
+
+TEST(WavAudioHandlerTest, TestZeroSamplesPerSecondIsNotValid) {
+ // Read in the sample data and modify the bits_per_sample field to hold
+ // |00|00|.
+ std::string data(kTestAudioData, kTestAudioDataSize);
+ data[kSampleRateIndex] = '\x00';
+ data[kSampleRateIndex + 1] = '\x00';
+ data[kSampleRateIndex + 2] = '\x00';
+ data[kSampleRateIndex + 3] = '\x00';
+ auto handler = WavAudioHandler::Create(data);
+ EXPECT_FALSE(handler);
+}
+
+TEST(WavAudioHandlerTest, TestTooBigTotalSizeIsOkay) {
+ // The size filed in the header should hold a very big number.
+ std::string data(kTestAudioData, kTestAudioDataSize);
+ data[kWavDataSizeIndex] = '\x00';
+ data[kWavDataSizeIndex + 1] = '\xFF';
+ data[kWavDataSizeIndex + 2] = '\xFF';
+ data[kWavDataSizeIndex + 3] = '\x00';
+ auto handler = WavAudioHandler::Create(data);
+ EXPECT_TRUE(handler);
+ ASSERT_EQ(2u, handler->num_channels());
+ ASSERT_EQ(16u, handler->bits_per_sample());
+ ASSERT_EQ(48000u, handler->sample_rate());
+ ASSERT_EQ(1u, handler->total_frames());
+ ASSERT_EQ(20u, handler->GetDuration().InMicroseconds());
- scoped_ptr<AudioBus> bus = AudioBus::Create(
- handler.num_channels(), handler.data().size() / handler.num_channels());
+ ASSERT_EQ(4U, handler->data().size());
+ const char kData[] = "\x01\x00\x01\x00";
+ ASSERT_EQ(base::StringPiece(kData, arraysize(kData) - 1), handler->data());
+}
+
+TEST(WavAudioHandlerTest, TestTooBigDataChunkSizeIsOkay) {
+ // If the |data| chunk size is last and it indicates it has more than it
+ // actually does, that's okay. Just consume the rest of the string. If it
+ // is not the last subsection, this file will parse badly.
+ std::string data(kTestAudioData, kTestAudioDataSize);
+ data[kDataHeaderIndex + 4] = '\x00';
+ data[kDataHeaderIndex + 5] = '\xFF';
+ data[kDataHeaderIndex + 6] = '\xFF';
+ data[kDataHeaderIndex + 7] = '\x00';
+ auto handler = WavAudioHandler::Create(data);
+ EXPECT_TRUE(handler);
+ ASSERT_EQ(2u, handler->num_channels());
+ ASSERT_EQ(16u, handler->bits_per_sample());
+ ASSERT_EQ(48000u, handler->sample_rate());
+ ASSERT_EQ(1u, handler->total_frames());
+ ASSERT_EQ(20u, handler->GetDuration().InMicroseconds());
+
+ ASSERT_EQ(4U, handler->data().size());
+ const char kData[] = "\x01\x00\x01\x00";
+ ASSERT_EQ(base::StringPiece(kData, arraysize(kData) - 1), handler->data());
+}
+
+TEST(WavAudioHandlerTest, TestTooSmallFormatSizeIsNotValid) {
+ // If the |data| chunk size is last and it indicates it has more than it
+ // actually does, that's okay. Just consume the rest of the string. If it
+ // is not the last subsection, this file will parse badly.
+ std::string data(kTestAudioData, kTestAudioDataSize);
+ data[kFormatHeaderIndex + 4] = '\x04';
+ data[kFormatHeaderIndex + 5] = '\x00';
+ data[kFormatHeaderIndex + 6] = '\x00';
+ data[kFormatHeaderIndex + 7] = '\x00';
+ auto handler = WavAudioHandler::Create(data);
+ EXPECT_FALSE(handler);
+}
+
+TEST(WavAudioHandlerTest, TestOtherSectionTypesIsOkay) {
+ // Append some other subsection header "abcd", the class should just consume
+ // and keep going.
+ std::string data(kTestAudioData, kTestAudioDataSize);
+ data.append("abcd\x04\x00\x00\x00\x01\x02\x03\x04");
+ data[kWavDataSizeIndex] += 12; // This should not overflow.
+
+ auto handler = WavAudioHandler::Create(data);
+ EXPECT_TRUE(handler);
+ ASSERT_EQ(2u, handler->num_channels());
+ ASSERT_EQ(16u, handler->bits_per_sample());
+ ASSERT_EQ(48000u, handler->sample_rate());
+ ASSERT_EQ(1u, handler->total_frames());
+ ASSERT_EQ(20u, handler->GetDuration().InMicroseconds());
+ ASSERT_EQ(4u, handler->data().size());
+}
+
+TEST(WavAudioHandlerTest, TestNoFmtSectionIsNotValid) {
+ // Write over the "fmt " header. No valid handler should be returned.
+ std::string data(kTestAudioData, kTestAudioDataSize);
+ data[kFormatHeaderIndex] = 'a';
+ data[kFormatHeaderIndex + 1] = 'b';
+ data[kFormatHeaderIndex + 2] = 'c';
+ data[kFormatHeaderIndex + 3] = 'd';
+ auto handler = WavAudioHandler::Create(data);
+ EXPECT_FALSE(handler);
+}
- size_t bytes_written;
- ASSERT_TRUE(handler.CopyTo(bus.get(), 0, &bytes_written));
- ASSERT_EQ(static_cast<size_t>(handler.data().size()), bytes_written);
+TEST(WavAudioHandlerTest, TestNoDataSectionIsOkay) {
+ // This one could go both ways. But for now, let's say that it's okay not
+ // to have a "data" section - just make sure everything is zeroed out as it
+ // should be.
+ std::string data(kTestAudioData, kTestAudioDataSize);
+ data[kDataHeaderIndex] = 'a';
+ data[kDataHeaderIndex + 1] = 'b';
+ data[kDataHeaderIndex + 2] = 'c';
+ data[kDataHeaderIndex + 3] = 'd';
+ auto handler = WavAudioHandler::Create(data);
+ EXPECT_TRUE(handler);
+ ASSERT_EQ(2u, handler->num_channels());
+ ASSERT_EQ(16u, handler->bits_per_sample());
+ ASSERT_EQ(48000u, handler->sample_rate());
+ ASSERT_EQ(0u, handler->total_frames());
+ ASSERT_EQ(0u, handler->GetDuration().InMicroseconds());
+ ASSERT_EQ(0u, handler->data().size());
}
} // namespace media
« no previous file with comments | « media/audio/sounds/wav_audio_handler.cc ('k') | media/media.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698