tagfile_test.cc 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. #include <config.h>
  2. #include <apt-pkg/fileutl.h>
  3. #include <apt-pkg/tagfile.h>
  4. #include <string>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <unistd.h>
  8. #include <sstream>
  9. #include <gtest/gtest.h>
  10. #include "file-helpers.h"
  11. TEST(TagFileTest,SingleField)
  12. {
  13. FileFd fd;
  14. createTemporaryFile("singlefield", fd, NULL, "FieldA-12345678: the value of the field");
  15. pkgTagFile tfile(&fd);
  16. pkgTagSection section;
  17. ASSERT_TRUE(tfile.Step(section));
  18. // It has one field
  19. EXPECT_EQ(1, section.Count());
  20. // ... and it is called FieldA-12345678
  21. EXPECT_TRUE(section.Exists("FieldA-12345678"));
  22. // its value is correct
  23. EXPECT_EQ("the value of the field", section.FindS("FieldA-12345678"));
  24. // A non-existent field has an empty string as value
  25. EXPECT_EQ("", section.FindS("FieldB-12345678"));
  26. // ... and Exists does not lie about missing fields...
  27. EXPECT_FALSE(section.Exists("FieldB-12345678"));
  28. // There is only one section in this tag file
  29. EXPECT_FALSE(tfile.Step(section));
  30. // Now we scan an empty section to test reset
  31. ASSERT_TRUE(section.Scan("\n\n", 2, true));
  32. EXPECT_EQ(0, section.Count());
  33. EXPECT_FALSE(section.Exists("FieldA-12345678"));
  34. EXPECT_FALSE(section.Exists("FieldB-12345678"));
  35. }
  36. TEST(TagFileTest,MultipleSections)
  37. {
  38. FileFd fd;
  39. createTemporaryFile("bigsection", fd, NULL, "Package: pkgA\n"
  40. "Version: 1\n"
  41. "Size: 100\n"
  42. "Description: aaa\n"
  43. " aaa\n"
  44. "\n"
  45. "Package: pkgB\n"
  46. "Version: 1\n"
  47. "Flag: no\n"
  48. "Description: bbb\n"
  49. "\n"
  50. "Package: pkgC\n"
  51. "Version: 2\n"
  52. "Flag: yes\n"
  53. "Description:\n"
  54. " ccc\n"
  55. );
  56. pkgTagFile tfile(&fd);
  57. pkgTagSection section;
  58. EXPECT_FALSE(section.Exists("Version"));
  59. EXPECT_TRUE(tfile.Step(section));
  60. EXPECT_EQ(4, section.Count());
  61. EXPECT_TRUE(section.Exists("Version"));
  62. EXPECT_TRUE(section.Exists("Package"));
  63. EXPECT_TRUE(section.Exists("Size"));
  64. EXPECT_FALSE(section.Exists("Flag"));
  65. EXPECT_TRUE(section.Exists("Description"));
  66. EXPECT_EQ("pkgA", section.FindS("Package"));
  67. EXPECT_EQ("1", section.FindS("Version"));
  68. EXPECT_EQ(1, section.FindULL("Version"));
  69. EXPECT_EQ(100, section.FindULL("Size"));
  70. unsigned long Flags = 1;
  71. EXPECT_TRUE(section.FindFlag("Flag", Flags, 1));
  72. EXPECT_EQ(1, Flags);
  73. Flags = 0;
  74. EXPECT_TRUE(section.FindFlag("Flag", Flags, 1));
  75. EXPECT_EQ(0, Flags);
  76. EXPECT_EQ("aaa\n aaa", section.FindS("Description"));
  77. EXPECT_TRUE(tfile.Step(section));
  78. EXPECT_EQ(4, section.Count());
  79. EXPECT_TRUE(section.Exists("Version"));
  80. EXPECT_TRUE(section.Exists("Package"));
  81. EXPECT_FALSE(section.Exists("Size"));
  82. EXPECT_TRUE(section.Exists("Flag"));
  83. EXPECT_TRUE(section.Exists("Description"));
  84. EXPECT_EQ("pkgB", section.FindS("Package"));
  85. EXPECT_EQ("1", section.FindS("Version"));
  86. EXPECT_EQ(1, section.FindULL("Version"));
  87. EXPECT_EQ(0, section.FindULL("Size"));
  88. Flags = 1;
  89. EXPECT_TRUE(section.FindFlag("Flag", Flags, 1));
  90. EXPECT_EQ(0, Flags);
  91. Flags = 0;
  92. EXPECT_TRUE(section.FindFlag("Flag", Flags, 1));
  93. EXPECT_EQ(0, Flags);
  94. EXPECT_EQ("bbb", section.FindS("Description"));
  95. EXPECT_TRUE(tfile.Step(section));
  96. EXPECT_EQ(4, section.Count());
  97. EXPECT_TRUE(section.Exists("Version"));
  98. EXPECT_TRUE(section.Exists("Package"));
  99. EXPECT_FALSE(section.Exists("Size"));
  100. EXPECT_TRUE(section.Exists("Flag"));
  101. EXPECT_TRUE(section.Exists("Description"));
  102. EXPECT_EQ("pkgC", section.FindS("Package"));
  103. EXPECT_EQ("2", section.FindS("Version"));
  104. EXPECT_EQ(2, section.FindULL("Version"));
  105. Flags = 0;
  106. EXPECT_TRUE(section.FindFlag("Flag", Flags, 1));
  107. EXPECT_EQ(1, Flags);
  108. Flags = 1;
  109. EXPECT_TRUE(section.FindFlag("Flag", Flags, 1));
  110. EXPECT_EQ(1, Flags);
  111. EXPECT_EQ("ccc", section.FindS("Description"));
  112. // There is no section left in this tag file
  113. EXPECT_FALSE(tfile.Step(section));
  114. }
  115. TEST(TagFileTest,BigSection)
  116. {
  117. size_t const count = 500;
  118. std::stringstream content;
  119. for (size_t i = 0; i < count; ++i)
  120. content << "Field-" << i << ": " << (2000 + i) << std::endl;
  121. FileFd fd;
  122. createTemporaryFile("bigsection", fd, NULL, content.str().c_str());
  123. pkgTagFile tfile(&fd);
  124. pkgTagSection section;
  125. EXPECT_TRUE(tfile.Step(section));
  126. EXPECT_EQ(count, section.Count());
  127. for (size_t i = 0; i < count; ++i)
  128. {
  129. std::stringstream name;
  130. name << "Field-" << i;
  131. EXPECT_TRUE(section.Exists(name.str().c_str())) << name.str() << " does not exist";
  132. EXPECT_EQ((2000 + i), section.FindULL(name.str().c_str()));
  133. }
  134. // There is only one section in this tag file
  135. EXPECT_FALSE(tfile.Step(section));
  136. }
  137. TEST(TagFileTest, PickedUpFromPreviousCall)
  138. {
  139. size_t const count = 500;
  140. std::stringstream contentstream;
  141. for (size_t i = 0; i < count; ++i)
  142. contentstream << "Field-" << i << ": " << (2000 + i) << std::endl;
  143. contentstream << std::endl << std::endl;
  144. std::string content = contentstream.str();
  145. pkgTagSection section;
  146. EXPECT_FALSE(section.Scan(content.c_str(), content.size()/2));
  147. EXPECT_NE(0, section.Count());
  148. EXPECT_NE(count, section.Count());
  149. EXPECT_TRUE(section.Scan(content.c_str(), content.size(), false));
  150. EXPECT_EQ(count, section.Count());
  151. for (size_t i = 0; i < count; ++i)
  152. {
  153. std::stringstream name;
  154. name << "Field-" << i;
  155. EXPECT_TRUE(section.Exists(name.str().c_str())) << name.str() << " does not exist";
  156. EXPECT_EQ((2000 + i), section.FindULL(name.str().c_str()));
  157. }
  158. }
  159. TEST(TagFileTest, SpacesEverywhere)
  160. {
  161. std::string content =
  162. "Package: pkgA\n"
  163. "Package: pkgB\n"
  164. "NoSpaces:yes\n"
  165. "TagSpaces\t :yes\n"
  166. "ValueSpaces: \tyes\n"
  167. "BothSpaces \t:\t yes\n"
  168. "TrailingSpaces: yes\t \n"
  169. "Naming Space: yes\n"
  170. "Naming Spaces: yes\n"
  171. "Package : pkgC \n"
  172. "Multi-Colon::yes:\n"
  173. "\n\n";
  174. pkgTagSection section;
  175. EXPECT_TRUE(section.Scan(content.c_str(), content.size()));
  176. EXPECT_TRUE(section.Exists("Package"));
  177. EXPECT_TRUE(section.Exists("NoSpaces"));
  178. EXPECT_TRUE(section.Exists("TagSpaces"));
  179. EXPECT_TRUE(section.Exists("ValueSpaces"));
  180. EXPECT_TRUE(section.Exists("BothSpaces"));
  181. EXPECT_TRUE(section.Exists("TrailingSpaces"));
  182. EXPECT_TRUE(section.Exists("Naming Space"));
  183. EXPECT_TRUE(section.Exists("Naming Spaces"));
  184. EXPECT_TRUE(section.Exists("Multi-Colon"));
  185. EXPECT_EQ("pkgC", section.FindS("Package"));
  186. EXPECT_EQ("yes", section.FindS("NoSpaces"));
  187. EXPECT_EQ("yes", section.FindS("TagSpaces"));
  188. EXPECT_EQ("yes", section.FindS("ValueSpaces"));
  189. EXPECT_EQ("yes", section.FindS("BothSpaces"));
  190. EXPECT_EQ("yes", section.FindS("TrailingSpaces"));
  191. EXPECT_EQ("yes", section.FindS("Naming Space"));
  192. EXPECT_EQ("yes", section.FindS("Naming Spaces"));
  193. EXPECT_EQ(":yes:", section.FindS("Multi-Colon"));
  194. // overridden values are still present, but not really accessible
  195. EXPECT_EQ(11, section.Count());
  196. }