From 7c98e0430d14c6182f9543e9f01aa64ce8caa97a Mon Sep 17 00:00:00 2001
From: Skylar Kelty <S.Kelty@kent.ac.uk>
Date: Thu, 10 Jul 2014 09:45:41 +0100
Subject: [PATCH] MDL-46138: Resolve issue preventing adhoc tasks with objects
 for custom data being created

---
 lib/classes/task/adhoc_task.php |  4 ++--
 lib/classes/task/manager.php    |  4 ++--
 lib/tests/adhoc_task_test.php   | 19 +++++++++++++++++++
 3 files changed, 23 insertions(+), 4 deletions(-)

diff --git a/lib/classes/task/adhoc_task.php b/lib/classes/task/adhoc_task.php
index 916b92b..ab0a1ba 100644
--- a/lib/classes/task/adhoc_task.php
+++ b/lib/classes/task/adhoc_task.php
@@ -61,7 +61,7 @@ abstract class adhoc_task extends task_base {
      * @param mixed $customdata (anything that can be handled by json_encode)
      */
     public function set_custom_data($customdata) {
-        $this->customdata = json_encode($customdata);
+        $this->customdata = $customdata;
     }
 
     /**
@@ -69,7 +69,7 @@ abstract class adhoc_task extends task_base {
      * @return mixed (anything that can be handled by json_decode).
      */
     public function get_custom_data() {
-        return json_decode($this->customdata);
+        return $this->customdata;
     }
 
 }
diff --git a/lib/classes/task/manager.php b/lib/classes/task/manager.php
index be60ee2..70c7344 100644
--- a/lib/classes/task/manager.php
+++ b/lib/classes/task/manager.php
@@ -220,7 +220,7 @@ class manager {
         $record->blocking = $task->is_blocking();
         $record->nextruntime = $task->get_next_run_time();
         $record->faildelay = $task->get_fail_delay();
-        $record->customdata = $task->get_custom_data();
+        $record->customdata = json_encode($task->get_custom_data());
 
         return $record;
     }
@@ -254,7 +254,7 @@ class manager {
             $task->set_fail_delay($record->faildelay);
         }
         if (isset($record->customdata)) {
-            $task->set_custom_data($record->customdata);
+            $task->set_custom_data(json_decode($record->customdata));
         }
 
         return $task;
diff --git a/lib/tests/adhoc_task_test.php b/lib/tests/adhoc_task_test.php
index 174e54c..9388ca5 100644
--- a/lib/tests/adhoc_task_test.php
+++ b/lib/tests/adhoc_task_test.php
@@ -67,4 +67,23 @@ class core_adhoc_task_testcase extends advanced_testcase {
         $task = \core\task\manager::get_next_adhoc_task($now);
         $this->assertNull($task);
     }
+
+    public function test_create_adhoc_task() {
+        $this->resetAfterTest(true);
+
+        // Create an adhoc task.
+        $task = new \core\task\adhoc_test_task();
+        $task->set_custom_data(array(
+            'test' => 'Test Value',
+            'anothertest' => 'Also a test value'
+        ));
+
+        // Check the record can be inserted.
+        $record = \core\task\manager::record_from_adhoc_task($task);
+        $this->assertFalse(is_object($record->customdata));
+
+        // Try inserting it.
+        $result = \core\task\manager::queue_adhoc_task($task);
+        $this->assertEquals(1, $result);
+    }
 }
-- 
1.9.1

