PageRenderTime 50ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/virhostcputest.c

https://gitlab.com/tiagoor/libvirt
C | 269 lines | 217 code | 49 blank | 3 comment | 27 complexity | 4608dba02476b97e7573a4f886c34e8b MD5 | raw file
  1. #include <config.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include "testutils.h"
  7. #include "internal.h"
  8. #include "virhostcpupriv.h"
  9. #include "virfile.h"
  10. #include "virstring.h"
  11. #define VIR_FROM_THIS VIR_FROM_NONE
  12. #if !(defined __linux__)
  13. int
  14. main(void)
  15. {
  16. return EXIT_AM_SKIP;
  17. }
  18. #else
  19. static int
  20. linuxTestCompareFiles(const char *cpuinfofile,
  21. virArch arch,
  22. const char *outputfile)
  23. {
  24. int ret = -1;
  25. char *actualData = NULL;
  26. virNodeInfo nodeinfo;
  27. FILE *cpuinfo;
  28. cpuinfo = fopen(cpuinfofile, "r");
  29. if (!cpuinfo) {
  30. fprintf(stderr, "unable to open: %s : %s\n",
  31. cpuinfofile, strerror(errno));
  32. goto fail;
  33. }
  34. memset(&nodeinfo, 0, sizeof(nodeinfo));
  35. if (virHostCPUGetInfoPopulateLinux(cpuinfo, arch,
  36. &nodeinfo.cpus, &nodeinfo.mhz,
  37. &nodeinfo.nodes, &nodeinfo.sockets,
  38. &nodeinfo.cores, &nodeinfo.threads) < 0) {
  39. if (virTestGetDebug()) {
  40. if (virGetLastError())
  41. VIR_TEST_DEBUG("\n%s\n", virGetLastErrorMessage());
  42. }
  43. VIR_FORCE_FCLOSE(cpuinfo);
  44. goto fail;
  45. }
  46. VIR_FORCE_FCLOSE(cpuinfo);
  47. if (virAsprintf(&actualData,
  48. "CPUs: %u/%u, MHz: %u, Nodes: %u, Sockets: %u, "
  49. "Cores: %u, Threads: %u\n",
  50. nodeinfo.cpus, VIR_NODEINFO_MAXCPUS(nodeinfo),
  51. nodeinfo.mhz, nodeinfo.nodes, nodeinfo.sockets,
  52. nodeinfo.cores, nodeinfo.threads) < 0)
  53. goto fail;
  54. if (virTestCompareToFile(actualData, outputfile) < 0)
  55. goto fail;
  56. ret = 0;
  57. fail:
  58. VIR_FREE(actualData);
  59. return ret;
  60. }
  61. # define TICK_TO_NSEC (1000ull * 1000ull * 1000ull / sysconf(_SC_CLK_TCK))
  62. static int
  63. linuxCPUStatsToBuf(virBufferPtr buf,
  64. int cpu,
  65. virNodeCPUStatsPtr param,
  66. size_t nparams)
  67. {
  68. size_t i = 0;
  69. if (cpu < 0)
  70. virBufferAddLit(buf, "cpu:\n");
  71. else
  72. virBufferAsprintf(buf, "cpu%d:\n", cpu);
  73. for (i = 0; i < nparams; i++)
  74. virBufferAsprintf(buf, "%s: %llu\n", param[i].field,
  75. param[i].value / TICK_TO_NSEC);
  76. virBufferAddChar(buf, '\n');
  77. return 0;
  78. }
  79. static int
  80. linuxCPUStatsCompareFiles(const char *cpustatfile,
  81. size_t ncpus,
  82. const char *outfile)
  83. {
  84. int ret = -1;
  85. char *actualData = NULL;
  86. FILE *cpustat = NULL;
  87. virNodeCPUStatsPtr params = NULL;
  88. virBuffer buf = VIR_BUFFER_INITIALIZER;
  89. size_t i;
  90. int nparams = 0;
  91. if (!(cpustat = fopen(cpustatfile, "r"))) {
  92. virReportSystemError(errno, "failed to open '%s': ", cpustatfile);
  93. goto fail;
  94. }
  95. if (virHostCPUGetStatsLinux(NULL, 0, NULL, &nparams) < 0)
  96. goto fail;
  97. if (VIR_ALLOC_N(params, nparams) < 0)
  98. goto fail;
  99. if (virHostCPUGetStatsLinux(cpustat, VIR_NODE_CPU_STATS_ALL_CPUS, params,
  100. &nparams) < 0)
  101. goto fail;
  102. if (linuxCPUStatsToBuf(&buf, VIR_NODE_CPU_STATS_ALL_CPUS,
  103. params, nparams) < 0)
  104. goto fail;
  105. for (i = 0; i < ncpus; i++) {
  106. if (virHostCPUGetStatsLinux(cpustat, i, params, &nparams) < 0)
  107. goto fail;
  108. if (linuxCPUStatsToBuf(&buf, i, params, nparams) < 0)
  109. goto fail;
  110. }
  111. if (!(actualData = virBufferContentAndReset(&buf))) {
  112. virReportOOMError();
  113. goto fail;
  114. }
  115. if (virTestCompareToFile(actualData, outfile) < 0)
  116. goto fail;
  117. ret = 0;
  118. fail:
  119. virBufferFreeAndReset(&buf);
  120. VIR_FORCE_FCLOSE(cpustat);
  121. VIR_FREE(actualData);
  122. VIR_FREE(params);
  123. return ret;
  124. }
  125. struct linuxTestHostCPUData {
  126. const char *testName;
  127. virArch arch;
  128. };
  129. static int
  130. linuxTestHostCPU(const void *opaque)
  131. {
  132. int result = -1;
  133. char *cpuinfo = NULL;
  134. char *sysfs_prefix = NULL;
  135. char *output = NULL;
  136. struct linuxTestHostCPUData *data = (struct linuxTestHostCPUData *) opaque;
  137. const char *archStr = virArchToString(data->arch);
  138. if (virAsprintf(&sysfs_prefix, "%s/virhostcpudata/linux-%s",
  139. abs_srcdir, data->testName) < 0 ||
  140. virAsprintf(&cpuinfo, "%s/virhostcpudata/linux-%s-%s.cpuinfo",
  141. abs_srcdir, archStr, data->testName) < 0 ||
  142. virAsprintf(&output, "%s/virhostcpudata/linux-%s-%s.expected",
  143. abs_srcdir, archStr, data->testName) < 0) {
  144. goto cleanup;
  145. }
  146. virHostCPUSetSysFSSystemPathLinux(sysfs_prefix);
  147. result = linuxTestCompareFiles(cpuinfo, data->arch, output);
  148. virHostCPUSetSysFSSystemPathLinux(NULL);
  149. cleanup:
  150. VIR_FREE(cpuinfo);
  151. VIR_FREE(output);
  152. VIR_FREE(sysfs_prefix);
  153. return result;
  154. }
  155. struct nodeCPUStatsData {
  156. const char *name;
  157. int ncpus;
  158. };
  159. static int
  160. linuxTestNodeCPUStats(const void *data)
  161. {
  162. const struct nodeCPUStatsData *testData = data;
  163. int result = -1;
  164. char *cpustatfile = NULL;
  165. char *outfile = NULL;
  166. if (virAsprintf(&cpustatfile, "%s/virhostcpudata/linux-cpustat-%s.stat",
  167. abs_srcdir, testData->name) < 0 ||
  168. virAsprintf(&outfile, "%s/virhostcpudata/linux-cpustat-%s.out",
  169. abs_srcdir, testData->name) < 0)
  170. goto fail;
  171. result = linuxCPUStatsCompareFiles(cpustatfile,
  172. testData->ncpus,
  173. outfile);
  174. fail:
  175. VIR_FREE(cpustatfile);
  176. VIR_FREE(outfile);
  177. return result;
  178. }
  179. static int
  180. mymain(void)
  181. {
  182. int ret = 0;
  183. size_t i;
  184. const struct linuxTestHostCPUData nodeData[] = {
  185. {"test1", VIR_ARCH_X86_64},
  186. {"test1", VIR_ARCH_PPC},
  187. {"test2", VIR_ARCH_X86_64},
  188. {"test3", VIR_ARCH_X86_64},
  189. {"test4", VIR_ARCH_X86_64},
  190. {"test5", VIR_ARCH_X86_64},
  191. {"test6", VIR_ARCH_X86_64},
  192. {"test7", VIR_ARCH_X86_64},
  193. {"test8", VIR_ARCH_X86_64},
  194. {"raspberrypi", VIR_ARCH_ARMV6L},
  195. {"f21-mustang", VIR_ARCH_AARCH64},
  196. {"rhelsa-3.19.0-mustang", VIR_ARCH_AARCH64},
  197. {"deconf-cpus", VIR_ARCH_PPC64},
  198. /* subcores, default configuration */
  199. {"subcores1", VIR_ARCH_PPC64},
  200. /* subcores, some of the cores are offline */
  201. {"subcores2", VIR_ARCH_PPC64},
  202. /* subcores, invalid configuration */
  203. {"subcores3", VIR_ARCH_PPC64},
  204. };
  205. if (virInitialize() < 0)
  206. return EXIT_FAILURE;
  207. for (i = 0; i < ARRAY_CARDINALITY(nodeData); i++)
  208. if (virTestRun(nodeData[i].testName, linuxTestHostCPU, &nodeData[i]) != 0)
  209. ret = -1;
  210. # define DO_TEST_CPU_STATS(name, ncpus) \
  211. do { \
  212. static struct nodeCPUStatsData data = { name, ncpus }; \
  213. if (virTestRun("CPU stats " name, linuxTestNodeCPUStats, &data) < 0) \
  214. ret = -1; \
  215. } while (0)
  216. DO_TEST_CPU_STATS("24cpu", 24);
  217. return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
  218. }
  219. VIRT_TEST_MAIN_PRELOAD(mymain, abs_builddir "/.libs/virhostcpumock.so")
  220. #endif /* __linux__ */