1 /*******************************************************************************
2
3 Copyright:
4 Copyright (c) 2017 dunnhumby Germany GmbH.
5 All rights reserved.
6
7 License:
8 Boost Software License Version 1.0. See LICENSE_BOOST.txt for details.
9 Alternatively, this file may be distributed under the terms of the Tango
10 3-Clause BSD License (see LICENSE_BSD.txt for details).
11
12 *******************************************************************************/
13
14 module ocean.task.util.TaskPoolSerializer_test;
15
16 import ocean.task.util.TaskPoolSerializer;
17
18 import ocean.core.Test;
19 import ocean.io.Stdout;
20 import ocean.io.device.MemoryDevice;
21 import ocean.task.Scheduler;
22 import ocean.task.Task;
23 import ocean.task.TaskPool;
24 import ocean.task.util.Timer;
25 import ocean.util.serialize.contiguous.Contiguous;
26 import ocean.util.serialize.contiguous.Deserializer;
27 import ocean.util.serialize.contiguous.Serializer;
28 import Util = ocean.util.serialize.contiguous.Util;
29
30 unittest
31 {
32 static struct TaskArgs
33 {
34 int i;
35 }
36
37 static class TestTask : Task
38 {
39 static int result;
40
41 public Contiguous!(TaskArgs) args;
42
43 override public void run ( )
44 {
45 wait(1);
46 result += args.ptr.i;
47 }
48
49 public void copyArguments( TaskArgs data )
50 {
51 Util.copy(data, this.args);
52 }
53
54 public void serialize ( ref void[] buffer )
55 {
56 Serializer.serialize(*this.args.ptr, buffer);
57 }
58
59 public void deserialize ( void[] buffer )
60 {
61 Deserializer.deserialize(buffer, this.args);
62 }
63 }
64
65 initScheduler(SchedulerConfiguration.init);
66 TaskPoolSerializer serializer = new TaskPoolSerializer();
67
68 auto pool = new TaskPool!(TestTask);
69 pool.start(TaskArgs(1));
70 pool.start(TaskArgs(2));
71 pool.start(TaskArgs(3));
72 pool.start(TaskArgs(4));
73 pool.start(TaskArgs(5));
74
75 auto storage = new MemoryDevice;
76 serializer.dump(pool, storage);
77
78 //Run the event loop and reset the pool and result so we have a clean slate.
79 theScheduler.eventLoop();
80 TestTask.result = 0;
81 pool.clear();
82
83 storage.seek(0);
84 size_t items = serializer.load(pool, storage);
85 theScheduler.eventLoop();
86
87 test!("==")(items, 5, "Incorrect number of items loaded");
88 test!("==")(TestTask.result, 15, "Wrong result for restored tasks.");
89 }