| Ed Tanous | 10c5765 | 2025-09-30 10:24:57 -0700 | [diff] [blame] | 1 | #include "fru_device/gzip_utils.hpp" | 
 | 2 |  | 
 | 3 | #include <algorithm> | 
 | 4 | #include <array> | 
 | 5 | #include <iterator> | 
 | 6 | #include <ranges> | 
 | 7 |  | 
 | 8 | #include "gmock/gmock.h" | 
 | 9 | #include "gtest/gtest.h" | 
 | 10 |  | 
 | 11 | TEST(GzipUtils, EmptyCompressed) | 
 | 12 | { | 
 | 13 |     std::vector<uint8_t> compressed = {}; | 
 | 14 |     std::optional<std::string> uncompressed = gzipInflate(compressed); | 
 | 15 |     EXPECT_EQ(uncompressed, std::nullopt); | 
 | 16 | } | 
 | 17 |  | 
 | 18 | TEST(GzipUtils, GoodCompressed) | 
 | 19 | { | 
 | 20 |     // Empty file created with | 
 | 21 |     // touch foo && gzip -c foo | xxd -i | 
 | 22 |     std::array<uint8_t, 24> emptyCompressed{ | 
 | 23 |         0x1f, 0x8b, 0x08, 0x08, 0x16, 0x37, 0xdc, 0x68, 0x00, 0x03, 0x66, 0x6f, | 
 | 24 |         0x6f, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; | 
 | 25 |     std::optional<std::string> uncompressed = gzipInflate(emptyCompressed); | 
 | 26 |     ASSERT_NE(uncompressed, std::nullopt); | 
 | 27 |     if (uncompressed) | 
 | 28 |     { | 
 | 29 |         EXPECT_EQ(uncompressed->size(), 0U); | 
 | 30 |     } | 
 | 31 | } | 
 | 32 |  | 
 | 33 | TEST(GzipUtils, 100kcompressedZeros) | 
 | 34 | { | 
 | 35 |     // File created with | 
 | 36 |     // dd if=/dev/zero of=10kfile bs=10k count=1 && gzip -c 10kfile | xxd -i | 
 | 37 |     std::array<uint8_t, 53> emptyCompressed{ | 
 | 38 |         0x1f, 0x8b, 0x08, 0x08, 0xcb, 0x37, 0xdc, 0x68, 0x00, 0x03, 0x31, | 
 | 39 |         0x30, 0x6b, 0x66, 0x69, 0x6c, 0x65, 0x00, 0xed, 0xc1, 0x01, 0x0d, | 
 | 40 |         0x00, 0x00, 0x00, 0xc2, 0xa0, 0xf7, 0x4f, 0x6d, 0x0e, 0x37, 0xa0, | 
 | 41 |         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x37, | 
 | 42 |         0x03, 0x9a, 0xde, 0x1d, 0x27, 0x00, 0x28, 0x00, 0x00}; | 
 | 43 |     std::optional<std::string> uncompressed = gzipInflate(emptyCompressed); | 
 | 44 |     ASSERT_NE(uncompressed, std::nullopt); | 
 | 45 |     if (uncompressed) | 
 | 46 |     { | 
 | 47 |         EXPECT_EQ(uncompressed->size(), 10240U); | 
 | 48 |         EXPECT_TRUE(std::ranges::all_of(*uncompressed, [](uint8_t c) { | 
 | 49 |             return c == 0U; | 
 | 50 |         })); | 
 | 51 |     } | 
 | 52 | } | 
 | 53 |  | 
 | 54 | using ::testing::ElementsAre; | 
 | 55 | using ::testing::IsEmpty; | 
 | 56 |  | 
 | 57 | TEST(GzipUtils, getNodeFromXml) | 
 | 58 | { | 
 | 59 |     constexpr std::string_view xml = R"(<?xml version="1.0" encoding="UTF-8"?> | 
 | 60 |         <bookstore> | 
 | 61 |           <book category="cooking"> | 
 | 62 |             <title lang="en">Everyday Italian</title> | 
 | 63 |             <author>Giada De Laurentiis</author> | 
 | 64 |             <year>2005</year> | 
 | 65 |             <price>30.00</price> | 
 | 66 |           </book> | 
 | 67 |         </bookstore> | 
 | 68 |     )"; | 
 | 69 |  | 
 | 70 |     EXPECT_THAT(getNodeFromXml(xml, "/bookstore/book/title"), | 
 | 71 |                 ElementsAre("Everyday Italian")); | 
 | 72 |     EXPECT_THAT(getNodeFromXml(xml, "/bookstore/book/author"), | 
 | 73 |                 ElementsAre("Giada De Laurentiis")); | 
 | 74 |     EXPECT_THAT(getNodeFromXml(xml, "/bookstore/book/year"), | 
 | 75 |                 ElementsAre("2005")); | 
 | 76 |     EXPECT_THAT(getNodeFromXml(xml, "/bookstore/book/price"), | 
 | 77 |                 ElementsAre("30.00")); | 
 | 78 |     EXPECT_THAT(getNodeFromXml(xml, "//book/title"), | 
 | 79 |                 ElementsAre("Everyday Italian")); | 
 | 80 |     EXPECT_THAT(getNodeFromXml(xml, "//book/author"), | 
 | 81 |                 ElementsAre("Giada De Laurentiis")); | 
 | 82 |     EXPECT_THAT(getNodeFromXml(xml, "//book/year"), ElementsAre("2005")); | 
 | 83 |     EXPECT_THAT(getNodeFromXml(xml, "//book/price"), ElementsAre("30.00")); | 
 | 84 |     EXPECT_THAT(getNodeFromXml(xml, "///title"), | 
 | 85 |                 ElementsAre("Everyday Italian")); | 
 | 86 |     EXPECT_THAT(getNodeFromXml(xml, "///author"), | 
 | 87 |                 ElementsAre("Giada De Laurentiis")); | 
 | 88 |     EXPECT_THAT(getNodeFromXml(xml, "///year"), ElementsAre("2005")); | 
 | 89 |     EXPECT_THAT(getNodeFromXml(xml, "///price"), ElementsAre("30.00")); | 
 | 90 |  | 
 | 91 |     EXPECT_THAT(getNodeFromXml(xml, "/bookstore/book/noexist"), IsEmpty()); | 
 | 92 |     EXPECT_THAT(getNodeFromXml(xml, "/bookstore/noexist/title"), IsEmpty()); | 
 | 93 |     EXPECT_THAT(getNodeFromXml(xml, "/noexist/book/title"), IsEmpty()); | 
 | 94 |     EXPECT_THAT(getNodeFromXml(xml, "//book/noexist"), IsEmpty()); | 
 | 95 |     EXPECT_THAT(getNodeFromXml(xml, "//noexist/title"), IsEmpty()); | 
 | 96 |     EXPECT_THAT(getNodeFromXml(xml, "///noexist"), IsEmpty()); | 
 | 97 |  | 
 | 98 |     // invalid xpath | 
 | 99 |     EXPECT_THAT(getNodeFromXml(xml, "foo"), IsEmpty()); | 
 | 100 |     EXPECT_THAT(getNodeFromXml(xml, "foo/bar"), IsEmpty()); | 
 | 101 |     EXPECT_THAT(getNodeFromXml(xml, "?"), IsEmpty()); | 
 | 102 | } |