summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Merry <alex.merry@cs.ox.ac.uk>2011-11-18 17:28:06 +0000
committerAlex Merry <alex.merry@cs.ox.ac.uk>2011-11-18 17:28:06 +0000
commit358a176bceb27886ea3e5a0ac4a039999290c7e3 (patch)
treee838be7dc9d6a4fcaaea8f6a152484e780a38bf2
parent46ca1678b12ac14a3a93353be6c17bbe89a85916 (diff)
Start working on metadata tests for tracklist
-rw-r--r--mpris2/tracklistinterfacetest.cpp214
-rw-r--r--mpris2/tracklistinterfacetest.h3
2 files changed, 34 insertions, 183 deletions
diff --git a/mpris2/tracklistinterfacetest.cpp b/mpris2/tracklistinterfacetest.cpp
index 8be1994..6b6a213 100644
--- a/mpris2/tracklistinterfacetest.cpp
+++ b/mpris2/tracklistinterfacetest.cpp
@@ -109,187 +109,6 @@ static bool compare(const QVariantMap& one, const QVariantMap& other)
return true;
}
-void TrackListInterfaceTest::checkMetadata(const QVariantMap& oldProps)
-{
- if (!props.contains("Metadata")) {
- emit interfaceError(Property, "Metadata", "Property Metadata is missing");
- return;
- }
- if (props["Metadata"].type() != QVariant::Map &&
- !props.value("Metadata").canConvert<QDBusArgument>())
- {
- const char * gotTypeCh = QDBusMetaType::typeToSignature(props["Metadata"].userType());
- QString gotType = gotTypeCh ? QString::fromAscii(gotTypeCh) : "<unknown>";
- emit interfaceError(Property, "Metadata", "Property Metadata has type " + gotType + ", but should be type a{sv}");
- return;
- }
- QVariantMap metadata;
- if (props["Metadata"].type() == QVariant::Map) {
- metadata = props["Metadata"].toMap();
- } else {
- QDBusArgument arg = props["Metadata"].value<QDBusArgument>();
- arg >> metadata;
- // replace the entry in the properties array
- props["Metadata"] = metadata;
- }
-
- if (oldProps.contains("Metadata") &&
- oldProps.value("Metadata").canConvert(QVariant::Map))
- {
- QVariantMap oldMetadata = oldProps.value("Metadata").toMap();
-
- // custom compare fn as we're expecting a QDBusObjectPath entry
- if (!compare(metadata, oldMetadata)) {
- outOfDateProperties["Metadata"] = props["Metadata"];
- props["Metadata"] = oldProps["Metadata"];
- return;
- } else {
- // same as before; don't re-run checks
- return;
- }
- }
- if (metadata.isEmpty()) {
- emit interfaceInfo(Property, "Metadata",
- "No metadata provided");
- return;
- }
-
- if (!metadata.contains("mpris:trackid")) {
- emit interfaceError(Property, "Metadata",
- "No mpris:trackid entry for the current track");
- } else if (metadata.value("mpris:trackid").userType() != qMetaTypeId<QDBusObjectPath>()) {
- emit interfaceError(Property, "Metadata",
- "mpris:trackid entry was not sent as a D-Bus object path (D-Bus type 'o')");
- } else if (metadata.value("mpris:trackid").value<QDBusObjectPath>().path().isEmpty()) {
- emit interfaceError(Property, "Metadata",
- "mpris:trackid entry is an empty path");
- }
-
- checkMetadataEntry(metadata, "mpris:length", QVariant::LongLong);
-
- if (checkMetadataEntry(metadata, "mpris:artUrl", QVariant::Url)) {
- QString artUrl = metadata.value("mpris:artUrl").toString();
- QUrl asUrl(artUrl, QUrl::StrictMode);
- if (asUrl.scheme() != "file" && asUrl.scheme() != "http" && asUrl.scheme() != "https") {
- emit interfaceInfo(Property, "Metadata",
- "mpris:artUrl has a scheme (" + asUrl.scheme() + ") which not all clients may recognise");
- } else {
- if (asUrl.scheme() == "file") {
- if (!QFile::exists(asUrl.toLocalFile())) {
- emit interfaceInfo(Property, "Metadata",
- "mpris:artUrl references a file that does not exist");
- }
- }
- // TODO: check network files
- }
- }
-
- Q_FOREACH( QString key, metadata.keys() ) {
- if (!key.startsWith("xesam:")) {
- if (key != "mpris:trackid" &&
- key != "mpris:length" &&
- key != "mpris:artUrl")
- {
- emit interfaceWarning(Property, "Metadata",
- "Unrecognised entry " + key);
- }
- }
- }
-
- checkMetadataEntry(metadata, "xesam:album", QVariant::String);
- checkMetadataEntry(metadata, "xesam:albumArtist", QVariant::StringList);
- checkMetadataEntry(metadata, "xesam:artist", QVariant::StringList);
- checkMetadataEntry(metadata, "xesam:asText", QVariant::String);
- checkMetadataEntry(metadata, "xesam:audioBpm", QVariant::Int);
- checkMetadataEntry(metadata, "xesam:autoRating", QVariant::Double);
- checkMetadataEntry(metadata, "xesam:comment", QVariant::StringList);
- checkMetadataEntry(metadata, "xesam:composer", QVariant::StringList);
- checkMetadataEntry(metadata, "xesam:contentCreator", QVariant::DateTime);
- checkMetadataEntry(metadata, "xesam:discNumber", QVariant::Int);
- checkMetadataEntry(metadata, "xesam:firstUsed", QVariant::DateTime);
- checkMetadataEntry(metadata, "xesam:genre", QVariant::StringList);
- checkMetadataEntry(metadata, "xesam:lastUsed", QVariant::DateTime);
- checkMetadataEntry(metadata, "xesam:lyricist", QVariant::StringList);
- checkMetadataEntry(metadata, "xesam:title", QVariant::String);
- checkMetadataEntry(metadata, "xesam:trackNumber", QVariant::Int);
- checkMetadataEntry(metadata, "xesam:url", QVariant::Url);
- checkMetadataEntry(metadata, "xesam:useCount", QVariant::Int);
- checkMetadataEntry(metadata, "xesam:userRating", QVariant::Double);
-}
-
-bool TrackListInterfaceTest::checkMetadataEntry(const QVariantMap& metadata, const QString& entry, QVariant::Type expType)
-{
- if (metadata.contains(entry)) {
- QVariant value = metadata.value(entry);
-
- bool propertyTypeError = false;
- bool propertyTypeWarning = false;
- QVariant::Type realExpectedType = expType;
- if (expType == QVariant::DateTime || expType == QVariant::Url) {
- realExpectedType = QVariant::String;
- }
-
- // be lax about integers
- if (realExpectedType == QVariant::Int) {
- if (value.type() == QVariant::UInt ||
- value.type() == QVariant::LongLong ||
- value.type() == QVariant::ULongLong)
- {
- propertyTypeWarning = true;
- } else if (value.type() != QVariant::Int) {
- propertyTypeError = true;
- }
- } else if (realExpectedType == QVariant::UInt || realExpectedType == QVariant::LongLong) {
- if (value.type() == QVariant::ULongLong) {
- propertyTypeWarning = true;
- } else if (value.type() != realExpectedType) {
- propertyTypeError = true;
- }
- } else if (value.type() != realExpectedType) {
- propertyTypeError = true;
- }
-
- if (propertyTypeError || propertyTypeWarning) {
- const char * gotTypeCh = QDBusMetaType::typeToSignature(value.userType());
- QString gotType = gotTypeCh ? QString::fromAscii(gotTypeCh) : "<unknown>";
- const char * expTypeCh = QDBusMetaType::typeToSignature(realExpectedType);
- QString expType = expTypeCh ? QString::fromAscii(expTypeCh) : "<unknown>";
- if (propertyTypeError) {
- emit interfaceError(Property, "Metadata",
- entry + " entry is of type '" + gotType + "' but should have been of type '" + expType + "'");
- return false;
- } else {
- emit interfaceWarning(Property, "Metadata",
- entry + " entry is of type '" + gotType + "' but should have been of type '" + expType + "'");
- return true;
- }
- }
-
- // extra checks for special types
- if (expType == QVariant::DateTime) {
- QDateTime dtValue = QDateTime::fromString(value.toString(), Qt::ISODate);
- if (!dtValue.isValid()) {
- emit interfaceError(Property, "Metadata",
- entry + " entry does not contain a valid date/time string (value was " + value.toString() + ")");
- return false;
- }
- } else if (expType == QVariant::Url) {
- if (value.toString().isEmpty()) {
- return false;
- } else {
- QUrl asUrl(value.toString(), QUrl::StrictMode);
- if (!asUrl.isValid()) {
- emit interfaceError(Property, "Metadata",
- entry + " entry is not a valid URL");
- return false;
- }
- }
- }
- return true;
- }
- return false;
-}
-
void TrackListInterfaceTest::_m_trackListReplaced(const QList<QDBusObjectPath>& trackIds, const QDBusObjectPath& currentPath)
{
}
@@ -328,6 +147,38 @@ void TrackListInterfaceTest::testNext()
QList<QVariantMap> TrackListInterfaceTest::testGetTracksMetadata(const QList<QDBusObjectPath>& trackIds)
{
+ QDBusReply<QList<QVariantMap> > reply = iface->call("GetTracksMetadata");
+ if (!reply.isValid()) {
+ emit interfaceError(Method, "GetTracksMetadata", "Call to GetTracksMetadata failed with error " + reply.error().message());
+ } else {
+ QList<QVariantMap> metadataList = reply.value();
+ QMap<QDBusObjectPath,QVariantMap> metadataMap;
+ int i = 0;
+ Q_FOREACH (const QVariantMap& metadata, metadataList) {
+ if (metadata.isEmpty()) {
+ emit interfaceWarning(Method, "GetTracksMetadata",
+ "Got an empty entry at position " + QString::number(i));
+ } else if (!metadata.contains("mpris:trackid")) {
+ emit interfaceError(Method, "GetTracksMetadata",
+ "No mpris:trackid entry at position " + QString::number(i));
+ } else if (metadata.value("mpris:trackid").userType() != qMetaTypeId<QDBusObjectPath>()) {
+ emit interfaceError(Method, "GetTracksMetadata",
+ "mpris:trackid entry was not sent as a D-Bus object path (D-Bus type 'o') at position " + QString::number(i));
+ } else {
+ QDBusObjectPath trackid = metadata.value("mpris:trackid").value<QDBusObjectPath>();
+ if (trackid.path().isEmpty()) {
+ emit interfaceError(Method, "GetTracksMetadata",
+ "mpris:trackid entry is an empty path at position " + QString::number(i));
+ } else if (!trackIds.contains(trackid)) {
+ emit interfaceWarning(Method, "GetTracksMetadata",
+ "Entry " + trackid.path() + " was not requested at position " + QString::number(i));
+ } else {
+ metadataMap.put(trackid, metadata);
+ }
+ }
+ ++i;
+ }
+ }
}
void TrackListInterfaceTest::testAddTrack(const QString& uri, const QDBusObjectPath& afterTrack, bool setAsCurrent)
@@ -342,3 +193,4 @@ void TrackListInterfaceTest::testGoTo(const QDBusObjectPath& track)
{
}
+// vim:et:sw=4:sts=4
diff --git a/mpris2/tracklistinterfacetest.h b/mpris2/tracklistinterfacetest.h
index f15a903..7090807 100644
--- a/mpris2/tracklistinterfacetest.h
+++ b/mpris2/tracklistinterfacetest.h
@@ -60,9 +60,8 @@ namespace Mpris2 {
private:
void checkTracks(const QVariantMap& oldProps = QVariantMap());
- void checkMetadata(const QVariantMap& metadata);
- bool checkMetadataEntry(const QVariantMap& metadata, const QString& entry, QVariant::Type type);
};
}
#endif // MPRIS2_TRACKLISTINTERFACETEST_H
+// vim:et:sw=4:sts=4