void FlusherSLSUnittest::TestBuildRequest()

in core/unittest/flusher/FlusherSLSUnittest.cpp [764:1427]


void FlusherSLSUnittest::TestBuildRequest() {
#ifdef __ENTERPRISE__
    EnterpriseSLSClientManager::GetInstance()->UpdateLocalRegionEndpointsAndHttpsInfo("test_region",
                                                                                      {kAccelerationDataEndpoint});
    EnterpriseSLSClientManager::GetInstance()->UpdateRemoteRegionEndpoints(
        "test_region", {"test_region-intranet.log.aliyuncs.com", "test_region.log.aliyuncs.com"});
    EnterpriseSLSClientManager::GetInstance()->UpdateRemoteRegionEndpoints(
        "test_region-b", {"test_region-b-intranet.log.aliyuncs.com", "test_region-b.log.aliyuncs.com"});
#endif
    Json::Value configJson, optionalGoPipeline;
    string errorMsg;
    string configStr = R"(
        {
            "Type": "flusher_sls",
            "Project": "test_project",
            "Logstore": "test_logstore",
            "Region": "test_region-b",
            "Aliuid": "1234567890",
            "Endpoint": "test_endpoint"
        }
    )";
    APSARA_TEST_TRUE(ParseJsonTable(configStr, configJson, errorMsg));
    FlusherSLS flusher;
    flusher.SetContext(ctx);
    flusher.SetMetricsRecordRef(FlusherSLS::sName, "1");
    APSARA_TEST_TRUE(flusher.Init(configJson, optionalGoPipeline));

    string body = "hello, world!";
    string bodyLenStr = to_string(body.size());
    uint32_t rawSize = 100;
    string rawSizeStr = "100";

    SLSSenderQueueItem item("hello, world!", rawSize, &flusher, flusher.GetQueueKey(), flusher.mLogstore);
    unique_ptr<HttpSinkRequest> req;
    bool keepItem = false;
    string errMsg;
#ifdef __ENTERPRISE__
    {
        // empty ak, first try
        APSARA_TEST_FALSE(flusher.BuildRequest(&item, req, &keepItem, &errMsg));
        // empty ak, second try
        APSARA_TEST_FALSE(flusher.BuildRequest(&item, req, &keepItem, &errMsg));
        APSARA_TEST_EQUAL(nullptr, req);
        APSARA_TEST_TRUE(keepItem);
    }
    EnterpriseSLSClientManager::GetInstance()->SetAccessKey(
        "1234567890", SLSClientManager::AuthType::ANONYMOUS, "test_ak", "test_sk");
    {
        // no available host, uninitialized
        APSARA_TEST_FALSE(flusher.BuildRequest(&item, req, &keepItem, &errMsg));
        APSARA_TEST_EQUAL(nullptr, req);
        APSARA_TEST_TRUE(keepItem);
        APSARA_TEST_EQUAL(static_cast<uint32_t>(AppConfig::GetInstance()->GetSendRequestConcurrency()),
                          FlusherSLS::GetRegionConcurrencyLimiter(flusher.mRegion)->GetCurrentLimit());
    }
    {
        // no available host, initialized
        flusher.mCandidateHostsInfo->SetInitialized();
        APSARA_TEST_FALSE(flusher.BuildRequest(&item, req, &keepItem, &errMsg));
        APSARA_TEST_EQUAL(nullptr, req);
        APSARA_TEST_TRUE(keepItem);
        APSARA_TEST_EQUAL(static_cast<uint32_t>(AppConfig::GetInstance()->GetSendRequestConcurrency()),
                          FlusherSLS::GetRegionConcurrencyLimiter(flusher.mRegion)->GetCurrentLimit());
    }
    EnterpriseSLSClientManager::GetInstance()->UpdateHostLatency("test_project",
                                                                 EndpointMode::DEFAULT,
                                                                 "test_project.test_region-b.log.aliyuncs.com",
                                                                 chrono::milliseconds(100));
    flusher.mCandidateHostsInfo->SelectBestHost();
#endif
    // log telemetry type
    {
        // normal
        SLSSenderQueueItem item("hello, world!", rawSize, &flusher, flusher.GetQueueKey(), flusher.mLogstore);
        APSARA_TEST_TRUE(flusher.BuildRequest(&item, req, &keepItem, &errMsg));
        APSARA_TEST_EQUAL(HTTP_POST, req->mMethod);
#ifdef __ENTERPRISE__
        APSARA_TEST_FALSE(req->mHTTPSFlag);
#else
        APSARA_TEST_TRUE(req->mHTTPSFlag);
#endif
        APSARA_TEST_EQUAL("/logstores/test_logstore/shards/lb", req->mUrl);
        APSARA_TEST_EQUAL("", req->mQueryString);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL(12U, req->mHeader.size());
#else
        APSARA_TEST_EQUAL(11U, req->mHeader.size());
#endif
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL("test_project.test_region-b.log.aliyuncs.com", req->mHeader[HOST]);
#else
        APSARA_TEST_EQUAL("test_project.test_endpoint", req->mHeader[HOST]);
#endif
        APSARA_TEST_EQUAL(SLSClientManager::GetInstance()->GetUserAgent(), req->mHeader[USER_AGENT]);
        APSARA_TEST_FALSE(req->mHeader[DATE].empty());
        APSARA_TEST_EQUAL(TYPE_LOG_PROTOBUF, req->mHeader[CONTENT_TYPE]);
        APSARA_TEST_EQUAL(bodyLenStr, req->mHeader[CONTENT_LENGTH]);
        APSARA_TEST_EQUAL(CalcMD5(req->mBody), req->mHeader[CONTENT_MD5]);
        APSARA_TEST_EQUAL(LOG_API_VERSION, req->mHeader[X_LOG_APIVERSION]);
        APSARA_TEST_EQUAL(HMAC_SHA1, req->mHeader[X_LOG_SIGNATUREMETHOD]);
        APSARA_TEST_EQUAL("lz4", req->mHeader[X_LOG_COMPRESSTYPE]);
        APSARA_TEST_EQUAL(rawSizeStr, req->mHeader[X_LOG_BODYRAWSIZE]);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL(MD5_SHA1_SALT_KEYPROVIDER, req->mHeader[X_LOG_KEYPROVIDER]);
#endif
        APSARA_TEST_FALSE(req->mHeader[AUTHORIZATION].empty());
        APSARA_TEST_EQUAL(body, req->mBody);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL("test_project.test_region-b.log.aliyuncs.com", req->mHost);
#else
        APSARA_TEST_EQUAL("test_project.test_endpoint", req->mHost);
#endif
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL(80, req->mPort);
#else
        APSARA_TEST_EQUAL(443, req->mPort);
#endif
        APSARA_TEST_EQUAL(static_cast<uint32_t>(INT32_FLAG(default_http_request_timeout_sec)), req->mTimeout);
        APSARA_TEST_EQUAL(1U, req->mMaxTryCnt);
        APSARA_TEST_FALSE(req->mFollowRedirects);
        APSARA_TEST_EQUAL(&item, req->mItem);
        APSARA_TEST_FALSE(item.mRealIpFlag);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL("test_project.test_region-b.log.aliyuncs.com", item.mCurrentHost);
#else
        APSARA_TEST_EQUAL("test_project.test_endpoint", item.mCurrentHost);
#endif
    }
    // arms_traces telemetry type
    {
        flusher.mTelemetryType = sls_logs::SLS_TELEMETRY_TYPE_APM_TRACES;
        flusher.mSubpath = APM_TRACES_URL;
        // normal
        SLSSenderQueueItem item("hello, world!", rawSize, &flusher, flusher.GetQueueKey(), flusher.mLogstore);

        APSARA_TEST_TRUE(flusher.BuildRequest(&item, req, &keepItem, &errMsg));
        APSARA_TEST_EQUAL(HTTP_POST, req->mMethod);
#ifdef __ENTERPRISE__
        APSARA_TEST_FALSE(req->mHTTPSFlag);
#else
        APSARA_TEST_TRUE(req->mHTTPSFlag);
#endif
        APSARA_TEST_EQUAL(APM_TRACES_URL, req->mUrl);
        APSARA_TEST_EQUAL("", req->mQueryString);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL(12U, req->mHeader.size());
#else
        APSARA_TEST_EQUAL(11U, req->mHeader.size());
#endif
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL("test_project.test_region-b.log.aliyuncs.com", req->mHeader[HOST]);
#else
        APSARA_TEST_EQUAL("test_project.test_endpoint", req->mHeader[HOST]);
#endif
        APSARA_TEST_EQUAL(SLSClientManager::GetInstance()->GetUserAgent(), req->mHeader[USER_AGENT]);
        APSARA_TEST_FALSE(req->mHeader[DATE].empty());
        APSARA_TEST_EQUAL(TYPE_LOG_PROTOBUF, req->mHeader[CONTENT_TYPE]);
        APSARA_TEST_EQUAL(bodyLenStr, req->mHeader[CONTENT_LENGTH]);
        APSARA_TEST_EQUAL(CalcMD5(req->mBody), req->mHeader[CONTENT_MD5]);
        APSARA_TEST_EQUAL(LOG_API_VERSION, req->mHeader[X_LOG_APIVERSION]);
        APSARA_TEST_EQUAL(HMAC_SHA1, req->mHeader[X_LOG_SIGNATUREMETHOD]);
        APSARA_TEST_EQUAL("lz4", req->mHeader[X_LOG_COMPRESSTYPE]);
        APSARA_TEST_EQUAL(rawSizeStr, req->mHeader[X_LOG_BODYRAWSIZE]);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL(MD5_SHA1_SALT_KEYPROVIDER, req->mHeader[X_LOG_KEYPROVIDER]);
#endif
        APSARA_TEST_FALSE(req->mHeader[AUTHORIZATION].empty());
        APSARA_TEST_EQUAL(body, req->mBody);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL("test_project.test_region-b.log.aliyuncs.com", req->mHost);
#else
        APSARA_TEST_EQUAL("test_project.test_endpoint", req->mHost);
#endif
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL(80, req->mPort);
#else
        APSARA_TEST_EQUAL(443, req->mPort);
#endif
        APSARA_TEST_EQUAL(static_cast<uint32_t>(INT32_FLAG(default_http_request_timeout_sec)), req->mTimeout);
        APSARA_TEST_EQUAL(1U, req->mMaxTryCnt);
        APSARA_TEST_FALSE(req->mFollowRedirects);
        APSARA_TEST_EQUAL(&item, req->mItem);
        APSARA_TEST_FALSE(item.mRealIpFlag);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL("test_project.test_region-b.log.aliyuncs.com", item.mCurrentHost);
#else
        APSARA_TEST_EQUAL("test_project.test_endpoint", item.mCurrentHost);
#endif
    }
    // arms_metrics telemetry type
    {
        flusher.mTelemetryType = sls_logs::SLS_TELEMETRY_TYPE_APM_METRICS;
        flusher.mSubpath = APM_METRICS_URL;
        // normal
        SLSSenderQueueItem item("hello, world!", rawSize, &flusher, flusher.GetQueueKey(), flusher.mLogstore);

        APSARA_TEST_TRUE(flusher.BuildRequest(&item, req, &keepItem, &errMsg));
        APSARA_TEST_EQUAL(HTTP_POST, req->mMethod);
#ifdef __ENTERPRISE__
        APSARA_TEST_FALSE(req->mHTTPSFlag);
#else
        APSARA_TEST_TRUE(req->mHTTPSFlag);
#endif
        APSARA_TEST_EQUAL(APM_METRICS_URL, req->mUrl);
        APSARA_TEST_EQUAL("", req->mQueryString);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL(12U, req->mHeader.size());
#else
        APSARA_TEST_EQUAL(11U, req->mHeader.size());
#endif
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL("test_project.test_region-b.log.aliyuncs.com", req->mHeader[HOST]);
#else
        APSARA_TEST_EQUAL("test_project.test_endpoint", req->mHeader[HOST]);
#endif
        APSARA_TEST_EQUAL(SLSClientManager::GetInstance()->GetUserAgent(), req->mHeader[USER_AGENT]);
        APSARA_TEST_FALSE(req->mHeader[DATE].empty());
        APSARA_TEST_EQUAL(TYPE_LOG_PROTOBUF, req->mHeader[CONTENT_TYPE]);
        APSARA_TEST_EQUAL(bodyLenStr, req->mHeader[CONTENT_LENGTH]);
        APSARA_TEST_EQUAL(CalcMD5(req->mBody), req->mHeader[CONTENT_MD5]);
        APSARA_TEST_EQUAL(LOG_API_VERSION, req->mHeader[X_LOG_APIVERSION]);
        APSARA_TEST_EQUAL(HMAC_SHA1, req->mHeader[X_LOG_SIGNATUREMETHOD]);
        APSARA_TEST_EQUAL("lz4", req->mHeader[X_LOG_COMPRESSTYPE]);
        APSARA_TEST_EQUAL(rawSizeStr, req->mHeader[X_LOG_BODYRAWSIZE]);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL(MD5_SHA1_SALT_KEYPROVIDER, req->mHeader[X_LOG_KEYPROVIDER]);
#endif
        APSARA_TEST_FALSE(req->mHeader[AUTHORIZATION].empty());
        APSARA_TEST_EQUAL(body, req->mBody);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL("test_project.test_region-b.log.aliyuncs.com", req->mHost);
#else
        APSARA_TEST_EQUAL("test_project.test_endpoint", req->mHost);
#endif
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL(80, req->mPort);
#else
        APSARA_TEST_EQUAL(443, req->mPort);
#endif
        APSARA_TEST_EQUAL(static_cast<uint32_t>(INT32_FLAG(default_http_request_timeout_sec)), req->mTimeout);
        APSARA_TEST_EQUAL(1U, req->mMaxTryCnt);
        APSARA_TEST_FALSE(req->mFollowRedirects);
        APSARA_TEST_EQUAL(&item, req->mItem);
        APSARA_TEST_FALSE(item.mRealIpFlag);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL("test_project.test_region-b.log.aliyuncs.com", item.mCurrentHost);
#else
        APSARA_TEST_EQUAL("test_project.test_endpoint", item.mCurrentHost);
#endif
    }
    // arms_agentinfo telemetry type
    {
        flusher.mTelemetryType = sls_logs::SLS_TELEMETRY_TYPE_APM_AGENTINFOS;
        flusher.mSubpath = APM_AGENTINFOS_URL;
        // normal
        SLSSenderQueueItem item("hello, world!", rawSize, &flusher, flusher.GetQueueKey(), flusher.mLogstore);

        APSARA_TEST_TRUE(flusher.BuildRequest(&item, req, &keepItem, &errMsg));
        APSARA_TEST_EQUAL(HTTP_POST, req->mMethod);
#ifdef __ENTERPRISE__
        APSARA_TEST_FALSE(req->mHTTPSFlag);
#else
        APSARA_TEST_TRUE(req->mHTTPSFlag);
#endif
        APSARA_TEST_EQUAL(APM_AGENTINFOS_URL, req->mUrl);
        APSARA_TEST_EQUAL("", req->mQueryString);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL(12U, req->mHeader.size());
#else
        APSARA_TEST_EQUAL(11U, req->mHeader.size());
#endif
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL("test_project.test_region-b.log.aliyuncs.com", req->mHeader[HOST]);
#else
        APSARA_TEST_EQUAL("test_project.test_endpoint", req->mHeader[HOST]);
#endif
        APSARA_TEST_EQUAL(SLSClientManager::GetInstance()->GetUserAgent(), req->mHeader[USER_AGENT]);
        APSARA_TEST_FALSE(req->mHeader[DATE].empty());
        APSARA_TEST_EQUAL(TYPE_LOG_PROTOBUF, req->mHeader[CONTENT_TYPE]);
        APSARA_TEST_EQUAL(bodyLenStr, req->mHeader[CONTENT_LENGTH]);
        APSARA_TEST_EQUAL(CalcMD5(req->mBody), req->mHeader[CONTENT_MD5]);
        APSARA_TEST_EQUAL(LOG_API_VERSION, req->mHeader[X_LOG_APIVERSION]);
        APSARA_TEST_EQUAL(HMAC_SHA1, req->mHeader[X_LOG_SIGNATUREMETHOD]);
        APSARA_TEST_EQUAL("lz4", req->mHeader[X_LOG_COMPRESSTYPE]);
        APSARA_TEST_EQUAL(rawSizeStr, req->mHeader[X_LOG_BODYRAWSIZE]);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL(MD5_SHA1_SALT_KEYPROVIDER, req->mHeader[X_LOG_KEYPROVIDER]);
#endif
        APSARA_TEST_FALSE(req->mHeader[AUTHORIZATION].empty());
        APSARA_TEST_EQUAL(body, req->mBody);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL("test_project.test_region-b.log.aliyuncs.com", req->mHost);
#else
        APSARA_TEST_EQUAL("test_project.test_endpoint", req->mHost);
#endif
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL(80, req->mPort);
#else
        APSARA_TEST_EQUAL(443, req->mPort);
#endif
        APSARA_TEST_EQUAL(static_cast<uint32_t>(INT32_FLAG(default_http_request_timeout_sec)), req->mTimeout);
        APSARA_TEST_EQUAL(1U, req->mMaxTryCnt);
        APSARA_TEST_FALSE(req->mFollowRedirects);
        APSARA_TEST_EQUAL(&item, req->mItem);
        APSARA_TEST_FALSE(item.mRealIpFlag);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL("test_project.test_region-b.log.aliyuncs.com", item.mCurrentHost);
#else
        APSARA_TEST_EQUAL("test_project.test_endpoint", item.mCurrentHost);
#endif
    }
    flusher.mTelemetryType = sls_logs::SLS_TELEMETRY_TYPE_LOGS;

    {
        // event group list
        SLSSenderQueueItem item("hello, world!",
                                rawSize,
                                &flusher,
                                flusher.GetQueueKey(),
                                flusher.mLogstore,
                                RawDataType::EVENT_GROUP_LIST);
        APSARA_TEST_TRUE(flusher.BuildRequest(&item, req, &keepItem, &errMsg));
        APSARA_TEST_EQUAL(HTTP_POST, req->mMethod);
#ifdef __ENTERPRISE__
        APSARA_TEST_FALSE(req->mHTTPSFlag);
#else
        APSARA_TEST_TRUE(req->mHTTPSFlag);
#endif
        APSARA_TEST_EQUAL("/logstores/test_logstore/shards/lb", req->mUrl);
        APSARA_TEST_EQUAL("", req->mQueryString);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL(13U, req->mHeader.size());
#else
        APSARA_TEST_EQUAL(12U, req->mHeader.size());
#endif
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL("test_project.test_region-b.log.aliyuncs.com", req->mHeader[HOST]);
#else
        APSARA_TEST_EQUAL("test_project.test_endpoint", req->mHeader[HOST]);
#endif
        APSARA_TEST_EQUAL(SLSClientManager::GetInstance()->GetUserAgent(), req->mHeader[USER_AGENT]);
        APSARA_TEST_FALSE(req->mHeader[DATE].empty());
        APSARA_TEST_EQUAL(TYPE_LOG_PROTOBUF, req->mHeader[CONTENT_TYPE]);
        APSARA_TEST_EQUAL(bodyLenStr, req->mHeader[CONTENT_LENGTH]);
        APSARA_TEST_EQUAL(CalcMD5(req->mBody), req->mHeader[CONTENT_MD5]);
        APSARA_TEST_EQUAL(LOG_API_VERSION, req->mHeader[X_LOG_APIVERSION]);
        APSARA_TEST_EQUAL(HMAC_SHA1, req->mHeader[X_LOG_SIGNATUREMETHOD]);
        APSARA_TEST_EQUAL("lz4", req->mHeader[X_LOG_COMPRESSTYPE]);
        APSARA_TEST_EQUAL(bodyLenStr, req->mHeader[X_LOG_BODYRAWSIZE]);
        APSARA_TEST_EQUAL(LOG_MODE_BATCH_GROUP, req->mHeader[X_LOG_MODE]);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL(MD5_SHA1_SALT_KEYPROVIDER, req->mHeader[X_LOG_KEYPROVIDER]);
#endif
        APSARA_TEST_FALSE(req->mHeader[AUTHORIZATION].empty());
        APSARA_TEST_EQUAL(body, req->mBody);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL("test_project.test_region-b.log.aliyuncs.com", req->mHost);
#else
        APSARA_TEST_EQUAL("test_project.test_endpoint", req->mHost);
#endif
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL(80, req->mPort);
#else
        APSARA_TEST_EQUAL(443, req->mPort);
#endif
        APSARA_TEST_EQUAL(static_cast<uint32_t>(INT32_FLAG(default_http_request_timeout_sec)), req->mTimeout);
        APSARA_TEST_EQUAL(1U, req->mMaxTryCnt);
        APSARA_TEST_FALSE(req->mFollowRedirects);
        APSARA_TEST_EQUAL(&item, req->mItem);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL("test_project.test_region-b.log.aliyuncs.com", item.mCurrentHost);
#else
        APSARA_TEST_EQUAL("test_project.test_endpoint", item.mCurrentHost);
#endif
    }
    {
        // shard hash
        SLSSenderQueueItem item("hello, world!",
                                rawSize,
                                &flusher,
                                flusher.GetQueueKey(),
                                flusher.mLogstore,
                                RawDataType::EVENT_GROUP,
                                "hash_key");
        APSARA_TEST_TRUE(flusher.BuildRequest(&item, req, &keepItem, &errMsg));
        APSARA_TEST_EQUAL(HTTP_POST, req->mMethod);
#ifdef __ENTERPRISE__
        APSARA_TEST_FALSE(req->mHTTPSFlag);
#else
        APSARA_TEST_TRUE(req->mHTTPSFlag);
#endif
        APSARA_TEST_EQUAL("/logstores/test_logstore/shards/route", req->mUrl);
        map<string, string> params{{"key", "hash_key"}};
        APSARA_TEST_EQUAL(GetQueryString(params), req->mQueryString);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL(12U, req->mHeader.size());
#else
        APSARA_TEST_EQUAL(11U, req->mHeader.size());
#endif
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL("test_project.test_region-b.log.aliyuncs.com", req->mHeader[HOST]);
#else
        APSARA_TEST_EQUAL("test_project.test_endpoint", req->mHeader[HOST]);
#endif
        APSARA_TEST_EQUAL(SLSClientManager::GetInstance()->GetUserAgent(), req->mHeader[USER_AGENT]);
        APSARA_TEST_FALSE(req->mHeader[DATE].empty());
        APSARA_TEST_EQUAL(TYPE_LOG_PROTOBUF, req->mHeader[CONTENT_TYPE]);
        APSARA_TEST_EQUAL(bodyLenStr, req->mHeader[CONTENT_LENGTH]);
        APSARA_TEST_EQUAL(CalcMD5(req->mBody), req->mHeader[CONTENT_MD5]);
        APSARA_TEST_EQUAL(LOG_API_VERSION, req->mHeader[X_LOG_APIVERSION]);
        APSARA_TEST_EQUAL(HMAC_SHA1, req->mHeader[X_LOG_SIGNATUREMETHOD]);
        APSARA_TEST_EQUAL("lz4", req->mHeader[X_LOG_COMPRESSTYPE]);
        APSARA_TEST_EQUAL(rawSizeStr, req->mHeader[X_LOG_BODYRAWSIZE]);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL(MD5_SHA1_SALT_KEYPROVIDER, req->mHeader[X_LOG_KEYPROVIDER]);
#endif
        APSARA_TEST_FALSE(req->mHeader[AUTHORIZATION].empty());
        APSARA_TEST_EQUAL(body, req->mBody);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL("test_project.test_region-b.log.aliyuncs.com", req->mHost);
#else
        APSARA_TEST_EQUAL("test_project.test_endpoint", req->mHost);
#endif
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL(80, req->mPort);
#else
        APSARA_TEST_EQUAL(443, req->mPort);
#endif
        APSARA_TEST_EQUAL(static_cast<uint32_t>(INT32_FLAG(default_http_request_timeout_sec)), req->mTimeout);
        APSARA_TEST_EQUAL(1U, req->mMaxTryCnt);
        APSARA_TEST_FALSE(req->mFollowRedirects);
        APSARA_TEST_EQUAL(&item, req->mItem);
        APSARA_TEST_FALSE(item.mRealIpFlag);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL("test_project.test_region-b.log.aliyuncs.com", item.mCurrentHost);
#else
        APSARA_TEST_EQUAL("test_project.test_endpoint", item.mCurrentHost);
#endif
    }
    {
        // exactly once
        auto cpt = make_shared<RangeCheckpoint>();
        cpt->index = 0;
        cpt->data.set_hash_key("hash_key_0");
        cpt->data.set_sequence_id(1);
        SLSSenderQueueItem item("hello, world!",
                                rawSize,
                                &flusher,
                                flusher.GetQueueKey(),
                                flusher.mLogstore,
                                RawDataType::EVENT_GROUP,
                                "hash_key_0",
                                std::move(cpt));
        APSARA_TEST_TRUE(flusher.BuildRequest(&item, req, &keepItem, &errMsg));
        APSARA_TEST_EQUAL(HTTP_POST, req->mMethod);
#ifdef __ENTERPRISE__
        APSARA_TEST_FALSE(req->mHTTPSFlag);
#else
        APSARA_TEST_TRUE(req->mHTTPSFlag);
#endif
        APSARA_TEST_EQUAL("/logstores/test_logstore/shards/route", req->mUrl);
        map<string, string> params{{"key", "hash_key_0"}, {"seqid", "1"}};
        APSARA_TEST_EQUAL(GetQueryString(params), req->mQueryString);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL(12U, req->mHeader.size());
#else
        APSARA_TEST_EQUAL(11U, req->mHeader.size());
#endif
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL("test_project.test_region-b.log.aliyuncs.com", req->mHeader[HOST]);
#else
        APSARA_TEST_EQUAL("test_project.test_endpoint", req->mHeader[HOST]);
#endif
        APSARA_TEST_EQUAL(SLSClientManager::GetInstance()->GetUserAgent(), req->mHeader[USER_AGENT]);
        APSARA_TEST_FALSE(req->mHeader[DATE].empty());
        APSARA_TEST_EQUAL(TYPE_LOG_PROTOBUF, req->mHeader[CONTENT_TYPE]);
        APSARA_TEST_EQUAL(bodyLenStr, req->mHeader[CONTENT_LENGTH]);
        APSARA_TEST_EQUAL(CalcMD5(req->mBody), req->mHeader[CONTENT_MD5]);
        APSARA_TEST_EQUAL(LOG_API_VERSION, req->mHeader[X_LOG_APIVERSION]);
        APSARA_TEST_EQUAL(HMAC_SHA1, req->mHeader[X_LOG_SIGNATUREMETHOD]);
        APSARA_TEST_EQUAL("lz4", req->mHeader[X_LOG_COMPRESSTYPE]);
        APSARA_TEST_EQUAL(rawSizeStr, req->mHeader[X_LOG_BODYRAWSIZE]);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL(MD5_SHA1_SALT_KEYPROVIDER, req->mHeader[X_LOG_KEYPROVIDER]);
#endif
        APSARA_TEST_FALSE(req->mHeader[AUTHORIZATION].empty());
        APSARA_TEST_EQUAL(body, req->mBody);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL("test_project.test_region-b.log.aliyuncs.com", req->mHost);
#else
        APSARA_TEST_EQUAL("test_project.test_endpoint", req->mHost);
#endif
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL(80, req->mPort);
#else
        APSARA_TEST_EQUAL(443, req->mPort);
#endif
        APSARA_TEST_EQUAL(static_cast<uint32_t>(INT32_FLAG(default_http_request_timeout_sec)), req->mTimeout);
        APSARA_TEST_EQUAL(1U, req->mMaxTryCnt);
        APSARA_TEST_FALSE(req->mFollowRedirects);
        APSARA_TEST_EQUAL(&item, req->mItem);
        APSARA_TEST_FALSE(item.mRealIpFlag);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL("test_project.test_region-b.log.aliyuncs.com", item.mCurrentHost);
#else
        APSARA_TEST_EQUAL("test_project.test_endpoint", item.mCurrentHost);
#endif
    }
    // metric telemtery type
    flusher.mTelemetryType = sls_logs::SlsTelemetryType::SLS_TELEMETRY_TYPE_METRICS;
    {
        SLSSenderQueueItem item("hello, world!", rawSize, &flusher, flusher.GetQueueKey(), flusher.mLogstore);
        APSARA_TEST_TRUE(flusher.BuildRequest(&item, req, &keepItem, &errMsg));
        APSARA_TEST_EQUAL(HTTP_POST, req->mMethod);
#ifdef __ENTERPRISE__
        APSARA_TEST_FALSE(req->mHTTPSFlag);
#else
        APSARA_TEST_TRUE(req->mHTTPSFlag);
#endif
        APSARA_TEST_EQUAL("/prometheus/test_project/test_logstore/api/v1/write", req->mUrl);
        APSARA_TEST_EQUAL("", req->mQueryString);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL(12U, req->mHeader.size());
#else
        APSARA_TEST_EQUAL(11U, req->mHeader.size());
#endif
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL("test_project.test_region-b.log.aliyuncs.com", req->mHeader[HOST]);
#else
        APSARA_TEST_EQUAL("test_project.test_endpoint", req->mHeader[HOST]);
#endif
        APSARA_TEST_EQUAL(SLSClientManager::GetInstance()->GetUserAgent(), req->mHeader[USER_AGENT]);
        APSARA_TEST_FALSE(req->mHeader[DATE].empty());
        APSARA_TEST_EQUAL(TYPE_LOG_PROTOBUF, req->mHeader[CONTENT_TYPE]);
        APSARA_TEST_EQUAL(bodyLenStr, req->mHeader[CONTENT_LENGTH]);
        APSARA_TEST_EQUAL(CalcMD5(req->mBody), req->mHeader[CONTENT_MD5]);
        APSARA_TEST_EQUAL(LOG_API_VERSION, req->mHeader[X_LOG_APIVERSION]);
        APSARA_TEST_EQUAL(HMAC_SHA1, req->mHeader[X_LOG_SIGNATUREMETHOD]);
        APSARA_TEST_EQUAL("lz4", req->mHeader[X_LOG_COMPRESSTYPE]);
        APSARA_TEST_EQUAL(rawSizeStr, req->mHeader[X_LOG_BODYRAWSIZE]);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL(MD5_SHA1_SALT_KEYPROVIDER, req->mHeader[X_LOG_KEYPROVIDER]);
#endif
        APSARA_TEST_FALSE(req->mHeader[AUTHORIZATION].empty());
        APSARA_TEST_EQUAL(body, req->mBody);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL("test_project.test_region-b.log.aliyuncs.com", req->mHost);
#else
        APSARA_TEST_EQUAL("test_project.test_endpoint", req->mHost);
#endif
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL(80, req->mPort);
#else
        APSARA_TEST_EQUAL(443, req->mPort);
#endif
        APSARA_TEST_EQUAL(static_cast<uint32_t>(INT32_FLAG(default_http_request_timeout_sec)), req->mTimeout);
        APSARA_TEST_EQUAL(1U, req->mMaxTryCnt);
        APSARA_TEST_FALSE(req->mFollowRedirects);
        APSARA_TEST_EQUAL(&item, req->mItem);
        APSARA_TEST_FALSE(item.mRealIpFlag);
#ifdef __ENTERPRISE__
        APSARA_TEST_EQUAL("test_project.test_region-b.log.aliyuncs.com", item.mCurrentHost);
#else
        APSARA_TEST_EQUAL("test_project.test_endpoint", item.mCurrentHost);
#endif
    }
    flusher.mTelemetryType = sls_logs::SlsTelemetryType::SLS_TELEMETRY_TYPE_LOGS;
#ifdef __ENTERPRISE__
    {
        // region mode changed
        EnterpriseSLSClientManager::GetInstance()->CopyLocalRegionEndpointsAndHttpsInfoIfNotExisted("test_region",
                                                                                                    "test_region-b");
        auto old = flusher.mCandidateHostsInfo.get();
        APSARA_TEST_FALSE(flusher.BuildRequest(&item, req, &keepItem, &errMsg));
        APSARA_TEST_NOT_EQUAL(old, flusher.mCandidateHostsInfo.get());

        EnterpriseSLSClientManager::GetInstance()->UpdateHostLatency("test_project",
                                                                     EndpointMode::ACCELERATE,
                                                                     "test_project." + kAccelerationDataEndpoint,
                                                                     chrono::milliseconds(10));
        flusher.mCandidateHostsInfo->SelectBestHost();
        APSARA_TEST_TRUE(flusher.BuildRequest(&item, req, &keepItem, &errMsg));
        APSARA_TEST_EQUAL("test_project." + kAccelerationDataEndpoint, req->mHost);
    }
    // real ip
    BOOL_FLAG(send_prefer_real_ip) = true;
    {
        // ip not empty
        EnterpriseSLSClientManager::GetInstance()->SetRealIp("test_region-b", "192.168.0.1");
        SLSSenderQueueItem item("hello, world!", rawSize, &flusher, flusher.GetQueueKey(), flusher.mLogstore);
        APSARA_TEST_TRUE(flusher.BuildRequest(&item, req, &keepItem, &errMsg));
        APSARA_TEST_EQUAL(HTTP_POST, req->mMethod);
        APSARA_TEST_FALSE(req->mHTTPSFlag);
        APSARA_TEST_EQUAL("/logstores/test_logstore/shards/lb", req->mUrl);
        APSARA_TEST_EQUAL("", req->mQueryString);
        APSARA_TEST_EQUAL(12U, req->mHeader.size());
        APSARA_TEST_EQUAL("test_project.192.168.0.1", req->mHeader[HOST]);
        APSARA_TEST_EQUAL(SLSClientManager::GetInstance()->GetUserAgent(), req->mHeader[USER_AGENT]);
        APSARA_TEST_FALSE(req->mHeader[DATE].empty());
        APSARA_TEST_EQUAL(TYPE_LOG_PROTOBUF, req->mHeader[CONTENT_TYPE]);
        APSARA_TEST_EQUAL(bodyLenStr, req->mHeader[CONTENT_LENGTH]);
        APSARA_TEST_EQUAL(CalcMD5(req->mBody), req->mHeader[CONTENT_MD5]);
        APSARA_TEST_EQUAL(LOG_API_VERSION, req->mHeader[X_LOG_APIVERSION]);
        APSARA_TEST_EQUAL(HMAC_SHA1, req->mHeader[X_LOG_SIGNATUREMETHOD]);
        APSARA_TEST_EQUAL("lz4", req->mHeader[X_LOG_COMPRESSTYPE]);
        APSARA_TEST_EQUAL(rawSizeStr, req->mHeader[X_LOG_BODYRAWSIZE]);
        APSARA_TEST_EQUAL(MD5_SHA1_SALT_KEYPROVIDER, req->mHeader[X_LOG_KEYPROVIDER]);
        APSARA_TEST_FALSE(req->mHeader[AUTHORIZATION].empty());
        APSARA_TEST_EQUAL(body, req->mBody);
        APSARA_TEST_EQUAL("192.168.0.1", req->mHost);
        APSARA_TEST_EQUAL(80, req->mPort);
        APSARA_TEST_EQUAL(static_cast<uint32_t>(INT32_FLAG(default_http_request_timeout_sec)), req->mTimeout);
        APSARA_TEST_EQUAL(1U, req->mMaxTryCnt);
        APSARA_TEST_FALSE(req->mFollowRedirects);
        APSARA_TEST_EQUAL(&item, req->mItem);
        APSARA_TEST_TRUE(item.mRealIpFlag);
        APSARA_TEST_EQUAL("192.168.0.1", item.mCurrentHost);
    }
    {
        // ip empty
        EnterpriseSLSClientManager::GetInstance()->SetRealIp("test_region-b", "");
        SLSSenderQueueItem item("hello, world!", rawSize, &flusher, flusher.GetQueueKey(), flusher.mLogstore);
        APSARA_TEST_TRUE(flusher.BuildRequest(&item, req, &keepItem, &errMsg));
        APSARA_TEST_EQUAL("test_project." + kAccelerationDataEndpoint, req->mHeader[HOST]);
        APSARA_TEST_EQUAL(SLSClientManager::GetInstance()->GetUserAgent(), req->mHeader[USER_AGENT]);
        APSARA_TEST_FALSE(req->mHeader[DATE].empty());
        APSARA_TEST_EQUAL(TYPE_LOG_PROTOBUF, req->mHeader[CONTENT_TYPE]);
        APSARA_TEST_EQUAL(bodyLenStr, req->mHeader[CONTENT_LENGTH]);
        APSARA_TEST_EQUAL(CalcMD5(req->mBody), req->mHeader[CONTENT_MD5]);
        APSARA_TEST_EQUAL(LOG_API_VERSION, req->mHeader[X_LOG_APIVERSION]);
        APSARA_TEST_EQUAL(HMAC_SHA1, req->mHeader[X_LOG_SIGNATUREMETHOD]);
        APSARA_TEST_EQUAL("lz4", req->mHeader[X_LOG_COMPRESSTYPE]);
        APSARA_TEST_EQUAL(rawSizeStr, req->mHeader[X_LOG_BODYRAWSIZE]);
        APSARA_TEST_EQUAL(MD5_SHA1_SALT_KEYPROVIDER, req->mHeader[X_LOG_KEYPROVIDER]);
        APSARA_TEST_FALSE(req->mHeader[AUTHORIZATION].empty());
        APSARA_TEST_EQUAL(body, req->mBody);
        APSARA_TEST_EQUAL("test_project." + kAccelerationDataEndpoint, req->mHost);
        APSARA_TEST_EQUAL(80, req->mPort);
        APSARA_TEST_EQUAL(static_cast<uint32_t>(INT32_FLAG(default_http_request_timeout_sec)), req->mTimeout);
        APSARA_TEST_EQUAL(1U, req->mMaxTryCnt);
        APSARA_TEST_FALSE(req->mFollowRedirects);
        APSARA_TEST_EQUAL(&item, req->mItem);
        APSARA_TEST_FALSE(item.mRealIpFlag);
        APSARA_TEST_EQUAL("test_project." + kAccelerationDataEndpoint, item.mCurrentHost);
    }
    {
        // ip empty, and region mode changed
        auto& endpoints = EnterpriseSLSClientManager::GetInstance()->mRegionCandidateEndpointsMap["test_region-b"];
        endpoints.mMode = EndpointMode::CUSTOM;
        endpoints.mLocalEndpoints = {"custom.endpoint"};

        auto old = flusher.mCandidateHostsInfo.get();
        APSARA_TEST_FALSE(flusher.BuildRequest(&item, req, &keepItem, &errMsg));
        APSARA_TEST_NOT_EQUAL(old, flusher.mCandidateHostsInfo.get());

        EnterpriseSLSClientManager::GetInstance()->UpdateHostLatency(
            "test_project", EndpointMode::CUSTOM, "test_project.custom.endpoint", chrono::milliseconds(10));
        flusher.mCandidateHostsInfo->SelectBestHost();
        APSARA_TEST_TRUE(flusher.BuildRequest(&item, req, &keepItem, &errMsg));
        APSARA_TEST_EQUAL("test_project.custom.endpoint", req->mHost);
    }
    BOOL_FLAG(send_prefer_real_ip) = false;
#endif
}