1 // SPDX-License-Identifier: Apache-2.0 2 // SPDX-FileCopyrightText: Copyright OpenBMC Authors 3 #include "http_utility.hpp" 4 5 #include <array> 6 7 #include <gtest/gtest.h> 8 9 namespace http_helpers 10 { 11 namespace 12 { 13 14 TEST(isContentTypeAllowed, PositiveTest) 15 { 16 EXPECT_TRUE(isContentTypeAllowed("*/*", ContentType::HTML, true)); 17 EXPECT_TRUE(isContentTypeAllowed("application/octet-stream", 18 ContentType::OctetStream, false)); 19 EXPECT_TRUE(isContentTypeAllowed("text/html", ContentType::HTML, false)); 20 EXPECT_TRUE( 21 isContentTypeAllowed("application/json", ContentType::JSON, false)); 22 EXPECT_TRUE( 23 isContentTypeAllowed("application/cbor", ContentType::CBOR, false)); 24 EXPECT_TRUE(isContentTypeAllowed("application/json, text/html", 25 ContentType::HTML, false)); 26 } 27 28 TEST(isContentTypeAllowed, NegativeTest) 29 { 30 EXPECT_FALSE(isContentTypeAllowed("application/octet-stream", 31 ContentType::HTML, false)); 32 EXPECT_FALSE( 33 isContentTypeAllowed("application/html", ContentType::JSON, false)); 34 EXPECT_FALSE( 35 isContentTypeAllowed("application/json", ContentType::CBOR, false)); 36 EXPECT_FALSE( 37 isContentTypeAllowed("application/cbor", ContentType::HTML, false)); 38 EXPECT_FALSE(isContentTypeAllowed("application/json, text/html", 39 ContentType::OctetStream, false)); 40 } 41 42 TEST(isContentTypeAllowed, ContainsAnyMimeTypeReturnsTrue) 43 { 44 EXPECT_TRUE( 45 isContentTypeAllowed("text/html, */*", ContentType::OctetStream, true)); 46 } 47 48 TEST(isContentTypeAllowed, ContainsQFactorWeightingReturnsTrue) 49 { 50 EXPECT_TRUE(isContentTypeAllowed("text/html, */*;q=0.8", 51 ContentType::OctetStream, true)); 52 } 53 54 TEST(getPreferredContentType, PositiveTest) 55 { 56 std::array<ContentType, 1> contentType{ContentType::HTML}; 57 EXPECT_EQ( 58 getPreferredContentType("text/html, application/json", contentType), 59 ContentType::HTML); 60 61 std::array<ContentType, 2> htmlJson{ContentType::HTML, ContentType::JSON}; 62 EXPECT_EQ(getPreferredContentType("text/html, application/json", htmlJson), 63 ContentType::HTML); 64 65 // String the chrome gives 66 EXPECT_EQ(getPreferredContentType( 67 "text/html," 68 "application/xhtml+xml," 69 "application/xml;q=0.9," 70 "image/avif," 71 "image/webp," 72 "image/apng,*/*;q=0.8," 73 "application/signed-exchange;v=b3;q=0.7", 74 htmlJson), 75 ContentType::HTML); 76 77 std::array<ContentType, 2> jsonHtml{ContentType::JSON, ContentType::HTML}; 78 EXPECT_EQ(getPreferredContentType("text/html, application/json", jsonHtml), 79 ContentType::HTML); 80 81 std::array<ContentType, 2> cborJson{ContentType::CBOR, ContentType::JSON}; 82 EXPECT_EQ(getPreferredContentType("application/cbor, application::json", 83 cborJson), 84 ContentType::CBOR); 85 86 EXPECT_EQ( 87 getPreferredContentType("application/json;charset=UTF-8", htmlJson), 88 ContentType::JSON); 89 90 std::array<ContentType, 1> eventStream{ContentType::EventStream}; 91 EXPECT_EQ( 92 getPreferredContentType("text/event-stream;charset=UTF-8", eventStream), 93 ContentType::EventStream); 94 95 EXPECT_EQ(getPreferredContentType("application/json", cborJson), 96 ContentType::JSON); 97 EXPECT_EQ(getPreferredContentType("*/*", cborJson), ContentType::ANY); 98 99 // Application types with odd characters 100 EXPECT_EQ(getPreferredContentType( 101 "application/prs.nprend, application/json", cborJson), 102 ContentType::JSON); 103 104 EXPECT_EQ(getPreferredContentType("application/rdf+xml, application/json", 105 cborJson), 106 ContentType::JSON); 107 108 // Q values are ignored, but should parse 109 EXPECT_EQ(getPreferredContentType( 110 "application/rdf+xml;q=0.9, application/json", cborJson), 111 ContentType::JSON); 112 EXPECT_EQ(getPreferredContentType( 113 "application/rdf+xml;q=1, application/json", cborJson), 114 ContentType::JSON); 115 EXPECT_EQ(getPreferredContentType("application/json;q=0.9", cborJson), 116 ContentType::JSON); 117 EXPECT_EQ(getPreferredContentType("application/json;q=1", cborJson), 118 ContentType::JSON); 119 } 120 121 TEST(getPreferredContentType, NegativeTest) 122 { 123 std::array<ContentType, 1> contentType{ContentType::CBOR}; 124 EXPECT_EQ( 125 getPreferredContentType("text/html, application/json", contentType), 126 ContentType::NoMatch); 127 } 128 129 TEST(getPreferredEncoding, PositiveTest) 130 { 131 std::array<Encoding, 1> encodingsGzip{Encoding::GZIP}; 132 EXPECT_EQ(getPreferredEncoding("gzip", encodingsGzip), Encoding::GZIP); 133 134 std::array<Encoding, 2> encodingsGzipZstd{Encoding::GZIP, Encoding::ZSTD}; 135 EXPECT_EQ(getPreferredEncoding("gzip", encodingsGzipZstd), Encoding::GZIP); 136 EXPECT_EQ(getPreferredEncoding("zstd", encodingsGzipZstd), Encoding::ZSTD); 137 138 EXPECT_EQ(getPreferredEncoding("*", encodingsGzipZstd), Encoding::GZIP); 139 140 EXPECT_EQ(getPreferredEncoding("zstd, gzip;q=1.0", encodingsGzipZstd), 141 Encoding::ZSTD); 142 } 143 144 TEST(getPreferredEncoding, NegativeTest) 145 { 146 std::array<Encoding, 2> contentType{Encoding::GZIP, 147 Encoding::UnencodedBytes}; 148 EXPECT_EQ(getPreferredEncoding("noexist", contentType), 149 Encoding::UnencodedBytes); 150 151 std::array<Encoding, 1> contentType2{Encoding::GZIP}; 152 EXPECT_EQ(getPreferredEncoding("zstd", contentType2), Encoding::NoMatch); 153 } 154 155 } // namespace 156 } // namespace http_helpers 157