I am working on an application that has SDKs in multiple languages. Currently Java, JavaScript, Dart, and Go, but ultimately we'd like to have an SDK for every major language. Our primary test suites are written in Go, which means our other SDKs are not well tested. I do not want to write or maintain test suites in four or ten different languages.
What I would like to do is choose a language to write the tests in, define a test harness interface, implement that test harness for each SDK, and write the tests using that harness. Of course I could do this with RPC/HTTP/etc but that would add significant complexity. I'd prefer to write the tests in a language that has a meaningful degree of interop/FFI with most of the major languages. Lua comes to mind, since it seems like someone has built a Lua interpreter for basically every language in existence, but I have very little Lua experience and I have no idea how painful it might be to do this in Lua. I am open to other suggestions besides interop/FFI and RPC, though I don't want to take the approach of creating test templates and generating the tests in each language. I've done things like that and they're a pain to maintain.
I don't think you really have a choice TBH. Trying to do something like that sounds like a world of pain, and a bunch of unidiomatic code. If you can't actually support 4 to 10 languages, maybe you should cut back on which ones you support?
One interesting thing you could try if you really don't want to cut back is to try having using an LLM to take your officially supported code and transliterate it to other languages. I haven't tried it at this scale yet, but LLMs are generally pretty good at tasks like that. I suspect that would work better than whatever templating approach you've used before.
If neither of those approaches works, everything speaks C FFI, and Rust is a modern language that would work well for presenting a C FFI that the other languages can use. You're probably not hot on the idea of rewriting your Go tests into another language, but I think that's your only real option then.
Yeah, that's pretty much what I was thinking too. The combination of a c API and a JVM API (and maybe .NET if you're in Microsoft land?) Hits most FFI available in languages I've seen. I can't think of any language I've used that couldn't Interop with either a c library (.a or .so) or JVM library (.jar). However I've never used any .NET system seriously, so I don't know about them.
FWIW I regularly remake the same API based game whenever I start a new job working in a new environment to test that my environment is "up to snuff" with my development methodologies. I've never needed to port more than API.a and API.jar to play around in any language. I've ported that system to at least 100 languages over the years, and while some have more friction than others, and often the c/JVM paradigm doesn't line up well with the target language, it is always effective.
The .NET languages support c interop. The documentation could use some love though.