1// Copyright 2013 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 "chrome/browser/metrics/variations/variations_http_header_provider.h" 6 7#include <string> 8 9#include "base/base64.h" 10#include "base/message_loop/message_loop.h" 11#include "chrome/common/metrics/proto/chrome_experiments.pb.h" 12#include "net/http/http_request_headers.h" 13#include "testing/gtest/include/gtest/gtest.h" 14#include "url/gurl.h" 15 16namespace chrome_variations { 17 18namespace { 19 20// Decodes the variations header and extracts the variation ids. 21bool ExtractVariationIds(const std::string& variations, 22 std::set<VariationID>* variation_ids) { 23 std::string serialized_proto; 24 if (!base::Base64Decode(variations, &serialized_proto)) 25 return false; 26 metrics::ChromeVariations proto; 27 if (!proto.ParseFromString(serialized_proto)) 28 return false; 29 for (int i = 0; i < proto.variation_id_size(); ++i) 30 variation_ids->insert(proto.variation_id(i)); 31 return true; 32} 33 34} // namespace 35 36TEST(VariationsHttpHeaderProviderTest, ShouldAppendHeaders) { 37 struct { 38 const char* url; 39 bool should_append_headers; 40 } cases[] = { 41 { "http://google.com", true }, 42 { "http://www.google.com", true }, 43 { "http://m.google.com", true }, 44 { "http://google.ca", true }, 45 { "https://google.ca", true }, 46 { "http://google.co.uk", true }, 47 { "http://google.co.uk:8080/", true }, 48 { "http://www.google.co.uk:8080/", true }, 49 { "http://youtube.com", true }, 50 { "http://www.youtube.com", true }, 51 { "http://www.youtube.ca", true }, 52 { "http://www.youtube.co.uk:8080/", true }, 53 { "https://www.youtube.com", true }, 54 { "http://www.yahoo.com", false }, 55 { "http://youtube", false }, 56 { "http://google", false }, 57 }; 58 59 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) { 60 const GURL url(cases[i].url); 61 EXPECT_EQ(cases[i].should_append_headers, 62 VariationsHttpHeaderProvider::ShouldAppendHeaders(url)) << url; 63 } 64} 65 66TEST(VariationsHttpHeaderProviderTest, SetDefaultVariationIds_Valid) { 67 base::MessageLoop loop; 68 VariationsHttpHeaderProvider provider; 69 GURL url("http://www.google.com"); 70 net::HttpRequestHeaders headers; 71 std::string variations; 72 73 // Valid experiment ids. 74 EXPECT_TRUE(provider.SetDefaultVariationIds("12,456")); 75 provider.InitVariationIDsCacheIfNeeded(); 76 provider.AppendHeaders(url, false, false, &headers); 77 EXPECT_TRUE(headers.HasHeader("X-Client-Data")); 78 headers.GetHeader("X-Client-Data", &variations); 79 std::set<VariationID> variation_ids; 80 ASSERT_TRUE(ExtractVariationIds(variations, &variation_ids)); 81 EXPECT_TRUE(variation_ids.find(12) != variation_ids.end()); 82 EXPECT_TRUE(variation_ids.find(456) != variation_ids.end()); 83} 84 85TEST(VariationsHttpHeaderProviderTest, SetDefaultVariationIds_Invalid) { 86 base::MessageLoop loop; 87 VariationsHttpHeaderProvider provider; 88 GURL url("http://www.google.com"); 89 net::HttpRequestHeaders headers; 90 91 // Invalid experiment ids. 92 EXPECT_FALSE(provider.SetDefaultVariationIds("abcd12,456")); 93 provider.InitVariationIDsCacheIfNeeded(); 94 provider.AppendHeaders(url, false, false, &headers); 95 EXPECT_FALSE(headers.HasHeader("X-Client-Data")); 96} 97 98} // namespace chrome_variations 99