Uploaded image for project: 'Clojure'
  1. CLJ-1684

Transducer eduction test is wrong

    Details

    • Approval:
      Ok
    • Patch:
      Code and Test

      Description

      Error in build:

        [java] ERROR in (seq-and-transducer) (TransformerIterator.java:86)
               [java] Uncaught exception, not in assertion.
               [java] expected: nil
               [java]   actual: java.lang.NullPointerException: null
               [java]  at clojure.lang.TransformerIterator.step (TransformerIterator.java:86)
               [java]     clojure.lang.TransformerIterator.hasNext (TransformerIterator.java:97)
               [java]     clojure.lang.RT.chunkIteratorSeq (RT.java:489)
               [java]     clojure.lang.RT.seqFrom (RT.java:518)
               [java]     clojure.lang.RT.seq (RT.java:509)
               [java]     clojure.core/seq (core.clj:135)
               [java]     clojure.core$print_sequential.invoke (core_print.clj:47)
               [java]     clojure.core/fn (core.clj:7362)
               [java]     clojure.lang.MultiFn.invoke (MultiFn.java:233)
               [java]     clojure.core$pr_on.invoke (core.clj:3549)
               [java]     clojure.core$pr.invoke (core.clj:3561)
               [java]     clojure.pprint$pprint_simple_default.invoke (dispatch.clj:144)
      

      There is an error in the generative transducer eduction test that was added in CLJ-1669 Closed . This code in transducers.clj:

      (apply eduction (into actions [coll]))
      

      is not invoking eduction with actions and a collection. Rather it is putting the actions inside the collection and effectively using no transformation at all as in (eduction [1 2]), which always passes. The error seen is due to a bad function being passed - if actions happens to be nil (which I think is happening while shrinking another failure), something like (eduction (constantly nil) []) is being called, which we would not expect to work in the first place.

      After fixing the bad eduction handling, I was only able to trigger failures with a high number of iterations and a very large number of transformations. The errors reported under these conditions are difficult to understand, I believe because they are hitting StackOverflow errors and the stack traces are being removed by the JVM.

      I did some more investigation into whether we are actually generating useful generative tests and found that due to the large stack of transformations, virtually all tests were just producing exceptions, rather than more interesting behavior. I capped the number of transformations to 5 and saw much more useful and interesting tests being generated. I've also doubled the number of transducer tests being run in the patch and ran it locally with a much higher number with no failures.

      Patch: clj-1684.patch

        Attachments

          Activity

            People

            • Assignee:
              Unassigned
              Reporter:
              alexmiller Alex Miller
            • Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: