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