/lib/libUPnP/Neptune/Source/Tests/FileTest1/FileTest1.cpp

https://github.com/MaDDoGo/xbmc · C++ · 340 lines · 282 code · 34 blank · 24 comment · 61 complexity · 4a5b4949198f911d05bf1e9ec92e507a MD5 · raw file

  1. /*****************************************************************
  2. |
  3. | File Test Program 1
  4. |
  5. | (c) 2005-2008 Gilles Boccon-Gibod
  6. | Author: Gilles Boccon-Gibod (bok@bok.net)
  7. |
  8. ****************************************************************/
  9. /*----------------------------------------------------------------------
  10. | includes
  11. +---------------------------------------------------------------------*/
  12. #include <stdlib.h>
  13. #include <stdio.h>
  14. #include <string.h>
  15. #include "Neptune.h"
  16. #include "NptDebug.h"
  17. /*----------------------------------------------------------------------
  18. | CreateNewFile
  19. +---------------------------------------------------------------------*/
  20. NPT_Result
  21. CreateNewFile(const char* filename, NPT_Size chunk_count, NPT_Size chunk_size=1)
  22. {
  23. NPT_File file(filename);
  24. NPT_CHECK(file.Open(NPT_FILE_OPEN_MODE_CREATE|NPT_FILE_OPEN_MODE_WRITE|NPT_FILE_OPEN_MODE_TRUNCATE));
  25. NPT_OutputStreamReference out;
  26. file.GetOutputStream(out);
  27. unsigned char* chunk_buffer = new unsigned char[chunk_size];
  28. for (unsigned int i=0; i<chunk_size; i++) {
  29. chunk_buffer[i] = (unsigned char)i;
  30. }
  31. for (unsigned int i=0; i<chunk_count; i++) {
  32. NPT_ASSERT(NPT_SUCCEEDED(out->WriteFully(chunk_buffer, chunk_size)));
  33. }
  34. delete[] chunk_buffer;
  35. file.Close();
  36. out = NULL;
  37. NPT_FileInfo info;
  38. NPT_Result result = NPT_File::GetInfo(filename, &info);
  39. NPT_ASSERT(NPT_SUCCEEDED(result));
  40. NPT_ASSERT(info.m_Size == (NPT_LargeSize)chunk_count*(NPT_LargeSize)chunk_size);
  41. return NPT_SUCCESS;
  42. }
  43. /*----------------------------------------------------------------------
  44. | main
  45. +---------------------------------------------------------------------*/
  46. int
  47. main(int argc, char** argv)
  48. {
  49. NPT_Result result;
  50. NPT_FileInfo info;
  51. NPT_ASSERT(NPT_File::GetInfo("foobar.doesnotexist", NULL) == NPT_ERROR_NO_SUCH_FILE);
  52. NPT_ASSERT(!NPT_File::Exists("foobar.doesnotexist"));
  53. // test special names
  54. NPT_File file(NPT_FILE_STANDARD_INPUT);
  55. NPT_ASSERT(NPT_SUCCEEDED(file.GetInfo(info)));
  56. NPT_ASSERT(info.m_Type == NPT_FileInfo::FILE_TYPE_SPECIAL);
  57. file = NPT_File(NPT_FILE_STANDARD_OUTPUT);
  58. NPT_ASSERT(NPT_SUCCEEDED(file.GetInfo(info)));
  59. NPT_ASSERT(info.m_Type == NPT_FileInfo::FILE_TYPE_SPECIAL);
  60. file = NPT_File(NPT_FILE_STANDARD_ERROR);
  61. NPT_ASSERT(NPT_SUCCEEDED(file.GetInfo(info)));
  62. NPT_ASSERT(info.m_Type == NPT_FileInfo::FILE_TYPE_SPECIAL);
  63. if (NPT_File::Exists("foobar.file1")) {
  64. result = NPT_File::RemoveFile("foobar.file1");
  65. NPT_ASSERT(NPT_SUCCEEDED(result));
  66. }
  67. result = CreateNewFile("foobar.file1", 9);
  68. NPT_ASSERT(NPT_SUCCEEDED(result));
  69. NPT_ASSERT(NPT_File::Exists("foobar.file1"));
  70. result = NPT_File::GetInfo("foobar.file1", &info);
  71. NPT_ASSERT(NPT_SUCCEEDED(result));
  72. NPT_ASSERT(info.m_Type == NPT_FileInfo::FILE_TYPE_REGULAR);
  73. NPT_ASSERT(info.m_Size == 9);
  74. {
  75. NPT_File f1("foobar.file1");
  76. result = f1.GetInfo(info);
  77. NPT_ASSERT(NPT_SUCCEEDED(result));
  78. NPT_ASSERT(info.m_Type == NPT_FileInfo::FILE_TYPE_REGULAR);
  79. NPT_ASSERT(info.m_Size == 9);
  80. }
  81. {
  82. NPT_File f1("foobar.file1");
  83. NPT_LargeSize size;
  84. result = f1.GetSize(size);
  85. NPT_ASSERT(NPT_SUCCEEDED(result));
  86. NPT_ASSERT(size == 9);
  87. }
  88. {
  89. NPT_File f1("foobar.file1");
  90. result = f1.Rename("foobar.file1-r");
  91. NPT_ASSERT(NPT_SUCCEEDED(result));
  92. NPT_ASSERT(f1.GetPath() == "foobar.file1-r");
  93. }
  94. NPT_ASSERT(NPT_File::Exists("foobar.file1-r"));
  95. result = NPT_File::GetInfo("foobar.file1-r", &info);
  96. NPT_ASSERT(NPT_SUCCEEDED(result));
  97. NPT_ASSERT(info.m_Type == NPT_FileInfo::FILE_TYPE_REGULAR);
  98. NPT_ASSERT(info.m_Size == 9);
  99. // dirs
  100. NPT_ASSERT(!NPT_File::Exists("foobar.dir"));
  101. result = NPT_File::CreateDir("foobar.dir");
  102. NPT_ASSERT(NPT_SUCCEEDED(result));
  103. result = NPT_File::GetInfo("foobar.dir", &info);
  104. NPT_ASSERT(NPT_SUCCEEDED(result));
  105. NPT_ASSERT(info.m_Type == NPT_FileInfo::FILE_TYPE_DIRECTORY);
  106. {
  107. NPT_File f1("foobar.dir");
  108. result = f1.GetInfo(info);
  109. NPT_ASSERT(NPT_SUCCEEDED(result));
  110. NPT_ASSERT(info.m_Type == NPT_FileInfo::FILE_TYPE_DIRECTORY);
  111. }
  112. NPT_String dirname = "foobar.dir";
  113. NPT_String fname;
  114. fname = dirname;
  115. fname += NPT_FilePath::Separator;
  116. fname += "file1";
  117. result = CreateNewFile(fname, 1);
  118. NPT_ASSERT(NPT_SUCCEEDED(result));
  119. fname = dirname;
  120. fname += NPT_FilePath::Separator;
  121. fname += "file2";
  122. result = CreateNewFile(fname, 2);
  123. NPT_ASSERT(NPT_SUCCEEDED(result));
  124. fname = dirname;
  125. fname += NPT_FilePath::Separator;
  126. fname += "file3";
  127. result = CreateNewFile(fname, 3);
  128. NPT_ASSERT(NPT_SUCCEEDED(result));
  129. NPT_List<NPT_String> entries;
  130. result = NPT_File::ListDir("foobar.dir", entries);
  131. NPT_ASSERT(NPT_SUCCEEDED(result));
  132. NPT_ASSERT(entries.GetItemCount() == 3);
  133. result = NPT_File::RemoveFile("foobar.dir");
  134. NPT_ASSERT(NPT_FAILED(result));
  135. result = NPT_File::RemoveDir("foobar.dir");
  136. NPT_ASSERT(result == NPT_ERROR_DIRECTORY_NOT_EMPTY);
  137. result = NPT_File::Rename("foobar.dir", "foobar.dir-r");
  138. NPT_ASSERT(NPT_SUCCEEDED(result));
  139. dirname = "foobar.dir-r";
  140. fname = dirname;
  141. fname += NPT_FilePath::Separator;
  142. fname += "file1";
  143. result = NPT_File::RemoveFile(fname);
  144. NPT_ASSERT(NPT_SUCCEEDED(result));
  145. fname = dirname;
  146. fname += NPT_FilePath::Separator;
  147. fname += "file2";
  148. result = NPT_File::RemoveFile(fname);
  149. NPT_ASSERT(NPT_SUCCEEDED(result));
  150. fname = dirname;
  151. fname += NPT_FilePath::Separator;
  152. fname += "file3";
  153. result = NPT_File::RemoveFile(fname);
  154. NPT_ASSERT(NPT_SUCCEEDED(result));
  155. result = NPT_File::RemoveDir("foobar.dir-r");
  156. NPT_ASSERT(NPT_SUCCEEDED(result));
  157. NPT_ASSERT(!NPT_File::Exists("foobar.dir-r"));
  158. // paths
  159. NPT_String test;
  160. test = NPT_FilePath::BaseName("");
  161. NPT_ASSERT(test == "");
  162. test = NPT_FilePath::BaseName("a");
  163. NPT_ASSERT(test == "a");
  164. test = NPT_FilePath::BaseName("a"+NPT_FilePath::Separator+"b");
  165. NPT_ASSERT(test == "b");
  166. test = NPT_FilePath::BaseName("a"+NPT_FilePath::Separator+"b"+NPT_FilePath::Separator);
  167. NPT_ASSERT(test == "");
  168. test = NPT_FilePath::BaseName(NPT_FilePath::Separator+"a");
  169. NPT_ASSERT(test == "a");
  170. test = NPT_FilePath::BaseName(NPT_FilePath::Separator);
  171. NPT_ASSERT(test == "");
  172. test = NPT_FilePath::DirName("");
  173. NPT_ASSERT(test == "");
  174. test = NPT_FilePath::DirName("a");
  175. NPT_ASSERT(test == "");
  176. test = NPT_FilePath::DirName("a"+NPT_FilePath::Separator+"b");
  177. NPT_ASSERT(test == "a");
  178. test = NPT_FilePath::DirName("a"+NPT_FilePath::Separator+"b"+NPT_FilePath::Separator);
  179. NPT_ASSERT(test == "a"+NPT_FilePath::Separator+"b");
  180. test = NPT_FilePath::DirName(NPT_FilePath::Separator+"a");
  181. NPT_ASSERT(test == NPT_FilePath::Separator);
  182. test = NPT_FilePath::DirName(NPT_FilePath::Separator);
  183. NPT_ASSERT(test == NPT_FilePath::Separator);
  184. // small files
  185. result = CreateNewFile("small.bin", 0x100, 0x107);
  186. NPT_ASSERT(NPT_SUCCEEDED(result));
  187. file = NPT_File("small.bin");
  188. result = file.Open(NPT_FILE_OPEN_MODE_READ);
  189. NPT_ASSERT(NPT_SUCCEEDED(result));
  190. NPT_InputStreamReference input;
  191. file.GetInputStream(input);
  192. NPT_Position position;
  193. result = input->Tell(position);
  194. NPT_ASSERT(NPT_SUCCEEDED(result));
  195. NPT_ASSERT(position == 0);
  196. NPT_LargeSize large_size = (NPT_LargeSize)0x107 * (NPT_LargeSize)0x100;
  197. result = input->Seek(large_size-0x107);
  198. NPT_ASSERT(NPT_SUCCEEDED(result));
  199. result = input->Tell(position);
  200. NPT_ASSERT(NPT_SUCCEEDED(result));
  201. NPT_ASSERT(position == large_size-0x107);
  202. unsigned char* buffer = new unsigned char[0x107];
  203. result = input->ReadFully(buffer, 0x107);
  204. NPT_ASSERT(NPT_SUCCEEDED(result));
  205. result = input->Tell(position);
  206. NPT_ASSERT(NPT_SUCCEEDED(result));
  207. NPT_ASSERT(position == large_size);
  208. for (unsigned int i=0; i<0x107; i++) {
  209. NPT_ASSERT(buffer[i] == (unsigned char)i);
  210. }
  211. file.Close();
  212. NPT_File::RemoveFile(file.GetPath());
  213. // large files
  214. if (argc == 2) {
  215. result = CreateNewFile(argv[1], 0x10000, 0x10007);
  216. NPT_ASSERT(NPT_SUCCEEDED(result));
  217. NPT_String new_name = argv[1];
  218. new_name += ".renamed";
  219. result = NPT_File::Rename(argv[1], new_name);
  220. NPT_ASSERT(NPT_SUCCEEDED(result));
  221. file = NPT_File(new_name);
  222. result = file.Open(NPT_FILE_OPEN_MODE_READ);
  223. NPT_ASSERT(NPT_SUCCEEDED(result));
  224. file.GetInputStream(input);
  225. result = input->Tell(position);
  226. NPT_ASSERT(NPT_SUCCEEDED(result));
  227. NPT_ASSERT(position == 0);
  228. large_size = (NPT_LargeSize)0x10007 * (NPT_LargeSize)0x10000;
  229. result = input->Seek(large_size-0x10007);
  230. NPT_ASSERT(NPT_SUCCEEDED(result));
  231. result = input->Tell(position);
  232. NPT_ASSERT(NPT_SUCCEEDED(result));
  233. NPT_ASSERT(position == large_size-0x10007);
  234. buffer = new unsigned char[0x10007];
  235. result = input->ReadFully(buffer, 0x10007);
  236. NPT_ASSERT(NPT_SUCCEEDED(result));
  237. result = input->Tell(position);
  238. NPT_ASSERT(NPT_SUCCEEDED(result));
  239. NPT_ASSERT(position == large_size);
  240. for (unsigned int i=0; i<0x10007; i++) {
  241. NPT_ASSERT(buffer[i] == (unsigned char)i);
  242. }
  243. file.Close();
  244. NPT_File::RemoveFile(new_name);
  245. }
  246. // test dynamic size
  247. //NPT_LargeSize size;
  248. unsigned char buff[16] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};
  249. const char* filename = "pi.\xCF\x80.test";
  250. NPT_TimeInterval wait(2.0f);
  251. if (argc > 1) {
  252. filename = argv[1];
  253. }
  254. NPT_File file1(filename);
  255. NPT_OutputStreamReference output;
  256. NPT_ASSERT(NPT_SUCCEEDED(file1.Open(NPT_FILE_OPEN_MODE_CREATE | NPT_FILE_OPEN_MODE_WRITE | NPT_FILE_OPEN_MODE_READ | NPT_FILE_OPEN_MODE_TRUNCATE)));
  257. NPT_ASSERT(NPT_SUCCEEDED(file1.GetSize(size)));
  258. NPT_ASSERT(size == 0);
  259. NPT_ASSERT(NPT_SUCCEEDED(file1.GetOutputStream(output)));
  260. NPT_ASSERT(NPT_SUCCEEDED(file1.GetInputStream(input)));
  261. NPT_ASSERT(NPT_SUCCEEDED(output->Tell(position)));
  262. NPT_ASSERT(position == 0);
  263. NPT_ASSERT(NPT_SUCCEEDED(input->Tell(position)));
  264. NPT_ASSERT(position == 0);
  265. NPT_ASSERT(NPT_SUCCEEDED(output->WriteFully(buff, 16)));
  266. output->Flush();
  267. NPT_System::Sleep(wait);
  268. NPT_ASSERT(NPT_SUCCEEDED(file1.GetSize(size)));
  269. NPT_ASSERT(size == 16);
  270. NPT_ASSERT(NPT_SUCCEEDED(output->Tell(position)));
  271. NPT_ASSERT(NPT_SUCCEEDED(input->GetSize(size)));
  272. NPT_ASSERT(size == 16);
  273. NPT_ASSERT(position == 16);
  274. NPT_ASSERT(NPT_SUCCEEDED(input->Tell(position)));
  275. NPT_ASSERT(position == 16);
  276. NPT_ASSERT(NPT_SUCCEEDED(output->Seek(8)));
  277. NPT_ASSERT(NPT_SUCCEEDED(output->Tell(position)));
  278. NPT_ASSERT(position == 8);
  279. NPT_File file2(filename);
  280. NPT_InputStreamReference input2;
  281. NPT_ASSERT(NPT_SUCCEEDED(file2.Open(NPT_FILE_OPEN_MODE_READ)));
  282. NPT_ASSERT(NPT_SUCCEEDED(file2.GetSize(size)));
  283. NPT_ASSERT(size == 16);
  284. NPT_ASSERT(NPT_SUCCEEDED(file2.GetInputStream(input2)));
  285. NPT_ASSERT(NPT_SUCCEEDED(input2->GetSize(size)));
  286. NPT_ASSERT(size == 16);
  287. NPT_ASSERT(NPT_SUCCEEDED(input2->Tell(position)));
  288. NPT_ASSERT(position == 0);
  289. NPT_ASSERT(NPT_SUCCEEDED(input2->Seek(8)));
  290. NPT_ASSERT(NPT_SUCCEEDED(input2->Tell(position)));
  291. NPT_ASSERT(position == 8);
  292. NPT_ASSERT(NPT_SUCCEEDED(output->WriteFully(buff, 16)));
  293. output->Flush();
  294. NPT_System::Sleep(wait);
  295. NPT_ASSERT(NPT_SUCCEEDED(file2.GetSize(size)));
  296. NPT_ASSERT(size == 24);
  297. NPT_ASSERT(NPT_SUCCEEDED(output->Tell(position)));
  298. NPT_ASSERT(position == 24);
  299. NPT_ASSERT(NPT_SUCCEEDED(input->Tell(position)));
  300. NPT_ASSERT(position == 24);
  301. NPT_ASSERT(NPT_SUCCEEDED(input2->GetSize(size)));
  302. NPT_ASSERT(size == 24);
  303. NPT_ASSERT(NPT_SUCCEEDED(input2->Seek(20)));
  304. NPT_ASSERT(NPT_SUCCEEDED(input2->Read(buff, 4, NULL)));
  305. return 0;
  306. }