I think it's a good point that we may only want to run some tests once, not once per OS/Arch. However, I believe these particular tests are still limited in scope by the OS/arch of the host machine. The go/build package respects the build tags in files, so in theory, one run of this on Ubuntu could miss code that is +build windows. (we could give go/build different os/arch constraints, but then we're back to running this N times for N os/arch variants)
I'm certainly happy to have these tests run in verify.sh, but it sounds like they may need to be run per-OS testrun as well. On Sun, May 1, 2016 at 10:27 PM Andrew Wilkins <andrew.wilk...@canonical.com> wrote: > On Thu, Apr 28, 2016 at 11:48 AM Nate Finch <nate.fi...@canonical.com> > wrote: > >> Maybe we're not as far apart as I thought at first. >> > > >> My thought was that they'd live under github.com/juju/juju/devrules (or >> some other name) and therefore only get run during a full test run or if >> you run them there specifically. What is a full test run if not a test of >> all our code? These tests just happen to test all the code at once, rather >> than piece by piece. Combining with the other thread, if we also marked >> them as skipped under -short, you could easily still run go test ./... >> -short from the root of the juju repo and not incur the extra 16.5 seconds >> (gocheck has a nice feature where if you call c.Skip() in the SetUpSuite, >> it skips all the tests in the suite, which is particularly appropriate to >> these tests, since it's the SetUpSuite that takes all the time). >> > > I'm not opposed to using the Go testing framework in this instance, > because it makes most sense to write the analysis code in Go. That may not > always be the case, though, and I don't want to have a rule of "everything > as Go tests" that means we end up shoe-horning things. This is just > academic until we need something that doesn't live in the Go ecosystem, > though. > > Most importantly, I don't want to lose the ability to distinguish the > types of tests. As an example: where we run static analysis should never > matter, so we can cut a merge job short by performing all of the static > analysis checks up front. That doesn't matter much if we only gate merges > on running the tests on one Ubuntu series/arch; but what if we want to > start gating on Windows, CentOS, or additional architectures? It would not > make sense to run them all in parallel if they're all going to fail on the > static analysis tests. And then if we've run them up front, it would be > ideal to not have to run them on the individual test machines. > > So I think it would be OK to have a separate "devrules" package, or > whatever we want to call it. I would still like these tests to be run by > verify.sh, so we have one place to go to check that the source code is > healthy, without also running the unit tests or feature tests. If we have a > separate package like this, test tags are not really necessary in the short > term -- the distinction is made by separating the tests into their own > package. We could still mark them as short/long, but that's orthogonal to > separation-by-purpose. > > Cheers, > Andrew > > Mostly, I just didn't want them to live off in a separate repo or run with >> a separate tool. >> >> On Wed, Apr 27, 2016 at 11:39 PM Andrew Wilkins < >> andrew.wilk...@canonical.com> wrote: >> >>> On Thu, Apr 28, 2016 at 11:14 AM Nate Finch <nate.fi...@canonical.com> >>> wrote: >>> >>>> From the other thread: >>>> >>>> I wrote a test that parses the entire codebase under >>>> github.com/juju/juju to look for places where we're creating a new >>>> value of crypto/tls.Config instead of using the new helper function that I >>>> wrote that creates one with more secure defaults. It takes 16.5 seconds to >>>> run on my machine. There's not really any getting around the fact that >>>> parsing the whole tree takes a long time. >>>> >>>> What I *don't* want is to put these tests somewhere else which requires >>>> more thought/setup to run. So, no separate long-tests directory or >>>> anything. Keep the tests close to the code and run in the same way we run >>>> unit tests. >>>> >>> >>> The general answer to this belongs back in the other thread, but I agree >>> that long-running *unit* tests (if there should ever be such a thing) >>> should not be shunted off to another location. Keep the unit tests with the >>> unit. Integration tests are a different matter, because they cross multiple >>> units. Likewise, tests for project policies. >>> >>> Andrew's response: >>>> >>>> >>>> *The nature of the test is important here: it's not a test of Juju >>>> functionality, but a test to ensure that we don't accidentally use a TLS >>>> configuration that doesn't match our project-wide constraints. It's static >>>> analysis, using the test framework; and FWIW, the sort of thing that Lingo >>>> would be a good fit for.* >>>> >>>> *I'd suggest that we do organise things like this separately, and run >>>> them as part of the "scripts/verify.sh" script. This is the sort of test >>>> that you shouldn't need to run often, but I'd like us to gate merges on.* >>>> >>>> So, I don't really think the method of testing should determine where a >>>> test lives or how it is run. I could test the exact same things with a >>>> more common unit test - check the tls config we use when dialing the API is >>>> using tls 1.2, that it only uses these specific ciphersuites, etc. In >>>> fact, we have some unit tests that do just that, to verify that SSL is >>>> disabled. However, then we'd need to remember to write those same tests >>>> for every place we make a tls.Config. >>>> >>> >>> The method of testing is not particularly relevant; it's the *purpose* >>> that matters. You could probably use static analysis for a lot of our >>> units; it would be inappropriate, but they'd still be testing units, and so >>> should live with them. >>> >>> The point I was trying to make is that this is not a test of one unit, >>> but a policy that covers the entire codebase. You say that you don't want >>> to it put them "somewhere else", but it's not at all clear to me where you >>> think we *should* have them. >>> >>>> The thing I like about having this as part of the unit tests is that >>>> it's zero friction. They already gate landings. We can write them and run >>>> them them just like we write and run go tests 1000 times a day. They're >>>> not special. There's no other commands I need to remember to run, scripts >>>> I need to remember to set up. It's go test, end of story. >>>> >>> >>> Using the Go testing framework is fine. I only want to make sure we're >>> not slowing down the edit/test cycle by frequently testing things that are >>> infrequently going to change. It's the same deal as with integration tests; >>> there's a trade-off between the time spent and confidence level. >>> >>>> The comment about Lingo is valid, though I think we have room for both >>>> in our processes. Lingo, in my mind, is more appropriate at review-time, >>>> which allows us to write lingo rules that may not have 100% confidence. >>>> They can be strong suggestions rather than gating rules. The type of test >>>> I wrote should be a gating rule - there are no false positives. >>>> >>>> To give a little more context, I wrote the test as a suite, where you >>>> can add tests to hook into the code parsing, so we can trivially add more >>>> tests that use the full parsed code, while only incurring the 16.5 second >>>> parsing hit once for the entire suite. That doesn't really affect this >>>> discussion at all, but I figured people might appreciate that this could be >>>> extended for more than my one specific test. I certainly wouldn't advocate >>>> people writing new 17 seconds tests all over the place. >>>> >>> >>> That sounds lovely, thank you. >>> >>> Cheers, >>> Andrew >>> >>
-- Juju-dev mailing list Juju-dev@lists.ubuntu.com Modify settings or unsubscribe at: https://lists.ubuntu.com/mailman/listinfo/juju-dev