]> git.proxmox.com Git - mirror_edk2.git/blob - ShellPkg/Application/ShellLibTestApp/sa3.c
First (Alpha) release of ShellPkg
[mirror_edk2.git] / ShellPkg / Application / ShellLibTestApp / sa3.c
1 /** @file
2 This is a simple shell application
3
4 This should be executed with "/Param2 Val1" and "/Param1" as the 2 command line options!
5
6 Copyright (c) 2008, Intel Corporation
7 All rights reserved. This program and the accompanying materials
8 are licensed and made available under the terms and conditions of the BSD License
9 which accompanies this distribution. The full text of the license may be found at
10 http://opensource.org/licenses/bsd-license.php
11
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14
15 **/
16
17 #include <Uefi.h>
18 #include <Library/UefiApplicationEntryPoint.h>
19 #include <Library/UefiLib.h>
20 #include <Library/ShellLib.h>
21 #include <Library/DebugLib.h>
22 #include <Library/MemoryAllocationLib.h>
23
24 SHELL_PARAM_ITEM ParamList[] = {
25 {L"/Param1", TypeFlag},
26 {L"/Param2", TypeValue},
27 {NULL, TypeMax}};
28
29 /**
30 as the real entry point for the application.
31
32 @param[in] ImageHandle The firmware allocated handle for the EFI image.
33 @param[in] SystemTable A pointer to the EFI System Table.
34
35 @retval EFI_SUCCESS The entry point is executed successfully.
36 @retval other Some error occurs when executing this entry point.
37
38 **/
39 EFI_STATUS
40 EFIAPI
41 UefiMain (
42 IN EFI_HANDLE ImageHandle,
43 IN EFI_SYSTEM_TABLE *SystemTable
44 )
45 {
46 EFI_FILE_HANDLE FileHandle;
47 EFI_STATUS Status;
48 CHAR16 FileName[100];
49 UINTN BufferSize;
50 UINT64 Position;
51 UINT8 Buffer[200];
52 EFI_FILE_INFO *pFileInfo;
53 UINT64 Size;
54 BOOLEAN NoFile;
55 EFI_SHELL_FILE_INFO *pShellFileInfo, *pShellFileInfo2;
56 LIST_ENTRY *List;
57
58 FileHandle = NULL;
59 StrCpy(FileName, L"testfile.txt");
60 Position = 0;
61 pFileInfo = NULL;
62 Size = 0;
63 NoFile = FALSE;
64 pShellFileInfo = NULL;
65 List = NULL;
66
67 ASSERT(ShellGetExecutionBreakFlag() == FALSE);
68 ASSERT(StrCmp(ShellGetCurrentDir(NULL), L"f8:\\") == 0);
69 Print(L"execution break and get cur dir - pass\r\n");
70
71 ShellSetPageBreakMode(TRUE);
72
73 Status = ShellOpenFileByName(FileName,
74 &FileHandle,
75 EFI_FILE_MODE_CREATE|EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE,
76 0
77 );
78 ASSERT_EFI_ERROR(Status);
79
80 BufferSize = StrSize(FileName);
81 Status = ShellWriteFile(FileHandle, &BufferSize, FileName);
82 ASSERT_EFI_ERROR(Status);
83 Status = ShellGetFilePosition(FileHandle, &Position);
84 ASSERT_EFI_ERROR(Status);
85 ASSERT(Position == 0x1A);
86 Status = ShellSetFilePosition(FileHandle, 0);
87 ASSERT_EFI_ERROR(Status);
88 BufferSize = sizeof(Buffer) * sizeof(Buffer[0]);
89 Status = ShellReadFile(FileHandle, &BufferSize, Buffer);
90 ASSERT_EFI_ERROR(Status);
91 ASSERT(BufferSize == 0x1A);
92 ASSERT(StrCmp((CHAR16*)Buffer, FileName) == 0);
93 pFileInfo = ShellGetFileInfo(FileHandle);
94 ASSERT(pFileInfo != NULL);
95 ASSERT(StrCmp(pFileInfo->FileName, FileName) == 0);
96 ASSERT(pFileInfo->FileSize == 0x1A);
97 FreePool(pFileInfo);
98 pFileInfo = NULL;
99 Status = ShellCloseFile(&FileHandle);
100 ASSERT(FileHandle == NULL);
101 ASSERT_EFI_ERROR(Status);
102 Print(L"read, write, create, getinfo - pass\r\n");
103
104 Status = ShellOpenFileByName(FileName,
105 &FileHandle,
106 EFI_FILE_MODE_CREATE|EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE,
107 0
108 );
109 ASSERT_EFI_ERROR(Status);
110 pFileInfo = ShellGetFileInfo(FileHandle);
111 ASSERT(pFileInfo != NULL);
112 pFileInfo->FileSize = 0x20;
113 Status = ShellSetFileInfo(FileHandle, pFileInfo);
114 FreePool(pFileInfo);
115 pFileInfo = NULL;
116 ASSERT_EFI_ERROR(Status);
117 pFileInfo = ShellGetFileInfo(FileHandle);
118 ASSERT(pFileInfo != NULL);
119 ASSERT(StrCmp(pFileInfo->FileName, FileName) == 0);
120 ASSERT(pFileInfo->PhysicalSize == 0x20);
121 ASSERT(pFileInfo->FileSize == 0x20);
122 ASSERT((pFileInfo->Attribute&EFI_FILE_DIRECTORY)==0);
123 FreePool(pFileInfo);
124 Status = ShellGetFileSize(FileHandle, &Size);
125 ASSERT(Size == 0x20);
126 ASSERT_EFI_ERROR(Status);
127 Status = ShellCloseFile(&FileHandle);
128 ASSERT(FileHandle == NULL);
129 ASSERT_EFI_ERROR(Status);
130 Print(L"setinfo and change size, getsize - pass\r\n");
131
132 Status = ShellOpenFileByName(FileName,
133 &FileHandle,
134 EFI_FILE_MODE_CREATE|EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE,
135 0
136 );
137 ASSERT_EFI_ERROR(Status);
138
139 pFileInfo = ShellGetFileInfo(FileHandle);
140 ASSERT(pFileInfo != NULL);
141 ASSERT(StrCmp(pFileInfo->FileName, FileName) == 0);
142 ASSERT(pFileInfo->PhysicalSize == 0x20);
143 ASSERT(pFileInfo->FileSize == 0x20);
144 ASSERT((pFileInfo->Attribute&EFI_FILE_DIRECTORY)==0);
145 FreePool(pFileInfo);
146 pFileInfo = NULL;
147 Status = ShellDeleteFile(&FileHandle);
148 ASSERT(FileHandle == NULL);
149 ASSERT_EFI_ERROR(Status);
150 Print(L"reopen file - pass\r\n");
151
152 Status = ShellOpenFileByName(FileName,
153 &FileHandle,
154 EFI_FILE_MODE_CREATE|EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE,
155 0
156 );
157 ASSERT_EFI_ERROR(Status);
158 pFileInfo = ShellGetFileInfo(FileHandle);
159 ASSERT(pFileInfo != NULL);
160 ASSERT(StrCmp(pFileInfo->FileName, FileName) == 0);
161 ASSERT(pFileInfo->PhysicalSize == 0x0);
162 ASSERT(pFileInfo->FileSize == 0x0);
163 ASSERT((pFileInfo->Attribute&EFI_FILE_DIRECTORY)==0);
164 FreePool(pFileInfo);
165 Status = ShellDeleteFile(&FileHandle);
166 ASSERT(FileHandle == NULL);
167 ASSERT_EFI_ERROR(Status);
168 Print(L"size of empty - pass\r\n");
169
170 Status = ShellOpenFileByName(FileName,
171 &FileHandle,
172 EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE,
173 0
174 );
175 ASSERT(Status == EFI_NOT_FOUND);
176 ASSERT(FileHandle == NULL);
177
178 Status = ShellCreateDirectory(FileName, &FileHandle);
179 ASSERT_EFI_ERROR(Status);
180 ASSERT(FileHandle != NULL);
181 pFileInfo = ShellGetFileInfo(FileHandle);
182 ASSERT(pFileInfo != NULL);
183 ASSERT(StrCmp(pFileInfo->FileName, FileName) == 0);
184 ASSERT(pFileInfo->Attribute&EFI_FILE_DIRECTORY);
185 Status = ShellDeleteFile(&FileHandle);
186 ASSERT(FileHandle == NULL);
187 ASSERT_EFI_ERROR(Status);
188 Print(L"Directory create - pass\r\n");
189
190 // FindFirst and FindNext
191 StrCpy(FileName, L"testDir");
192 Status = ShellCreateDirectory(FileName, &FileHandle);
193 Status = ShellCloseFile(&FileHandle);
194 StrCat(FileName, L"\\File.txt");
195 Status = ShellOpenFileByName(FileName,
196 &FileHandle,
197 EFI_FILE_MODE_CREATE|EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE,
198 0
199 );
200 ASSERT_EFI_ERROR(Status);
201 Status = ShellCloseFile(&FileHandle);
202 StrCpy(FileName, L"testDir");
203 Status = ShellOpenFileByName(FileName,
204 &FileHandle,
205 EFI_FILE_MODE_CREATE|EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE,
206 0
207 );
208 ASSERT_EFI_ERROR(Status);
209 Status = ShellFindFirstFile(FileHandle, pFileInfo);
210 ASSERT_EFI_ERROR(Status);
211 Status = ShellFindNextFile(FileHandle, pFileInfo, &NoFile);
212 ASSERT_EFI_ERROR(Status);
213 ASSERT(NoFile == FALSE);
214 Status = ShellFindNextFile(FileHandle, pFileInfo, &NoFile);
215 ASSERT_EFI_ERROR(Status);
216 ASSERT(NoFile == FALSE);
217 Status = ShellFindNextFile(FileHandle, pFileInfo, &NoFile);
218 ASSERT_EFI_ERROR(Status);
219 /// @todo - why is NoFile never set? limitation of NT32 file system?
220 Status = ShellDeleteFile(&FileHandle);
221 ASSERT(FileHandle == NULL);
222 ASSERT(Status == RETURN_WARN_DELETE_FAILURE);
223 Print(L"FindFirst - pass\r\n");
224 Print(L"FindNext - Verify with real EFI system. Cant verify NoFile under NT32\r\n");
225
226 // open and close meta arg
227 Status = ShellOpenFileMetaArg(L"testDir\\*.*", EFI_FILE_MODE_READ, &pShellFileInfo);
228 ASSERT_EFI_ERROR(Status);
229 ASSERT(pShellFileInfo->Status == 0);
230 ASSERT(StrCmp(pShellFileInfo->FileName, L"File.txt") == 0);
231 ASSERT(pShellFileInfo->Handle);
232 ASSERT(pShellFileInfo->Info);
233 ASSERT(pShellFileInfo->Info->FileSize == 0);
234 ASSERT(StrCmp(pShellFileInfo->Info->FileName, L"File.txt") == 0);
235 ASSERT(pShellFileInfo->Info->Attribute == 0);
236 pShellFileInfo2 = (EFI_SHELL_FILE_INFO*)0x12345678;
237 Status = ShellOpenFileMetaArg(L"testDir\\*.*", EFI_FILE_MODE_READ, &pShellFileInfo2);
238 ASSERT(pShellFileInfo2 == NULL);
239 ASSERT(Status == EFI_UNSUPPORTED);
240 Status = ShellCloseFileMetaArg(&pShellFileInfo);
241 ASSERT_EFI_ERROR(Status);
242 Print(L"Open/Close Meta Arg - pass\r\n");
243
244 // now delete that file and that directory
245 StrCat(FileName, L"\\File.txt");
246 Status = ShellOpenFileByName(FileName,
247 &FileHandle,
248 EFI_FILE_MODE_CREATE|EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE,
249 0
250 );
251 ASSERT_EFI_ERROR(Status);
252 Status = ShellDeleteFile(&FileHandle);
253 ASSERT(FileHandle == NULL);
254 StrCpy(FileName, L"testDir");
255 ASSERT_EFI_ERROR(Status);
256 Status = ShellOpenFileByName(FileName,
257 &FileHandle,
258 EFI_FILE_MODE_CREATE|EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE,
259 0
260 );
261 Status = ShellDeleteFile(&FileHandle);
262 ASSERT(FileHandle == NULL);
263 ASSERT_EFI_ERROR(Status);
264
265 // get environment variable
266 // made for testing under nt32
267 ASSERT(StrCmp(ShellGetEnvironmentVariable(L"path"), L".;f8:\\efi\\tools;f8:\\efi\\boot;f8:\\;f9:\\efi\\tools;f9:\\efi\\boot;f9:\\") == 0);
268 Print(L"ShellGetEnvironmentVariable - pass\r\n");
269
270 // set environment variable
271 Status = ShellSetEnvironmentVariable(L"", L"", FALSE);
272 ASSERT(Status == EFI_UNSUPPORTED);
273 Print(L"ShellSetEnvironmentVariable - pass\r\n");
274
275 // ShellExecute
276 Status = ShellExecute(&ImageHandle, L"EmptyApplication.efi", TRUE, NULL, NULL);
277 ASSERT_EFI_ERROR(Status);
278 // the pass printout for this is performed by EmptyApplication
279 Print(L"\r\n");
280
281 // command line param functions
282 Status = ShellCommandLineParse(ParamList, &List, NULL, FALSE);
283 // if you put an invalid parameter you SHOULD hit this assert.
284 ASSERT_EFI_ERROR(Status);
285 if (List) {
286 ASSERT(ShellCommandLineGetFlag(List, L"/Param5") == FALSE);
287 ASSERT(ShellCommandLineGetFlag(List, L"/Param1") != FALSE);
288 ASSERT(StrCmp(ShellCommandLineGetValue(List, L"/Param2"), L"Val1")==0);
289 ASSERT(StrCmp(ShellCommandLineGetRawValue(List, 0), L"SimpleApplication")==0);
290
291 ShellCommandLineFreeVarList(List);
292 } else {
293 Print(L"param checking skipped.\r\n");
294 }
295
296 // page break mode (done last so we can see the results)
297 // we set this true at the begining of the program
298 // this is enough lines to trigger the page...
299 Print(L"1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n11\r\n12\r\n13\r\n14\r\n15\r\n16\r\n17\r\n18\r\n19\r\n20\r\n21\r\n22\r\n23\r\n24\r\n25\r\n26\r\n27\r\n28\r\n29\r\n30\r\n31\r\n");
300 ShellSetPageBreakMode(FALSE);
301 Print(L"1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n11\r\n12\r\n13\r\n14\r\n15\r\n16\r\n17\r\n18\r\n19\r\n20\r\n21\r\n22\r\n23\r\n24\r\n25\r\n26\r\n27\r\n28\r\n29\r\n30\r\n31\r\n32\r\n33\r\n34\r\n35\r\n36\r\n37\r\n38\r\n39\r\n40\r\n41\r\n42\r\n43\r\n44\r\n45\r\n46\r\n47\r\n48\r\n49\r\n50\r\n51\r\n52\r\n53\r\n54\r\n55\r\n56\r\n57\r\n58\r\n59\r\n60\r\n");
302
303 return EFI_SUCCESS;
304 }
305
306
307 /*
308 done - ShellGetFileInfo
309 done - ShellSetFileInfo
310 done - ShellOpenFileByDevicePath
311 done - ShellOpenFileByName
312 done - ShellCreateDirectory
313 done - ShellReadFile
314 done - ShellWriteFile
315 done - ShellCloseFile
316 done - ShellDeleteFile
317 done - ShellSetFilePosition
318 done - ShellGetFilePosition
319 ???? - ShellFlushFile
320 done - ShellFindFirstFile
321 done - ShellFindNextFile
322 done - ShellGetFileSize
323 done - ShellGetExecutionBreakFlag
324 done - ShellGetEnvironmentVariable
325 done - ShellSetEnvironmentVariable
326 done - ShellExecute
327 done - ShellGetCurrentDir
328 done - ShellSetPageBreakMode
329 done - ShellOpenFileMetaArg
330 done - ShellCloseFileMetaArg
331 done - ShellCommandLineParse
332 done - ShellCommandLineFreeVarList
333 done - ShellCommandLineGetFlag
334 done - ShellCommandLineGetValue
335 done - ShellCommandLineGetRawValue
336 */