Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(52)

Side by Side Diff: base/time/time_unittest.cc

Issue 1229853004: Base: Make TimeDelta constructors deal with overflow. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« base/time/time.cc ('K') | « base/time/time.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/time/time.h" 5 #include "base/time/time.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 #include <time.h> 8 #include <time.h>
9 #include <limits> 9 #include <limits>
10 #include <string> 10 #include <string>
(...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after
477 // Should be 1970-01-01 00:00:01 1 millisecond. 477 // Should be 1970-01-01 00:00:01 1 millisecond.
478 EXPECT_EQ(kUnixEpochYear, exploded.year); 478 EXPECT_EQ(kUnixEpochYear, exploded.year);
479 EXPECT_EQ(1, exploded.month); 479 EXPECT_EQ(1, exploded.month);
480 EXPECT_EQ(1, exploded.day_of_month); 480 EXPECT_EQ(1, exploded.day_of_month);
481 EXPECT_EQ(0, exploded.hour); 481 EXPECT_EQ(0, exploded.hour);
482 EXPECT_EQ(0, exploded.minute); 482 EXPECT_EQ(0, exploded.minute);
483 EXPECT_EQ(1, exploded.second); 483 EXPECT_EQ(1, exploded.second);
484 EXPECT_EQ(1, exploded.millisecond); 484 EXPECT_EQ(1, exploded.millisecond);
485 } 485 }
486 486
487 TEST_F(TimeTest, TimeDeltaMax) {
488 TimeDelta max = TimeDelta::Max();
489 EXPECT_TRUE(max.is_max());
490 EXPECT_EQ(max, TimeDelta::Max());
491 EXPECT_GT(max, TimeDelta::FromDays(100 * 365));
492 EXPECT_GT(max, TimeDelta());
493 }
494
495 TEST_F(TimeTest, TimeDeltaMaxConversions) {
496 TimeDelta t = TimeDelta::Max();
497 EXPECT_EQ(std::numeric_limits<int64>::max(), t.ToInternalValue());
498
499 EXPECT_EQ(std::numeric_limits<int>::max(), t.InDays());
500 EXPECT_EQ(std::numeric_limits<int>::max(), t.InHours());
501 EXPECT_EQ(std::numeric_limits<int>::max(), t.InMinutes());
502 EXPECT_EQ(std::numeric_limits<double>::infinity(), t.InSecondsF());
503 EXPECT_EQ(std::numeric_limits<int64>::max(), t.InSeconds());
504 EXPECT_EQ(std::numeric_limits<double>::infinity(), t.InMillisecondsF());
505 EXPECT_EQ(std::numeric_limits<int64>::max(), t.InMilliseconds());
506 EXPECT_EQ(std::numeric_limits<int64>::max(), t.InMillisecondsRoundedUp());
507
508 t = TimeDelta::FromDays(std::numeric_limits<int>::max());
509 EXPECT_TRUE(t.is_max());
510
511 t = TimeDelta::FromHours(std::numeric_limits<int>::max());
512 EXPECT_TRUE(t.is_max());
513
514 t = TimeDelta::FromMinutes(std::numeric_limits<int>::max());
515 EXPECT_TRUE(t.is_max());
516
517 t = TimeDelta::FromSeconds(std::numeric_limits<int64>::max());
518 EXPECT_TRUE(t.is_max());
519
520 t = TimeDelta::FromMilliseconds(std::numeric_limits<int64>::max());
521 EXPECT_TRUE(t.is_max());
522
523 t = TimeDelta::FromSecondsD(std::numeric_limits<double>::infinity());
524 EXPECT_TRUE(t.is_max());
525
526 t = TimeDelta::FromMillisecondsD(std::numeric_limits<double>::infinity());
527 EXPECT_TRUE(t.is_max());
528
529 t = TimeDelta::FromMicroseconds(std::numeric_limits<int64>::max());
530 EXPECT_TRUE(t.is_max());
531 }
532
533 TEST_F(TimeTest, Max) { 487 TEST_F(TimeTest, Max) {
534 Time max = Time::Max(); 488 Time max = Time::Max();
535 EXPECT_TRUE(max.is_max()); 489 EXPECT_TRUE(max.is_max());
536 EXPECT_EQ(max, Time::Max()); 490 EXPECT_EQ(max, Time::Max());
537 EXPECT_GT(max, Time::Now()); 491 EXPECT_GT(max, Time::Now());
538 EXPECT_GT(max, Time()); 492 EXPECT_GT(max, Time());
539 } 493 }
540 494
541 TEST_F(TimeTest, MaxConversions) { 495 TEST_F(TimeTest, MaxConversions) {
542 Time t = Time::Max(); 496 Time t = Time::Max();
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
788 EXPECT_EQ(13, TimeDelta::FromMinutes(13).InMinutes()); 742 EXPECT_EQ(13, TimeDelta::FromMinutes(13).InMinutes());
789 EXPECT_EQ(13, TimeDelta::FromSeconds(13).InSeconds()); 743 EXPECT_EQ(13, TimeDelta::FromSeconds(13).InSeconds());
790 EXPECT_EQ(13.0, TimeDelta::FromSeconds(13).InSecondsF()); 744 EXPECT_EQ(13.0, TimeDelta::FromSeconds(13).InSecondsF());
791 EXPECT_EQ(13, TimeDelta::FromMilliseconds(13).InMilliseconds()); 745 EXPECT_EQ(13, TimeDelta::FromMilliseconds(13).InMilliseconds());
792 EXPECT_EQ(13.0, TimeDelta::FromMilliseconds(13).InMillisecondsF()); 746 EXPECT_EQ(13.0, TimeDelta::FromMilliseconds(13).InMillisecondsF());
793 EXPECT_EQ(13, TimeDelta::FromSecondsD(13.1).InSeconds()); 747 EXPECT_EQ(13, TimeDelta::FromSecondsD(13.1).InSeconds());
794 EXPECT_EQ(13.1, TimeDelta::FromSecondsD(13.1).InSecondsF()); 748 EXPECT_EQ(13.1, TimeDelta::FromSecondsD(13.1).InSecondsF());
795 EXPECT_EQ(13, TimeDelta::FromMillisecondsD(13.3).InMilliseconds()); 749 EXPECT_EQ(13, TimeDelta::FromMillisecondsD(13.3).InMilliseconds());
796 EXPECT_EQ(13.3, TimeDelta::FromMillisecondsD(13.3).InMillisecondsF()); 750 EXPECT_EQ(13.3, TimeDelta::FromMillisecondsD(13.3).InMillisecondsF());
797 EXPECT_EQ(13, TimeDelta::FromMicroseconds(13).InMicroseconds()); 751 EXPECT_EQ(13, TimeDelta::FromMicroseconds(13).InMicroseconds());
752 EXPECT_EQ(3.456, TimeDelta::FromMillisecondsD(3.45678).InMillisecondsF());
798 } 753 }
799 754
800 #if defined(OS_POSIX) 755 #if defined(OS_POSIX)
801 TEST(TimeDelta, TimeSpecConversion) { 756 TEST(TimeDelta, TimeSpecConversion) {
802 struct timespec result = TimeDelta::FromSeconds(0).ToTimeSpec(); 757 struct timespec result = TimeDelta::FromSeconds(0).ToTimeSpec();
803 EXPECT_EQ(result.tv_sec, 0); 758 EXPECT_EQ(result.tv_sec, 0);
804 EXPECT_EQ(result.tv_nsec, 0); 759 EXPECT_EQ(result.tv_nsec, 0);
805 760
806 result = TimeDelta::FromSeconds(1).ToTimeSpec(); 761 result = TimeDelta::FromSeconds(1).ToTimeSpec();
807 EXPECT_EQ(result.tv_sec, 1); 762 EXPECT_EQ(result.tv_sec, 1);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
861 TimeDelta::FromMicroseconds(negative_one).magnitude()); 816 TimeDelta::FromMicroseconds(negative_one).magnitude());
862 817
863 const int64 max_int64_minus_one = std::numeric_limits<int64>::max() - 1; 818 const int64 max_int64_minus_one = std::numeric_limits<int64>::max() - 1;
864 const int64 min_int64_plus_two = std::numeric_limits<int64>::min() + 2; 819 const int64 min_int64_plus_two = std::numeric_limits<int64>::min() + 2;
865 EXPECT_EQ(TimeDelta::FromMicroseconds(max_int64_minus_one), 820 EXPECT_EQ(TimeDelta::FromMicroseconds(max_int64_minus_one),
866 TimeDelta::FromMicroseconds(max_int64_minus_one).magnitude()); 821 TimeDelta::FromMicroseconds(max_int64_minus_one).magnitude());
867 EXPECT_EQ(TimeDelta::FromMicroseconds(max_int64_minus_one), 822 EXPECT_EQ(TimeDelta::FromMicroseconds(max_int64_minus_one),
868 TimeDelta::FromMicroseconds(min_int64_plus_two).magnitude()); 823 TimeDelta::FromMicroseconds(min_int64_plus_two).magnitude());
869 } 824 }
870 825
826 TEST(TimeDelta, Max) {
827 TimeDelta max = TimeDelta::Max();
828 EXPECT_TRUE(max.is_max());
829 EXPECT_EQ(max, TimeDelta::Max());
830 EXPECT_GT(max, TimeDelta::FromDays(100 * 365));
831 EXPECT_GT(max, TimeDelta());
832 }
833
834 bool IsMin(TimeDelta delta) {
835 return (-delta).is_max();
836 }
837
838 TEST(TimeDelta, MaxConversions) {
839 TimeDelta t = TimeDelta::Max();
840 EXPECT_EQ(std::numeric_limits<int64>::max(), t.ToInternalValue());
841
842 EXPECT_EQ(std::numeric_limits<int>::max(), t.InDays());
843 EXPECT_EQ(std::numeric_limits<int>::max(), t.InHours());
844 EXPECT_EQ(std::numeric_limits<int>::max(), t.InMinutes());
845 EXPECT_EQ(std::numeric_limits<double>::infinity(), t.InSecondsF());
846 EXPECT_EQ(std::numeric_limits<int64>::max(), t.InSeconds());
847 EXPECT_EQ(std::numeric_limits<double>::infinity(), t.InMillisecondsF());
848 EXPECT_EQ(std::numeric_limits<int64>::max(), t.InMilliseconds());
849 EXPECT_EQ(std::numeric_limits<int64>::max(), t.InMillisecondsRoundedUp());
850
851 t = TimeDelta::FromDays(std::numeric_limits<int>::max());
852 EXPECT_TRUE(t.is_max());
853
854 t = TimeDelta::FromHours(std::numeric_limits<int>::max());
855 EXPECT_TRUE(t.is_max());
856
857 t = TimeDelta::FromMinutes(std::numeric_limits<int>::max());
858 EXPECT_TRUE(t.is_max());
859
860 int64 max_int = std::numeric_limits<int64>::max();
861
862 t = TimeDelta::FromSeconds(max_int / Time::kMicrosecondsPerSecond + 1);
863 EXPECT_TRUE(t.is_max());
864
865 t = TimeDelta::FromMilliseconds(max_int / Time::kMillisecondsPerSecond + 1);
866 EXPECT_TRUE(t.is_max());
867
868 t = TimeDelta::FromMicroseconds(max_int);
869 EXPECT_TRUE(t.is_max());
870
871 t = TimeDelta::FromSeconds(-max_int / Time::kMicrosecondsPerSecond - 1);
872 EXPECT_TRUE(IsMin(t));
873
874 t = TimeDelta::FromMilliseconds(-max_int / Time::kMillisecondsPerSecond - 1);
875 EXPECT_TRUE(IsMin(t));
876
877 t = TimeDelta::FromMicroseconds(-max_int);
878 EXPECT_TRUE(IsMin(t));
Nico 2015/07/17 17:00:24 For giggles, can you add a EXPECT_FALSE(IsMin(-
rvargas (doing something else) 2015/07/17 19:18:10 Will do.
879
880 t = TimeDelta::FromSecondsD(std::numeric_limits<double>::infinity());
881 EXPECT_TRUE(t.is_max());
882
883 double max_d = max_int;
884
885 t = TimeDelta::FromSecondsD(max_d / Time::kMicrosecondsPerSecond + 1);
886 EXPECT_TRUE(t.is_max());
887
888 t = TimeDelta::FromMillisecondsD(std::numeric_limits<double>::infinity());
889 EXPECT_TRUE(t.is_max());
890
891 t = TimeDelta::FromMillisecondsD(max_d / Time::kMillisecondsPerSecond * 2);
892 EXPECT_TRUE(t.is_max());
893
894 t = TimeDelta::FromSecondsD(-max_d / Time::kMicrosecondsPerSecond - 1);
895 EXPECT_TRUE(IsMin(t));
896
897 t = TimeDelta::FromMillisecondsD(-max_d / Time::kMillisecondsPerSecond * 2);
898 EXPECT_TRUE(IsMin(t));
899 }
871 900
872 TEST(TimeDelta, NumericOperators) { 901 TEST(TimeDelta, NumericOperators) {
873 double d = 0.5; 902 double d = 0.5;
874 EXPECT_EQ(TimeDelta::FromMilliseconds(500), 903 EXPECT_EQ(TimeDelta::FromMilliseconds(500),
875 TimeDelta::FromMilliseconds(1000) * d); 904 TimeDelta::FromMilliseconds(1000) * d);
876 EXPECT_EQ(TimeDelta::FromMilliseconds(2000), 905 EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
877 TimeDelta::FromMilliseconds(1000) / d); 906 TimeDelta::FromMilliseconds(1000) / d);
878 EXPECT_EQ(TimeDelta::FromMilliseconds(500), 907 EXPECT_EQ(TimeDelta::FromMilliseconds(500),
879 TimeDelta::FromMilliseconds(1000) *= d); 908 TimeDelta::FromMilliseconds(1000) *= d);
880 EXPECT_EQ(TimeDelta::FromMilliseconds(2000), 909 EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
881 TimeDelta::FromMilliseconds(1000) /= d); 910 TimeDelta::FromMilliseconds(1000) /= d);
882 EXPECT_EQ(TimeDelta::FromMilliseconds(500), 911 EXPECT_EQ(TimeDelta::FromMilliseconds(500),
883 d * TimeDelta::FromMilliseconds(1000)); 912 d * TimeDelta::FromMilliseconds(1000));
884 913
885 float f = 0.5; 914 float f = 0.5;
886 EXPECT_EQ(TimeDelta::FromMilliseconds(500), 915 EXPECT_EQ(TimeDelta::FromMilliseconds(500),
887 TimeDelta::FromMilliseconds(1000) * f); 916 TimeDelta::FromMilliseconds(1000) * f);
888 EXPECT_EQ(TimeDelta::FromMilliseconds(2000), 917 EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
889 TimeDelta::FromMilliseconds(1000) / f); 918 TimeDelta::FromMilliseconds(1000) / f);
890 EXPECT_EQ(TimeDelta::FromMilliseconds(500), 919 EXPECT_EQ(TimeDelta::FromMilliseconds(500),
891 TimeDelta::FromMilliseconds(1000) *= f); 920 TimeDelta::FromMilliseconds(1000) *= f);
892 EXPECT_EQ(TimeDelta::FromMilliseconds(2000), 921 EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
893 TimeDelta::FromMilliseconds(1000) /= f); 922 TimeDelta::FromMilliseconds(1000) /= f);
894 EXPECT_EQ(TimeDelta::FromMilliseconds(500), 923 EXPECT_EQ(TimeDelta::FromMilliseconds(500),
895 f * TimeDelta::FromMilliseconds(1000)); 924 f * TimeDelta::FromMilliseconds(1000));
896 925
897
898 int i = 2; 926 int i = 2;
899 EXPECT_EQ(TimeDelta::FromMilliseconds(2000), 927 EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
900 TimeDelta::FromMilliseconds(1000) * i); 928 TimeDelta::FromMilliseconds(1000) * i);
901 EXPECT_EQ(TimeDelta::FromMilliseconds(500), 929 EXPECT_EQ(TimeDelta::FromMilliseconds(500),
902 TimeDelta::FromMilliseconds(1000) / i); 930 TimeDelta::FromMilliseconds(1000) / i);
903 EXPECT_EQ(TimeDelta::FromMilliseconds(2000), 931 EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
904 TimeDelta::FromMilliseconds(1000) *= i); 932 TimeDelta::FromMilliseconds(1000) *= i);
905 EXPECT_EQ(TimeDelta::FromMilliseconds(500), 933 EXPECT_EQ(TimeDelta::FromMilliseconds(500),
906 TimeDelta::FromMilliseconds(1000) /= i); 934 TimeDelta::FromMilliseconds(1000) /= i);
907 EXPECT_EQ(TimeDelta::FromMilliseconds(2000), 935 EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
908 i * TimeDelta::FromMilliseconds(1000)); 936 i * TimeDelta::FromMilliseconds(1000));
909 937
910 int64_t i64 = 2; 938 int64_t i64 = 2;
911 EXPECT_EQ(TimeDelta::FromMilliseconds(2000), 939 EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
912 TimeDelta::FromMilliseconds(1000) * i64); 940 TimeDelta::FromMilliseconds(1000) * i64);
913 EXPECT_EQ(TimeDelta::FromMilliseconds(500), 941 EXPECT_EQ(TimeDelta::FromMilliseconds(500),
914 TimeDelta::FromMilliseconds(1000) / i64); 942 TimeDelta::FromMilliseconds(1000) / i64);
915 EXPECT_EQ(TimeDelta::FromMilliseconds(2000), 943 EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
916 TimeDelta::FromMilliseconds(1000) *= i64); 944 TimeDelta::FromMilliseconds(1000) *= i64);
917 EXPECT_EQ(TimeDelta::FromMilliseconds(500), 945 EXPECT_EQ(TimeDelta::FromMilliseconds(500),
918 TimeDelta::FromMilliseconds(1000) /= i64); 946 TimeDelta::FromMilliseconds(1000) /= i64);
919 EXPECT_EQ(TimeDelta::FromMilliseconds(2000), 947 EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
920 i64 * TimeDelta::FromMilliseconds(1000)); 948 i64 * TimeDelta::FromMilliseconds(1000));
921 949
922
923 EXPECT_EQ(TimeDelta::FromMilliseconds(500), 950 EXPECT_EQ(TimeDelta::FromMilliseconds(500),
924 TimeDelta::FromMilliseconds(1000) * 0.5); 951 TimeDelta::FromMilliseconds(1000) * 0.5);
925 EXPECT_EQ(TimeDelta::FromMilliseconds(2000), 952 EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
926 TimeDelta::FromMilliseconds(1000) / 0.5); 953 TimeDelta::FromMilliseconds(1000) / 0.5);
927 EXPECT_EQ(TimeDelta::FromMilliseconds(500), 954 EXPECT_EQ(TimeDelta::FromMilliseconds(500),
928 TimeDelta::FromMilliseconds(1000) *= 0.5); 955 TimeDelta::FromMilliseconds(1000) *= 0.5);
929 EXPECT_EQ(TimeDelta::FromMilliseconds(2000), 956 EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
930 TimeDelta::FromMilliseconds(1000) /= 0.5); 957 TimeDelta::FromMilliseconds(1000) /= 0.5);
931 EXPECT_EQ(TimeDelta::FromMilliseconds(500), 958 EXPECT_EQ(TimeDelta::FromMilliseconds(500),
932 0.5 * TimeDelta::FromMilliseconds(1000)); 959 0.5 * TimeDelta::FromMilliseconds(1000));
933 960
934 EXPECT_EQ(TimeDelta::FromMilliseconds(2000), 961 EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
935 TimeDelta::FromMilliseconds(1000) * 2); 962 TimeDelta::FromMilliseconds(1000) * 2);
936 EXPECT_EQ(TimeDelta::FromMilliseconds(500), 963 EXPECT_EQ(TimeDelta::FromMilliseconds(500),
937 TimeDelta::FromMilliseconds(1000) / 2); 964 TimeDelta::FromMilliseconds(1000) / 2);
938 EXPECT_EQ(TimeDelta::FromMilliseconds(2000), 965 EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
939 TimeDelta::FromMilliseconds(1000) *= 2); 966 TimeDelta::FromMilliseconds(1000) *= 2);
940 EXPECT_EQ(TimeDelta::FromMilliseconds(500), 967 EXPECT_EQ(TimeDelta::FromMilliseconds(500),
941 TimeDelta::FromMilliseconds(1000) /= 2); 968 TimeDelta::FromMilliseconds(1000) /= 2);
942 EXPECT_EQ(TimeDelta::FromMilliseconds(2000), 969 EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
943 2 * TimeDelta::FromMilliseconds(1000)); 970 2 * TimeDelta::FromMilliseconds(1000));
944 } 971 }
945 972
946 bool IsMin(TimeDelta delta) {
947 return (-delta).is_max();
948 }
949
950 TEST(TimeDelta, Overflows) { 973 TEST(TimeDelta, Overflows) {
951 // Some sanity checks. 974 // Some sanity checks.
952 EXPECT_TRUE(TimeDelta::Max().is_max()); 975 EXPECT_TRUE(TimeDelta::Max().is_max());
953 EXPECT_TRUE(IsMin(-TimeDelta::Max())); 976 EXPECT_TRUE(IsMin(-TimeDelta::Max()));
954 EXPECT_GT(TimeDelta(), -TimeDelta::Max()); 977 EXPECT_GT(TimeDelta(), -TimeDelta::Max());
955 978
956 TimeDelta large_delta = TimeDelta::Max() - TimeDelta::FromMilliseconds(1); 979 TimeDelta large_delta = TimeDelta::Max() - TimeDelta::FromMilliseconds(1);
957 TimeDelta large_negative = -large_delta; 980 TimeDelta large_negative = -large_delta;
958 EXPECT_GT(TimeDelta(), large_negative); 981 EXPECT_GT(TimeDelta(), large_negative);
959 EXPECT_FALSE(large_delta.is_max()); 982 EXPECT_FALSE(large_delta.is_max());
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
1094 1117
1095 TEST(TimeTicksLogging, DoesNotMakeStreamBad) { 1118 TEST(TimeTicksLogging, DoesNotMakeStreamBad) {
1096 std::ostringstream oss; 1119 std::ostringstream oss;
1097 oss << TimeTicks(); 1120 oss << TimeTicks();
1098 EXPECT_TRUE(oss.good()); 1121 EXPECT_TRUE(oss.good());
1099 } 1122 }
1100 1123
1101 } // namespace 1124 } // namespace
1102 1125
1103 } // namespace base 1126 } // namespace base
OLDNEW
« base/time/time.cc ('K') | « base/time/time.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698