|
Litmus
information about litmus
LitmusLitmus is a WebDAV compliance testing tool. It tries to cover most features and problem areas. It currently only tests against the standard, so passing the litmus test does mean your server will also work for every client. Our stanceLitmus is a strict tester, and passing it will also require the server to be strict. Our philosophy is "be liberal in what you accept, be strict in what you produce" and these two things don't always match. Generally if a client would be misbehaving, but an accurate assumption can be made on what the intention of the request was it would be our choice to accept the requests. This may also depend on how popular the client is. For instance, NetDrive sends PROPFIND requests with an empty <prop> element. We can reasonably assume it meant to do an <allprop> request instead, so that's how it's interpreted. That being said, we pass every test. Test statusThis is from a stable release (1.6.1), litmus 0.12.1 and Apache2 were used for testing. The Sabre_DAV_FSExt_* classes were used for this server, as this implementation supports custom properties. Currently all tests are passed. When using Nginx a warning will be thrown for the delete_fragment test. This is because nginx automatically strips url-fragments (#). Nginx also never completes the expect100 http test. I presume this is a bug in my nginx version. -> running `basic': 0. init.................. pass 1. begin................. pass 2. options............... pass 3. put_get............... pass 4. put_get_utf8_segment.. pass 5. put_no_parent......... pass 6. mkcol_over_plain...... pass 7. delete................ pass 8. delete_null........... pass 9. delete_fragment....... pass 10. mkcol................. pass 11. mkcol_again........... pass 12. delete_coll........... pass 13. mkcol_no_parent....... pass 14. mkcol_with_body....... pass 15. finish................ pass <- summary for `basic': of 16 tests run: 16 passed, 0 failed. 100.0% -> running `copymove': 0. init.................. pass 1. begin................. pass 2. copy_init............. pass 3. copy_simple........... pass 4. copy_overwrite........ pass 5. copy_nodestcoll....... pass 6. copy_cleanup.......... pass 7. copy_coll............. pass 8. copy_shallow.......... pass 9. move.................. pass 10. move_coll............. pass 11. move_cleanup.......... pass 12. finish................ pass <- summary for `copymove': of 13 tests run: 13 passed, 0 failed. 100.0% -> running `props': 0. init.................. pass 1. begin................. pass 2. propfind_invalid...... pass 3. propfind_invalid2..... pass 4. propfind_d0........... pass 5. propinit.............. pass 6. propset............... pass 7. propget............... pass 8. propextended.......... pass 9. propmove.............. pass 10. propget............... pass 11. propdeletes........... pass 12. propget............... pass 13. propreplace........... pass 14. propget............... pass 15. propnullns............ pass 16. propget............... pass 17. prophighunicode....... pass 18. propget............... pass 19. propremoveset......... pass 20. propget............... pass 21. propsetremove......... pass 22. propget............... pass 23. propvalnspace......... pass 24. propwformed........... pass 25. propinit.............. pass 26. propmanyns............ pass 27. propget............... pass 28. propcleanup........... pass 29. finish................ pass <- summary for `props': of 30 tests run: 30 passed, 0 failed. 100.0% -> running `locks': 0. init.................. pass 1. begin................. pass 2. options............... pass 3. precond............... pass 4. init_locks............ pass 5. put................... pass 6. lock_excl............. pass 7. discover.............. pass 8. refresh............... pass 9. notowner_modify....... pass 10. notowner_lock......... pass 11. owner_modify.......... pass 12. notowner_modify....... pass 13. notowner_lock......... pass 14. copy.................. pass 15. cond_put.............. pass 16. fail_cond_put......... pass 17. cond_put_with_not..... pass 18. cond_put_corrupt_token pass 19. complex_cond_put...... pass 20. fail_complex_cond_put. pass 21. unlock................ pass 22. fail_cond_put_unlocked pass 23. lock_shared........... pass 24. notowner_modify....... pass 25. notowner_lock......... pass 26. owner_modify.......... pass 27. double_sharedlock..... pass 28. notowner_modify....... pass 29. notowner_lock......... pass 30. unlock................ pass 31. prep_collection....... pass 32. lock_collection....... pass 33. owner_modify.......... pass 34. notowner_modify....... pass 35. refresh............... pass 36. indirect_refresh...... pass 37. unlock................ pass 38. unmapped_lock......... pass 39. unlock................ pass 40. finish................ pass <- summary for `locks': of 41 tests run: 41 passed, 0 failed. 100.0% -> running `http': 0. init.................. pass 1. begin................. pass 2. expect100............. pass 3. finish................ pass <- summary for `http': of 4 tests run: 4 passed, 0 failed. 100.0% | |
"As an example, Windows clients might make a PROPPATCH request with no body. While this is non-standard, this is interpreted as a PROPPATCH request containing the <allprops /> instruction."
I believe PROPFIND was meant here and RFC 4918 explicitly allows that:
"A client may choose not to submit a request body. An empty PROPFIND request body MUST be treated as if it were an 'allprop' request."
You're right. I did mean PROPFIND. I don't think the old rfc allowed it, which is how I got there.
filip, I changed the example to a Netdrive incompatibility. Thankfully there's plenty of incompatibilities to choose from :)
Thanks. These pages are good reference for other implementors of the WebDAV/CalDAV protocols. :)
Thanks =) I was hoping for that. Keep the suggestions coming.
Hi Evert, is it possible to update this test and run it with 1.6 version? Only if it's not too much effort...
Updated!