tagfile_test.cc 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  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. }
  31. TEST(TagFileTest,MultipleSections)
  32. {
  33. FileFd fd;
  34. createTemporaryFile("bigsection", fd, NULL, "Package: pkgA\n"
  35. "Version: 1\n"
  36. "Size: 100\n"
  37. "Description: aaa\n"
  38. " aaa\n"
  39. "\n"
  40. "Package: pkgB\n"
  41. "Version: 1\n"
  42. "Flag: no\n"
  43. "Description: bbb\n"
  44. "\n"
  45. "Package: pkgC\n"
  46. "Version: 2\n"
  47. "Flag: yes\n"
  48. "Description:\n"
  49. " ccc\n"
  50. );
  51. pkgTagFile tfile(&fd);
  52. pkgTagSection section;
  53. EXPECT_FALSE(section.Exists("Version"));
  54. EXPECT_TRUE(tfile.Step(section));
  55. EXPECT_EQ(4, section.Count());
  56. EXPECT_TRUE(section.Exists("Version"));
  57. EXPECT_TRUE(section.Exists("Package"));
  58. EXPECT_TRUE(section.Exists("Size"));
  59. EXPECT_FALSE(section.Exists("Flag"));
  60. EXPECT_TRUE(section.Exists("Description"));
  61. EXPECT_EQ("pkgA", section.FindS("Package"));
  62. EXPECT_EQ("1", section.FindS("Version"));
  63. EXPECT_EQ(1, section.FindULL("Version"));
  64. EXPECT_EQ(100, section.FindULL("Size"));
  65. unsigned long Flags = 1;
  66. EXPECT_TRUE(section.FindFlag("Flag", Flags, 1));
  67. EXPECT_EQ(1, Flags);
  68. Flags = 0;
  69. EXPECT_TRUE(section.FindFlag("Flag", Flags, 1));
  70. EXPECT_EQ(0, Flags);
  71. EXPECT_EQ("aaa\n aaa", section.FindS("Description"));
  72. EXPECT_TRUE(tfile.Step(section));
  73. EXPECT_EQ(4, section.Count());
  74. EXPECT_TRUE(section.Exists("Version"));
  75. EXPECT_TRUE(section.Exists("Package"));
  76. EXPECT_FALSE(section.Exists("Size"));
  77. EXPECT_TRUE(section.Exists("Flag"));
  78. EXPECT_TRUE(section.Exists("Description"));
  79. EXPECT_EQ("pkgB", section.FindS("Package"));
  80. EXPECT_EQ("1", section.FindS("Version"));
  81. EXPECT_EQ(1, section.FindULL("Version"));
  82. EXPECT_EQ(0, section.FindULL("Size"));
  83. Flags = 1;
  84. EXPECT_TRUE(section.FindFlag("Flag", Flags, 1));
  85. EXPECT_EQ(0, Flags);
  86. Flags = 0;
  87. EXPECT_TRUE(section.FindFlag("Flag", Flags, 1));
  88. EXPECT_EQ(0, Flags);
  89. EXPECT_EQ("bbb", section.FindS("Description"));
  90. EXPECT_TRUE(tfile.Step(section));
  91. EXPECT_EQ(4, section.Count());
  92. EXPECT_TRUE(section.Exists("Version"));
  93. EXPECT_TRUE(section.Exists("Package"));
  94. EXPECT_FALSE(section.Exists("Size"));
  95. EXPECT_TRUE(section.Exists("Flag"));
  96. EXPECT_TRUE(section.Exists("Description"));
  97. EXPECT_EQ("pkgC", section.FindS("Package"));
  98. EXPECT_EQ("2", section.FindS("Version"));
  99. EXPECT_EQ(2, section.FindULL("Version"));
  100. Flags = 0;
  101. EXPECT_TRUE(section.FindFlag("Flag", Flags, 1));
  102. EXPECT_EQ(1, Flags);
  103. Flags = 1;
  104. EXPECT_TRUE(section.FindFlag("Flag", Flags, 1));
  105. EXPECT_EQ(1, Flags);
  106. EXPECT_EQ("ccc", section.FindS("Description"));
  107. // There is no section left in this tag file
  108. EXPECT_FALSE(tfile.Step(section));
  109. }
  110. TEST(TagFileTest,BigSection)
  111. {
  112. size_t const count = 500;
  113. std::stringstream content;
  114. for (size_t i = 0; i < count; ++i)
  115. content << "Field-" << i << ": " << (2000 + i) << std::endl;
  116. FileFd fd;
  117. createTemporaryFile("bigsection", fd, NULL, content.str().c_str());
  118. pkgTagFile tfile(&fd);
  119. pkgTagSection section;
  120. EXPECT_TRUE(tfile.Step(section));
  121. EXPECT_EQ(count, section.Count());
  122. for (size_t i = 0; i < count; ++i)
  123. {
  124. std::stringstream name;
  125. name << "Field-" << i;
  126. EXPECT_TRUE(section.Exists(name.str().c_str())) << name.str() << " does not exist";
  127. EXPECT_EQ((2000 + i), section.FindULL(name.str().c_str()));
  128. }
  129. // There is only one section in this tag file
  130. EXPECT_FALSE(tfile.Step(section));
  131. }
  132. TEST(TagFileTest, PickedUpFromPreviousCall)
  133. {
  134. size_t const count = 500;
  135. std::stringstream contentstream;
  136. for (size_t i = 0; i < count; ++i)
  137. contentstream << "Field-" << i << ": " << (2000 + i) << std::endl;
  138. contentstream << std::endl << std::endl;
  139. std::string content = contentstream.str();
  140. pkgTagSection section;
  141. EXPECT_FALSE(section.Scan(content.c_str(), content.size()/2));
  142. EXPECT_NE(0, section.Count());
  143. EXPECT_NE(count, section.Count());
  144. EXPECT_TRUE(section.Scan(content.c_str(), content.size(), false));
  145. EXPECT_EQ(count, section.Count());
  146. for (size_t i = 0; i < count; ++i)
  147. {
  148. std::stringstream name;
  149. name << "Field-" << i;
  150. EXPECT_TRUE(section.Exists(name.str().c_str())) << name.str() << " does not exist";
  151. EXPECT_EQ((2000 + i), section.FindULL(name.str().c_str()));
  152. }
  153. }
  154. TEST(TagFileTest, SpacesEverywhere)
  155. {
  156. std::string content =
  157. "Package: pkgA\n"
  158. "Package: pkgB\n"
  159. "NoSpaces:yes\n"
  160. "TagSpaces\t :yes\n"
  161. "ValueSpaces: \tyes\n"
  162. "BothSpaces \t:\t yes\n"
  163. "TrailingSpaces: yes\t \n"
  164. "Naming Space: yes\n"
  165. "Naming Spaces: yes\n"
  166. "Package : pkgC \n"
  167. "Multi-Colon::yes:\n"
  168. "\n\n";
  169. pkgTagSection section;
  170. EXPECT_TRUE(section.Scan(content.c_str(), content.size()));
  171. EXPECT_TRUE(section.Exists("Package"));
  172. EXPECT_TRUE(section.Exists("NoSpaces"));
  173. EXPECT_TRUE(section.Exists("TagSpaces"));
  174. EXPECT_TRUE(section.Exists("ValueSpaces"));
  175. EXPECT_TRUE(section.Exists("BothSpaces"));
  176. EXPECT_TRUE(section.Exists("TrailingSpaces"));
  177. EXPECT_TRUE(section.Exists("Naming Space"));
  178. EXPECT_TRUE(section.Exists("Naming Spaces"));
  179. EXPECT_TRUE(section.Exists("Multi-Colon"));
  180. EXPECT_EQ("pkgC", section.FindS("Package"));
  181. EXPECT_EQ("yes", section.FindS("NoSpaces"));
  182. EXPECT_EQ("yes", section.FindS("TagSpaces"));
  183. EXPECT_EQ("yes", section.FindS("ValueSpaces"));
  184. EXPECT_EQ("yes", section.FindS("BothSpaces"));
  185. EXPECT_EQ("yes", section.FindS("TrailingSpaces"));
  186. EXPECT_EQ("yes", section.FindS("Naming Space"));
  187. EXPECT_EQ("yes", section.FindS("Naming Spaces"));
  188. EXPECT_EQ(":yes:", section.FindS("Multi-Colon"));
  189. // overridden values are still present, but not really accessible
  190. EXPECT_EQ(11, section.Count());
  191. }