[Ovirt-devel] [PATCH matahari] Introduces a multiplexer for taking requests and mapping them to APIs.

Darryl L. Pierce dpierce at redhat.com
Thu May 27 20:36:11 UTC 2010


The Multiplexer lets Matahari register APIs and then call them by that
registered name. APIs are function pointers in the form of:

const char* function(const char *);

where the API takes as input a descriptor containing any arguments, and
returns an array containing the response or result.

Also adds a testing directory and unit tests to validate the
Multiplexer.

The new directory, src/tests, has its own standalone makefile that
builds the tests.

Signed-off-by: Darryl L. Pierce <dpierce at redhat.com>
---
 configure.ac                  |    3 +-
 src/Makefile.am               |    6 ++-
 src/tests/.gitignore          |    1 +
 src/tests/Makefile.am         |   13 +++++
 src/tests/testmultiplexer.cpp |  109 +++++++++++++++++++++++++++++++++++++++++
 src/tests/testmultiplexer.h   |   46 +++++++++++++++++
 src/virtio/multiplexer.cpp    |   62 +++++++++++++++++++++++
 src/virtio/multiplexer.h      |   48 ++++++++++++++++++
 8 files changed, 285 insertions(+), 3 deletions(-)
 create mode 100644 src/tests/.gitignore
 create mode 100644 src/tests/Makefile.am
 create mode 100644 src/tests/testmultiplexer.cpp
 create mode 100644 src/tests/testmultiplexer.h
 create mode 100644 src/virtio/multiplexer.cpp
 create mode 100644 src/virtio/multiplexer.h

diff --git a/configure.ac b/configure.ac
index 42d319b..3481c09 100644
--- a/configure.ac
+++ b/configure.ac
@@ -21,6 +21,7 @@ AC_HEADER_STDBOOL
 AC_TYPE_UINT32_T
 
 # Checks for libraries.
+PKG_CHECK_MODULES(CPPUNIT, cppunit >= 1.12.1)
 PKG_CHECK_MODULES(LIBVIRT, libvirt >= 0.6.2)
 PKG_CHECK_MODULES(PCRE, libpcre >= 7.8)
 PKG_CHECK_MODULES(UDEV, libudev >= 145)
@@ -28,4 +29,4 @@ PKG_CHECK_MODULES(UDEV, libudev >= 145)
 # Checks for library functions.
 AC_CHECK_FUNCS([gethostname inet_ntoa socket])
 
-AC_OUTPUT(Makefile src/Makefile)
+AC_OUTPUT(Makefile src/Makefile src/tests/Makefile)
diff --git a/src/Makefile.am b/src/Makefile.am
index 498ee72..7b5245a 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -32,7 +32,9 @@ matahari_SOURCES = \
 	qmf/hostagent.cpp \
 	qmf/hostagent.h \
 	qmf/processorsagent.cpp \
-	qmf/processorsagent.h
+	qmf/processorsagent.h \
+	virtio/multiplexer.cpp \
+	virtio/multiplexer.h
 
 $(generated_file_list): $(generated_file_list)
 
@@ -44,6 +46,6 @@ CLEANFILES = $(generated_file_list) $(first)
 
 matahari_CPPFLAGS = -fno-strict-aliasing
 matahari_LDFLAGS = -L/usr/local/lib
-matahari_LDADD = -lqmf $(LIBVIRT_LIBS) $(PCRE_LIBS) $(UDEV_LIBS)
+matahari_LDADD = -lqmf -lqpidclient -lqpidcommon $(LIBVIRT_LIBS) $(PCRE_LIBS) $(UDEV_LIBS)
 
 dist_pkgdata_DATA = schema.xml
diff --git a/src/tests/.gitignore b/src/tests/.gitignore
new file mode 100644
index 0000000..06042ff
--- /dev/null
+++ b/src/tests/.gitignore
@@ -0,0 +1 @@
+testmultiplexer
diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am
new file mode 100644
index 0000000..8573ac3
--- /dev/null
+++ b/src/tests/Makefile.am
@@ -0,0 +1,13 @@
+
+bin_PROGRAMS = testmultiplexer
+
+INCLUDES = \
+	-I$(top_srcdir)/src
+
+testmultiplexer_SOURCES = \
+	$(top_srcdir)/src/virtio/multiplexer.cpp \
+	$(top_srcdir)/src/virtio/multiplexer.h \
+	testmultiplexer.cpp \
+	testmultiplexer.h
+
+testmultiplexer_LDADD = -lcppunit
\ No newline at end of file
diff --git a/src/tests/testmultiplexer.cpp b/src/tests/testmultiplexer.cpp
new file mode 100644
index 0000000..8ed77fd
--- /dev/null
+++ b/src/tests/testmultiplexer.cpp
@@ -0,0 +1,109 @@
+/* testmultiplexer.cpp - Copyright (C) 2010 Red Hat, Inc.
+ * Written by Darryl L. Pierce <dpierce at redhat.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA  02110-1301, USA.  A copy of the GNU General Public License is
+ * also available at http://www.gnu.org/copyleft/gpl.html.
+ */
+
+#include "testmultiplexer.h"
+
+#include "virtio/multiplexer.h"
+
+#include <cppunit/TestAssert.h>
+#include <cppunit/TestCaller.h>
+#include <cppunit/TestResult.h>
+#include <cppunit/TestSuite.h>
+#include <cppunit/ui/text/TestRunner.h>
+
+const string APINAME("testapifunction");
+
+const char*
+test_callback_function(const char* input)
+{
+  return input;
+}
+
+TestMultiplexer::TestMultiplexer()
+  :TestCase("TestMultiplexer")
+{}
+
+TestSuite*
+TestMultiplexer::suite()
+{
+  CppUnit::TestSuite *result = new CppUnit::TestSuite("TestMultiplexer");
+
+  result->addTest(new CppUnit::TestCaller<TestMultiplexer>
+		  ("testBadAPINameGetsNull",
+		   &TestMultiplexer::testUnregisteredAPIIsNull));
+  result->addTest(new CppUnit::TestCaller<TestMultiplexer>
+		  ("testRegisterAPIMethod",
+		   &TestMultiplexer::testRegisterAPIMethod));
+  result->addTest(new CppUnit::TestCaller<TestMultiplexer>
+		  ("testEnsureCallingAnUnregisteredAPIFails",
+		   &TestMultiplexer::testEnsureCallingAnUnregisteredAPIFails));
+  result->addTest(new CppUnit::TestCaller<TestMultiplexer>
+		  ("testEnsureAPIIsCalled",
+		   &TestMultiplexer::testEnsureAPIIsCalled));
+
+  return result;
+}
+
+void
+TestMultiplexer::setUp()
+{
+  Multiplexer::instance()->registerAPI(APINAME, test_callback_function);
+}
+
+void
+TestMultiplexer::testUnregisteredAPIIsNull()
+{
+  CPPUNIT_ASSERT(NULL == Multiplexer::instance()->getAPI(APINAME + "!"));
+}
+
+void
+TestMultiplexer::testRegisterAPIMethod()
+{
+  t_apifunction apifunction = test_callback_function;
+
+  CPPUNIT_ASSERT(apifunction == Multiplexer::instance()->getAPI(APINAME));
+}
+
+void
+TestMultiplexer::testEnsureCallingAnUnregisteredAPIFails()
+{
+  string input  = string("This is some input");
+  string result = Multiplexer::instance()->invokeAPI(APINAME + "!", input);
+
+  CPPUNIT_ASSERT(string("") == result);
+}
+
+void TestMultiplexer::testEnsureAPIIsCalled()
+{
+  string expected = "This is what I expected";
+  string result   = Multiplexer::instance()->invokeAPI(APINAME, expected);
+
+  CPPUNIT_ASSERT(expected == result);
+}
+
+int
+main(int argc, char** argv)
+{
+  CppUnit::TextUi::TestRunner runner;
+
+  runner.addTest(TestMultiplexer::suite());
+  runner.run();
+
+  return 0;
+}
diff --git a/src/tests/testmultiplexer.h b/src/tests/testmultiplexer.h
new file mode 100644
index 0000000..04cb9e5
--- /dev/null
+++ b/src/tests/testmultiplexer.h
@@ -0,0 +1,46 @@
+#ifndef __TESTMULTIPLEXER_H
+#define __TESTMULTIPLEXER_H
+
+/* testmultiplexer.h - Copyright (C) 2010 Red Hat, Inc.
+ * Written by Darryl L. Pierce <dpierce at redhat.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA  02110-1301, USA.  A copy of the GNU General Public License is
+ * also available at http://www.gnu.org/copyleft/gpl.html.
+ */
+
+#include "virtio/multiplexer.h"
+
+#include <cppunit/TestCase.h>
+#include <cppunit/TestSuite.h>
+
+using namespace CppUnit;
+using namespace std;
+
+class TestMultiplexer : public CppUnit::TestCase
+{
+ public:
+  TestMultiplexer();
+
+  static TestSuite* suite();
+
+  void setUp();
+
+  void testUnregisteredAPIIsNull();
+  void testRegisterAPIMethod();
+  void testEnsureCallingAnUnregisteredAPIFails();
+  void testEnsureAPIIsCalled();
+};
+
+#endif
diff --git a/src/virtio/multiplexer.cpp b/src/virtio/multiplexer.cpp
new file mode 100644
index 0000000..79f8b35
--- /dev/null
+++ b/src/virtio/multiplexer.cpp
@@ -0,0 +1,62 @@
+#include "multiplexer.h"
+
+/* multiplexer.cpp - Copyright (C) 2010 Red Hat, Inc.
+ * Written by Darryl L. Pierce <dpierce at redhat.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA  02110-1301, USA.  A copy of the GNU General Public License is
+ * also available at http://www.gnu.org/copyleft/gpl.html.
+ */
+
+#include "multiplexer.h"
+
+// the singleton
+Multiplexer* Multiplexer::_instance = new Multiplexer();
+
+typedef map<string, t_apifunction> APIMAP;
+
+Multiplexer::Multiplexer()
+{}
+
+Multiplexer*
+Multiplexer::instance()
+{
+  return _instance;
+}
+
+void
+Multiplexer::registerAPI(string name, t_apifunction apifunction)
+{
+  _apis.insert(APIMAP::value_type(string(name), apifunction));
+}
+
+t_apifunction
+Multiplexer::getAPI(string name)
+{
+  return (*_apis.find(name)).second;
+}
+
+string
+Multiplexer::invokeAPI(string name, string input)
+{
+  string        result  = string("");
+  t_apifunction funcptr = (*_apis.find(name)).second;
+
+  if(funcptr)
+    {
+      result = funcptr(input.c_str());
+    }
+
+  return result;
+}
diff --git a/src/virtio/multiplexer.h b/src/virtio/multiplexer.h
new file mode 100644
index 0000000..26a288c
--- /dev/null
+++ b/src/virtio/multiplexer.h
@@ -0,0 +1,48 @@
+#ifndef __MULTIPLEXER_H
+#define __MULTIPLEXER_H
+
+/* multiplexer.h - Copyright (C) 2010 Red Hat, Inc.
+ * Written by Darryl L. Pierce <dpierce at redhat.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA  02110-1301, USA.  A copy of the GNU General Public License is
+ * also available at http://www.gnu.org/copyleft/gpl.html.
+ */
+
+#include <map>
+#include <string>
+
+using namespace std;
+
+typedef const char*(*t_apifunction)(const char*);
+
+// Multiplexer processes the content received from a remote system.
+class Multiplexer
+{
+ private:
+  Multiplexer();
+
+  static Multiplexer* _instance;
+
+  map<string, t_apifunction> _apis;
+
+ public:
+  static Multiplexer* instance();
+
+  void registerAPI(string apiname, t_apifunction apifunction);
+  t_apifunction getAPI(string apiname);
+  string invokeAPI(string apiname, string input);
+};
+
+#endif
-- 
1.7.0.1




More information about the ovirt-devel mailing list