diff --git a/core/src/test/java/com/google/zxing/InvertedLuminanceSourceTestCase.java b/core/src/test/java/com/google/zxing/InvertedLuminanceSourceTestCase.java new file mode 100644 index 000000000..932a7e2ab --- /dev/null +++ b/core/src/test/java/com/google/zxing/InvertedLuminanceSourceTestCase.java @@ -0,0 +1,39 @@ +/* + * Copyright 2020 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing; + +import org.junit.Assert; +import org.junit.Test; + +import java.awt.image.BufferedImage; + +/** + * Tests {@link InvertedLuminanceSource}. + */ +public final class InvertedLuminanceSourceTestCase extends Assert { + + @Test + public void testInverted() { + BufferedImage image = new BufferedImage(2, 1, BufferedImage.TYPE_INT_RGB); + image.setRGB(0, 0, 0xFFFFFF); + LuminanceSource source = new BufferedImageLuminanceSource(image); + assertArrayEquals(new byte[] { (byte) 0xFF, 0 }, source.getRow(0, null)); + LuminanceSource inverted = new InvertedLuminanceSource(source); + assertArrayEquals(new byte[] { 0, (byte) 0xFF }, inverted.getRow(0, null)); + } + +} diff --git a/core/src/test/java/com/google/zxing/common/BitMatrixTestCase.java b/core/src/test/java/com/google/zxing/common/BitMatrixTestCase.java index 2aeca625b..b92705e3a 100644 --- a/core/src/test/java/com/google/zxing/common/BitMatrixTestCase.java +++ b/core/src/test/java/com/google/zxing/common/BitMatrixTestCase.java @@ -19,6 +19,8 @@ package com.google.zxing.common; import org.junit.Assert; import org.junit.Test; +import java.util.Arrays; + /** * @author Sean Owen * @author dswitkin@google.com (Daniel Switkin) @@ -226,6 +228,25 @@ public final class BitMatrixTestCase extends Assert { assertEquals(centerMatrix, BitMatrix.parse(centerMatrix.toString("x", "."), "x", ".")); } + @Test + public void testParseBoolean() { + BitMatrix emptyMatrix = new BitMatrix(3, 3); + BitMatrix fullMatrix = new BitMatrix(3, 3); + fullMatrix.setRegion(0, 0, 3, 3); + BitMatrix centerMatrix = new BitMatrix(3, 3); + centerMatrix.setRegion(1, 1, 1, 1); + BitMatrix emptyMatrix24 = new BitMatrix(2, 4); + + boolean[][] matrix = new boolean[3][3]; + assertEquals(emptyMatrix, BitMatrix.parse(matrix)); + matrix[1][1] = true; + assertEquals(centerMatrix, BitMatrix.parse(matrix)); + for (boolean[] arr : matrix) { + Arrays.fill(arr, true); + } + assertEquals(fullMatrix, BitMatrix.parse(matrix)); + } + @Test public void testUnset() { BitMatrix emptyMatrix = new BitMatrix(3, 3); diff --git a/core/src/test/java/com/google/zxing/common/StringUtilsTestCase.java b/core/src/test/java/com/google/zxing/common/StringUtilsTestCase.java index 6440209b9..355586935 100644 --- a/core/src/test/java/com/google/zxing/common/StringUtilsTestCase.java +++ b/core/src/test/java/com/google/zxing/common/StringUtilsTestCase.java @@ -19,14 +19,23 @@ package com.google.zxing.common; import org.junit.Assert; import org.junit.Test; -import java.nio.charset.StandardCharsets; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.Random; /** * Tests {@link StringUtils}. */ public final class StringUtilsTestCase extends Assert { + @Test + public void testRandom() { + Random r = new Random(1234L); + byte[] bytes = new byte[1000]; + r.nextBytes(bytes); + assertEquals(Charset.defaultCharset(), StringUtils.guessCharset(bytes, null)); + } + @Test public void testShortShiftJIS1() { // 金魚 diff --git a/javase/src/main/java/com/google/zxing/client/j2se/HtmlAssetTranslator.java b/javase/src/main/java/com/google/zxing/client/j2se/HtmlAssetTranslator.java index 7d401c1c8..f8b10899a 100644 --- a/javase/src/main/java/com/google/zxing/client/j2se/HtmlAssetTranslator.java +++ b/javase/src/main/java/com/google/zxing/client/j2se/HtmlAssetTranslator.java @@ -52,16 +52,18 @@ import java.util.regex.Pattern; * as a comma-separated list. Specify "all" for language to try to translate for all existing translations. * Each argument after this is the name of a file to translate; if the first one is "all", all files will * be translated.

- * + * *

Usage: {@code HtmlAssetTranslator android/assets/ (all|lang1[,lang2 ...]) (all|file1.html[ file2.html ...])}

* - *

{@code android/assets/ es all} will translate .html files in subdirectory html-en to - * directory html-es, for example. Note that only text nodes in the HTML document are translated. - * Any text that is a child of a node with {@code class="notranslate"} will not be translated. It will + *

{@code android/assets/ es all} will translate .html files in subdirectory html-en to + * directory html-es, for example. Note that only text nodes in the HTML document are translated. + * Any text that is a child of a node with {@code class="notranslate"} will not be translated. It will * also add a note at the end of the translated page that indicates it was automatically translated.

* * @author Sean Owen + * @deprecated without replacement since 3.4.2 */ +@Deprecated public final class HtmlAssetTranslator { private static final Pattern COMMA = Pattern.compile(","); diff --git a/javase/src/main/java/com/google/zxing/client/j2se/StringsResourceTranslator.java b/javase/src/main/java/com/google/zxing/client/j2se/StringsResourceTranslator.java index 95f81a2c7..47185ea66 100644 --- a/javase/src/main/java/com/google/zxing/client/j2se/StringsResourceTranslator.java +++ b/javase/src/main/java/com/google/zxing/client/j2se/StringsResourceTranslator.java @@ -49,7 +49,9 @@ import java.util.regex.Pattern; *

You must set your Google Translate API key into the environment with -DtranslateAPI.key=...

* * @author Sean Owen + * @deprecated without replacement since 3.4.2 */ +@Deprecated public final class StringsResourceTranslator { private static final String API_KEY = System.getProperty("translateAPI.key"); @@ -58,7 +60,7 @@ public final class StringsResourceTranslator { throw new IllegalArgumentException("translateAPI.key is not specified"); } } - + private static final Pattern ENTRY_PATTERN = Pattern.compile("([^<]+)"); private static final Pattern STRINGS_FILE_NAME_PATTERN = Pattern.compile("values-(.+)"); private static final Pattern TRANSLATE_RESPONSE_PATTERN = Pattern.compile("translatedText\":\\s*\"([^\"]+)\""); diff --git a/javase/src/test/java/com/google/zxing/client/j2se/CommandLineRunnerTestCase.java b/javase/src/test/java/com/google/zxing/client/j2se/CommandLineRunnerTestCase.java index 648acde74..1fee0dae9 100644 --- a/javase/src/test/java/com/google/zxing/client/j2se/CommandLineRunnerTestCase.java +++ b/javase/src/test/java/com/google/zxing/client/j2se/CommandLineRunnerTestCase.java @@ -26,7 +26,8 @@ public final class CommandLineRunnerTestCase extends Assert { @Test public void testCommandLineRunner() throws Exception { - String[] args = { "--pure_barcode", DecodeWorkerTestCase.IMAGE_DATA_URI }; + String[] args = { "--pure_barcode", "--try_harder", + DecodeWorkerTestCase.IMAGE_DATA_URI, DecodeWorkerTestCase.IMAGE_NOBARCODE_DATA_URI }; // Not a lot to do here but make sure it runs CommandLineRunner.main(args); } diff --git a/javase/src/test/java/com/google/zxing/client/j2se/DecodeWorkerTestCase.java b/javase/src/test/java/com/google/zxing/client/j2se/DecodeWorkerTestCase.java index 66ecd0061..d05d64732 100644 --- a/javase/src/test/java/com/google/zxing/client/j2se/DecodeWorkerTestCase.java +++ b/javase/src/test/java/com/google/zxing/client/j2se/DecodeWorkerTestCase.java @@ -36,6 +36,25 @@ public final class DecodeWorkerTestCase extends Assert { "988HQPUfPVaqA0XKz%2BgD9bIk1AP1fgwvB7KlS9VBdqXbA82PT9AH2fiaH2SXGdDM71fDgeIfhIvKsbkTTAIAKYVr0N" + "z5IloAAAAASUVORK5CYII="; + static final String IMAGE_NOBARCODE_DATA_URI = + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACE1BMVEUAAAAYsPIXsPL//+" + + "2J6/CI6vB74/Alt/IXr/LL/++M7PD//+UZsPIXr/ISrfIRrPIXsPIYsPIYsPIKqfIQrPITrvIZsfImt/IouPImt/IZsf" + + "IXr/IXsPIbsfIWr/IcsvInuPImuPIvvPJt3PB54vBt3PAasfIXsPIXr/IUrvIYsPIwvfJx3vB54vCE6PCS7/B64/Bt3P" + + "AktvIXr/IYsPIYsPIasfIlt/IwvPKJ6/CM7PCW8fCQ7vCB5vAmt/IXr/IYsPIYsPIXsPKI6vCI6vCI6vAYsfMYsPIYsP" + + "KI6vCI6vCI6vAYrO0YsPGI6vCI6vCI6vCJ6/CH6vBw3vB64/CE6PAwvPJr2/FLy/ESrfIYsPIjtvIasfIYsPIYsPIYsP" + + "IYsPIYsPIYsPIYsPIYsPIYre4vvPIktvJ64/Bx3vCI6vAitfJj1/F74/CH6vAbsfI7wvF/5fCJ6vAXsPJw3fAWmNEYre" + + "0mt/J85PCJ6/Bw3vAXqukYr/EYsPIZsPIwvPJ95PAjtvIVksgWmtQYre4VlMsXpuUVkccWl9AXquouu/Jy3/AWl88Wm9" + + "QXpuQYrO0ZsfIVkcgVlMwWmNAXqekVisIVkMcVkscWm9UTXaQVgr0VisMVlcwTT5oTVZ4TXKMVhL4TTpoTTZoTW6MVg7" + + "4Vj8YVicIVkMYVi8MUfbkTVZ8UfLkUY6gTVJ4Vg70TT5sTVp/hyCW0AAAAZnRSTlMAAAAAAAAAAAAAAAACGx8fHxsCAh" + + "k2yeTi4uLJMgEZNsnm++fi5s80GTbJ5v3NNhzJ4uCvFwHJ5v3mNgIbHx8cBDHN/ckZOcz+5jYC5f3k4Bzk/f3NMv7NNh" + + "0f/eTg4jYd/eQZ5v3GzkXBAAAByUlEQVQ4y73TvW4TQRSG4e/dtbHx2hv/FBEIEBWIEgmLhoaGittJRYeEfAUUFBS+Ai" + + "qIoIBQgGQRFKWwoAxgKYog3vXf2uvx7lAkBDvyio7TnkffnDOaQf8o/h/4C+06gOQB1oHgnEASosZZ9VYFQvLqp837vO" + + "NnsAqQdwXg3oeTI+DzOXDn8DLcZo8OdwF4vwqaZW4BXdiRrAPxuRkewE3gC7wxa+/hITfGlXkXdrQebJHkoLvICBBbJO" + + "PG+BsvlQEeAbAfZydccCI//jrMnOExxMDrWtYWT4iI/LiTtQYtGIsybwd7GLMOKB84UqUDrxbzNe+hJeNNY+F2AbYJlp" + + "r2BKQX6UvR1U/AbpP5aXebQLKipRIQxlJUknr8GYPdZu5FINGSpNSPRsVZcVhYyu+5H5vMxVMIJZHW+5VJ2UxiqTArep" + + "NZcXaUGIlnYAaS0sR1lG5O+X4tjiuWUT2yhXBW5DlwWA3PktPNo8RN8sZN3MT1RwFtrMO0FNaCoXzVDyTper8WVF17IO" + + "OWaUsLTDWsTfIyc+eXr6EuWS+oM/shX9CWhKmGeVPRtHxcMtqIbIqpOmNKAxnaS1/E+migDR3nJGnR0GDR+A23fMFDA8" + + "6WRQAAAABJRU5ErkJggg=="; @Test public void testWorker() throws Exception { @@ -46,5 +65,5 @@ public final class DecodeWorkerTestCase extends Assert { DecodeWorker worker = new DecodeWorker(config, inputs); assertEquals(1, worker.call().intValue()); } - + } diff --git a/pom.xml b/pom.xml index bbc488b50..f1562425a 100644 --- a/pom.xml +++ b/pom.xml @@ -467,6 +467,7 @@ **/*.properties **/*.cfg **/*.config + **/*.yml **/*.yaml **/gen/** **/resources/** diff --git a/zxingorg/pom.xml b/zxingorg/pom.xml index 3bd4d14a4..ada770926 100644 --- a/zxingorg/pom.xml +++ b/zxingorg/pom.xml @@ -49,7 +49,13 @@ org.springframework spring-test - 5.3.1 + ${spring.version} + test + + + org.springframework + spring-web + ${spring.version} test @@ -66,6 +72,10 @@ 3.4.2-SNAPSHOT + + 5.3.1 + + diff --git a/zxingorg/src/main/java/com/google/zxing/web/ChartServlet.java b/zxingorg/src/main/java/com/google/zxing/web/ChartServlet.java index bdee82281..60cbcf54e 100644 --- a/zxingorg/src/main/java/com/google/zxing/web/ChartServlet.java +++ b/zxingorg/src/main/java/com/google/zxing/web/ChartServlet.java @@ -114,7 +114,7 @@ public final class ChartServlet extends HttpServlet { } else { imageFormat = "PNG"; } - + String contentType; switch (imageFormat) { case "PNG": @@ -129,7 +129,7 @@ public final class ChartServlet extends HttpServlet { default: throw new IllegalArgumentException("Unknown format " + imageFormat); } - + ByteArrayOutputStream imageOut = new ByteArrayOutputStream(1024); MatrixToImageWriter.writeToStream(matrix, imageFormat, imageOut); byte[] imageData = imageOut.toByteArray(); @@ -143,7 +143,8 @@ public final class ChartServlet extends HttpServlet { private static ChartServletRequestParameters doParseParameters(ServletRequest request, boolean readBody) throws IOException { - Preconditions.checkArgument("qr".equals(request.getParameter("cht")), "Bad type"); + String chartType = request.getParameter("cht"); + Preconditions.checkArgument(chartType == null || "qr".equals(chartType), "Bad type"); String widthXHeight = request.getParameter("chs"); Preconditions.checkNotNull(widthXHeight, "No size"); @@ -156,8 +157,10 @@ public final class ChartServlet extends HttpServlet { Preconditions.checkArgument(width <= MAX_DIMENSION && height <= MAX_DIMENSION, "Bad size"); String outputEncodingName = request.getParameter("choe"); - Charset outputEncoding = StandardCharsets.UTF_8; - if (outputEncodingName != null) { + Charset outputEncoding; + if (outputEncodingName == null) { + outputEncoding = StandardCharsets.UTF_8; + } else { outputEncoding = Charset.forName(outputEncodingName); Preconditions.checkArgument(SUPPORTED_OUTPUT_ENCODINGS.contains(outputEncoding), "Bad output encoding"); } diff --git a/zxingorg/src/main/java/com/google/zxing/web/OutputUtils.java b/zxingorg/src/main/java/com/google/zxing/web/OutputUtils.java index 7d31fc87c..191acf102 100644 --- a/zxingorg/src/main/java/com/google/zxing/web/OutputUtils.java +++ b/zxingorg/src/main/java/com/google/zxing/web/OutputUtils.java @@ -18,7 +18,7 @@ package com.google.zxing.web; /** * Utility functions for {@code decoderesult.jspx}. - * + * * @author Sean Owen */ public final class OutputUtils { @@ -42,17 +42,14 @@ public final class OutputUtils { } else if (i % HALF_BYTES_PER_LINE == 0) { result.append(" "); } else { - result.append(' '); + result.append(' '); } } return result.toString(); } - + private static char hexChar(int value) { - if (value < 0 || value > 15) { - throw new IllegalArgumentException("Bad hex digit value " + value); - } return (char) (value < 10 ? ('0' + value) : ('a' + (value - 10))); } - + } diff --git a/zxingorg/src/test/java/com/google/zxing/web/ChartServletTestCase.java b/zxingorg/src/test/java/com/google/zxing/web/ChartServletTestCase.java new file mode 100644 index 000000000..1fe34f0a7 --- /dev/null +++ b/zxingorg/src/test/java/com/google/zxing/web/ChartServletTestCase.java @@ -0,0 +1,58 @@ +/* + * Copyright 2020 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.web; + +import org.junit.Assert; +import org.junit.Test; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpServletResponse; + +import java.util.HashMap; +import java.util.Map; +import javax.servlet.http.HttpServletResponse; + +/** + * Tests {@link ChartServlet}. + */ +public final class ChartServletTestCase extends Assert { + + @Test + public void testChart() throws Exception { + ChartServlet servlet = new ChartServlet(); + + for (String contentType : new String[] { "png", "jpeg", "gif"}) { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.setRequestURI("image." + contentType); + Map params = new HashMap<>(); + params.put("chl", "foo"); + params.put("chs", "100x100"); + params.put("chld", "M"); + request.setParameters(params); + + MockHttpServletResponse response = new MockHttpServletResponse(); + + servlet.doGet(request, response); + + assertEquals(HttpServletResponse.SC_OK, response.getStatus()); + assertEquals("image/" + contentType, response.getContentType()); + assertTrue(response.getContentAsByteArray().length > 0); + } + + servlet.destroy(); + } + +} diff --git a/zxingorg/src/test/java/com/google/zxing/web/DecodeServletTestCase.java b/zxingorg/src/test/java/com/google/zxing/web/DecodeServletTestCase.java new file mode 100644 index 000000000..01b41a005 --- /dev/null +++ b/zxingorg/src/test/java/com/google/zxing/web/DecodeServletTestCase.java @@ -0,0 +1,68 @@ +/* + * Copyright 2020 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.web; + +import com.google.common.net.MediaType; +import org.junit.Assert; +import org.junit.Test; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.mock.web.MockServletConfig; + +import java.util.HashMap; +import java.util.Map; +import javax.servlet.http.HttpServletResponse; + +/** + * Tests {@link DecodeServlet}. + */ +public final class DecodeServletTestCase extends Assert { + + private static final String IMAGE_DATA_URI = + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACEAAAAhAQAAAAB/n//CAAAAkklEQVR42mP4DwQNDJjkB4" + + "E77A0M369N/d7A8CV6rjiQjPMFkWG1QPL7RVGg%2BAfREKCa/5/vA9V/nFSQ3sDwb7/KdiDJqX4dSH4pXN/A8DfyDVD2" + + "988HQPUfPVaqA0XKz%2BgD9bIk1AP1fgwvB7KlS9VBdqXbA82PT9AH2fiaH2SXGdDM71fDgeIfhIvKsbkTTAIAKYVr0N" + + "z5IloAAAAASUVORK5CYII="; + + @Test + public void testDataURI() throws Exception { + MockServletConfig config = new MockServletConfig(); + config.addInitParameter("maxAccessPerTime", "100"); + config.addInitParameter("accessTimeSec", "100"); + config.addInitParameter("maxEntries", "100"); + + DecodeServlet servlet = new DecodeServlet(); + servlet.init(config); + + MockHttpServletRequest request = new MockHttpServletRequest(); + Map params = new HashMap<>(); + params.put("u", IMAGE_DATA_URI); + params.put("full", "false"); + request.setParameters(params); + + MockHttpServletResponse response = new MockHttpServletResponse(); + + servlet.doGet(request, response); + + assertEquals(HttpServletResponse.SC_OK, response.getStatus()); + assertEquals(MediaType.PLAIN_TEXT_UTF_8.toString(), response.getContentType()); + assertEquals("--error-correction_level\n", response.getContentAsString()); + + servlet.destroy(); + } + +} diff --git a/zxingorg/src/test/java/com/google/zxing/web/ServletContextLogHandlerTestCase.java b/zxingorg/src/test/java/com/google/zxing/web/ServletContextLogHandlerTestCase.java new file mode 100644 index 000000000..f613134e1 --- /dev/null +++ b/zxingorg/src/test/java/com/google/zxing/web/ServletContextLogHandlerTestCase.java @@ -0,0 +1,41 @@ +/* + * Copyright 2020 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.web; + +import org.junit.Assert; +import org.junit.Test; +import org.springframework.mock.web.MockServletContext; + +import java.util.logging.Level; +import java.util.logging.LogRecord; + +/** + * Tests {@link ServletContextLogHandler}. + */ +public final class ServletContextLogHandlerTestCase extends Assert { + + @Test + public void testLogHandler() { + // Can't test much here + MockServletContext context = new MockServletContext(); + ServletContextLogHandler handler = new ServletContextLogHandler(context); + handler.publish(new LogRecord(Level.INFO, "test log message")); + handler.flush(); + handler.close(); + } + +}