| 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 | } |