1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "net/websockets/websocket_frame.h" 6 7 #include <algorithm> 8 #include <vector> 9 10 #include "base/macros.h" 11 #include "base/test/perf_time_logger.h" 12 #include "testing/gtest/include/gtest/gtest.h" 13 14 namespace net { 15 16 namespace { 17 18 const int kIterations = 100000; 19 const int kLongPayloadSize = 1 << 16; 20 const char kMaskingKey[] = "\xFE\xED\xBE\xEF"; 21 22 COMPILE_ASSERT(arraysize(kMaskingKey) == 23 WebSocketFrameHeader::kMaskingKeyLength + 1, 24 incorrect_masking_key_size); 25 26 class WebSocketFrameTestMaskBenchmark : public ::testing::Test { 27 protected: 28 void Benchmark(const char* const name, 29 const char* const payload, 30 size_t size) { 31 std::vector<char> scratch(payload, payload + size); 32 WebSocketMaskingKey masking_key; 33 std::copy(kMaskingKey, 34 kMaskingKey + WebSocketFrameHeader::kMaskingKeyLength, 35 masking_key.key); 36 base::PerfTimeLogger timer(name); 37 for (int x = 0; x < kIterations; ++x) { 38 MaskWebSocketFramePayload( 39 masking_key, x % size, &scratch.front(), scratch.size()); 40 } 41 timer.Done(); 42 } 43 }; 44 45 TEST_F(WebSocketFrameTestMaskBenchmark, BenchmarkMaskShortPayload) { 46 static const char kShortPayload[] = "Short Payload"; 47 Benchmark( 48 "Frame_mask_short_payload", kShortPayload, arraysize(kShortPayload)); 49 } 50 51 TEST_F(WebSocketFrameTestMaskBenchmark, BenchmarkMaskLongPayload) { 52 std::vector<char> payload(kLongPayloadSize, 'a'); 53 Benchmark("Frame_mask_long_payload", &payload.front(), payload.size()); 54 } 55 56 } // namespace 57 58 } // namespace net 59