From e157e67c0d5406033969cebf43fe6593c362920b Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Tue, 13 Aug 2019 18:44:07 +0200
Subject: [PATCH] handle crash on plugin unload

---
 frontend-js/src/main/js/plugin/Plugin.js      |  6 +++++
 frontend-js/src/test/js/plugin/Plugin-test.js | 12 ++++++++++
 ...ster.js&version=0.0.1&token=MOCK_TOKEN_ID& |  8 +++++++
 .../plugin-invalid/crash-unregister.js        | 23 +++++++++++++++++++
 4 files changed, 49 insertions(+)
 create mode 100644 frontend-js/testFiles/apiCalls/plugins/POST_hash=dac1c83fdedde144a3c09424f88c9804&isPublic=false&name=high%20test&url=.%2FtestFiles%2Fplugin-invalid%2Fcrash-unregister.js&version=0.0.1&token=MOCK_TOKEN_ID&
 create mode 100644 frontend-js/testFiles/plugin-invalid/crash-unregister.js

diff --git a/frontend-js/src/main/js/plugin/Plugin.js b/frontend-js/src/main/js/plugin/Plugin.js
index e1c97d61db..1a7fe201a5 100644
--- a/frontend-js/src/main/js/plugin/Plugin.js
+++ b/frontend-js/src/main/js/plugin/Plugin.js
@@ -7,6 +7,7 @@ var Promise = require("bluebird");
 
 var logger = require('../logger');
 var Functions = require('../Functions');
+var GuiConnector = require('../GuiConnector');
 var PluginData = require('../map/data/PluginData');
 
 var pluginId = 0;
@@ -226,6 +227,11 @@ Plugin.prototype.unload = function () {
     if (validPlugin) {
       return self.getLoadedPluginData().unregister();
     }
+  }).catch(function (e) {
+    GuiConnector.warn("Plugin crashed on upload.");
+    if (typeof self.getLoadedPluginData().notifyError === "function") {
+      self.getLoadedPluginData().notifyError({error: error});
+    }
   }).then(function () {
     if (validPlugin) {
       var removedListeners = self.getMinervaPluginProxy().project.map.removeAllListeners();
diff --git a/frontend-js/src/test/js/plugin/Plugin-test.js b/frontend-js/src/test/js/plugin/Plugin-test.js
index 9c754a212c..527ed43eb0 100644
--- a/frontend-js/src/test/js/plugin/Plugin-test.js
+++ b/frontend-js/src/test/js/plugin/Plugin-test.js
@@ -110,6 +110,18 @@ describe('Plugin', function () {
         assert.equal(1, logger.getWarnings().length);
       });
     });
+    it('plugin crashed during unload', function () {
+      var map = helper.createCustomMap();
+      helper.createSearchDbOverlay(map);
+
+      var plugin = createPlugin("./testFiles/plugin-invalid/crash-unregister.js", map);
+      return plugin.load().then(function () {
+        assert.equal(0, logger.getWarnings().length);
+        return plugin.unload();
+      }).then(function () {
+        assert.equal(2, logger.getWarnings().length);
+      });
+    });
   });
   it('plugin listener crash', function () {
     var map = helper.createCustomMap();
diff --git a/frontend-js/testFiles/apiCalls/plugins/POST_hash=dac1c83fdedde144a3c09424f88c9804&isPublic=false&name=high%20test&url=.%2FtestFiles%2Fplugin-invalid%2Fcrash-unregister.js&version=0.0.1&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/plugins/POST_hash=dac1c83fdedde144a3c09424f88c9804&isPublic=false&name=high%20test&url=.%2FtestFiles%2Fplugin-invalid%2Fcrash-unregister.js&version=0.0.1&token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000..f7a0f04fa8
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/plugins/POST_hash=dac1c83fdedde144a3c09424f88c9804&isPublic=false&name=high%20test&url=.%2FtestFiles%2Fplugin-invalid%2Fcrash-unregister.js&version=0.0.1&token=MOCK_TOKEN_ID&
@@ -0,0 +1,8 @@
+{
+    "hash": "dac1c83fdedde144a3c09424f88c9804",
+    "name": "test plugin",
+    "urls": [
+        "./testFiles/plugin-invalid/crash-unregister.js"
+    ],
+    "version": "0.0.1"
+}
\ No newline at end of file
diff --git a/frontend-js/testFiles/plugin-invalid/crash-unregister.js b/frontend-js/testFiles/plugin-invalid/crash-unregister.js
new file mode 100644
index 0000000000..602ee8f112
--- /dev/null
+++ b/frontend-js/testFiles/plugin-invalid/crash-unregister.js
@@ -0,0 +1,23 @@
+minervaDefine(function () {
+  return {
+    register: function (minervaObject) {
+      var options = {
+        dbOverlayName: "search",
+        type: "onSearch",
+        callback: function (elements) {
+          console.log("hi there");
+        }
+      };
+      minervaObject.project.map.addListener(options);
+    },
+    unregister: function () {
+      throw new Error("ups")
+    },
+    getName: function () {
+      return "high test";
+    },
+    getVersion: function () {
+      return "0.0.1";
+    }
+  };
+});
\ No newline at end of file
-- 
GitLab