hidl_test: move duplicated code to shared lib

Test: hidl_test

Change-Id: Ia68b78d44d68a6b254c686afe64faf7cc89510d7
diff --git a/tests/foo/1.0/default/Android.bp b/tests/foo/1.0/default/Android.bp
index 90295a9..185e5ea 100644
--- a/tests/foo/1.0/default/Android.bp
+++ b/tests/foo/1.0/default/Android.bp
@@ -11,6 +11,7 @@
     shared_libs: [
         "libbase",
         "libhidl",
+        "libfootest",
         "libhwbinder",
         "liblog",
         "libutils",
diff --git a/tests/foo/1.0/default/Foo.cpp b/tests/foo/1.0/default/Foo.cpp
index cadb151..235a12d 100644
--- a/tests/foo/1.0/default/Foo.cpp
+++ b/tests/foo/1.0/default/Foo.cpp
@@ -4,6 +4,7 @@
 #include "Foo.h"
 #include "FooCallback.h"
 #include <android-base/logging.h>
+#include <hidl-test/FooHelper.h>
 #include <inttypes.h>
 #include <utils/Timers.h>
 
@@ -108,7 +109,7 @@
 
         ALOGI("SERVER(Foo) callMe %p calling IFooCallback::heyItsYouIsntIt, " \
               "should block for %" PRId64 " seconds", cb.get(),
-              FooCallback::DELAY_S);
+              DELAY_S);
         c[1] = systemTime();
         bool answer = cb->heyItsYouIsntIt(cb);
         c[1] = systemTime() - c[1];
@@ -201,74 +202,6 @@
     return Void();
 }
 
-// NOTE: duplicated code in hidl_test
-using std::to_string;
-
-static std::string to_string(const IFoo::StringMatrix5x3 &M);
-static std::string to_string(const IFoo::StringMatrix3x5 &M);
-static std::string to_string(const hidl_string &s);
-
-template<typename T>
-static std::string to_string(const T *elems, size_t n) {
-    std::string out;
-    out = "[";
-    for (size_t i = 0; i < n; ++i) {
-        if (i > 0) {
-            out += ", ";
-        }
-        out += to_string(elems[i]);
-    }
-    out += "]";
-
-    return out;
-}
-
-template<typename T, size_t SIZE>
-static std::string to_string(const hidl_array<T, SIZE> &array) {
-    return to_string(&array[0], SIZE);
-}
-
-template<typename T, size_t SIZE1, size_t SIZE2>
-static std::string to_string(const hidl_array<T, SIZE1, SIZE2> &array) {
-    std::string out;
-    out = "[";
-    for (size_t i = 0; i < SIZE1; ++i) {
-        if (i > 0) {
-            out += ", ";
-        }
-
-        out += "[";
-        for (size_t j = 0; j < SIZE2; ++j) {
-            if (j > 0) {
-                out += ", ";
-            }
-
-            out += to_string(array[i][j]);
-        }
-        out += "]";
-    }
-    out += "]";
-
-    return out;
-}
-
-template<typename T>
-static std::string to_string(const hidl_vec<T> &vec) {
-    return to_string(&vec[0], vec.size());
-}
-
-static std::string to_string(const IFoo::StringMatrix5x3 &M) {
-    return to_string(M.s);
-}
-
-static std::string to_string(const IFoo::StringMatrix3x5 &M) {
-    return to_string(M.s);
-}
-
-static std::string to_string(const hidl_string &s) {
-    return std::string("'") + s.c_str() + "'";
-}
-
 Return<void> Foo::transposeMe(
         const hidl_array<float, 3, 5> &in, transposeMe_cb _cb) {
     ALOGI("SERVER(Foo) transposeMe(%s)", to_string(in).c_str());
@@ -286,48 +219,6 @@
 
     return Void();
 }
-// end duplicated code
-
-static std::string QuuxToString(const IFoo::Quux &val) {
-    std::string s;
-
-    s = "Quux(first='";
-    s += val.first.c_str();
-    s += "', last='";
-    s += val.last.c_str();
-    s += "')";
-
-    return s;
-}
-
-static std::string MultiDimensionalToString(const IFoo::MultiDimensional &val) {
-    std::string s;
-
-    s += "MultiDimensional(";
-
-    s += "quuxMatrix=[";
-
-    size_t k = 0;
-    for (size_t i = 0; i < 5; ++i) {
-        if (i > 0) {
-            s += ", ";
-        }
-
-        s += "[";
-        for (size_t j = 0; j < 3; ++j, ++k) {
-            if (j > 0) {
-                s += ", ";
-            }
-
-            s += QuuxToString(val.quuxMatrix[i][j]);
-        }
-    }
-    s += "]";
-
-    s += ")";
-
-    return s;
-}
 
 Return<void> Foo::callingDrWho(
         const MultiDimensional &in, callingDrWho_cb _hidl_cb) {
diff --git a/tests/foo/1.0/default/FooCallback.cpp b/tests/foo/1.0/default/FooCallback.cpp
index d3eef77..e4704f2 100644
--- a/tests/foo/1.0/default/FooCallback.cpp
+++ b/tests/foo/1.0/default/FooCallback.cpp
@@ -3,7 +3,9 @@
 
 #include "FooCallback.h"
 #include <android-base/logging.h>
+#include <hidl-test/FooHelper.h>
 #include <inttypes.h>
+#include <utils/Timers.h>
 
 namespace android {
 namespace hardware {
diff --git a/tests/foo/1.0/default/FooCallback.h b/tests/foo/1.0/default/FooCallback.h
index 5921972..00233b5 100644
--- a/tests/foo/1.0/default/FooCallback.h
+++ b/tests/foo/1.0/default/FooCallback.h
@@ -6,7 +6,6 @@
 #include <hidl/MQDescriptor.h>
 
 #include <utils/Condition.h>
-#include <utils/Timers.h>
 namespace android {
 namespace hardware {
 namespace tests {
@@ -30,11 +29,6 @@
     Return<void> reportResults(int64_t ns, reportResults_cb _hidl_cb)  override;
     Return<void> youBlockedMeFor(const hidl_array<int64_t, 3 /* 3 */>& callerBlockedInfo)  override;
 
-    static constexpr nsecs_t DELAY_S = 1;
-    static constexpr nsecs_t DELAY_NS = seconds_to_nanoseconds(DELAY_S);
-    static constexpr nsecs_t TOLERANCE_NS = milliseconds_to_nanoseconds(10);
-    static constexpr nsecs_t ONEWAY_TOLERANCE_NS = milliseconds_to_nanoseconds(1);
-
     hidl_array<InvokeInfo, 3> invokeInfo;
     Mutex mLock;
     Condition mCond;
diff --git a/tests/foo/1.0/default/lib/Android.bp b/tests/foo/1.0/default/lib/Android.bp
new file mode 100644
index 0000000..c7ad57e
--- /dev/null
+++ b/tests/foo/1.0/default/lib/Android.bp
@@ -0,0 +1,15 @@
+cc_library_shared {
+    name: "libfootest",
+    srcs: [
+        "FooHelper.cpp"
+    ],
+
+    shared_libs: [
+        "libhidl",
+        "libhwbinder",
+        "android.hardware.tests.foo@1.0",
+    ],
+    local_include_dirs: ["include/hidl-test"],
+    export_include_dirs: ["include"],
+
+}
diff --git a/tests/foo/1.0/default/lib/FooHelper.cpp b/tests/foo/1.0/default/lib/FooHelper.cpp
new file mode 100644
index 0000000..8c5ff94
--- /dev/null
+++ b/tests/foo/1.0/default/lib/FooHelper.cpp
@@ -0,0 +1,57 @@
+#include "FooHelper.h"
+
+namespace android {
+
+std::string to_string(const IFoo::StringMatrix5x3 &M) {
+    return to_string(M.s);
+}
+
+std::string to_string(const IFoo::StringMatrix3x5 &M) {
+    return to_string(M.s);
+}
+
+std::string to_string(const hidl_string &s) {
+    return std::string("'") + s.c_str() + "'";
+}
+
+std::string QuuxToString(const IFoo::Quux &val) {
+    std::string s;
+
+    s = "Quux(first='";
+    s += val.first.c_str();
+    s += "', last='";
+    s += val.last.c_str();
+    s += "')";
+
+    return s;
+}
+
+std::string MultiDimensionalToString(const IFoo::MultiDimensional &val) {
+    std::string s;
+
+    s += "MultiDimensional(";
+
+    s += "quuxMatrix=[";
+
+    size_t k = 0;
+    for (size_t i = 0; i < 5; ++i) {
+        if (i > 0) {
+            s += ", ";
+        }
+
+        s += "[";
+        for (size_t j = 0; j < 3; ++j, ++k) {
+            if (j > 0) {
+                s += ", ";
+            }
+
+            s += QuuxToString(val.quuxMatrix[i][j]);
+        }
+    }
+    s += "]";
+
+    s += ")";
+
+    return s;
+}
+} // namespace android
diff --git a/tests/foo/1.0/default/lib/include/hidl-test/FooHelper.h b/tests/foo/1.0/default/lib/include/hidl-test/FooHelper.h
new file mode 100644
index 0000000..09b0557
--- /dev/null
+++ b/tests/foo/1.0/default/lib/include/hidl-test/FooHelper.h
@@ -0,0 +1,79 @@
+#ifndef ANDROID_HIDL_TEST_FOO_HELPER_H
+#define ANDROID_HIDL_TEST_FOO_HELPER_H
+#include <string>
+#include <android/hardware/tests/foo/1.0/IFoo.h>
+#include <utils/Timers.h>
+
+namespace android {
+
+using std::to_string;
+using hardware::hidl_string;
+using hardware::hidl_vec;
+using hardware::hidl_array;
+using hardware::tests::foo::V1_0::IFoo;
+
+static constexpr nsecs_t DELAY_S = 1;
+static constexpr nsecs_t DELAY_NS = seconds_to_nanoseconds(DELAY_S);
+static constexpr nsecs_t TOLERANCE_NS = milliseconds_to_nanoseconds(10);
+static constexpr nsecs_t ONEWAY_TOLERANCE_NS = milliseconds_to_nanoseconds(1);
+
+std::string to_string(const IFoo::StringMatrix5x3 &M);
+std::string to_string(const IFoo::StringMatrix3x5 &M);
+// Add quotes around s. For testing purposes only.
+std::string to_string(const hidl_string &s);
+
+template<typename T>
+std::string to_string(const T *elems, size_t n) {
+    std::string out;
+    out = "[";
+    for (size_t i = 0; i < n; ++i) {
+        if (i > 0) {
+            out += ", ";
+        }
+        out += to_string(elems[i]);
+    }
+    out += "]";
+
+    return out;
+}
+
+template<typename T, size_t SIZE>
+std::string to_string(const hidl_array<T, SIZE> &array) {
+    return to_string(&array[0], SIZE);
+}
+
+template<typename T, size_t SIZE1, size_t SIZE2>
+std::string to_string(const hidl_array<T, SIZE1, SIZE2> &array) {
+    std::string out;
+    out = "[";
+    for (size_t i = 0; i < SIZE1; ++i) {
+        if (i > 0) {
+            out += ", ";
+        }
+
+        out += "[";
+        for (size_t j = 0; j < SIZE2; ++j) {
+            if (j > 0) {
+                out += ", ";
+            }
+
+            out += to_string(array[i][j]);
+        }
+        out += "]";
+    }
+    out += "]";
+
+    return out;
+}
+
+template<typename T>
+std::string to_string(const hidl_vec<T> &vec) {
+    return to_string(&vec[0], vec.size());
+}
+
+std::string QuuxToString(const IFoo::Quux &val);
+
+std::string MultiDimensionalToString(const IFoo::MultiDimensional &val);
+
+} // namespace android
+#endif // ANDROID_HIDL_TEST_TEST_HELPER_H