> When the TDML runner is called, and the model for the test case identifies a
> binary file, somehow the schema version and daffodil-version information are
> added to it.
>
> Where does the TDML runner get this information from? I would expect that
> information is available to SBT, but how can the TDML runner get it?

Are you asking this because packageDaffodilBin creates files like "dfdl-foo-1.0-message-daffodil390.bin" and you're asking how the TDML runner knows to use "1.0" and "daffodil390", and also the "message" classifier to find the binary file since those aren't including in the model?

The answer is that it doesn't. When daffodilTdmlUsesPackageBin is true, the plugin runs packageDaffodilBin to create the saved parsers you're familiar with. But then it actually finds the saved parsers built for daffodilVersion and copies them to the Test/resourceManaged directory (which is on the test classpath for the TDML runner to find), and it copies the files so the names do not include any version information. So for example, the above dfdl-foo saved parser would be copied to "resource_managed/test/dfdl-foo-message.bin".

This way TDML files do not need to be updated each time the schema version or daffodilVersion setting is changed. Only names or classifiers require TDML changes, and those change pretty rarely.


Note that based on this, instead of step 4, you could copy the binary file to src/test/resources/<name>-<classifer>.bin. Then you don't need to do step 2 and can keep your TDML files the same. You just have to remember to not commit the build.sbt or src/test/resources changes.


Also, now that I think about how SBT works, I'm not even sure SBT can support what you're asking for. Support for conditional tasks in SBT is kindof limited. You either do the task and all sub-tasks, or you do none of it. There's no way to do one part of a task (e.g. copy saved parser if it exists and add to classpath) without also doing another part (build saved parsers). Maybe it's possible with some complicated reorganization of the plugin, but it's already complicated enough. I think modifying daffodilTdmlUsesPackageBin might be the best option to get what you want. If that becomes too much of a hassle I'm happy to revisit this and see if there's a way to make it work, but I'm not sure there is.


On 2024-10-28 12:31 PM, Mike Beckerle wrote:
I can think of many situations where I have a pre-compiled schema, I've made changes, but I still want to run using the old one, not wait 2 or 3 minutes for a new one to be created.

Here's my workaround:

 1. Temporarily set daffodilTdmlUsesPackageBin := false
 2. Temporarily change model attribute of every test case to point at a tempdir
    location.
     1. (Enhancement: a tdml:testSuite defaultModel attribute where one could
        specify the model to be used in one place, not in every test case. This
        makes modifying the test suite to point it at a specific location for
        the binary model file a one-line edit, not a giant multi-replacement)
 3. sbt packageDaffodilBin
 4. copy the binary file to the tmpdir location.

Here is what I don't understand.

When the TDML runner is called, and the model for the test case identifies a binary file, somehow the schema version and daffodil-version information are added to it.

Where does the TDML runner get this information from? I would expect that information is available to SBT, but how can the TDML runner get it?


On Mon, Oct 28, 2024 at 9:36 AM Steve Lawrence <slawre...@apache.org <mailto:slawre...@apache.org>> wrote:

    There is not currently a setting that does that. We could probably add one
    pretty easily, but it feels like it could be a bit fragile?

    For example, say this new setting is enabled and you run packageDaffodilBin 
to
    build a saved parser and you run "sbt test" and all test pass. Then you make
    changes to the schema that accidentally break things, but forget to run
    "packgeDaffodilBin". If you run "sbt test" all the tests will pass because
    you're using an older saved parser even though they should fail. The current
    logic detects when schema changes have been made and will force a rebuild 
when
    you run tests.

    Would it work to temporarily change daffodilTdmlUsesPackageBin to false 
while
    you do things that don't need a binary and then change it back when your 
done?
    Or would there be too much switching?

    If that would be too much of a headache, we can definitely add setting, but 
it
    would have to come with a warning that it's up to the user to not forget to
    rebuild schemas when running tests. We might be able to output a warning if
    tests are run and the cache is old, but dealing with SBT cache is tricky, 
so it
    might not be possible.


    On 2024-10-25 07:56 PM, Mike Beckerle wrote:
     >
     > So in IntelliJ when I run a main app that is part of src/test/scala, the
    build
     > process runs packageDaffodilBin and that recompiles the entire schema.
     >
     > This takes *minutes* for this large schema.
     >
     > Is there a setting I can use to tell it to only recompile the binary
    schema when
     > I specifically request it by 'sbt packageDaffodilBin' ?
     >
     > I don't want to turn off use of the binary by TDML tests. I just want to
    turn
     > off all automatic such compilation.
     >
     > If the compiled binary doesn't exist I want a diagnostic error from
    whatever was
     > looking for it, not an automatic recompile.
     >
     >
     >
     >
     >


Reply via email to