1 /*******************************************************************************
2
3 Test for the CpuMemoryStats.
4
5 Copyright:
6 Copyright (c) 2009-2017 dunnhumby Germany GmbH.
7 All rights reserved.
8
9 License:
10 Boost Software License Version 1.0. See LICENSE_BOOST.txt for details.
11 Alternatively, this file may be distributed under the terms of the Tango
12 3-Clause BSD License (see LICENSE_BSD.txt for details).
13
14 *******************************************************************************/
15
16 module integrationtest.sysstats.main;
17
18 import ocean.meta.types.Qualifiers;
19
20 import ocean.core.Test;
21 import ocean.sys.ErrnoException;
22 import ocean.util.app.DaemonApp;
23 import ocean.io.select.client.TimerEvent;
24 import ocean.math.IEEE;
25 import ProcVFS = ocean.sys.stats.linux.ProcVFS;
26
27 class MyApp : DaemonApp
28 {
29 import ocean.io.select.EpollSelectDispatcher;
30 import ocean.sys.Stats;
31
32 private EpollSelectDispatcher epoll;
33
34 /// Instance of CpuMemoryStats
35 private CpuMemoryStats sys_stats;
36
37 this ( )
38 {
39 this.epoll = new EpollSelectDispatcher;
40
41 istring name = "Application";
42 istring desc = "Testing signal handling.";
43
44 DaemonApp.OptionalSettings settings;
45
46 this.sys_stats = new CpuMemoryStats;
47 // log first time to avoid zeroes in CPU usage in the first log
48 this.sys_stats.collect();
49
50 super(name, desc, VersionInfo.init, settings);
51 }
52
53 // Called after arguments and config file parsing.
54 override protected int run ( Arguments args, ConfigParser config )
55 {
56 this.startEventHandling(this.epoll);
57 CpuMemoryStats.Stats stats;
58
59 auto uptime = ProcVFS.getProcUptime();
60 auto timer = new TimerEvent(
61 {
62 // wait until uptime advances, clock might be slower on VMs
63 if (ProcVFS.getProcUptime().uptime == uptime.uptime)
64 return true;
65 stats = this.sys_stats.collect();
66 this.epoll.shutdown();
67
68 return false;
69 });
70
71 timer.set(0, 10, 0, 10);
72 this.epoll.register(timer);
73 this.epoll.eventLoop();
74
75 test!(">=")(stats.cpu_user, 0);
76 test!(">=")(stats.cpu_system, 0);
77 test!(">=")(stats.cpu_total, 0);
78 test!(">")(stats.vsz, 0);
79 test!(">")(stats.rss, 0);
80 test!(">=")(stats.mem_percentage, 0);
81
82 test!("==")(isInfinity(stats.cpu_user), false);
83 test!("==")(isInfinity(stats.cpu_system), false);
84 test!("==")(isInfinity(stats.cpu_total), false);
85 test!("==")(isInfinity(stats.mem_percentage), false);
86
87 test!("==")(isNaN(stats.cpu_user), false);
88 test!("==")(isNaN(stats.cpu_system), false);
89 test!("==")(isNaN(stats.cpu_total), false);
90 test!("==")(isNaN(stats.mem_percentage), false);
91
92 return 0; // return code to OS
93 }
94
95 }
96
97 import ocean.io.device.File;
98 import ocean.util.test.DirectorySandbox;
99
100 version (unittest) {} else
101 void main(istring[] args)
102 {
103 auto sandbox = DirectorySandbox.create(["etc", "log"]);
104
105 File.set("etc/config.ini", "[LOG.Root]\n" ~
106 "console = false\n");
107
108 auto app = new MyApp;
109 auto ret = app.main(args);
110 }