From f794d1e7a52809fb55679e0f76a0f481b9f32a3b Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Sun, 13 Sep 2015 11:52:07 +1000 Subject: [PATCH] Infrastructure for doing test driven development to support multiple repo dev. The new test skeletons right now update three different repos in different configurations. They do so such that the order of updates changes and therefore the way in which conflicts between repos are dealt with are tested. They should all have the same result (though I'm not sure exactly what that should be yet). --- F-Droid/test/assets/README.md | 50 +++++++ F-Droid/test/assets/multiRepo.archive.jar | Bin 0 -> 5971 bytes F-Droid/test/assets/multiRepo.conflicting.jar | Bin 0 -> 5705 bytes F-Droid/test/assets/multiRepo.normal.jar | Bin 0 -> 5809 bytes .../fdroid/fdroid/MultiRepoUpdaterTest.java | 136 ++++++++++++++++++ 5 files changed, 186 insertions(+) create mode 100644 F-Droid/test/assets/README.md create mode 100644 F-Droid/test/assets/multiRepo.archive.jar create mode 100644 F-Droid/test/assets/multiRepo.conflicting.jar create mode 100644 F-Droid/test/assets/multiRepo.normal.jar create mode 100644 F-Droid/test/src/org/fdroid/fdroid/MultiRepoUpdaterTest.java diff --git a/F-Droid/test/assets/README.md b/F-Droid/test/assets/README.md new file mode 100644 index 000000000..ea34d0a14 --- /dev/null +++ b/F-Droid/test/assets/README.md @@ -0,0 +1,50 @@ +# Multiple Repos Test + +This covers the three indexes: + * multiRepo.normal.jar + * multiRepo.archive.jar + * multiRepo.conflicting.jar + +The goal is that F-Droid client should be able to: + + * Update all three repos successfully + * Show all included versions for download in the UI + * Somehow deal nicely with the fact that two repos provide versions 50-53 of AdAway + +## multiRepo.normal.jar + + * 2048 (com.uberspot.a2048) + - Version 1.96 (19) + - Version 1.95 (18) + * AdAway (org.adaway) + - Version 3.0.2 (54) + - Version 3.0.1 (53) + - Version 3.0 (52) + * adbWireless (siir.es.adbWireless) + - Version 1.5.4 (12) + +## multiRepo.archive.jar + + * AdAway (org.adaway) + - Version 2.9.2 (51) + - Version 2.9.1 (50) + - Version 2.9 (49) + - Version 2.8.1 (48) + - Version 2.7 (46) + - Version 2.6 (45) + - Version 2.3 (42) + - Version 2.1 (40) + - Version 1.37 (37) + - Version 1.35 (36) + - Version 1.34 (35) + +## multiRepo.conflicting.jar + + * AdAway (org.adaway) + - Version 3.0.1 (53) + - Version 3.0 (52) + - Version 2.9.2 (51) + - Version 2.2.1 (50) + * Add to calendar (org.dgtale.icsimport) + - Version 1.2 (3) + - Version 1.1 (2) \ No newline at end of file diff --git a/F-Droid/test/assets/multiRepo.archive.jar b/F-Droid/test/assets/multiRepo.archive.jar new file mode 100644 index 0000000000000000000000000000000000000000..f5c505c073234f2bed24b4c4888d61e1d395c601 GIT binary patch literal 5971 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 AC;$Ke literal 0 HcmV?d00001 diff --git a/F-Droid/test/assets/multiRepo.conflicting.jar b/F-Droid/test/assets/multiRepo.conflicting.jar new file mode 100644 index 0000000000000000000000000000000000000000..6d26f65d3159bf7af4ce3b0c5d45a729ce5d83d2 GIT binary patch literal 5705 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