Index: chrome/browser/media_galleries/fileapi/itunes_library_parser_unittest.cc |
diff --git a/chrome/browser/media_galleries/fileapi/itunes_library_parser_unittest.cc b/chrome/browser/media_galleries/fileapi/itunes_library_parser_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c0f8061d021a10cddb33d55806bd42a1ac5c883c |
--- /dev/null |
+++ b/chrome/browser/media_galleries/fileapi/itunes_library_parser_unittest.cc |
@@ -0,0 +1,197 @@ |
+// Copyright (c) 2013 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 "base/logging.h" |
+#include "chrome/browser/media_galleries/fileapi/itunes_library_parser.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+#define SIMPLE_HEADER() \ |
+ "<plist>" \ |
+ " <dict>" \ |
+ " <key>Tracks</key>" \ |
+ " <dict>" |
+ |
+#define SIMPLE_TRACK(key, id, path, artist, album) \ |
+ "<key>" #key "</key>" \ |
+ "<dict>" \ |
+ " <key>Track ID</key><integer>" #id "</integer>" \ |
+ " <key>Location</key><string>file://localhost/" path "</string>" \ |
+ " <key>Album Artist</key><string>" artist "</string>" \ |
+ " <key>Album</key><string>" album "</string>" \ |
+ "</dict>" |
+ |
+#define SIMPLE_FOOTER() \ |
+ " </dict>" \ |
+ " </dict>" \ |
+ "</plist>" |
+ |
+namespace itunes { |
+ |
+namespace { |
+ |
+void CompareTrack(const ITunesLibraryParser::Track& a, |
+ const ITunesLibraryParser::Track& b) { |
+ EXPECT_EQ(a.id, b.id); |
+ EXPECT_EQ(a.location, b.location); |
+} |
+ |
+void CompareAlbum(const ITunesLibraryParser::Album& a, |
+ const ITunesLibraryParser::Album& b) { |
+ EXPECT_EQ(a.size(), b.size()); |
+ |
+ ITunesLibraryParser::Album::const_iterator a_it; |
+ ITunesLibraryParser::Album::const_iterator b_it; |
+ for (a_it = a.begin(), b_it = b.begin(); |
+ a_it != a.end() && b_it != b.end(); |
+ ++a_it, ++b_it) { |
+ CompareTrack(*a_it, *b_it); |
+ } |
+} |
+ |
+void CompareAlbums(const ITunesLibraryParser::Albums& a, |
+ const ITunesLibraryParser::Albums& b) { |
+ EXPECT_EQ(a.size(), b.size()); |
+ |
+ ITunesLibraryParser::Albums::const_iterator a_it; |
+ ITunesLibraryParser::Albums::const_iterator b_it; |
+ for (a_it = a.begin(), b_it = b.begin(); |
+ a_it != a.end() && b_it != b.end(); |
+ ++a_it, ++b_it) { |
+ EXPECT_EQ(a_it->first, b_it->first); |
+ CompareAlbum(a_it->second, b_it->second); |
+ } |
+} |
+ |
+void CompareLibrary(const ITunesLibraryParser::Library& a, |
+ const ITunesLibraryParser::Library& b) { |
+ EXPECT_EQ(a.size(), b.size()); |
+ |
+ ITunesLibraryParser::Library::const_iterator a_it; |
+ ITunesLibraryParser::Library::const_iterator b_it; |
+ for (a_it = a.begin(), b_it = b.begin(); |
+ a_it != a.end() && b_it != b.end(); |
+ ++a_it, ++b_it) { |
+ EXPECT_EQ(a_it->first, b_it->first); |
+ CompareAlbums(a_it->second, b_it->second); |
+ } |
+} |
+ |
+class ITunesLibraryParserTest : public testing::Test { |
+ public: |
+ ITunesLibraryParserTest() {} |
+ |
+ void TestParser(bool expected_result, const std::string& xml) { |
+ ITunesLibraryParser parser; |
+ |
+ EXPECT_EQ(expected_result, parser.Parse(xml)); |
+ if (!expected_result) |
+ return; |
+ |
+ CompareLibrary(expected_library_, parser.library()); |
+ } |
+ |
+ void AddExpectedTrack(uint32 id, const std::string& location, |
+ const std::string& artist, const std::string& album) { |
+ ITunesLibraryParser::Track track(id, |
+ base::FilePath::FromUTF8Unsafe(location)); |
+ expected_library_[artist][album].insert(track); |
+ } |
+ |
+ private: |
+ ITunesLibraryParser::Library expected_library_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ITunesLibraryParserTest); |
+}; |
+ |
+TEST_F(ITunesLibraryParserTest, EmptyLibrary) { |
+ TestParser(false, ""); |
+} |
+ |
+TEST_F(ITunesLibraryParserTest, MinimalXML) { |
+ AddExpectedTrack(1, "C:/dir/Song With Space.mp3", "Artist A", "Album A"); |
+ TestParser( |
+ true, |
+ SIMPLE_HEADER() |
+ SIMPLE_TRACK(1, 1, "C:/dir/Song%20With%20Space.mp3", "Artist A", |
+ "Album A") |
+ SIMPLE_FOOTER()); |
+} |
+ |
+TEST_F(ITunesLibraryParserTest, MultipleSongs) { |
+ AddExpectedTrack(1, "C:/dir/SongA1.mp3", "Artist A", "Album A"); |
+ AddExpectedTrack(2, "C:/dir/SongA2.mp3", "Artist A", "Album A"); |
+ AddExpectedTrack(3, "C:/dir/SongA3.mp3", "Artist A", "Album A"); |
+ AddExpectedTrack(4, "C:/dir/SongB1.mp3", "Artist A", "Album B"); |
+ AddExpectedTrack(5, "C:/dir/SongB2.mp3", "Artist A", "Album B"); |
+ AddExpectedTrack(6, "C:/dir2/SongB1.mp3", "Artist B", "Album B"); |
+ AddExpectedTrack(7, "C:/dir2/SongB2.mp3", "Artist B", "Album B"); |
+ TestParser( |
+ true, |
+ SIMPLE_HEADER() |
+ SIMPLE_TRACK(1, 1, "C:/dir/SongA1.mp3", "Artist A", "Album A") |
+ SIMPLE_TRACK(2, 2, "C:/dir/SongA2.mp3", "Artist A", "Album A") |
+ SIMPLE_TRACK(3, 3, "C:/dir/SongA3.mp3", "Artist A", "Album A") |
+ SIMPLE_TRACK(4, 4, "C:/dir/SongB1.mp3", "Artist A", "Album B") |
+ SIMPLE_TRACK(5, 5, "C:/dir/SongB2.mp3", "Artist A", "Album B") |
+ SIMPLE_TRACK(6, 6, "C:/dir2/SongB1.mp3", "Artist B", "Album B") |
+ SIMPLE_TRACK(7, 7, "C:/dir2/SongB2.mp3", "Artist B", "Album B") |
+ SIMPLE_FOOTER()); |
+} |
+ |
+TEST_F(ITunesLibraryParserTest, MismatchedId) { |
+ TestParser( |
+ false, |
+ SIMPLE_HEADER() |
+ SIMPLE_TRACK(1, 2, "C:/dir/SongA1.mp3", "Artist A", "Album A") |
+ SIMPLE_FOOTER()); |
+ |
+ AddExpectedTrack(1, "C:/dir/SongA1.mp3", "Artist A", "Album A"); |
+ TestParser( |
+ true, |
+ SIMPLE_HEADER() |
+ SIMPLE_TRACK(1, 1, "C:/dir/SongA1.mp3", "Artist A", "Album A") |
+ SIMPLE_TRACK(2, 3, "C:/dir/SongA2.mp3", "Artist A", "Album A") |
+ SIMPLE_FOOTER()); |
+} |
+ |
+TEST_F(ITunesLibraryParserTest, OtherDictionaryEntries) { |
+ AddExpectedTrack(1, "C:/dir/SongA1.mp3", "Artist A", "Album A"); |
+ TestParser( |
+ true, |
+ "<plist>" |
+ " <dict>" |
+ " <key>Other section</key>" |
+ " <dict>" |
+ // In Other section, not Tracks. |
+ SIMPLE_TRACK(10, 10, "C:/dir/SongB2.mp3", "Artist B", "Album B") |
+ " </dict>" |
+ " <key>Tracks</key>" |
+ " <dict>" |
+ " <key>1</key>" |
+ " <dict>" |
+ // In the body of a track dictionary before the interesting entries. |
+ SIMPLE_TRACK(20, 20, "C:/dir/SongB2.mp3", "Artist B", "Album B") |
+ // Entries in a different order. |
+ " <key>Album Artist</key><string>Artist A</string>" |
+ " <key>Location</key>" |
+ " <string>file://localhost/C:/dir/SongA1.mp3</string>" |
+ " <key>Album</key><string>Album A</string>" |
+ " <key>Track ID</key><integer>1</integer>" |
+ // In the body of a track dictionary after the interesting entries. |
+ SIMPLE_TRACK(30, 30, "C:/dir/SongB3.mp3", "Artist B", "Album B") |
+ " </dict>" |
+ " <key>40</key>" |
+ " <dict>" |
+ // Missing album name. |
+ " <key>Album Artist</key><string>Artist B</string>" |
+ " <key>Location</key>" |
+ " <string>file://localhost/C:/dir/SongB4.mp3</string>" |
+ " <key>Track ID</key><integer>1</integer>" |
+ " </dict>" |
+ SIMPLE_FOOTER()); |
+} |
+ |
+} // namespace |
+ |
+} // namespace itunes |