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 14namespace net { 15 16namespace { 17 18const int kIterations = 100000; 19const int kLongPayloadSize = 1 << 16; 20const char kMaskingKey[] = "\xFE\xED\xBE\xEF"; 21 22COMPILE_ASSERT(arraysize(kMaskingKey) == 23 WebSocketFrameHeader::kMaskingKeyLength + 1, 24 incorrect_masking_key_size); 25 26class 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 45TEST_F(WebSocketFrameTestMaskBenchmark, BenchmarkMaskShortPayload) { 46 static const char kShortPayload[] = "Short Payload"; 47 Benchmark( 48 "Frame_mask_short_payload", kShortPayload, arraysize(kShortPayload)); 49} 50 51TEST_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