test_metadatajob_reading.js
Go to the documentation of this file.
1 /*
2 //
3 // BEGIN SONGBIRD GPL
4 //
5 // This file is part of the Songbird web player.
6 //
7 // Copyright(c) 2005-2008 POTI, Inc.
8 // http://songbirdnest.com
9 //
10 // This file may be licensed under the terms of of the
11 // GNU General Public License Version 2 (the "GPL").
12 //
13 // Software distributed under the License is distributed
14 // on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
15 // express or implied. See the GPL for the specific language
16 // governing rights and limitations.
17 //
18 // You should have received a copy of the GPL along with this
19 // program. If not, go to http://www.gnu.org/licenses/gpl.html
20 // or write to the Free Software Foundation, Inc.,
21 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22 //
23 // END SONGBIRD GPL
24 //
25 */
26 
31 var gFileLocation = "testharness/metadatamanager/files/";
32 
34 var gRemoteURLPrefix = "http://localhost:" + PORT_NUMBER + "/";
35 
37 gDefaultMetadata[SBProperties.artistName] = "Songbird";
38 gDefaultMetadata[SBProperties.albumName] = "Unit Test Classics";
39 gDefaultMetadata[SBProperties.trackName] = "Sample";
40 
41 // Map of media files to expected metadata
42 var gFiles = {};
43 gFiles["FLAC.flac"] = gDefaultMetadata;
44 gFiles["MP3_ID3v1.mp3"] = gDefaultMetadata;
45 gFiles["MP3_ID3v1_and_ID3v2.mp3"] = gDefaultMetadata;
46 gFiles["MP3_ID3v1_ID3v2_APE2.mp3"] = gDefaultMetadata;
47 gFiles["MP3_ID3v1v22.mp3"] = gDefaultMetadata;
48 gFiles["MP3_ID3v1v23.mp3"] = gDefaultMetadata;
49 gFiles["MP3_ID3v1v24.mp3"] = gDefaultMetadata;
50 gFiles["MP3_ID3v22.mp3"] = gDefaultMetadata;
51 gFiles["MP3_ID3v23.mp3"] = gDefaultMetadata;
52 gFiles["MP3_ID3v24.mp3"] = gDefaultMetadata;
53 gFiles["MP3_NoTags.mp3"] = {};
54 gFiles["MPEG4_Audio_Apple_Lossless.m4a"] = gDefaultMetadata;
55 gFiles["MusePack.mpc"] = gDefaultMetadata;
56 gFiles["Ogg_Vorbis.ogg"] = gDefaultMetadata;
57 
58 gFiles["TrueAudio.tta"] = gDefaultMetadata;
59 gFiles["WavPack.wv"] = gDefaultMetadata;
60 gFiles["\u2606\u2606\u2606\u2606\u2606\u2606.mp3"] = gDefaultMetadata;
61 
62 gFiles["MP3_ID3v1_Shift_JIS.mp3"] = {};
63 gFiles["MP3_ID3v1_Shift_JIS.mp3"][SBProperties.artistName] = "\u7406\u591A";
64 gFiles["MP3_ID3v1_Shift_JIS.mp3"][SBProperties.albumName] = "Monologue -\u3082\u306E\u308D\u3049\u3050-";
65 
66 // TODO Not working at the moment. Filed as bug 8768
67 // gFiles["Speex.spx"] = gDefaultMetadata;
68 // gFiles["Ogg_FLAC.oga"] = gDefaultMetadata;
69 
72 var gFileList = [];
73 
75 
76 var gServer;
77 
78 function runTest () {
79 
80  var gTestLibrary = createNewLibrary( "test_metadatajob" );
81  var gTestMediaItems = Components.classes["@songbirdnest.com/moz/xpcom/threadsafe-array;1"]
82  .createInstance(Components.interfaces.nsIMutableArray);
83 
84  // Make a copy of everything in the test file folder
85  // so that our changes don't interfere with other tests
86  var testFolder = getCopyOfFolder(newAppRelativeFile(gFileLocation), "_temp_reading_files");
87 
88  sleep(2000);
89 
90  // Make a file with a unicode filename. This would be checked in, except
91  // the windows build system can't handle unicode filenames.
92  var unicodeFile = testFolder.clone();
93  unicodeFile.append("MP3_ID3v23.mp3");
94  unicodeFile = getCopyOfFile(unicodeFile, "\u2606\u2606\u2606\u2606\u2606\u2606.mp3", testFolder);
95 
96 
97  gServer = Cc["@mozilla.org/server/jshttp;1"]
98  .createInstance(Ci.nsIHttpServer);
99 
100  gServer.start(PORT_NUMBER);
101 
102  gServer.registerDirectory("/", testFolder.clone());
103 
104  for (var fileName in gFiles) {
105  log("MetadataJob_Reading: enqueueing file " + fileName);
106 
107  gFileList.push(fileName);
108 
109  // Add gFiles to it
110  var localPath = testFolder.clone();
111  localPath.append(fileName);
112  assertNotEqual( localPath, null );
113  var localPathURI = newFileURI( localPath );
114  assertNotEqual( localPathURI, null );
115  // Allow duplicates, since many of the files have the same hash value
116  var localPathMI = gTestLibrary.createMediaItem( localPathURI, null, true );
117  assertNotEqual( localPathMI, null );
118  gLocalMediaItems.push( localPathMI );
119  gTestMediaItems.appendElement( localPathMI, false );
120 
121  // Add gRemoteUrls to it
122  var remotePathURI = newURI( gRemoteURLPrefix + fileName );
123  assertNotEqual( remotePathURI, null );
124  var remotePathMI = gTestLibrary.createMediaItem( remotePathURI );
125  assertNotEqual( remotePathMI, null );
126  gRemoteMediaItems.push( remotePathMI );
127  gTestMediaItems.appendElement( remotePathMI, false );
128  }
129 
130  // Request metadata for both local and remote urls at the same time. Woo!
131  gFileMetadataService = Components.classes["@songbirdnest.com/Songbird/FileMetadataService;1"]
132  .getService(Components.interfaces.sbIFileMetadataService);
133  var job = gFileMetadataService.read( gTestMediaItems);
134 
135  if (job.status == Components.interfaces.sbIJobProgress.STATUS_SUCCEEDED) {
136  jobFinished();
137  } else {
138  // Set an observer to know when we complete
139  job.addJobProgressListener(onComplete);
140  testPending();
141  }
142 }
143 
144 function onComplete(job) {
145  if (job.status == Components.interfaces.sbIJobProgress.STATUS_RUNNING) {
146  return;
147  }
148 
149  job.removeJobProgressListener(onComplete);
150 
151  jobFinished();
152 }
153 
154 function jobFinished() {
155  try {
156  assertTrue(gFileList.length > 0);
157 
158  // Print metadata or all items so we can see the full set of data instead
159  // of just quitting on the first error
160  for (var i = 0; i < gFileList.length; i++) {
161  var fileName = gFileList[i];
162  var expectedProperties = gFiles[fileName];
163  var localProperties =
164  SBProperties.arrayToJSObject(gLocalMediaItems[i].getProperties());
165  var remoteProperties =
166  SBProperties.arrayToJSObject(gRemoteMediaItems[i].getProperties());
167 
168  log("\n\n--------------------------------------------------------------");
169  log("MetadataJob_Reading: results for " + fileName);
170  log("Expected properties: " + expectedProperties.toSource());
171  log("\nLocal properties: " + localProperties.toSource());
172  log("\nRemote properties: " + remoteProperties.toSource());
173  }
174 
175  // Now actually verify the metadata
176  for (var i = 0; i < gFileList.length; i++) {
177  var fileName = gFileList[i];
178  var expectedProperties = gFiles[fileName];
179 
180  log("MetadataJob_Reading: comparing local properties for " + fileName);
181 
182  // Verify local properties
183  assertObjectIsSubsetOf(expectedProperties,
184  SBProperties.arrayToJSObject(gLocalMediaItems[i].getProperties()));
185 
186  log("MetadataJob_Reading: comparing remote properties for " + fileName);
187 
188  // Verify remote properties
189  assertObjectIsSubsetOf(expectedProperties,
190  SBProperties.arrayToJSObject(gRemoteMediaItems[i].getProperties()));
191  }
192 
193 
194  // So testing is complete
196 
197  } finally {
198  gServer.stop(function() {});
199  }
200 
201  testFinished();
202 }
function runTest()
Advanced DataRemote unit tests.
function onComplete(job)
function sleep(ms, suppressOutput)
var gFileLocation
Test reading from various media formats.
const Cc
var gRemoteURLPrefix
function newAppRelativeFile(path)
var testFolder
var gFileMetadataService
function jobFinished()
function assertNotEqual(aExpected, aActual, aMessage)
function log(s)
function testFinished()
function createNewLibrary(databaseGuid, databaseLocation)
function assertTrue(aTest, aMessage)
var gLocalMediaItems
function getCopyOfFile(file, tempName, optionalLocation)
function newFileURI(file)
return null
Definition: FeedWriter.js:1143
function newURI(aURLString)
var gRemoteMediaItems
function assertObjectIsSubsetOf(mapA, mapB)
var gDefaultMetadata
const Ci
function getCopyOfFolder(folder, tempName)
Copy the given folder to tempName, returning an nsIFile for the new location.
var gTestMediaItems
function getTestServerPortNumber()
_getSelectedPageStyle s i
var gTestLibrary
function testPending()