Derby
  1. Derby
  2. DERBY-5682

ProtocolTest failures: Unsupported encoding MacGreek

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Minor Minor
    • Resolution: Fixed
    • Affects Version/s: 10.9.1.0
    • Fix Version/s: 10.9.1.0
    • Component/s: Test
    • Labels:
      None

      Description

      I saw two failures in ProtocolTest when running them on a JVM where support for encodings not mandated by the Java platform specification had been removed.

      There were 2 failures:
      1) protocol.tests_1150_1212(org.apache.derbyTesting.functionTests.tests.derbynet.ProtocolTest)junit.framework.AssertionFailedError: Unsupported encoding MacGreek
      at org.apache.derbyTesting.junit.BaseTestCase.fail(BaseTestCase.java:879)
      at org.apache.derbyTesting.functionTests.tests.derbynet.ProtocolTest.writeEncodedLDString(ProtocolTest.java:781)
      at org.apache.derbyTesting.functionTests.tests.derbynet.ProtocolTest.processCommand(ProtocolTest.java:324)
      at org.apache.derbyTesting.functionTests.tests.derbynet.ProtocolTest.processCommands(ProtocolTest.java:230)
      at org.apache.derbyTesting.functionTests.tests.derbynet.ProtocolTest.testProtocolSequence(ProtocolTest.java:148)
      at sun.reflect.GeneratedMethodAccessor13.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at org.apache.derbyTesting.junit.BaseTestCase.runBare(BaseTestCase.java:113)
      at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
      at junit.extensions.TestSetup$1.protect(TestSetup.java:23)
      at junit.extensions.TestSetup.run(TestSetup.java:27)
      at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
      at junit.extensions.TestSetup$1.protect(TestSetup.java:23)
      at junit.extensions.TestSetup.run(TestSetup.java:27)
      at org.apache.derbyTesting.junit.BaseTestSetup.run(BaseTestSetup.java:57)
      at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
      at junit.extensions.TestSetup$1.protect(TestSetup.java:23)
      at junit.extensions.TestSetup.run(TestSetup.java:27)
      at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
      at junit.extensions.TestSetup$1.protect(TestSetup.java:23)
      at junit.extensions.TestSetup.run(TestSetup.java:27)
      Caused by: java.io.UnsupportedEncodingException: MacGreek
      at java.lang.StringCoding.encode(StringCoding.java:340)
      at java.lang.String.getBytes(String.java:955)
      at org.apache.derbyTesting.functionTests.tests.derbynet.ProtocolTest.writeEncodedLDString(ProtocolTest.java:774)
      ... 41 more

      2) protocol.tests_1213_1243(org.apache.derbyTesting.functionTests.tests.derbynet.ProtocolTest)junit.framework.AssertionFailedError: Unsupported encoding MacGreek
      at org.apache.derbyTesting.junit.BaseTestCase.fail(BaseTestCase.java:879)
      at org.apache.derbyTesting.functionTests.tests.derbynet.ProtocolTest.writeEncodedLDString(ProtocolTest.java:781)
      at org.apache.derbyTesting.functionTests.tests.derbynet.ProtocolTest.processCommand(ProtocolTest.java:324)
      at org.apache.derbyTesting.functionTests.tests.derbynet.ProtocolTest.processCommands(ProtocolTest.java:230)
      at org.apache.derbyTesting.functionTests.tests.derbynet.ProtocolTest.testProtocolSequence(ProtocolTest.java:148)
      at sun.reflect.GeneratedMethodAccessor13.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at org.apache.derbyTesting.junit.BaseTestCase.runBare(BaseTestCase.java:113)
      at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
      at junit.extensions.TestSetup$1.protect(TestSetup.java:23)
      at junit.extensions.TestSetup.run(TestSetup.java:27)
      at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
      at junit.extensions.TestSetup$1.protect(TestSetup.java:23)
      at junit.extensions.TestSetup.run(TestSetup.java:27)
      at org.apache.derbyTesting.junit.BaseTestSetup.run(BaseTestSetup.java:57)
      at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
      at junit.extensions.TestSetup$1.protect(TestSetup.java:23)
      at junit.extensions.TestSetup.run(TestSetup.java:27)
      at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
      at junit.extensions.TestSetup$1.protect(TestSetup.java:23)
      at junit.extensions.TestSetup.run(TestSetup.java:27)
      Caused by: java.io.UnsupportedEncodingException: MacGreek
      at java.lang.StringCoding.encode(StringCoding.java:340)
      at java.lang.String.getBytes(String.java:955)
      at org.apache.derbyTesting.functionTests.tests.derbynet.ProtocolTest.writeEncodedLDString(ProtocolTest.java:774)
      ... 41 more

        Activity

        Hide
        Knut Anders Hatlen added a comment -

        It looks to me as if the two test cases use MacGreek because they want to test a non-default CCSID. Using one that's guaranteed to be available on all platforms (like UTF-16) should be just as fine as using MacGreek, I think.

        Show
        Knut Anders Hatlen added a comment - It looks to me as if the two test cases use MacGreek because they want to test a non-default CCSID. Using one that's guaranteed to be available on all platforms (like UTF-16) should be just as fine as using MacGreek, I think.
        Hide
        Kristian Waagan added a comment -

        Started looking at this when I saw the JIRA got created, and missed that you had assigned yourself and already proposed a solution...

        Since my patch has already been produced, I'm attaching it anyway.

        I agree that using a supported, but non-default, encoding is better, as the test itself is defined by the "protocol test language" in protocol.tests and this makes it a little worse to simply skip the test where MacGreek isn't supported.

        Show
        Kristian Waagan added a comment - Started looking at this when I saw the JIRA got created, and missed that you had assigned yourself and already proposed a solution... Since my patch has already been produced, I'm attaching it anyway. I agree that using a supported, but non-default, encoding is better, as the test itself is defined by the "protocol test language" in protocol.tests and this makes it a little worse to simply skip the test where MacGreek isn't supported.
        Hide
        Knut Anders Hatlen added a comment -

        Thanks for picking up this bug, Kristian. I hadn't started on it (except a little reading of the code), so I'm reassigning it to you.

        I applied the patch and verified that it ran successfully.

        The patch looks good to me. I'm not completely sure, though, if the second argument to writeEncodedLDString should be "UnicodeBigUnmarked" or "UTF-16BE". The argument ends up being passed to String.getBytes(String), whose javadoc says the encoding should be one supported by java.nio.charset.Charset, but java.nio.charset.Charset doesn't mention "UnicodeBigUnmarked".

        On the other hand, http://docs.oracle.com/javase/7/docs/technotes/guides/intl/encoding.doc.html says "UnicodeBigUnmarked" is the canonical name for the java.lang APIs, so I suppose both names should be fairly portable. But this latter document is not part of the platform specification, I think, which is why I'm not sure it's guaranteed to work.

        Show
        Knut Anders Hatlen added a comment - Thanks for picking up this bug, Kristian. I hadn't started on it (except a little reading of the code), so I'm reassigning it to you. I applied the patch and verified that it ran successfully. The patch looks good to me. I'm not completely sure, though, if the second argument to writeEncodedLDString should be "UnicodeBigUnmarked" or "UTF-16BE". The argument ends up being passed to String.getBytes(String), whose javadoc says the encoding should be one supported by java.nio.charset.Charset, but java.nio.charset.Charset doesn't mention "UnicodeBigUnmarked". On the other hand, http://docs.oracle.com/javase/7/docs/technotes/guides/intl/encoding.doc.html says "UnicodeBigUnmarked" is the canonical name for the java.lang APIs, so I suppose both names should be fairly portable. But this latter document is not part of the platform specification, I think, which is why I'm not sure it's guaranteed to work.
        Hide
        Kristian Waagan added a comment -

        Thanks for looking into the naming conventions, Knut Anders.

        The relevant Derby class ([1]) uses UnicodeBigUnmarked, which was what led me to the encoding doc. As the recommendation on this is to never remove an alias, I think UnicodeBigUnmarked should work for all VMs that have been around for a while - the fact that it is listed as a canonical name in the Internationalization Guide suggests so too.
        However, it appears to me that it is easier to determine that UTF-16BE is always supported ([2]) since it is listed in the API Specification (the Javadocs), so I'm using it instead in patch 1b (attached).

        [1] CharacterEncoding in the drda package, there's one for the client side too.
        [2] The encoding doc/guide introduced UTF-16BE as a canonical name for the java.nio package in J2SE 1.4, whereas UnicodeBigUnmarked was the canonical name originally used in the Sun JDK.

        Show
        Kristian Waagan added a comment - Thanks for looking into the naming conventions, Knut Anders. The relevant Derby class ( [1] ) uses UnicodeBigUnmarked, which was what led me to the encoding doc. As the recommendation on this is to never remove an alias, I think UnicodeBigUnmarked should work for all VMs that have been around for a while - the fact that it is listed as a canonical name in the Internationalization Guide suggests so too. However, it appears to me that it is easier to determine that UTF-16BE is always supported ( [2] ) since it is listed in the API Specification (the Javadocs), so I'm using it instead in patch 1b (attached). [1] CharacterEncoding in the drda package, there's one for the client side too. [2] The encoding doc/guide introduced UTF-16BE as a canonical name for the java.nio package in J2SE 1.4, whereas UnicodeBigUnmarked was the canonical name originally used in the Sun JDK.
        Hide
        Knut Anders Hatlen added a comment -

        Thanks, Kristian. The 1b patch looks fine to me, and it still makes ProtocolTest pass in the environment that lacks support for MacGreek. +1 to commit.

        Show
        Knut Anders Hatlen added a comment - Thanks, Kristian. The 1b patch looks fine to me, and it still makes ProtocolTest pass in the environment that lacks support for MacGreek. +1 to commit.
        Hide
        Kristian Waagan added a comment -

        Committed patch 1b to trunk with revision 1308694.

        Show
        Kristian Waagan added a comment - Committed patch 1b to trunk with revision 1308694.

          People

          • Assignee:
            Kristian Waagan
            Reporter:
            Knut Anders Hatlen
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development