1*6777b538SAndroid Build Coastguard Worker // Copyright 2015 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "net/base/mime_sniffer.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <vector>
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Worker #include "base/bits.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/check_op.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/timer/elapsed_timer.h"
12*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
13*6777b538SAndroid Build Coastguard Worker #include "testing/perf/perf_result_reporter.h"
14*6777b538SAndroid Build Coastguard Worker
15*6777b538SAndroid Build Coastguard Worker namespace net {
16*6777b538SAndroid Build Coastguard Worker namespace {
17*6777b538SAndroid Build Coastguard Worker
18*6777b538SAndroid Build Coastguard Worker // This text is supposed to be representative of a plain text file the browser
19*6777b538SAndroid Build Coastguard Worker // might encounter, including a variation in line lengths and blank
20*6777b538SAndroid Build Coastguard Worker // lines. CRLF is used as the line-terminator to make it slightly more
21*6777b538SAndroid Build Coastguard Worker // difficult. It is roughly 1KB.
22*6777b538SAndroid Build Coastguard Worker const char kRepresentativePlainText[] =
23*6777b538SAndroid Build Coastguard Worker "The Tragedie of Hamlet\r\n"
24*6777b538SAndroid Build Coastguard Worker "\r\n"
25*6777b538SAndroid Build Coastguard Worker "Actus Primus. Scoena Prima.\r\n"
26*6777b538SAndroid Build Coastguard Worker "\r\n"
27*6777b538SAndroid Build Coastguard Worker "Enter Barnardo and Francisco two Centinels.\r\n"
28*6777b538SAndroid Build Coastguard Worker "\r\n"
29*6777b538SAndroid Build Coastguard Worker " Barnardo. Who's there?\r\n"
30*6777b538SAndroid Build Coastguard Worker " Fran. Nay answer me: Stand & vnfold\r\n"
31*6777b538SAndroid Build Coastguard Worker "your selfe\r\n"
32*6777b538SAndroid Build Coastguard Worker "\r\n"
33*6777b538SAndroid Build Coastguard Worker " Bar. Long liue the King\r\n"
34*6777b538SAndroid Build Coastguard Worker "\r\n"
35*6777b538SAndroid Build Coastguard Worker " Fran. Barnardo?\r\n"
36*6777b538SAndroid Build Coastguard Worker " Bar. He\r\n"
37*6777b538SAndroid Build Coastguard Worker "\r\n"
38*6777b538SAndroid Build Coastguard Worker " Fran. You come most carefully vpon your houre\r\n"
39*6777b538SAndroid Build Coastguard Worker "\r\n"
40*6777b538SAndroid Build Coastguard Worker " Bar. 'Tis now strook twelue, get thee to bed Francisco\r\n"
41*6777b538SAndroid Build Coastguard Worker "\r\n"
42*6777b538SAndroid Build Coastguard Worker " Fran. For this releefe much thankes: 'Tis bitter cold,\r\n"
43*6777b538SAndroid Build Coastguard Worker "And I am sicke at heart\r\n"
44*6777b538SAndroid Build Coastguard Worker "\r\n"
45*6777b538SAndroid Build Coastguard Worker " Barn. Haue you had quiet Guard?\r\n"
46*6777b538SAndroid Build Coastguard Worker " Fran. Not a Mouse stirring\r\n"
47*6777b538SAndroid Build Coastguard Worker "\r\n"
48*6777b538SAndroid Build Coastguard Worker " Barn. Well, goodnight. If you do meet Horatio and\r\n"
49*6777b538SAndroid Build Coastguard Worker "Marcellus, the Riuals of my Watch, bid them make hast.\r\n"
50*6777b538SAndroid Build Coastguard Worker "Enter Horatio and Marcellus.\r\n"
51*6777b538SAndroid Build Coastguard Worker "\r\n"
52*6777b538SAndroid Build Coastguard Worker " Fran. I thinke I heare them. Stand: who's there?\r\n"
53*6777b538SAndroid Build Coastguard Worker " Hor. Friends to this ground\r\n"
54*6777b538SAndroid Build Coastguard Worker "\r\n"
55*6777b538SAndroid Build Coastguard Worker " Mar. And Leige-men to the Dane\r\n"
56*6777b538SAndroid Build Coastguard Worker "\r\n"
57*6777b538SAndroid Build Coastguard Worker " Fran. Giue you good night\r\n"
58*6777b538SAndroid Build Coastguard Worker "\r\n"
59*6777b538SAndroid Build Coastguard Worker " Mar. O farwel honest Soldier, who hath relieu'd you?\r\n"
60*6777b538SAndroid Build Coastguard Worker " Fra. Barnardo ha's my place: giue you goodnight.\r\n"
61*6777b538SAndroid Build Coastguard Worker "\r\n"
62*6777b538SAndroid Build Coastguard Worker "Exit Fran.\r\n"
63*6777b538SAndroid Build Coastguard Worker "\r\n"
64*6777b538SAndroid Build Coastguard Worker " Mar. Holla Barnardo\r\n"
65*6777b538SAndroid Build Coastguard Worker "\r\n"
66*6777b538SAndroid Build Coastguard Worker " Bar. Say, what is Horatio there?\r\n"
67*6777b538SAndroid Build Coastguard Worker " Hor. A peece of him\r\n"
68*6777b538SAndroid Build Coastguard Worker "\r\n"
69*6777b538SAndroid Build Coastguard Worker " Bar. Welcome Horatio, welcome good Marcellus\r\n"
70*6777b538SAndroid Build Coastguard Worker "\r\n";
71*6777b538SAndroid Build Coastguard Worker
RunLooksLikeBinary(const std::string & plaintext,size_t iterations)72*6777b538SAndroid Build Coastguard Worker void RunLooksLikeBinary(const std::string& plaintext, size_t iterations) {
73*6777b538SAndroid Build Coastguard Worker bool looks_like_binary = false;
74*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < iterations; ++i) {
75*6777b538SAndroid Build Coastguard Worker if (LooksLikeBinary(plaintext))
76*6777b538SAndroid Build Coastguard Worker looks_like_binary = true;
77*6777b538SAndroid Build Coastguard Worker }
78*6777b538SAndroid Build Coastguard Worker CHECK(!looks_like_binary);
79*6777b538SAndroid Build Coastguard Worker }
80*6777b538SAndroid Build Coastguard Worker
TEST(MimeSnifferTest,PlainTextPerfTest)81*6777b538SAndroid Build Coastguard Worker TEST(MimeSnifferTest, PlainTextPerfTest) {
82*6777b538SAndroid Build Coastguard Worker // Android systems have a relatively small CPU cache (512KB to 2MB).
83*6777b538SAndroid Build Coastguard Worker // It is better if the test data fits in cache so that we are not just
84*6777b538SAndroid Build Coastguard Worker // testing bus bandwidth.
85*6777b538SAndroid Build Coastguard Worker const size_t kTargetSize = 1 << 18; // 256KB
86*6777b538SAndroid Build Coastguard Worker const size_t kWarmupIterations = 16;
87*6777b538SAndroid Build Coastguard Worker const size_t kMeasuredIterations = 1 << 15;
88*6777b538SAndroid Build Coastguard Worker std::string plaintext = kRepresentativePlainText;
89*6777b538SAndroid Build Coastguard Worker size_t expected_size = plaintext.size() << base::bits::Log2Ceiling(
90*6777b538SAndroid Build Coastguard Worker kTargetSize / plaintext.size());
91*6777b538SAndroid Build Coastguard Worker plaintext.reserve(expected_size);
92*6777b538SAndroid Build Coastguard Worker while (plaintext.size() < kTargetSize)
93*6777b538SAndroid Build Coastguard Worker plaintext += plaintext;
94*6777b538SAndroid Build Coastguard Worker DCHECK_EQ(expected_size, plaintext.size());
95*6777b538SAndroid Build Coastguard Worker RunLooksLikeBinary(plaintext, kWarmupIterations);
96*6777b538SAndroid Build Coastguard Worker base::ElapsedTimer elapsed_timer;
97*6777b538SAndroid Build Coastguard Worker RunLooksLikeBinary(plaintext, kMeasuredIterations);
98*6777b538SAndroid Build Coastguard Worker perf_test::PerfResultReporter reporter("MimeSniffer.", "PlainText");
99*6777b538SAndroid Build Coastguard Worker reporter.RegisterImportantMetric("throughput",
100*6777b538SAndroid Build Coastguard Worker "bytesPerSecond_biggerIsBetter");
101*6777b538SAndroid Build Coastguard Worker reporter.AddResult("throughput", static_cast<int64_t>(plaintext.size()) *
102*6777b538SAndroid Build Coastguard Worker kMeasuredIterations /
103*6777b538SAndroid Build Coastguard Worker elapsed_timer.Elapsed().InSecondsF());
104*6777b538SAndroid Build Coastguard Worker }
105*6777b538SAndroid Build Coastguard Worker
106*6777b538SAndroid Build Coastguard Worker } // namespace
107*6777b538SAndroid Build Coastguard Worker } // namespace net
108