[libvirt] [PATCHv3 2/4] Add test for linuxNodeGetCPUStats

Ján Tomko jtomko at redhat.com
Wed Jan 22 13:37:48 UTC 2014


Check if cpu stats are read correctly from a sample
/proc/stat collected from a 24 CPU machine.
---
 src/libvirt_linux.syms                      |   1 +
 src/nodeinfo.c                              |   2 +-
 src/nodeinfopriv.h                          |   5 +
 tests/nodeinfodata/linux-cpustat-24cpu.out  | 150 ++++++++++++++++++++++++++++
 tests/nodeinfodata/linux-cpustat-24cpu.stat |  25 +++++
 tests/nodeinfotest.c                        | 124 +++++++++++++++++++++++
 6 files changed, 306 insertions(+), 1 deletion(-)
 create mode 100644 tests/nodeinfodata/linux-cpustat-24cpu.out
 create mode 100644 tests/nodeinfodata/linux-cpustat-24cpu.stat

diff --git a/src/libvirt_linux.syms b/src/libvirt_linux.syms
index 3500898..b3b2384 100644
--- a/src/libvirt_linux.syms
+++ b/src/libvirt_linux.syms
@@ -3,6 +3,7 @@
 #
 
 # nodeinfo.h
+linuxNodeGetCPUStats;
 linuxNodeInfoCPUPopulate;
 
 # util/virstatslinux.h
diff --git a/src/nodeinfo.c b/src/nodeinfo.c
index 775ea75..12495f6 100644
--- a/src/nodeinfo.c
+++ b/src/nodeinfo.c
@@ -676,7 +676,7 @@ cleanup:
 
 # define TICK_TO_NSEC (1000ull * 1000ull * 1000ull / sysconf(_SC_CLK_TCK))
 
-static int
+int
 linuxNodeGetCPUStats(FILE *procstat,
                      int cpuNum,
                      virNodeCPUStatsPtr params,
diff --git a/src/nodeinfopriv.h b/src/nodeinfopriv.h
index 9aa3262..6692363 100644
--- a/src/nodeinfopriv.h
+++ b/src/nodeinfopriv.h
@@ -28,6 +28,11 @@
 int linuxNodeInfoCPUPopulate(FILE *cpuinfo,
                              const char *sysfs_dir,
                              virNodeInfoPtr nodeinfo);
+
+int linuxNodeGetCPUStats(FILE *procstat,
+                         int cpuNum,
+                         virNodeCPUStatsPtr params,
+                         int *nparams);
 # endif
 
 #endif /* __NODEINFO_PRIV_H__ */
diff --git a/tests/nodeinfodata/linux-cpustat-24cpu.out b/tests/nodeinfodata/linux-cpustat-24cpu.out
new file mode 100644
index 0000000..0a1a5bc
--- /dev/null
+++ b/tests/nodeinfodata/linux-cpustat-24cpu.out
@@ -0,0 +1,150 @@
+cpu:
+kernel: 8751170
+user: 14128079
+idle: 1816344522
+iowait: 81323
+
+cpu0:
+kernel: 447603
+user: 749021
+idle: 75399242
+iowait: 5295
+
+cpu1:
+kernel: 167215
+user: 337326
+idle: 76178612
+iowait: 1121
+
+cpu2:
+kernel: 308930
+user: 666889
+idle: 75649696
+iowait: 4298
+
+cpu3:
+kernel: 227674
+user: 328464
+idle: 76131634
+iowait: 1219
+
+cpu4:
+kernel: 299514
+user: 583915
+idle: 75746383
+iowait: 3997
+
+cpu5:
+kernel: 112287
+user: 231867
+idle: 76336319
+iowait: 798
+
+cpu6:
+kernel: 546590
+user: 896252
+idle: 75132665
+iowait: 7210
+
+cpu7:
+kernel: 177715
+user: 342337
+idle: 76154889
+iowait: 1933
+
+cpu8:
+kernel: 452773
+user: 772479
+idle: 75359327
+iowait: 5845
+
+cpu9:
+kernel: 1050230
+user: 1079258
+idle: 74532776
+iowait: 3340
+
+cpu10:
+kernel: 535495
+user: 847295
+idle: 75202362
+iowait: 4038
+
+cpu11:
+kernel: 171635
+user: 323891
+idle: 76181622
+iowait: 993
+
+cpu12:
+kernel: 331031
+user: 683257
+idle: 75587176
+iowait: 5174
+
+cpu13:
+kernel: 112686
+user: 230633
+idle: 76345295
+iowait: 1367
+
+cpu14:
+kernel: 251393
+user: 547599
+idle: 75824554
+iowait: 5195
+
+cpu15:
+kernel: 199044
+user: 260673
+idle: 76230586
+iowait: 1379
+
+cpu16:
+kernel: 244158
+user: 463357
+idle: 75923993
+iowait: 6211
+
+cpu17:
+kernel: 88571
+user: 189253
+idle: 76411610
+iowait: 1388
+
+cpu18:
+kernel: 546539
+user: 875655
+idle: 75096896
+iowait: 5756
+
+cpu19:
+kernel: 186366
+user: 348768
+idle: 76137323
+iowait: 1299
+
+cpu20:
+kernel: 449460
+user: 765202
+idle: 75348938
+iowait: 4389
+
+cpu21:
+kernel: 1045076
+user: 1116075
+idle: 74500557
+iowait: 2411
+
+cpu22:
+kernel: 534125
+user: 847779
+idle: 75178185
+iowait: 5632
+
+cpu23:
+kernel: 265029
+user: 640815
+idle: 75753872
+iowait: 1026
+
diff --git a/tests/nodeinfodata/linux-cpustat-24cpu.stat b/tests/nodeinfodata/linux-cpustat-24cpu.stat
new file mode 100644
index 0000000..bc9d449
--- /dev/null
+++ b/tests/nodeinfodata/linux-cpustat-24cpu.stat
@@ -0,0 +1,25 @@
+cpu  14126233 1846 7764352 1816344522 81323 395581 591237 0 5880634 0
+cpu0 748997 24 320851 75399242 5295 22050 104702 0 331814 0
+cpu1 337325 1 140909 76178612 1121 8962 17344 0 166726 0
+cpu2 666860 29 269302 75649696 4298 18473 21155 0 272094 0
+cpu3 328387 77 211400 76131634 1219 9701 6573 0 115551 0
+cpu4 583896 19 265185 75746383 3997 17525 16804 0 253387 0
+cpu5 231867 0 100660 76336319 798 6856 4771 0 118465 0
+cpu6 896023 229 472933 75132665 7210 25811 47846 0 410328 0
+cpu7 342336 1 159567 76154889 1933 8675 9473 0 204523 0
+cpu8 772415 64 382065 75359327 5845 22810 47898 0 347169 0
+cpu9 1078771 487 1007467 74532776 3340 28419 14344 0 150374 0
+cpu10 847174 121 461786 75202362 4038 25206 48503 0 370309 0
+cpu11 323890 1 153521 76181622 993 9462 8652 0 199566 0
+cpu12 683237 20 290483 75587176 5174 19287 21261 0 293663 0
+cpu13 230633 0 100001 76345295 1367 7171 5514 0 103907 0
+cpu14 547593 6 220118 75824554 5195 14963 16312 0 207464 0
+cpu15 260648 25 185128 76230586 1379 8448 5468 0 76655 0
+cpu16 463328 29 214199 75923993 6211 14403 15556 0 184943 0
+cpu17 189247 6 79317 76411610 1388 5455 3799 0 85456 0
+cpu18 875552 103 470237 75096896 5756 25159 51143 0 408446 0
+cpu19 348767 1 167550 76137323 1299 8813 10003 0 208604 0
+cpu20 765169 33 380697 75348938 4389 21782 46981 0 353323 0
+cpu21 1115675 400 1003579 74500557 2411 28146 13351 0 162678 0
+cpu22 847629 150 463239 75178185 5632 24933 45953 0 376150 0
+cpu23 640804 11 244148 75753872 1026 13061 7820 0 479032 0
diff --git a/tests/nodeinfotest.c b/tests/nodeinfotest.c
index a6247ce..7cafd11 100644
--- a/tests/nodeinfotest.c
+++ b/tests/nodeinfotest.c
@@ -79,6 +79,93 @@ fail:
     return ret;
 }
 
+# define TICK_TO_NSEC (1000ull * 1000ull * 1000ull / sysconf(_SC_CLK_TCK))
+
+static int
+linuxCPUStatsToBuf(virBufferPtr buf,
+                   int cpu,
+                   virNodeCPUStatsPtr param,
+                   size_t nparams)
+{
+    size_t i = 0;
+
+    if (cpu < 0)
+        virBufferAddLit(buf, "cpu:\n");
+    else
+        virBufferAsprintf(buf, "cpu%d:\n", cpu);
+
+    for (i = 0; i < nparams; i++)
+        virBufferAsprintf(buf, "%s: %llu\n", param[i].field,
+                          param[i].value / TICK_TO_NSEC);
+
+    virBufferAddChar(buf, '\n');
+    return 0;
+}
+
+static int
+linuxCPUStatsCompareFiles(const char *cpustatfile,
+                          size_t ncpus,
+                          const char *outfile)
+{
+    int ret = -1;
+    char *actualData = NULL;
+    char *expectData = NULL;
+    FILE *cpustat = NULL;
+    virNodeCPUStatsPtr params = NULL;
+    virBuffer buf = VIR_BUFFER_INITIALIZER;
+    size_t i;
+    int nparams = 0;
+
+    if (virtTestLoadFile(outfile, &expectData) < 0)
+        goto fail;
+
+    if (!(cpustat = fopen(cpustatfile, "r"))) {
+        virReportSystemError(errno, "failed to open '%s': ", cpustatfile);
+        goto fail;
+    }
+
+    if (linuxNodeGetCPUStats(NULL, 0, NULL, &nparams) < 0)
+        goto fail;
+
+    if (VIR_ALLOC_N(params, nparams) < 0)
+        goto fail;
+
+    if (linuxNodeGetCPUStats(cpustat, VIR_NODE_CPU_STATS_ALL_CPUS, params,
+                             &nparams) < 0)
+        goto fail;
+
+    if (linuxCPUStatsToBuf(&buf, VIR_NODE_CPU_STATS_ALL_CPUS,
+                           params, nparams) < 0)
+        goto fail;
+
+    for (i = 0; i < ncpus; i++) {
+        if (linuxNodeGetCPUStats(cpustat, i, params, &nparams) < 0)
+            goto fail;
+        if (linuxCPUStatsToBuf(&buf, i, params, nparams) < 0)
+            goto fail;
+    }
+
+    if (!(actualData = virBufferContentAndReset(&buf))) {
+        virReportOOMError();
+        goto fail;
+    }
+
+    if (STRNEQ(actualData, expectData)) {
+        virtTestDifference(stderr, expectData, actualData);
+        goto fail;
+    }
+
+    ret = 0;
+
+fail:
+    virBufferFreeAndReset(&buf);
+    VIR_FORCE_FCLOSE(cpustat);
+    VIR_FREE(expectData);
+    VIR_FREE(actualData);
+    VIR_FREE(params);
+    return ret;
+}
+
 
 static int
 linuxTestNodeInfo(const void *data)
@@ -114,6 +201,34 @@ cleanup:
     return result;
 }
 
+struct nodeCPUStatsData {
+    const char *name;
+    int ncpus;
+};
+
+static int
+linuxTestNodeCPUStats(const void *data)
+{
+    const struct nodeCPUStatsData *testData = data;
+    int result = -1;
+    char *cpustatfile = NULL;
+    char *outfile = NULL;
+
+    if (virAsprintf(&cpustatfile, "%s/nodeinfodata/linux-cpustat-%s.stat",
+                    abs_srcdir, testData->name) < 0 ||
+        virAsprintf(&outfile, "%s/nodeinfodata/linux-cpustat-%s.out",
+                    abs_srcdir, testData->name) < 0)
+        goto fail;
+
+    result = linuxCPUStatsCompareFiles(cpustatfile,
+                                       testData->ncpus,
+                                       outfile);
+fail:
+    VIR_FREE(cpustatfile);
+    VIR_FREE(outfile);
+    return result;
+}
+
 
 static int
 mymain(void)
@@ -141,6 +256,15 @@ mymain(void)
       if (virtTestRun(nodeData[i], linuxTestNodeInfo, nodeData[i]) != 0)
         ret = -1;
 
+# define DO_TEST_CPU_STATS(name, ncpus) \
+    do { \
+        static struct nodeCPUStatsData data = { name, ncpus }; \
+        if (virtTestRun("CPU stats " name, linuxTestNodeCPUStats, &data) < 0) \
+            ret = -1; \
+    } while (0)
+
+    DO_TEST_CPU_STATS("24cpu", 24);
+
     return ret==0 ? EXIT_SUCCESS : EXIT_FAILURE;
 }
 
-- 
1.8.3.2




More information about the libvir-list mailing list