aboutsummaryrefslogtreecommitdiff
path: root/engines/testbed
diff options
context:
space:
mode:
authorAlexander Tkachev2016-07-18 12:42:57 +0600
committerAlexander Tkachev2016-08-24 16:07:55 +0600
commit4a0a5af52ef4a9c184f8aa49b191e78ed24b5b92 (patch)
treea3df4e21eed59bf8148855e6957ac3efa1105582 /engines/testbed
parent75fbecf616a9b3e2592cffa8000f92237db05640 (diff)
downloadscummvm-rg350-4a0a5af52ef4a9c184f8aa49b191e78ed24b5b92.tar.gz
scummvm-rg350-4a0a5af52ef4a9c184f8aa49b191e78ed24b5b92.tar.bz2
scummvm-rg350-4a0a5af52ef4a9c184f8aa49b191e78ed24b5b92.zip
TESTBED: Add first Cloud tests
Adding tests for: * Storage::info(); * Storage::listDirectory(); * Storage::createDirectory().
Diffstat (limited to 'engines/testbed')
-rw-r--r--engines/testbed/cloud.cpp284
-rw-r--r--engines/testbed/cloud.h73
-rw-r--r--engines/testbed/config-params.h12
-rw-r--r--engines/testbed/module.mk5
-rw-r--r--engines/testbed/testbed.cpp8
5 files changed, 382 insertions, 0 deletions
diff --git a/engines/testbed/cloud.cpp b/engines/testbed/cloud.cpp
new file mode 100644
index 0000000000..655e2f72bc
--- /dev/null
+++ b/engines/testbed/cloud.cpp
@@ -0,0 +1,284 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* 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; either version 2
+* of the License, or (at your option) any later version.
+*
+* 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.
+*
+*/
+
+#include "common/config-manager.h"
+#include "common/stream.h"
+#include "common/util.h"
+
+#include "testbed/cloud.h"
+#include <backends/cloud/cloudmanager.h>
+
+namespace Testbed {
+
+CloudTestSuite::CloudTestSuite() {
+ // Cloud tests depend on CloudMan.
+ // If there is no Storage connected to it, disable this test suite.
+ if (CloudMan.getCurrentStorage() == nullptr) {
+ logPrintf("WARNING! : No Storage connected to CloudMan found. Skipping Cloud tests\n");
+ Testsuite::enable(false);
+ }
+
+ addTest("UserInfo", &CloudTests::testInfo, true);
+ addTest("ListDirectory", &CloudTests::testDirectoryListing, true);
+ addTest("CreateDirectory", &CloudTests::testDirectoryCreating, true);
+}
+
+/*
+void CloudTestSuite::enable(bool flag) {
+ Testsuite::enable(ConfParams.isGameDataFound() ? flag : false);
+}
+*/
+
+///// TESTS GO HERE /////
+
+bool CloudTests::waitForCallback() {
+ const int TIMEOUT = 30;
+
+ Common::Point pt;
+ pt.x = 10; pt.y = 10;
+ Testsuite::writeOnScreen("Waiting for callback...", pt);
+
+ int left = TIMEOUT;
+ while (--left) {
+ if (ConfParams.isCloudTestCallbackCalled()) return true;
+ if (ConfParams.isCloudTestErrorCallbackCalled()) return true;
+ g_system->delayMillis(1000);
+ }
+ return false;
+}
+
+void CloudTests::infoCallback(Cloud::Storage::StorageInfoResponse response) {
+ ConfParams.setCloudTestCallbackCalled(true);
+ Testsuite::logPrintf("Info! User's ID: %s\n", response.value.uid().c_str());
+ Testsuite::logPrintf("Info! User's email: %s\n", response.value.email().c_str());
+ Testsuite::logPrintf("Info! User's name: %s\n", response.value.name().c_str());
+ Testsuite::logPrintf("Info! User's quota: %lu bytes used / %lu bytes available\n", response.value.used(), response.value.available());
+}
+
+void CloudTests::directoryListedCallback(Cloud::Storage::FileArrayResponse response) {
+ ConfParams.setCloudTestCallbackCalled(true);
+ if (response.value.size() == 0) {
+ Testsuite::logPrintf("Warning! Directory is empty!\n");
+ return;
+ }
+
+ Common::String directory, file;
+ uint32 directories = 0, files = 0;
+ for (uint32 i = 0; i < response.value.size(); ++i) {
+ if (response.value[i].isDirectory()) {
+ if (++directories == 1) directory = response.value[i].path();
+ } else {
+ if (++files == 1) file = response.value[i].name();
+ }
+ }
+
+ if (directories == 0) {
+ Testsuite::logPrintf("Info! %u files listed, first one is '%s'\n", files, file.c_str());
+ } else if (files == 0) {
+ Testsuite::logPrintf("Info! %u directories listed, first one is '%s'\n", directories, directory.c_str());
+ } else {
+ Testsuite::logPrintf("Info! %u directories and %u files listed\n", directories, files);
+ Testsuite::logPrintf("Info! First directory is '%u' and first file is '%s'\n", directory.c_str(), file.c_str());
+ }
+}
+
+void CloudTests::directoryCreatedCallback(Cloud::Storage::BoolResponse response) {
+ ConfParams.setCloudTestCallbackCalled(true);
+ if (response.value) {
+ Testsuite::logPrintf("Info! Directory created!\n");
+ } else {
+ Testsuite::logPrintf("Info! Such directory already exists!\n");
+ }
+}
+
+void CloudTests::errorCallback(Networking::ErrorResponse response) {
+ ConfParams.setCloudTestErrorCallbackCalled(true);
+ Testsuite::logPrintf("Info! Error Callback was called\n");
+ Testsuite::logPrintf("Info! code = %ld, message = %s\n", response.httpResponseCode, response.response.c_str());
+}
+
+/** This test calls Storage::info(). */
+
+TestExitStatus CloudTests::testInfo() {
+ ConfParams.setCloudTestCallbackCalled(false);
+ ConfParams.setCloudTestErrorCallbackCalled(false);
+
+ if (CloudMan.getCurrentStorage() == nullptr) {
+ Testsuite::logPrintf("Couldn't find connected Storage\n");
+ return kTestFailed;
+ }
+
+ Common::String info = Common::String::format(
+ "Welcome to the Cloud test suite!\n"
+ "We're going to use the %s cloud storage which is connected right now.\n\n"
+ "Testing Cloud Storage API info() method.\n"
+ "In this test we'll try to list user infomation.",
+ CloudMan.getCurrentStorage()->name().c_str()
+ );
+
+ if (Testsuite::handleInteractiveInput(info, "OK", "Skip", kOptionRight)) {
+ Testsuite::logPrintf("Info! Skipping test : info()\n");
+ return kTestSkipped;
+ }
+
+ if (CloudMan.info(
+ new Common::GlobalFunctionCallback<Cloud::Storage::StorageInfoResponse>(&infoCallback),
+ new Common::GlobalFunctionCallback<Networking::ErrorResponse>(&errorCallback)
+ ) == nullptr) {
+ Testsuite::logPrintf("Warning! No Request is returned!\n");
+ }
+
+ waitForCallback();
+ Testsuite::clearScreen();
+
+ if (ConfParams.isCloudTestErrorCallbackCalled()) {
+ Testsuite::logPrintf("Error callback was called\n");
+ return kTestFailed;
+ }
+
+ Testsuite::logDetailedPrintf("Info was displayed\n");
+ return kTestPassed;
+}
+
+TestExitStatus CloudTests::testDirectoryListing() {
+ ConfParams.setCloudTestCallbackCalled(false);
+ ConfParams.setCloudTestErrorCallbackCalled(false);
+
+ if (CloudMan.getCurrentStorage() == nullptr) {
+ Testsuite::logPrintf("Couldn't find connected Storage\n");
+ return kTestFailed;
+ }
+
+ Common::String info = "Testing Cloud Storage API listDirectory() method.\n"
+ "In this test we'll try to list root directory.";
+
+ if (Testsuite::handleInteractiveInput(info, "OK", "Skip", kOptionRight)) {
+ Testsuite::logPrintf("Info! Skipping test : listDirectory()\n");
+ return kTestSkipped;
+ }
+
+ if (CloudMan.listDirectory(
+ "",
+ new Common::GlobalFunctionCallback<Cloud::Storage::FileArrayResponse>(&directoryListedCallback),
+ new Common::GlobalFunctionCallback<Networking::ErrorResponse>(&errorCallback)
+ ) == nullptr) {
+ Testsuite::logPrintf("Warning! No Request is returned!\n");
+ }
+
+ waitForCallback();
+ Testsuite::clearScreen();
+
+ if (ConfParams.isCloudTestErrorCallbackCalled()) {
+ Testsuite::logPrintf("Error callback was called\n");
+ return kTestFailed;
+ }
+
+ Testsuite::logDetailedPrintf("Directory was listed\n");
+ return kTestPassed;
+}
+
+TestExitStatus CloudTests::testDirectoryCreating() {
+ ConfParams.setCloudTestCallbackCalled(false);
+ ConfParams.setCloudTestErrorCallbackCalled(false);
+
+ if (CloudMan.getCurrentStorage() == nullptr) {
+ Testsuite::logPrintf("Couldn't find connected Storage\n");
+ return kTestFailed;
+ }
+
+ Common::String info = "Testing Cloud Storage API createDirectory() method.\n"
+ "In this test we'll try to create a 'testbed' directory.";
+
+ if (Testsuite::handleInteractiveInput(info, "OK", "Skip", kOptionRight)) {
+ Testsuite::logPrintf("Info! Skipping test : createDirectory()\n");
+ return kTestSkipped;
+ }
+
+ Common::String info2 = "We'd list the root directory, create the directory and the list it again.\n"
+ "If all goes smoothly, you'd notice that there are more directories now.";
+ Testsuite::displayMessage(info2);
+
+ // list root directory
+ if (CloudMan.listDirectory(
+ "",
+ new Common::GlobalFunctionCallback<Cloud::Storage::FileArrayResponse>(&directoryListedCallback),
+ new Common::GlobalFunctionCallback<Networking::ErrorResponse>(&errorCallback)
+ ) == nullptr) {
+ Testsuite::logPrintf("Warning! No Request is returned!\n");
+ }
+
+ waitForCallback();
+ Testsuite::clearScreen();
+
+ if (ConfParams.isCloudTestErrorCallbackCalled()) {
+ Testsuite::logPrintf("Error callback was called\n");
+ return kTestFailed;
+ }
+
+ ConfParams.setCloudTestCallbackCalled(false);
+
+ // create 'testbed'
+ if (CloudMan.getCurrentStorage()->createDirectory(
+ "/testbed",
+ new Common::GlobalFunctionCallback<Cloud::Storage::BoolResponse>(&directoryCreatedCallback),
+ new Common::GlobalFunctionCallback<Networking::ErrorResponse>(&errorCallback)
+ ) == nullptr) {
+ Testsuite::logPrintf("Warning! No Request is returned!\n");
+ }
+
+ waitForCallback();
+ Testsuite::clearScreen();
+
+ if (ConfParams.isCloudTestErrorCallbackCalled()) {
+ Testsuite::logPrintf("Error callback was called\n");
+ return kTestFailed;
+ }
+
+ ConfParams.setCloudTestCallbackCalled(false);
+
+ // list it again
+ if (CloudMan.listDirectory(
+ "",
+ new Common::GlobalFunctionCallback<Cloud::Storage::FileArrayResponse>(&directoryListedCallback),
+ new Common::GlobalFunctionCallback<Networking::ErrorResponse>(&errorCallback)
+ ) == nullptr) {
+ Testsuite::logPrintf("Warning! No Request is returned!\n");
+ }
+
+ waitForCallback();
+ Testsuite::clearScreen();
+
+ if (ConfParams.isCloudTestErrorCallbackCalled()) {
+ Testsuite::logPrintf("Error callback was called\n");
+ return kTestFailed;
+ }
+
+ if (Testsuite::handleInteractiveInput("Was the CloudMan able to create a 'testbed' directory?", "Yes", "No", kOptionRight)) {
+ Testsuite::logDetailedPrintf("Error! Directory was not created!\n");
+ return kTestFailed;
+ }
+
+ Testsuite::logDetailedPrintf("Directory was created\n");
+ return kTestPassed;
+}
+
+} // End of namespace Testbed
diff --git a/engines/testbed/cloud.h b/engines/testbed/cloud.h
new file mode 100644
index 0000000000..827b231ea5
--- /dev/null
+++ b/engines/testbed/cloud.h
@@ -0,0 +1,73 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * 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; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * 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.
+ *
+ */
+
+#ifndef TESTBED_CLOUD_H
+#define TESTBED_CLOUD_H
+
+#include "testbed/testsuite.h"
+#include <backends/cloud/storage.h>
+
+// This file can be used as template for header files of other newer testsuites.
+
+namespace Testbed {
+
+namespace CloudTests {
+
+// Helper functions for Cloud tests
+
+bool waitForCallback();
+void infoCallback(Cloud::Storage::StorageInfoResponse response);
+void directoryListedCallback(Cloud::Storage::FileArrayResponse response);
+void directoryCreatedCallback(Cloud::Storage::BoolResponse response);
+void errorCallback(Networking::ErrorResponse response);
+
+TestExitStatus testInfo();
+TestExitStatus testDirectoryListing();
+TestExitStatus testDirectoryCreating();
+
+} // End of namespace CloudTests
+
+class CloudTestSuite : public Testsuite {
+public:
+ /**
+ * The constructor for the CloudTestSuite
+ * For every test to be executed one must:
+ * 1) Create a function that would invoke the test
+ * 2) Add that test to list by executing addTest()
+ *
+ * @see addTest()
+ */
+ CloudTestSuite();
+ ~CloudTestSuite() {}
+ const char *getName() const {
+ return "Cloud";
+ }
+
+ const char *getDescription() const {
+ return "CloudMan, Storage API tests";
+ }
+
+};
+
+} // End of namespace Testbed
+
+#endif // TESTBED_TEMPLATE_H
diff --git a/engines/testbed/config-params.h b/engines/testbed/config-params.h
index 89aae199b6..57fd099bf4 100644
--- a/engines/testbed/config-params.h
+++ b/engines/testbed/config-params.h
@@ -54,6 +54,10 @@ private:
*/
bool _isInteractive;
bool _isGameDataFound;
+#ifdef USE_LIBCURL
+ bool _isCloudTestCallbackCalled;
+ bool _isCloudTestErrorCallbackCalled;
+#endif
bool _rerunTests;
TestbedConfigManager *_testbedConfMan;
@@ -68,6 +72,14 @@ public:
bool isGameDataFound() { return _isGameDataFound; }
void setGameDataFound(bool status) { _isGameDataFound = status; }
+#ifdef USE_LIBCURL
+ bool isCloudTestCallbackCalled() const { return _isCloudTestCallbackCalled; }
+ void setCloudTestCallbackCalled(bool status) { _isCloudTestCallbackCalled = status; }
+
+ bool isCloudTestErrorCallbackCalled() const { return _isCloudTestErrorCallbackCalled; }
+ void setCloudTestErrorCallbackCalled(bool status) { _isCloudTestErrorCallbackCalled = status; }
+#endif
+
TestbedConfigManager *getTestbedConfigManager() { return _testbedConfMan; }
void setTestbedConfigManager(TestbedConfigManager* confMan) { _testbedConfMan = confMan; }
diff --git a/engines/testbed/module.mk b/engines/testbed/module.mk
index ce78a48bc5..3a7eb2ebfb 100644
--- a/engines/testbed/module.mk
+++ b/engines/testbed/module.mk
@@ -14,6 +14,11 @@ MODULE_OBJS := \
testbed.o \
testsuite.o
+ifdef USE_LIBCURL
+MODULE_OBJS += \
+ cloud.o
+endif
+
MODULE_DIRS += \
engines/testbed
diff --git a/engines/testbed/testbed.cpp b/engines/testbed/testbed.cpp
index 885429cafd..a2f9aad16c 100644
--- a/engines/testbed/testbed.cpp
+++ b/engines/testbed/testbed.cpp
@@ -39,6 +39,9 @@
#include "testbed/savegame.h"
#include "testbed/sound.h"
#include "testbed/testbed.h"
+#ifdef USE_LIBCURL
+#include "testbed/cloud.h"
+#endif
namespace Testbed {
@@ -134,6 +137,11 @@ TestbedEngine::TestbedEngine(OSystem *syst)
// Midi
ts = new MidiTestSuite();
_testsuiteList.push_back(ts);
+#ifdef USE_LIBCURL
+ // Cloud
+ ts = new CloudTestSuite();
+ _testsuiteList.push_back(ts);
+#endif
}
TestbedEngine::~TestbedEngine() {