windows-installer-progress.cpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. // Deterministic user-visible progress scenarios; no wall-clock sleeps or file operations.
  2. #include "../installer/progress.h"
  3. #include <cassert>
  4. int main() {
  5. // Identical work fractions give the same result on fast and slow disks.
  6. for (std::uint64_t interval : {1000ULL, 10000ULL}) {
  7. InstallProgress progress(0);
  8. std::uint64_t now = 0;
  9. double previous = 0;
  10. for (int stage : {1, 2}) {
  11. for (int step = 0; step <= 10; ++step) {
  12. now += interval;
  13. progress.Advance(stage, step / 10.0, now);
  14. progress.Tick(now + 250);
  15. assert(progress.value >= previous && progress.value < 100);
  16. previous = progress.value;
  17. if (stage == 2 && step == 5) assert(progress.value == 58.5);
  18. }
  19. }
  20. assert(progress.value == 92);
  21. progress.Advance(2, 0.2, now + 300); // Retry or a revised Shell work total.
  22. progress.Advance(1, 1, now + 400);
  23. assert(progress.stage == 2 && progress.value == 92);
  24. progress.Advance(3, 0, now + 500);
  25. progress.Advance(4, 0, now + 600);
  26. progress.Advance(4, 0, now + 1000000);
  27. progress.Tick(now + 1000250);
  28. assert(progress.value < 100);
  29. assert(progress.CaptionStage() == 4);
  30. }
  31. // A stalled copy does not creep toward completion merely because time passes.
  32. InstallProgress stalled(0);
  33. stalled.Advance(2, 0.5, 0);
  34. stalled.Advance(2, 0.5, 1000000);
  35. assert(stalled.value == 58.5);
  36. assert(!stalled.succeeded);
  37. // Replay the recording's short cleanup and also a worker finishing between UI ticks.
  38. for (std::uint64_t cleanup : {0ULL, 2200ULL}) {
  39. InstallProgress progress(0);
  40. progress.Advance(1, 1, 25000);
  41. progress.Advance(2, 0, 25300);
  42. progress.Advance(2, 0.99, 53000);
  43. progress.Advance(3, 0, 53250);
  44. progress.Advance(4, 0, 53500);
  45. const auto done = 53500 + cleanup;
  46. progress.Complete(done);
  47. double previous = progress.value;
  48. for (std::uint64_t elapsed = 0; elapsed < 600; elapsed += 16) {
  49. progress.Advance(4, 1, done + elapsed);
  50. assert(progress.value >= previous && progress.value < 100);
  51. previous = progress.value;
  52. }
  53. progress.Tick(done + 600);
  54. assert(progress.value == 100);
  55. progress.Complete(done + 1000);
  56. assert(progress.value == 100);
  57. }
  58. }