1111#include < map>
1212#include < memory>
1313#include < mutex>
14+ #include < numeric>
1415#include < string>
1516#include < thread>
1617#include < utility>
@@ -558,7 +559,6 @@ TEST_F(BasicCurlHttpTests, ElegantQuitQuick)
558559 ASSERT_TRUE (handler->is_called_ );
559560 ASSERT_TRUE (handler->got_response_ );
560561}
561-
562562TEST_F (BasicCurlHttpTests, BackgroundThreadWaitMore)
563563{
564564 {
@@ -581,3 +581,128 @@ TEST_F(BasicCurlHttpTests, BackgroundThreadWaitMore)
581581 ASSERT_TRUE (http_client.MaybeSpawnBackgroundThread ());
582582 }
583583}
584+
585+ #ifdef ENABLE_OTLP_COMPRESSION_PREVIEW
586+ struct GzipEventHandler : public CustomEventHandler
587+ {
588+ ~GzipEventHandler () override = default ;
589+
590+ void OnResponse (http_client::Response & /* response */ ) noexcept override {}
591+
592+ void OnEvent (http_client::SessionState state, nostd::string_view reason) noexcept override
593+ {
594+ is_called_ = true ;
595+ state_ = state;
596+ reason_ = std::string{reason};
597+ }
598+
599+ bool is_called_ = false ;
600+ http_client::SessionState state_ = static_cast <http_client::SessionState>(-1 );
601+ std::string reason_;
602+ };
603+
604+ TEST_F (BasicCurlHttpTests, GzipCompressibleData)
605+ {
606+ received_requests_.clear ();
607+ auto session_manager = http_client::HttpClientFactory::Create ();
608+ EXPECT_TRUE (session_manager != nullptr );
609+
610+ auto session = session_manager->CreateSession (" http://127.0.0.1:19000" );
611+ auto request = session->CreateRequest ();
612+ request->SetUri (" post/" );
613+ request->SetMethod (http_client::Method::Post);
614+
615+ const auto original_size = 500UL ;
616+ http_client::Body body (original_size);
617+ std::iota (body.begin (), body.end (), 0 );
618+ request->SetBody (body);
619+ request->AddHeader (" Content-Type" , " text/plain" );
620+ request->SetCompression (opentelemetry::ext::http::client::Compression::kGzip );
621+ auto handler = std::make_shared<GzipEventHandler>();
622+ session->SendRequest (handler);
623+ ASSERT_TRUE (waitForRequests (30 , 1 ));
624+ session->FinishSession ();
625+ ASSERT_TRUE (handler->is_called_ );
626+ ASSERT_EQ (handler->state_ , http_client::SessionState::Response);
627+ ASSERT_TRUE (handler->reason_ .empty ());
628+
629+ auto http_request =
630+ dynamic_cast <opentelemetry::ext::http::client::curl::Request *>(request.get ());
631+ ASSERT_TRUE (http_request != nullptr );
632+ ASSERT_LT (http_request->body_ .size (), original_size);
633+
634+ session_manager->CancelAllSessions ();
635+ session_manager->FinishAllSessions ();
636+ }
637+
638+ TEST_F (BasicCurlHttpTests, GzipIncompressibleData)
639+ {
640+ received_requests_.clear ();
641+ auto session_manager = http_client::HttpClientFactory::Create ();
642+ EXPECT_TRUE (session_manager != nullptr );
643+
644+ auto session = session_manager->CreateSession (" http://127.0.0.1:19000" );
645+ auto request = session->CreateRequest ();
646+ request->SetUri (" post/" );
647+ request->SetMethod (http_client::Method::Post);
648+
649+ // Random data generated using code snippet below.
650+ // const auto original_size = 500UL;
651+ // http_client::Body body(original_size);
652+ // std::random_device rd;
653+ // std::mt19937 gen(rd());
654+ // std::uniform_int_distribution<> uid(1, 255);
655+ // std::generate(body.begin(), body.end(), [&]() { return uid(gen); });
656+
657+ // The input values are fixed to make the test repeatable in the event that some distributions
658+ // might yield results that are, in fact, compressible.
659+ http_client::Body body = {
660+ 140 , 198 , 12 , 56 , 165 , 185 , 173 , 20 , 13 , 83 , 127 , 223 , 77 , 38 , 224 , 43 , 236 , 10 , 178 ,
661+ 75 , 169 , 157 , 136 , 199 , 74 , 30 , 148 , 195 , 51 , 30 , 225 , 21 , 121 , 219 , 7 , 155 , 198 , 121 ,
662+ 205 , 102 , 80 , 38 , 132 , 202 , 45 , 229 , 206 , 90 , 150 , 202 , 53 , 221 , 54 , 37 , 172 , 90 , 238 ,
663+ 248 , 191 , 240 , 109 , 227 , 248 , 41 , 251 , 121 , 35 , 226 , 107 , 122 , 15 , 242 , 203 , 45 , 64 , 195 ,
664+ 186 , 23 , 1 , 158 , 61 , 196 , 182 , 26 , 201 , 47 , 211 , 241 , 251 , 209 , 255 , 170 , 181 , 192 , 89 ,
665+ 133 , 176 , 60 , 178 , 97 , 168 , 223 , 152 , 9 , 118 , 98 , 169 , 240 , 170 , 15 , 13 , 161 , 24 , 57 ,
666+ 123 , 117 , 230 , 30 , 244 , 117 , 238 , 255 , 198 , 232 , 95 , 148 , 37 , 61 , 67 , 103 , 31 , 240 , 52 ,
667+ 21 , 145 , 175 , 201 , 86 , 19 , 61 , 228 , 76 , 131 , 185 , 111 , 149 , 203 , 143 , 16 , 142 , 95 , 173 ,
668+ 42 , 106 , 39 , 203 , 116 , 235 , 20 , 162 , 112 , 173 , 112 , 70 , 126 , 191 , 210 , 219 , 90 , 145 , 126 ,
669+ 118 , 43 , 241 , 101 , 66 , 175 , 179 , 5 , 233 , 208 , 164 , 180 , 83 , 214 , 194 , 173 , 29 , 179 , 149 ,
670+ 75 , 202 , 17 , 152 , 139 , 130 , 94 , 247 , 142 , 249 , 159 , 224 , 205 , 131 , 93 , 82 , 186 , 226 , 210 ,
671+ 84 , 17 , 212 , 155 , 61 , 226 , 103 , 152 , 37 , 3 , 193 , 216 , 219 , 203 , 101 , 99 , 33 , 59 , 38 ,
672+ 106 , 62 , 232 , 127 , 44 , 125 , 90 , 169 , 148 , 238 , 34 , 106 , 12 , 221 , 90 , 173 , 67 , 122 , 232 ,
673+ 161 , 89 , 198 , 43 , 241 , 195 , 248 , 219 , 35 , 47 , 200 , 11 , 227 , 168 , 246 , 243 , 103 , 38 , 17 ,
674+ 203 , 237 , 203 , 158 , 204 , 89 , 231 , 19 , 24 , 25 , 199 , 160 , 233 , 43 , 117 , 144 , 196 , 117 , 152 ,
675+ 42 , 121 , 189 , 217 , 202 , 221 , 250 , 157 , 237 , 47 , 29 , 64 , 32 , 10 , 32 , 243 , 28 , 114 , 158 ,
676+ 228 , 102 , 36 , 191 , 139 , 217 , 161 , 162 , 186 , 19 , 141 , 212 , 49 , 1 , 239 , 153 , 107 , 249 , 31 ,
677+ 235 , 138 , 73 , 80 , 58 , 152 , 15 , 149 , 50 , 42 , 84 , 75 , 95 , 82 , 56 , 86 , 143 , 45 , 214 ,
678+ 11 , 184 , 164 , 181 , 249 , 74 , 184 , 26 , 207 , 165 , 162 , 240 , 154 , 90 , 56 , 175 , 72 , 4 , 166 ,
679+ 188 , 78 , 232 , 87 , 243 , 50 , 59 , 62 , 175 , 213 , 210 , 182 , 31 , 123 , 91 , 118 , 98 , 249 , 23 ,
680+ 170 , 240 , 228 , 236 , 121 , 87 , 132 , 129 , 250 , 41 , 227 , 204 , 250 , 147 , 145 , 109 , 149 , 210 , 21 ,
681+ 174 , 165 , 127 , 234 , 64 , 211 , 52 , 93 , 126 , 117 , 231 , 216 , 210 , 15 , 16 , 2 , 167 , 215 , 178 ,
682+ 104 , 245 , 119 , 211 , 235 , 120 , 135 , 202 , 117 , 150 , 101 , 94 , 201 , 136 , 179 , 205 , 167 , 212 , 236 ,
683+ 7 , 178 , 132 , 228 , 65 , 230 , 90 , 171 , 109 , 31 , 83 , 31 , 210 , 123 , 136 , 76 , 186 , 81 , 205 ,
684+ 63 , 35 , 21 , 121 , 152 , 22 , 242 , 199 , 106 , 217 , 199 , 211 , 206 , 165 , 88 , 77 , 112 , 108 , 193 ,
685+ 122 , 8 , 193 , 74 , 91 , 50 , 6 , 156 , 185 , 165 , 15 , 92 , 116 , 3 , 18 , 244 , 165 , 191 , 2 ,
686+ 183 , 9 , 164 , 116 , 75 , 127 };
687+ const auto original_size = body.size ();
688+
689+ request->SetBody (body);
690+ request->AddHeader (" Content-Type" , " text/plain" );
691+ request->SetCompression (opentelemetry::ext::http::client::Compression::kGzip );
692+ auto handler = std::make_shared<GzipEventHandler>();
693+ session->SendRequest (handler);
694+ ASSERT_TRUE (waitForRequests (30 , 1 ));
695+ session->FinishSession ();
696+ ASSERT_TRUE (handler->is_called_ );
697+ ASSERT_EQ (handler->state_ , http_client::SessionState::Response);
698+ ASSERT_TRUE (handler->reason_ .empty ());
699+
700+ auto http_request =
701+ dynamic_cast <opentelemetry::ext::http::client::curl::Request *>(request.get ());
702+ ASSERT_TRUE (http_request != nullptr );
703+ ASSERT_EQ (http_request->body_ .size (), original_size);
704+
705+ session_manager->CancelAllSessions ();
706+ session_manager->FinishAllSessions ();
707+ }
708+ #endif // ENABLE_OTLP_COMPRESSION_PREVIEW
0 commit comments