1/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
2 *
3 * Permission is hereby granted, free of charge, to any person obtaining a copy
4 * of this software and associated documentation files (the "Software"), to
5 * deal in the Software without restriction, including without limitation the
6 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7 * sell copies of the Software, and to permit persons to whom the Software is
8 * furnished to do so, subject to the following conditions:
9 *
10 * The above copyright notice and this permission notice shall be included in
11 * all copies or substantial portions of the Software.
12 *
13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19 * IN THE SOFTWARE.
20 */
21
22#include "uv.h"
23#include "task.h"
24#include <string.h>
25
26
27TEST_IMPL(platform_output) {
28  char buffer[512];
29  size_t rss;
30  size_t size;
31  double uptime;
32  uv_pid_t pid;
33  uv_pid_t ppid;
34  uv_rusage_t rusage;
35  uv_cpu_info_t* cpus;
36  uv_interface_address_t* interfaces;
37  uv_passwd_t pwd;
38  uv_group_t grp;
39  uv_utsname_t uname;
40  unsigned par;
41  char* const* member;
42  int count;
43  int i;
44  int err;
45
46  err = uv_get_process_title(buffer, sizeof(buffer));
47  ASSERT_OK(err);
48  printf("uv_get_process_title: %s\n", buffer);
49
50  size = sizeof(buffer);
51  err = uv_cwd(buffer, &size);
52  ASSERT_OK(err);
53  printf("uv_cwd: %s\n", buffer);
54
55  err = uv_resident_set_memory(&rss);
56#if defined(__MSYS__)
57  ASSERT_EQ(err, UV_ENOSYS);
58#else
59  ASSERT_OK(err);
60  printf("uv_resident_set_memory: %llu\n", (unsigned long long) rss);
61#endif
62
63  err = uv_uptime(&uptime);
64#if defined(__PASE__)
65  ASSERT_EQ(err, UV_ENOSYS);
66#else
67  ASSERT_OK(err);
68  ASSERT_GT(uptime, 0);
69  printf("uv_uptime: %f\n", uptime);
70#endif
71
72  err = uv_getrusage(&rusage);
73  ASSERT_OK(err);
74  ASSERT_GE(rusage.ru_utime.tv_sec, 0);
75  ASSERT_GE(rusage.ru_utime.tv_usec, 0);
76  ASSERT_GE(rusage.ru_stime.tv_sec, 0);
77  ASSERT_GE(rusage.ru_stime.tv_usec, 0);
78  printf("uv_getrusage:\n");
79  printf("  user: %llu sec %llu microsec\n",
80         (unsigned long long) rusage.ru_utime.tv_sec,
81         (unsigned long long) rusage.ru_utime.tv_usec);
82  printf("  system: %llu sec %llu microsec\n",
83         (unsigned long long) rusage.ru_stime.tv_sec,
84         (unsigned long long) rusage.ru_stime.tv_usec);
85  printf("  page faults: %llu\n", (unsigned long long) rusage.ru_majflt);
86  printf("  maximum resident set size: %llu\n",
87         (unsigned long long) rusage.ru_maxrss);
88
89  par = uv_available_parallelism();
90  ASSERT_GE(par, 1);
91  printf("uv_available_parallelism: %u\n", par);
92
93  err = uv_cpu_info(&cpus, &count);
94#if defined(__CYGWIN__) || defined(__MSYS__)
95  ASSERT_EQ(err, UV_ENOSYS);
96#else
97  ASSERT_OK(err);
98
99  printf("uv_cpu_info:\n");
100  for (i = 0; i < count; i++) {
101    printf("  model: %s\n", cpus[i].model);
102    printf("  speed: %d\n", cpus[i].speed);
103    printf("  times.sys: %llu\n", (unsigned long long) cpus[i].cpu_times.sys);
104    printf("  times.user: %llu\n",
105           (unsigned long long) cpus[i].cpu_times.user);
106    printf("  times.idle: %llu\n",
107           (unsigned long long) cpus[i].cpu_times.idle);
108    printf("  times.irq: %llu\n",  (unsigned long long) cpus[i].cpu_times.irq);
109    printf("  times.nice: %llu\n",
110           (unsigned long long) cpus[i].cpu_times.nice);
111  }
112#endif
113  uv_free_cpu_info(cpus, count);
114
115  err = uv_interface_addresses(&interfaces, &count);
116  ASSERT_OK(err);
117
118  printf("uv_interface_addresses:\n");
119  for (i = 0; i < count; i++) {
120    printf("  name: %s\n", interfaces[i].name);
121    printf("  internal: %d\n", interfaces[i].is_internal);
122    printf("  physical address: ");
123    printf("%02x:%02x:%02x:%02x:%02x:%02x\n",
124           (unsigned char)interfaces[i].phys_addr[0],
125           (unsigned char)interfaces[i].phys_addr[1],
126           (unsigned char)interfaces[i].phys_addr[2],
127           (unsigned char)interfaces[i].phys_addr[3],
128           (unsigned char)interfaces[i].phys_addr[4],
129           (unsigned char)interfaces[i].phys_addr[5]);
130
131    if (interfaces[i].address.address4.sin_family == AF_INET) {
132      uv_ip4_name(&interfaces[i].address.address4, buffer, sizeof(buffer));
133    } else if (interfaces[i].address.address4.sin_family == AF_INET6) {
134      uv_ip6_name(&interfaces[i].address.address6, buffer, sizeof(buffer));
135    }
136
137    printf("  address: %s\n", buffer);
138
139    if (interfaces[i].netmask.netmask4.sin_family == AF_INET) {
140      uv_ip4_name(&interfaces[i].netmask.netmask4, buffer, sizeof(buffer));
141      printf("  netmask: %s\n", buffer);
142    } else if (interfaces[i].netmask.netmask4.sin_family == AF_INET6) {
143      uv_ip6_name(&interfaces[i].netmask.netmask6, buffer, sizeof(buffer));
144      printf("  netmask: %s\n", buffer);
145    } else {
146      printf("  netmask: none\n");
147    }
148  }
149  uv_free_interface_addresses(interfaces, count);
150
151  err = uv_os_get_passwd(&pwd);
152  ASSERT_OK(err);
153
154  err = uv_os_get_group(&grp, pwd.gid);
155#if defined(_WIN32)
156  ASSERT_EQ(err, UV_ENOTSUP);
157  ASSERT_EQ(pwd.uid, (unsigned long) -1);
158  ASSERT_EQ(pwd.gid, (unsigned long) -1);
159  (void) member;
160  grp.groupname = "ENOTSUP";
161#else
162  ASSERT_OK(err);
163  ASSERT_EQ(pwd.gid, grp.gid);
164#endif
165
166  printf("uv_os_get_passwd:\n");
167  printf("  euid: %ld\n", pwd.uid);
168  printf("  gid: %ld (%s)\n", pwd.gid, grp.groupname);
169#if !defined(_WIN32)
170  printf("    members: [");
171  for (member = grp.members; *member != NULL; member++) {
172    printf(" %s", *member);
173  }
174  printf(" ]\n");
175#endif
176  printf("  username: %s\n", pwd.username);
177  if (pwd.shell != NULL) /* Not set on Windows */
178    printf("  shell: %s\n", pwd.shell);
179  printf("  home directory: %s\n", pwd.homedir);
180  uv_os_free_passwd(&pwd);
181#if !defined(_WIN32)
182  uv_os_free_group(&grp);
183#endif
184
185  pid = uv_os_getpid();
186  ASSERT_GT(pid, 0);
187  printf("uv_os_getpid: %d\n", (int) pid);
188  ppid = uv_os_getppid();
189  ASSERT_GT(ppid, 0);
190  printf("uv_os_getppid: %d\n", (int) ppid);
191
192  err = uv_os_uname(&uname);
193  ASSERT_OK(err);
194  printf("uv_os_uname:\n");
195  printf("  sysname: %s\n", uname.sysname);
196  printf("  release: %s\n", uname.release);
197  printf("  version: %s\n", uname.version);
198  printf("  machine: %s\n", uname.machine);
199
200  return 0;
201}
202