* fix(server): 翻译失败后允许下次候选请求重试 * fix(server): 翻译失败项按次数退避,未发出的批次尾部不记失败 完全去掉失败缓存后,凭据错误、限流和确实没有译文的词会在每次候选刷新时被整批重发, 计费提供方会重复扣费;批次开头持续超时的词还会每次都耗尽预算,让尾部永远发不出去。 - 失败项按词退避:15 秒起步逐次翻倍,封顶 8 分钟,成功即清除 - 牛翻与自定义接口在批次预算耗尽时截短结果数组,共享层据此跳过未发出的尾部 - 退避时长抽成 CloudTranslation::FailureRetryDelay 并补单测 --------- Co-authored-by: fanlusky <1730976608@qq.com>
62 lines
2.9 KiB
C++
62 lines
2.9 KiB
C++
#include "tests/includes/test_framework.h"
|
|
#include "cloud/translation_gloss.h"
|
|
|
|
TEST_CASE(CloudTranslationFormatsGlossWithoutTruncating)
|
|
{
|
|
REQUIRE_EQ(CloudTranslation::FormatGloss(" hello world \n"), std::string("hello world"));
|
|
REQUIRE(CloudTranslation::FormatGloss(" ").empty());
|
|
|
|
std::string long_text;
|
|
for (int i = 0; i < 30; ++i)
|
|
long_text += "字";
|
|
REQUIRE_EQ(CloudTranslation::FormatGloss(long_text), long_text);
|
|
REQUIRE_EQ(CloudTranslation::Utf8Length(CloudTranslation::FormatGloss(long_text)), static_cast<size_t>(30));
|
|
}
|
|
|
|
TEST_CASE(CloudTranslationPersistPolicyRejectsUselessGloss)
|
|
{
|
|
REQUIRE(CloudTranslation::ShouldPersistGloss("水杉", "metasequoia"));
|
|
REQUIRE(!CloudTranslation::ShouldPersistGloss("hello", "hello"));
|
|
REQUIRE(CloudTranslation::ShouldPersistGloss("长句", std::string(32, 'a')));
|
|
REQUIRE(!CloudTranslation::ShouldPersistGloss("长句", std::string(33, 'a')));
|
|
REQUIRE(!CloudTranslation::ShouldPersistGloss("a", ""));
|
|
REQUIRE(!CloudTranslation::IsUsableSecret(""));
|
|
REQUIRE(!CloudTranslation::IsUsableSecret(" <YOUR_OWN_TENCENT_SECRET_ID> "));
|
|
REQUIRE(CloudTranslation::IsUsableSecret(" AKIDabc \n"));
|
|
REQUIRE_EQ(CloudTranslation::TrimSecret(" AKIDabc \r\n"), std::string("AKIDabc"));
|
|
}
|
|
|
|
TEST_CASE(CloudTranslationFailureRetryDelayDoublesUpToEightMinutes)
|
|
{
|
|
using std::chrono::seconds;
|
|
REQUIRE(CloudTranslation::FailureRetryDelay(0) == seconds(0));
|
|
REQUIRE(CloudTranslation::FailureRetryDelay(1) == seconds(15));
|
|
REQUIRE(CloudTranslation::FailureRetryDelay(2) == seconds(30));
|
|
REQUIRE(CloudTranslation::FailureRetryDelay(5) == seconds(240));
|
|
REQUIRE(CloudTranslation::FailureRetryDelay(6) == seconds(480));
|
|
REQUIRE(CloudTranslation::FailureRetryDelay(7) == seconds(480));
|
|
REQUIRE(CloudTranslation::FailureRetryDelay(4000000000u) == seconds(480));
|
|
}
|
|
|
|
TEST_CASE(CloudTranslationOnlySendsChineseWithoutEmoji)
|
|
{
|
|
REQUIRE(CloudTranslation::IsCloudTranslatableChinese("水杉"));
|
|
REQUIRE(CloudTranslation::IsCloudTranslatableChinese("输入法"));
|
|
REQUIRE(!CloudTranslation::IsCloudTranslatableChinese("hello"));
|
|
REQUIRE(!CloudTranslation::IsCloudTranslatableChinese("😀"));
|
|
REQUIRE(!CloudTranslation::IsCloudTranslatableChinese("笑😀"));
|
|
REQUIRE(!CloudTranslation::IsCloudTranslatableChinese(""));
|
|
}
|
|
|
|
TEST_CASE(CloudTranslationAcceptsEnglishCandidateShapes)
|
|
{
|
|
REQUIRE(CloudTranslation::IsCloudTranslatableEnglish("metasequoia"));
|
|
REQUIRE(CloudTranslation::IsCloudTranslatableEnglish("Meta Sequoia"));
|
|
REQUIRE(CloudTranslation::IsCloudTranslatableEnglish("cloud-based"));
|
|
REQUIRE(CloudTranslation::IsCloudTranslatableEnglish("user's"));
|
|
REQUIRE(!CloudTranslation::IsCloudTranslatableEnglish(""));
|
|
REQUIRE(!CloudTranslation::IsCloudTranslatableEnglish("123"));
|
|
REQUIRE(!CloudTranslation::IsCloudTranslatableEnglish("hello!"));
|
|
REQUIRE(!CloudTranslation::IsCloudTranslatableEnglish("水杉"));
|
|
}
|