VirtualBox

source: vbox/trunk/src/VBox/VMM/testcase/tstVMMFork.cpp@ 5999

Last change on this file since 5999 was 5999, checked in by vboxsync, 17 years ago

The Giant CDDL Dual-License Header Change.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 4.8 KB
Line 
1/* $Id: tstVMMFork.cpp 5999 2007-12-07 15:05:06Z vboxsync $ */
2/** @file
3 * VMM Fork Test.
4 */
5
6/*
7 * Copyright (C) 2006-2007 innotek GmbH
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18
19/*******************************************************************************
20* Header Files *
21*******************************************************************************/
22#include <VBox/vm.h>
23#include <VBox/vmm.h>
24#include <VBox/err.h>
25#include <VBox/log.h>
26#include <iprt/assert.h>
27#include <iprt/runtime.h>
28#include <iprt/stream.h>
29
30#include <errno.h>
31#include <sys/wait.h>
32#include <unistd.h>
33
34
35/*******************************************************************************
36* Defined Constants And Macros *
37*******************************************************************************/
38#define TESTCASE "tstVMMFork"
39#define AUTO_TEST_ARGS 1
40
41VMMR3DECL(int) VMMDoTest(PVM pVM);
42
43
44int main(int argc, char* argv[])
45{
46 int rcErrors = 0;
47
48 /*
49 * Initialize the runtime.
50 */
51 RTR3Init();
52
53#ifndef AUTO_TEST_ARGS
54 if (argc < 2)
55 {
56 RTPrintf("syntax: %s command [args]\n"
57 "\n"
58 "command Command to run under child process in fork.\n"
59 "[args] Arguments to command.\n", argv[0]);
60 return 1;
61 }
62#endif
63
64 /*
65 * Create empty VM.
66 */
67 RTPrintf(TESTCASE ": Initializing...\n");
68 PVM pVM;
69 int rc = VMR3Create(NULL, NULL, NULL, NULL, &pVM);
70 if (VBOX_SUCCESS(rc))
71 {
72 /*
73 * Do testing.
74 */
75 int iCowTester = 0;
76 char cCowTester = 'a';
77
78#ifndef AUTO_TEST_ARGS
79 int cArgs = argc - 1;
80 char **ppszArgs = &argv[1];
81#else
82 int cArgs = 2;
83 char *ppszArgs[3];
84 ppszArgs[0] = (char *)"/bin/sleep";
85 ppszArgs[1] = (char *)"3";
86 ppszArgs[2] = NULL;
87#endif
88
89 RTPrintf(TESTCASE ": forking current process...\n");
90 pid_t pid = fork();
91 if (pid < 0)
92 {
93 /* Bad. fork() failed! */
94 RTPrintf(TESTCASE ": error: fork() failed.\n");
95 rcErrors++;
96 }
97 else if (pid == 0)
98 {
99 /*
100 * The child process.
101 * Write to some local variables to trigger copy-on-write if it's used.
102 */
103 RTPrintf(TESTCASE ": running child process...\n");
104 RTPrintf(TESTCASE ": writing local variables...\n");
105 iCowTester = 2;
106 cCowTester = 'z';
107
108 RTPrintf(TESTCASE ": calling execv() with command-line:\n");
109 for (int i = 0; i < cArgs; i++)
110 RTPrintf(TESTCASE ": ppszArgs[%d]=%s\n", i, ppszArgs[i]);
111 execv(ppszArgs[0], ppszArgs);
112 RTPrintf(TESTCASE ": error: execv() returned to caller. errno=%d.\n", errno);
113 _exit(-1);
114 }
115 else
116 {
117 /*
118 * The parent process.
119 * Wait for child & run VMM test to ensure things are fine.
120 */
121 int result;
122 while (waitpid(pid, &result, 0) < 0)
123 ;
124 if (!WIFEXITED(result) || WEXITSTATUS(result) != 0)
125 {
126 RTPrintf(TESTCASE ": error: failed to run child process. errno=%d\n", errno);
127 rcErrors++;
128 }
129
130 if (rcErrors == 0)
131 {
132 RTPrintf(TESTCASE ": fork() returned fine.\n");
133 RTPrintf(TESTCASE ": testing VM after fork.\n");
134 PVMREQ pReq1 = NULL;
135 rc = VMR3ReqCall(pVM, &pReq1, RT_INDEFINITE_WAIT, (PFNRT)VMMDoTest, 1, pVM);
136 AssertRC(rc);
137 VMR3ReqFree(pReq1);
138
139 STAMR3Dump(pVM, "*");
140 }
141 }
142
143 if (rcErrors > 0)
144 RTPrintf(TESTCASE ": error: %d error(s) during fork(). Cannot proceed to test the VM.\n");
145 else
146 RTPrintf(TESTCASE ": fork() and VM test, SUCCESS.\n");
147
148 /*
149 * Cleanup.
150 */
151 rc = VMR3Destroy(pVM);
152 if (!VBOX_SUCCESS(rc))
153 {
154 RTPrintf(TESTCASE ": error: failed to destroy vm! rc=%d\n", rc);
155 rcErrors++;
156 }
157 }
158 else
159 {
160 RTPrintf(TESTCASE ": fatal error: failed to create vm! rc=%d\n", rc);
161 rcErrors++;
162 }
163
164 return rcErrors;
165}
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette