Fix checks for 1D barcodes that do not accept letters.

- Enable disabled tests for barcodes that do not accept ASCII.
- Put unused CBC_OneDimWriter::CheckContentValidity() to use, to fix the
  tests.
- Merge validity checks in various Encode() methods into
  CBC_OneDimWriter::HasValidContentSize(), and call it in
  CheckContentValidity() instead.
- Fix some nits along the way.

Bug: pdfium:1172
Change-Id: I60e0b99795178bac035202f4814792403f9e13e2
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/68970
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/fxbarcode/cbc_codabar.cpp b/fxbarcode/cbc_codabar.cpp
index ad4d21c..70500f4 100644
--- a/fxbarcode/cbc_codabar.cpp
+++ b/fxbarcode/cbc_codabar.cpp
@@ -30,18 +30,18 @@
 CBC_Codabar::CBC_Codabar()
     : CBC_OneCode(pdfium::MakeUnique<CBC_OnedCodaBarWriter>()) {}
 
-CBC_Codabar::~CBC_Codabar() {}
+CBC_Codabar::~CBC_Codabar() = default;
 
 bool CBC_Codabar::Encode(WideStringView contents) {
-  if (contents.IsEmpty() || contents.GetLength() > kMaxInputLengthBytes)
+  auto* pWriter = GetOnedCodaBarWriter();
+  if (!pWriter->CheckContentValidity(contents))
     return false;
 
   BCFORMAT format = BCFORMAT_CODABAR;
   int32_t outWidth = 0;
   int32_t outHeight = 0;
-  m_renderContents = GetOnedCodaBarWriter()->FilterContents(contents);
+  m_renderContents = pWriter->FilterContents(contents);
   ByteString byteString = m_renderContents.ToUTF8();
-  auto* pWriter = GetOnedCodaBarWriter();
   std::unique_ptr<uint8_t, FxFreeDeleter> data(
       pWriter->Encode(byteString, format, outWidth, outHeight));
   return data && pWriter->RenderResult(m_renderContents.AsStringView(),
diff --git a/fxbarcode/cbc_code128.cpp b/fxbarcode/cbc_code128.cpp
index c363c94..4c872bc 100644
--- a/fxbarcode/cbc_code128.cpp
+++ b/fxbarcode/cbc_code128.cpp
@@ -30,16 +30,16 @@
 CBC_Code128::CBC_Code128(BC_TYPE type)
     : CBC_OneCode(pdfium::MakeUnique<CBC_OnedCode128Writer>(type)) {}
 
-CBC_Code128::~CBC_Code128() {}
+CBC_Code128::~CBC_Code128() = default;
 
 bool CBC_Code128::Encode(WideStringView contents) {
-  if (contents.IsEmpty() || contents.GetLength() > kMaxInputLengthBytes)
+  auto* pWriter = GetOnedCode128Writer();
+  if (!pWriter->CheckContentValidity(contents))
     return false;
 
   BCFORMAT format = BCFORMAT_CODE_128;
   int32_t outWidth = 0;
   int32_t outHeight = 0;
-  auto* pWriter = GetOnedCode128Writer();
   WideString content(contents);
   if (contents.GetLength() % 2 && pWriter->GetType() == BC_CODE128_C)
     content += '0';
diff --git a/fxbarcode/cbc_code39.cpp b/fxbarcode/cbc_code39.cpp
index 2138d18..f6600c4 100644
--- a/fxbarcode/cbc_code39.cpp
+++ b/fxbarcode/cbc_code39.cpp
@@ -30,16 +30,16 @@
 CBC_Code39::CBC_Code39()
     : CBC_OneCode(pdfium::MakeUnique<CBC_OnedCode39Writer>()) {}
 
-CBC_Code39::~CBC_Code39() {}
+CBC_Code39::~CBC_Code39() = default;
 
 bool CBC_Code39::Encode(WideStringView contents) {
-  if (contents.IsEmpty() || contents.GetLength() > kMaxInputLengthBytes)
+  auto* pWriter = GetOnedCode39Writer();
+  if (!pWriter->CheckContentValidity(contents))
     return false;
 
   BCFORMAT format = BCFORMAT_CODE_39;
   int32_t outWidth = 0;
   int32_t outHeight = 0;
-  auto* pWriter = GetOnedCode39Writer();
   WideString filtercontents = pWriter->FilterContents(contents);
   m_renderContents = pWriter->RenderTextContents(contents);
   ByteString byteString = filtercontents.ToUTF8();
diff --git a/fxbarcode/cbc_eancode.cpp b/fxbarcode/cbc_eancode.cpp
index 6e44f81..f3ec3f1 100644
--- a/fxbarcode/cbc_eancode.cpp
+++ b/fxbarcode/cbc_eancode.cpp
@@ -21,7 +21,8 @@
 }
 
 bool CBC_EANCode::Encode(WideStringView contents) {
-  if (contents.IsEmpty() || contents.GetLength() > kMaxInputLengthBytes)
+  auto* pWriter = GetOneDimEANWriter();
+  if (!pWriter->CheckContentValidity(contents))
     return false;
 
   BCFORMAT format = GetFormat();
@@ -29,7 +30,6 @@
   int32_t out_height = 0;
   m_renderContents = Preprocess(contents);
   ByteString str = m_renderContents.ToUTF8();
-  auto* pWriter = GetOneDimEANWriter();
   pWriter->InitEANWriter();
   std::unique_ptr<uint8_t, FxFreeDeleter> data(
       pWriter->Encode(str, format, out_width, out_height));
diff --git a/fxbarcode/cbc_onecode.h b/fxbarcode/cbc_onecode.h
index 7072386..7ccaafe 100644
--- a/fxbarcode/cbc_onecode.h
+++ b/fxbarcode/cbc_onecode.h
@@ -18,10 +18,6 @@
 
 class CBC_OneCode : public CBC_CodeBase {
  public:
-  // Limit the size of 1D barcodes. Typical 1D barcodes are short so this should
-  // be sufficient for most use cases.
-  static constexpr size_t kMaxInputLengthBytes = 8192;
-
   explicit CBC_OneCode(std::unique_ptr<CBC_Writer> pWriter);
   ~CBC_OneCode() override;
 
diff --git a/fxbarcode/cfx_barcode_unittest.cpp b/fxbarcode/cfx_barcode_unittest.cpp
index 3d4206a..571c6ca 100644
--- a/fxbarcode/cfx_barcode_unittest.cpp
+++ b/fxbarcode/cfx_barcode_unittest.cpp
@@ -94,7 +94,7 @@
   EXPECT_EQ("5fad4fc19f099001a0fe83c89430c977", BitmapChecksum());
 }
 
-TEST_F(BarcodeTest, DISABLED_CodaBarLetters) {
+TEST_F(BarcodeTest, CodaBarLetters) {
   Create(BC_CODABAR);
   EXPECT_FALSE(barcode()->Encode(L"clams"));
 }
@@ -164,7 +164,7 @@
   EXPECT_EQ("aff88491ac46ca6217d780d185300cde", BitmapChecksum());
 }
 
-TEST_F(BarcodeTest, DISABLED_Ean8Letters) {
+TEST_F(BarcodeTest, Ean8Letters) {
   Create(BC_EAN8);
   EXPECT_FALSE(barcode()->Encode(L"clams"));
 }
@@ -182,7 +182,7 @@
   EXPECT_EQ("fe26a5714cff7ffe3f9b02183efc435b", BitmapChecksum());
 }
 
-TEST_F(BarcodeTest, DISABLED_UPCALetters) {
+TEST_F(BarcodeTest, UPCALetters) {
   Create(BC_UPCA);
   EXPECT_FALSE(barcode()->Encode(L"clams"));
 }
@@ -200,7 +200,7 @@
   EXPECT_EQ("72d2190b98d635c32834bf67552e561e", BitmapChecksum());
 }
 
-TEST_F(BarcodeTest, DISABLED_Ean13Letters) {
+TEST_F(BarcodeTest, Ean13Letters) {
   Create(BC_EAN13);
   EXPECT_FALSE(barcode()->Encode(L"clams"));
 }
diff --git a/fxbarcode/oned/BC_OneDimWriter.cpp b/fxbarcode/oned/BC_OneDimWriter.cpp
index 5a02cdf..33d6ebf 100644
--- a/fxbarcode/oned/BC_OneDimWriter.cpp
+++ b/fxbarcode/oned/BC_OneDimWriter.cpp
@@ -36,6 +36,16 @@
 #include "core/fxge/text_char_pos.h"
 #include "fxbarcode/BC_Writer.h"
 
+// static
+bool CBC_OneDimWriter::HasValidContentSize(WideStringView contents) {
+  // Limit the size of 1D barcodes. Typical 1D barcodes are short so this should
+  // be sufficient for most use cases.
+  static constexpr size_t kMaxInputLengthBytes = 8192;
+
+  size_t size = contents.GetLength();
+  return size > 0 && size <= kMaxInputLengthBytes;
+}
+
 CBC_OneDimWriter::CBC_OneDimWriter() = default;
 
 CBC_OneDimWriter::~CBC_OneDimWriter() = default;
diff --git a/fxbarcode/oned/BC_OneDimWriter.h b/fxbarcode/oned/BC_OneDimWriter.h
index 3e0ccc9..338e34e 100644
--- a/fxbarcode/oned/BC_OneDimWriter.h
+++ b/fxbarcode/oned/BC_OneDimWriter.h
@@ -22,6 +22,8 @@
 
 class CBC_OneDimWriter : public CBC_Writer {
  public:
+  static bool HasValidContentSize(WideStringView contents);
+
   CBC_OneDimWriter();
   ~CBC_OneDimWriter() override;
 
diff --git a/fxbarcode/oned/BC_OnedCodaBarWriter.cpp b/fxbarcode/oned/BC_OnedCodaBarWriter.cpp
index eb330a9..d87125f 100644
--- a/fxbarcode/oned/BC_OnedCodaBarWriter.cpp
+++ b/fxbarcode/oned/BC_OnedCodaBarWriter.cpp
@@ -99,9 +99,10 @@
 }
 
 bool CBC_OnedCodaBarWriter::CheckContentValidity(WideStringView contents) {
-  return std::all_of(
-      contents.begin(), contents.end(),
-      [this](const wchar_t& ch) { return this->FindChar(ch, false); });
+  return HasValidContentSize(contents) &&
+         std::all_of(
+             contents.begin(), contents.end(),
+             [this](const wchar_t& ch) { return this->FindChar(ch, false); });
 }
 
 WideString CBC_OnedCodaBarWriter::FilterContents(WideStringView contents) {
diff --git a/fxbarcode/oned/BC_OnedCode128Writer.cpp b/fxbarcode/oned/BC_OnedCode128Writer.cpp
index b01abb5..fa51f4a 100644
--- a/fxbarcode/oned/BC_OnedCode128Writer.cpp
+++ b/fxbarcode/oned/BC_OnedCode128Writer.cpp
@@ -75,6 +75,11 @@
 const int32_t CODE_START_C = 105;
 const int32_t CODE_STOP = 106;
 
+bool IsInOnedCode128Alphabet(wchar_t ch) {
+  int32_t index = static_cast<int32_t>(ch);
+  return index >= 32 && index <= 126 && index != 34;
+}
+
 }  // namespace
 
 CBC_OnedCode128Writer::CBC_OnedCode128Writer(BC_TYPE type)
@@ -85,12 +90,8 @@
 CBC_OnedCode128Writer::~CBC_OnedCode128Writer() = default;
 
 bool CBC_OnedCode128Writer::CheckContentValidity(WideStringView contents) {
-  for (const auto& ch : contents) {
-    int32_t patternIndex = static_cast<int32_t>(ch);
-    if (patternIndex < 32 || patternIndex > 126 || patternIndex == 34)
-      return false;
-  }
-  return true;
+  return HasValidContentSize(contents) &&
+         std::all_of(contents.begin(), contents.end(), IsInOnedCode128Alphabet);
 }
 
 WideString CBC_OnedCode128Writer::FilterContents(WideStringView contents) {
diff --git a/fxbarcode/oned/BC_OnedCode128Writer_unittest.cpp b/fxbarcode/oned/BC_OnedCode128Writer_unittest.cpp
index 19d91f9..c85cdfd 100644
--- a/fxbarcode/oned/BC_OnedCode128Writer_unittest.cpp
+++ b/fxbarcode/oned/BC_OnedCode128Writer_unittest.cpp
@@ -84,9 +84,9 @@
 TEST(OnedCode128WriterTest, CheckContentValidity) {
   {
     CBC_OnedCode128Writer writer(BC_CODE128_B);
-    EXPECT_TRUE(writer.CheckContentValidity(L""));
     EXPECT_TRUE(writer.CheckContentValidity(L"foo"));
     EXPECT_TRUE(writer.CheckContentValidity(L"xyz"));
+    EXPECT_FALSE(writer.CheckContentValidity(L""));
     EXPECT_FALSE(writer.CheckContentValidity(L"\""));
     EXPECT_FALSE(writer.CheckContentValidity(L"f\x10oo"));
     EXPECT_FALSE(writer.CheckContentValidity(L"bar\x7F"));
@@ -94,9 +94,9 @@
   }
   {
     CBC_OnedCode128Writer writer(BC_CODE128_C);
-    EXPECT_TRUE(writer.CheckContentValidity(L""));
     EXPECT_TRUE(writer.CheckContentValidity(L"foo"));
     EXPECT_TRUE(writer.CheckContentValidity(L"xyz"));
+    EXPECT_FALSE(writer.CheckContentValidity(L""));
     EXPECT_FALSE(writer.CheckContentValidity(L"\""));
     EXPECT_FALSE(writer.CheckContentValidity(L"f\x10oo"));
     EXPECT_FALSE(writer.CheckContentValidity(L"bar\x7F"));
diff --git a/fxbarcode/oned/BC_OnedCode39Writer.cpp b/fxbarcode/oned/BC_OnedCode39Writer.cpp
index 97ee881..42c031a 100644
--- a/fxbarcode/oned/BC_OnedCode39Writer.cpp
+++ b/fxbarcode/oned/BC_OnedCode39Writer.cpp
@@ -66,7 +66,8 @@
 CBC_OnedCode39Writer::~CBC_OnedCode39Writer() = default;
 
 bool CBC_OnedCode39Writer::CheckContentValidity(WideStringView contents) {
-  return std::all_of(contents.begin(), contents.end(), IsInOnedCode39Alphabet);
+  return HasValidContentSize(contents) &&
+         std::all_of(contents.begin(), contents.end(), IsInOnedCode39Alphabet);
 }
 
 WideString CBC_OnedCode39Writer::FilterContents(WideStringView contents) {
diff --git a/fxbarcode/oned/BC_OnedEAN13Writer.cpp b/fxbarcode/oned/BC_OnedEAN13Writer.cpp
index f2e88dd..871efa8 100644
--- a/fxbarcode/oned/BC_OnedEAN13Writer.cpp
+++ b/fxbarcode/oned/BC_OnedEAN13Writer.cpp
@@ -56,10 +56,11 @@
   m_bLeftPadding = true;
   m_codeWidth = 3 + (7 * 6) + 5 + (7 * 6) + 3;
 }
-CBC_OnedEAN13Writer::~CBC_OnedEAN13Writer() {}
+CBC_OnedEAN13Writer::~CBC_OnedEAN13Writer() = default;
 
 bool CBC_OnedEAN13Writer::CheckContentValidity(WideStringView contents) {
-  return std::all_of(contents.begin(), contents.end(),
+  return HasValidContentSize(contents) &&
+         std::all_of(contents.begin(), contents.end(),
                      [](wchar_t c) { return FXSYS_IsDecimalDigit(c); });
 }
 
diff --git a/fxbarcode/oned/BC_OnedEAN8Writer.cpp b/fxbarcode/oned/BC_OnedEAN8Writer.cpp
index 62c760c..1825491 100644
--- a/fxbarcode/oned/BC_OnedEAN8Writer.cpp
+++ b/fxbarcode/oned/BC_OnedEAN8Writer.cpp
@@ -65,7 +65,8 @@
 }
 
 bool CBC_OnedEAN8Writer::CheckContentValidity(WideStringView contents) {
-  return std::all_of(contents.begin(), contents.end(),
+  return HasValidContentSize(contents) &&
+         std::all_of(contents.begin(), contents.end(),
                      [](wchar_t c) { return FXSYS_IsDecimalDigit(c); });
 }
 
diff --git a/fxbarcode/oned/BC_OnedUPCAWriter.cpp b/fxbarcode/oned/BC_OnedUPCAWriter.cpp
index 666b037..cf6a4dc 100644
--- a/fxbarcode/oned/BC_OnedUPCAWriter.cpp
+++ b/fxbarcode/oned/BC_OnedUPCAWriter.cpp
@@ -22,6 +22,7 @@
 
 #include "fxbarcode/oned/BC_OnedUPCAWriter.h"
 
+#include <algorithm>
 #include <vector>
 
 #include "core/fxcrt/fx_extension.h"
@@ -37,14 +38,12 @@
   m_bRightPadding = true;
 }
 
-CBC_OnedUPCAWriter::~CBC_OnedUPCAWriter() {}
+CBC_OnedUPCAWriter::~CBC_OnedUPCAWriter() = default;
 
 bool CBC_OnedUPCAWriter::CheckContentValidity(WideStringView contents) {
-  for (size_t i = 0; i < contents.GetLength(); ++i) {
-    if (contents[i] < '0' || contents[i] > '9')
-      return false;
-  }
-  return true;
+  return HasValidContentSize(contents) &&
+         std::all_of(contents.begin(), contents.end(),
+                     [](wchar_t c) { return FXSYS_IsDecimalDigit(c); });
 }
 
 WideString CBC_OnedUPCAWriter::FilterContents(WideStringView contents) {