Effect factory: Test that the xml is correctly parsed

Compare the dump after parsing with the reference dump.

Test: This is it
Bug: 37492580

Change-Id: I7dbbe2754f182a0f5818bdf9010d89ac6f0498e2
Signed-off-by: Kevin Rocard <krocard@google.com>
diff --git a/media/libeffects/factory/Android.bp b/media/libeffects/factory/Android.bp
index 9c6b5b6..21be587 100644
--- a/media/libeffects/factory/Android.bp
+++ b/media/libeffects/factory/Android.bp
@@ -31,3 +31,24 @@
     header_libs: ["libeffects_headers"],
     export_header_lib_headers: ["libeffects_headers"],
 }
+
+cc_binary {
+    name: "dumpEffectConfigFile",
+    vendor: true,
+    srcs: ["test/DumpConfig.cpp"],
+
+    compile_multilib: "32",
+
+    cflags: [
+        "-Wall",
+        "-Wextra",
+        "-Werror",
+    ],
+
+
+    shared_libs: [
+        "libeffectsconfig",
+        "libeffects",
+    ],
+    local_include_dirs:[".", "include"],
+}
diff --git a/media/libeffects/factory/EffectsConfigLoader.c b/media/libeffects/factory/EffectsConfigLoader.c
index c9b0337..5c973b4 100644
--- a/media/libeffects/factory/EffectsConfigLoader.c
+++ b/media/libeffects/factory/EffectsConfigLoader.c
@@ -44,7 +44,7 @@
 
 static lib_entry_t *gCachedLibrary;  // last library accessed by getLibrary()
 
-int loadEffectConfig()
+int EffectLoadEffectConfig()
 {
     if (access(AUDIO_EFFECT_VENDOR_CONFIG_FILE, R_OK) == 0) {
         return loadEffectConfigFile(AUDIO_EFFECT_VENDOR_CONFIG_FILE);
diff --git a/media/libeffects/factory/EffectsConfigLoader.h b/media/libeffects/factory/EffectsConfigLoader.h
index 1dbf638..3f82609 100644
--- a/media/libeffects/factory/EffectsConfigLoader.h
+++ b/media/libeffects/factory/EffectsConfigLoader.h
@@ -17,6 +17,7 @@
 #ifndef ANDROID_EFFECTSCONFIGLOADER_H
 #define ANDROID_EFFECTSCONFIGLOADER_H
 
+#include <cutils/compiler.h>
 #include "EffectsFactoryState.h"
 
 #ifdef  __cplusplus
@@ -26,7 +27,8 @@
 
 /** Parses the platform effect configuration
  * and stores its content in the global EffectFactoryState. */
-int loadEffectConfig();
+ANDROID_API
+int EffectLoadEffectConfig();
 
 
 #ifdef  __cplusplus
diff --git a/media/libeffects/factory/EffectsFactory.c b/media/libeffects/factory/EffectsFactory.c
index a2fdcc5..f5a9acd 100644
--- a/media/libeffects/factory/EffectsFactory.c
+++ b/media/libeffects/factory/EffectsFactory.c
@@ -27,8 +27,8 @@
 #include <media/EffectsFactoryApi.h>
 
 #include "EffectsConfigLoader.h"
-#include "EffectsXmlConfigLoader.h"
 #include "EffectsFactoryState.h"
+#include "EffectsXmlConfigLoader.h"
 
 #include "EffectsFactory.h"
 
@@ -437,10 +437,10 @@
     if (ignoreFxConfFiles) {
         ALOGI("Audio effects in configuration files will be ignored");
     } else {
-        ssize_t loadResult = loadXmlEffectConfig(NULL);
+        ssize_t loadResult = EffectLoadXmlEffectConfig(NULL);
         if (loadResult < 0) {
             ALOGW("Failed to load XML effect configuration, fallback to .conf");
-            loadEffectConfig();
+            EffectLoadEffectConfig();
         } else if (loadResult > 0) {
             ALOGE("Effect config is partially invalid, skipped %zd elements", loadResult);
         }
diff --git a/media/libeffects/factory/EffectsXmlConfigLoader.cpp b/media/libeffects/factory/EffectsXmlConfigLoader.cpp
index 6b12571..42e00f8 100644
--- a/media/libeffects/factory/EffectsXmlConfigLoader.cpp
+++ b/media/libeffects/factory/EffectsXmlConfigLoader.cpp
@@ -313,7 +313,7 @@
 //      Interface function
 /////////////////////////////////////////////////
 
-extern "C" ssize_t loadXmlEffectConfig(const char* path)
+extern "C" ssize_t EffectLoadXmlEffectConfig(const char* path)
 {
     using effectsConfig::parse;
     auto result = path ? parse(path) : parse();
diff --git a/media/libeffects/factory/EffectsXmlConfigLoader.h b/media/libeffects/factory/EffectsXmlConfigLoader.h
index 9bf4d18..a3fe9a3 100644
--- a/media/libeffects/factory/EffectsXmlConfigLoader.h
+++ b/media/libeffects/factory/EffectsXmlConfigLoader.h
@@ -19,6 +19,10 @@
 
 #include <unistd.h>
 
+#include <cutils/compiler.h>
+
+#include "EffectsFactoryState.h"
+
 #if __cplusplus
 extern "C" {
 #endif
@@ -28,8 +32,10 @@
  * @return -1 on unrecoverable error (eg: no configuration file)
  *         0 on success
  *         the number of invalid elements (lib & effect) skipped if the config is partially invalid
+ * @note this function is exported for test purpose only. Do not call from outside this library.
  */
-ssize_t loadXmlEffectConfig(const char* path);
+ANDROID_API
+ssize_t EffectLoadXmlEffectConfig(const char* path);
 
 #if __cplusplus
 } // extern "C"
diff --git a/media/libeffects/factory/test/DumpConfig.cpp b/media/libeffects/factory/test/DumpConfig.cpp
new file mode 100644
index 0000000..0a156b4
--- /dev/null
+++ b/media/libeffects/factory/test/DumpConfig.cpp
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <media/EffectsFactoryApi.h>
+#include <unistd.h>
+#include "EffectsXmlConfigLoader.h"
+#include "EffectsConfigLoader.h"
+
+int main(int argc, char* argv[]) {
+    const char* path = nullptr;
+    bool legacyFormat;
+
+    if (argc == 2 && strcmp(argv[1], "--legacy") == 0) {
+        legacyFormat = true;
+        fprintf(stderr, "Dumping legacy effect config file\n");
+    } else if ((argc == 2 || argc == 3) && strcmp(argv[1], "--xml") == 0) {
+        legacyFormat = false;
+        if (argc == 3) {
+            fprintf(stderr, "Dumping XML effect config file: %s\n", path);
+        } else {
+            fprintf(stderr, "Dumping default XML effect config file.\n");
+        }
+    } else {
+        fprintf(stderr, "Invalid arguments.\n"
+                        "Usage: %s [--legacy|--xml [FILE]]\n", argv[0]);
+        return 1;
+    }
+
+    if (!legacyFormat) {
+        ssize_t ret = EffectLoadXmlEffectConfig(path);
+        if (ret < 0) {
+            fprintf(stderr, "loadXmlEffectConfig failed, see logcat for detail.\n");
+            return 2;
+        }
+        if (ret > 0) {
+            fprintf(stderr, "Partially failed to load config. Skipped %zu elements, "
+                    "see logcat for detail.\n", (size_t)ret);
+        }
+    }
+
+    if (legacyFormat) {
+        auto ret = EffectLoadEffectConfig();
+        if (ret < 0) {
+            fprintf(stderr, "loadEffectConfig failed, see logcat for detail.\n");
+            return 3;
+        }
+        fprintf(stderr, "legacy loadEffectConfig has probably succeed, see logcat to make sure.\n");
+    }
+
+    if (EffectDumpEffects(STDOUT_FILENO) != 0) {
+        fprintf(stderr, "Effect dump failed, see logcat for detail.\n");
+        return 4;
+    }
+}