summaryrefslogtreecommitdiffstats
path: root/test/src
diff options
context:
space:
mode:
authorStefan Radomski <github@mintwerk.de>2017-01-13 16:47:44 (GMT)
committerStefan Radomski <github@mintwerk.de>2017-01-13 16:47:44 (GMT)
commit4f6cbe9e7aec2b4a6c8f286f9097abfb011a6235 (patch)
tree8c023473bb342780ddf51a893d18369f1319bb5c /test/src
parent0aa0fe08dc308c94379c47d0bf9745e341cb4c81 (diff)
downloaduscxml-4f6cbe9e7aec2b4a6c8f286f9097abfb011a6235.zip
uscxml-4f6cbe9e7aec2b4a6c8f286f9097abfb011a6235.tar.gz
uscxml-4f6cbe9e7aec2b4a6c8f286f9097abfb011a6235.tar.bz2
First support for serialization and some bug fixes for DOM per data.src
Diffstat (limited to 'test/src')
-rw-r--r--test/src/test-extensions.cpp99
-rw-r--r--test/src/test-serialization.cpp147
-rw-r--r--test/src/test-url.cpp17
3 files changed, 176 insertions, 87 deletions
diff --git a/test/src/test-extensions.cpp b/test/src/test-extensions.cpp
index e3dfbb6..7686f9f 100644
--- a/test/src/test-extensions.cpp
+++ b/test/src/test-extensions.cpp
@@ -3,6 +3,7 @@
#include "uscxml/interpreter/InterpreterImpl.h"
#include "uscxml/interpreter/BasicEventQueue.h"
#include "uscxml/interpreter/BasicDelayedEventQueue.h"
+#include "uscxml/PausableDelayedEventQueue.h"
#include <event2/util.h> // for evutil_socket_t
@@ -10,6 +11,21 @@
#include <mutex>
using namespace uscxml;
+class MyPausableDelayedEventQueue;
+
+std::shared_ptr<MyPausableDelayedEventQueue> nestedDelayQueue;
+
+class MyPausableDelayedEventQueue : public PausableDelayedEventQueue {
+ MyPausableDelayedEventQueue(DelayedEventQueueCallbacks* callbacks) : PausableDelayedEventQueue(callbacks) {
+ }
+
+ std::shared_ptr<DelayedEventQueueImpl> create(DelayedEventQueueCallbacks* callbacks) {
+ // remember as nestedDelayQueue in global scope
+ nestedDelayQueue = std::shared_ptr<MyPausableDelayedEventQueue>(new MyPausableDelayedEventQueue(callbacks));
+ return nestedDelayQueue;
+ }
+};
+
// from issue 96:
// https://github.com/tklab-tud/uscxml/issues/96
@@ -45,89 +61,6 @@ static const char *customDelayedEQ =
" <final id=\"FinalShape1\"/>"
"</scxml>";
-class PausableDelayedEventQueue;
-std::shared_ptr<PausableDelayedEventQueue> nestedDelayQueue;
-
-/**
- * A DelayedEventQueue that implements pause/resume
- */
-class PausableDelayedEventQueue : public BasicDelayedEventQueue {
-public:
- PausableDelayedEventQueue(DelayedEventQueueCallbacks* callbacks) : BasicDelayedEventQueue(callbacks) {
- _pausedAt.tv_sec = 0;
- _pausedAt.tv_usec = 0;
- }
-
- std::shared_ptr<DelayedEventQueueImpl> create(DelayedEventQueueCallbacks* callbacks) {
- // remember as nestedDelayQueue in global scope
- nestedDelayQueue = std::shared_ptr<PausableDelayedEventQueue>(new PausableDelayedEventQueue(callbacks));
- return nestedDelayQueue;
- }
-
- void pause() {
- if(_pausedAt.tv_sec != 0 || _pausedAt.tv_usec != 0) {
- return; // we are already paused!
- }
-
- evutil_gettimeofday(&_pausedAt, NULL); // remember when we paused
-
- {
- // Verbatim copy of stop() without cancelAllDelayed()
- if (_isStarted) {
- _isStarted = false;
- event_base_loopbreak(_eventLoop);
- }
- if (_thread) {
- _thread->join();
- delete _thread;
- _thread = NULL;
- }
- }
-
- std::lock_guard<std::recursive_mutex> lock(_mutex);
-
- // remove all events from libevent without deleting them
- for(auto callbackData : _callbackData) {
- Event data = callbackData.second.userData;
- event_del(callbackData.second.event);
- }
- }
-
- void resume() {
- if (_pausedAt.tv_sec != 0 || _pausedAt.tv_usec != 0) {
- struct timeval now;
- struct timeval pausedFor;
-
- evutil_gettimeofday(&now, NULL);
- evutil_timersub(&now, &_pausedAt, &pausedFor);
- _pausedAt.tv_sec = 0;
- _pausedAt.tv_usec = 0;
-
- for(auto& callbackData : _callbackData) {
- // add the time we were paused to all due times
- evutil_timeradd(&callbackData.second.due, &pausedFor, &callbackData.second.due);
-
- struct timeval remain;
- evutil_timersub(&callbackData.second.due, &now, &remain);
-
-#if 0
- std::cout << "Now : " << now.tv_sec << "." << now.tv_usec << std::endl;
- std::cout << "Paused : " << pausedFor.tv_sec << "." << pausedFor.tv_usec << std::endl;
- std::cout << "Remaining: " << remain.tv_sec << "." << remain.tv_usec << std::endl;
-#endif
- assert(remain.tv_usec >= 0 && remain.tv_sec >= 0);
-
- // reenqueue with libevent
- event_add(callbackData.second.event, &remain);
- }
- }
- start();
- }
-
-protected:
- timeval _pausedAt;
-};
-
bool testPausableEventQueue() {
Interpreter interpreter = Interpreter::fromXML(customDelayedEQ, "");
diff --git a/test/src/test-serialization.cpp b/test/src/test-serialization.cpp
new file mode 100644
index 0000000..a19786e
--- /dev/null
+++ b/test/src/test-serialization.cpp
@@ -0,0 +1,147 @@
+#define protected public
+
+#include "uscxml/config.h"
+#include "uscxml/Interpreter.h"
+#include "uscxml/interpreter/InterpreterImpl.h"
+//#include "uscxml/Factory.h"
+#include "uscxml/server/HTTPServer.h"
+
+#include "uscxml/interpreter/Logging.h"
+
+#include "uscxml/plugins/invoker/dirmon/DirMonInvoker.h"
+#include <boost/algorithm/string.hpp>
+
+#ifdef _WIN32
+#include "XGetopt.h"
+#include "XGetopt.cpp"
+#endif
+
+int startedAt;
+int lastTransitionAt;
+
+//class StatusMonitor : public uscxml::InterpreterMonitor {
+class StatusMonitor : public uscxml::StateTransitionMonitor {
+ void beforeTakingTransition(uscxml::Interpreter& interpreter, const XERCESC_NS::DOMElement* transition) {
+ lastTransitionAt = time(NULL);
+ }
+
+};
+
+void printUsageAndExit() {
+ printf("test-serialization version " USCXML_VERSION " (" CMAKE_BUILD_TYPE " build - " CMAKE_COMPILER_STRING ")\n");
+ printf("Usage\n");
+ printf("\ttest-stress");
+#ifdef BUILD_AS_PLUGINS
+ printf(" [-p pluginPath]");
+#endif
+ printf(" <PATH>\n");
+ printf("\n");
+ exit(1);
+}
+
+int main(int argc, char** argv) {
+ using namespace uscxml;
+
+ if (argc < 2) {
+ printUsageAndExit();
+ }
+
+ HTTPServer::getInstance(8188, 8189);
+#ifndef _WIN32
+ opterr = 0;
+#endif
+ int option;
+ while ((option = getopt(argc, argv, "vl:p:")) != -1) {
+ switch(option) {
+ case 'p':
+ uscxml::Factory::setDefaultPluginPath(optarg);
+ break;
+ case '?':
+ break;
+ default:
+ printUsageAndExit();
+ break;
+ }
+ }
+
+ DirectoryWatch* watcher = new DirectoryWatch(argv[optind], true);
+ watcher->updateEntries(true);
+
+ std::map<std::string, struct stat> entries = watcher->getAllEntries();
+
+ StatusMonitor vm;
+ vm.copyToInvokers(true);
+
+ std::map<std::string, struct stat>::iterator entryIter = entries.begin();
+ while(entryIter != entries.end()) {
+ if (!boost::ends_with(entryIter->first, ".scxml") ||
+ entryIter->first.find("sub") != std::string::npos ||
+ entryIter->first.find("test415.scxml") != std::string::npos ||
+ entryIter->first.find("test329.scxml") != std::string::npos ||
+ entryIter->first.find("test326.scxml") != std::string::npos ||
+ entryIter->first.find("test307.scxml") != std::string::npos ||
+ entryIter->first.find("test301.scxml") != std::string::npos ||
+ entryIter->first.find("test230.scxml") != std::string::npos ||
+ entryIter->first.find("test250.scxml") != std::string::npos ||
+ entryIter->first.find("test178.scxml") != std::string::npos) {
+ entryIter++;
+ continue;
+ }
+
+ startedAt = time(NULL);
+ lastTransitionAt = time(NULL);
+
+ std::string sourceXML = std::string(argv[optind]) + PATH_SEPERATOR + entryIter->first;
+ sourceXML = "/Users/sradomski/Documents/TK/Code/uscxml/test/w3c/ecma/test557.scxml";
+
+ Interpreter interpreter = Interpreter::fromURL(sourceXML);
+ LOGD(USCXML_INFO) << "Processing " << interpreter.getImpl()->getBaseURL();
+ if (interpreter) {
+
+ interpreter.addMonitor(&vm);
+ std::string serializedState;
+
+RESTART_WITH_STATE:
+ InterpreterState state = InterpreterState::USCXML_UNDEF;
+ int now = time(NULL);
+
+ try {
+#if 1
+ if (serializedState.size() > 0) {
+ Interpreter interpreter = Interpreter::fromURL(sourceXML);
+ interpreter.deserialize(serializedState);
+ }
+#endif
+// while(state != USCXML_FINISHED && now - startedAt < 20 && now - lastTransitionAt < 2) {
+
+ while(state != USCXML_FINISHED) {
+ state = interpreter.step();
+
+#if 1
+ if (state == USCXML_MACROSTEPPED) {
+ assert(!interpreter.getImpl()->_internalQueue.dequeue(0));
+ serializedState = interpreter.serialize();
+// std::cout << serializedState << std::endl;
+ goto RESTART_WITH_STATE;
+ }
+#endif
+
+ now = time(NULL);
+ }
+ assert(interpreter.isInState("pass"));
+ } catch (ErrorEvent e) {
+ LOGD(USCXML_ERROR) << e;
+ } catch (...) {}
+ }
+ entryIter++;
+
+ // forever
+// if (entryIter == entries.end()) {
+// entryIter = entries.begin();
+// }
+ }
+
+ delete watcher;
+
+ return EXIT_SUCCESS;
+}
diff --git a/test/src/test-url.cpp b/test/src/test-url.cpp
index 51fb545..94d5c91 100644
--- a/test/src/test-url.cpp
+++ b/test/src/test-url.cpp
@@ -153,6 +153,15 @@ void testFileURLs() {
void testData() {
{
+ Data data;
+ std::string key = "//state[@id=\"s0\"]/onentry[1]/send[1]";
+ data[key] = Data("fooo");
+ std::string json = data.asJSON();
+ data = Data::fromJSON(json);
+ assert(data.hasKey(key));
+ }
+
+ {
Data data = Data::fromJSON("{\"shiftKey\":false,\"toElement\":{\"id\":\"\",\"localName\":\"body\"},\"clientY\":38,\"y\":38,\"x\":66,\"ctrlKey\":false,\"relatedTarget\":{\"id\":\"\",\"localName\":\"body\"},\"clientX\":66,\"screenY\":288,\"metaKey\":false,\"offsetX\":58,\"altKey\":false,\"offsetY\":30,\"fromElement\":{\"id\":\"foo\",\"localName\":\"div\"},\"screenX\":-1691,\"dataTransfer\":null,\"button\":0,\"pageY\":38,\"layerY\":38,\"pageX\":66,\"charCode\":0,\"which\":0,\"keyCode\":0,\"detail\":0,\"layerX\":66,\"returnValue\":true,\"timeStamp\":1371223991895,\"eventPhase\":2,\"target\":{\"id\":\"foo\",\"localName\":\"div\"},\"defaultPrevented\":false,\"srcElement\":{\"id\":\"foo\",\"localName\":\"div\"},\"type\":\"mouseout\",\"cancelable\":true,\"currentTarget\":{\"id\":\"foo\",\"localName\":\"div\"},\"bubbles\":true,\"cancelBubble\":false}");
std::cout << data << std::endl;
}
@@ -266,11 +275,11 @@ int main(int argc, char** argv) {
HTTPServer::getInstance(8199, 8200);
try {
- testPaths();
- testFileURLs();
- testHTTPURLs();
+// testPaths();
+// testFileURLs();
+// testHTTPURLs();
testData();
- testServlets();
+// testServlets();
} catch (Event e) {
LOGD(USCXML_ERROR) << e;
exit(EXIT_FAILURE);