1// Copyright (c) 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/extensions/api/identity/identity_mint_queue.h" 6 7#include <vector> 8 9#include "base/memory/scoped_ptr.h" 10#include "testing/gmock/include/gmock/gmock.h" 11#include "testing/gtest/include/gtest/gtest.h" 12 13using extensions::ExtensionTokenKey; 14using extensions::IdentityMintRequestQueue; 15 16namespace { 17 18class MockRequest : public extensions::IdentityMintRequestQueue::Request { 19 public: 20 MOCK_METHOD1(StartMintToken, void(IdentityMintRequestQueue::MintType)); 21}; 22 23scoped_ptr<ExtensionTokenKey> ExtensionIdToKey( 24 const std::string& extension_id) { 25 return scoped_ptr<ExtensionTokenKey>(new ExtensionTokenKey( 26 extension_id, "user_id", std::set<std::string>())); 27} 28 29} // namespace 30 31TEST(IdentityMintQueueTest, SerialRequests) { 32 IdentityMintRequestQueue::MintType type = 33 IdentityMintRequestQueue::MINT_TYPE_NONINTERACTIVE; 34 IdentityMintRequestQueue queue; 35 scoped_ptr<ExtensionTokenKey> key(ExtensionIdToKey("ext_id")); 36 MockRequest request1; 37 MockRequest request2; 38 39 EXPECT_CALL(request1, StartMintToken(type)).Times(1); 40 queue.RequestStart(type, *key, &request1); 41 queue.RequestComplete(type, *key, &request1); 42 43 EXPECT_CALL(request2, StartMintToken(type)).Times(1); 44 queue.RequestStart(type, *key, &request2); 45 queue.RequestComplete(type, *key, &request2); 46} 47 48TEST(IdentityMintQueueTest, InteractiveType) { 49 IdentityMintRequestQueue::MintType type = 50 IdentityMintRequestQueue::MINT_TYPE_INTERACTIVE; 51 IdentityMintRequestQueue queue; 52 scoped_ptr<ExtensionTokenKey> key(ExtensionIdToKey("ext_id")); 53 MockRequest request1; 54 55 EXPECT_CALL(request1, StartMintToken(type)).Times(1); 56 queue.RequestStart(type, *key, &request1); 57 queue.RequestComplete(type, *key, &request1); 58} 59 60TEST(IdentityMintQueueTest, ParallelRequests) { 61 IdentityMintRequestQueue::MintType type = 62 IdentityMintRequestQueue::MINT_TYPE_NONINTERACTIVE; 63 IdentityMintRequestQueue queue; 64 scoped_ptr<ExtensionTokenKey> key(ExtensionIdToKey("ext_id")); 65 MockRequest request1; 66 MockRequest request2; 67 MockRequest request3; 68 69 EXPECT_CALL(request1, StartMintToken(type)).Times(1); 70 queue.RequestStart(type, *key, &request1); 71 queue.RequestStart(type, *key, &request2); 72 queue.RequestStart(type, *key, &request3); 73 74 EXPECT_CALL(request2, StartMintToken(type)).Times(1); 75 queue.RequestComplete(type, *key, &request1); 76 77 EXPECT_CALL(request3, StartMintToken(type)).Times(1); 78 queue.RequestComplete(type, *key, &request2); 79 80 queue.RequestComplete(type, *key, &request3); 81} 82 83TEST(IdentityMintQueueTest, ParallelRequestsFromTwoKeys) { 84 IdentityMintRequestQueue::MintType type = 85 IdentityMintRequestQueue::MINT_TYPE_NONINTERACTIVE; 86 IdentityMintRequestQueue queue; 87 scoped_ptr<ExtensionTokenKey> key1(ExtensionIdToKey("ext_id_1")); 88 scoped_ptr<ExtensionTokenKey> key2(ExtensionIdToKey("ext_id_2")); 89 MockRequest request1; 90 MockRequest request2; 91 92 EXPECT_CALL(request1, StartMintToken(type)).Times(1); 93 EXPECT_CALL(request2, StartMintToken(type)).Times(1); 94 queue.RequestStart(type, *key1, &request1); 95 queue.RequestStart(type, *key2, &request2); 96 97 queue.RequestComplete(type, *key1, &request1); 98 queue.RequestComplete(type, *key2, &request2); 99} 100 101TEST(IdentityMintQueueTest, Empty) { 102 IdentityMintRequestQueue::MintType type = 103 IdentityMintRequestQueue::MINT_TYPE_INTERACTIVE; 104 IdentityMintRequestQueue queue; 105 scoped_ptr<ExtensionTokenKey> key(ExtensionIdToKey("ext_id")); 106 MockRequest request1; 107 108 EXPECT_TRUE(queue.empty(type, *key)); 109 EXPECT_CALL(request1, StartMintToken(type)).Times(1); 110 queue.RequestStart(type, *key, &request1); 111 EXPECT_FALSE(queue.empty(type, *key)); 112 queue.RequestComplete(type, *key, &request1); 113 EXPECT_TRUE(queue.empty(type, *key)); 114} 115 116TEST(IdentityMintQueueTest, Cancel) { 117 IdentityMintRequestQueue::MintType type = 118 IdentityMintRequestQueue::MINT_TYPE_NONINTERACTIVE; 119 IdentityMintRequestQueue queue; 120 scoped_ptr<ExtensionTokenKey> key(ExtensionIdToKey("ext_id")); 121 MockRequest request1; 122 MockRequest request2; 123 MockRequest request3; 124 MockRequest request4; 125 126 EXPECT_CALL(request1, StartMintToken(type)).Times(1); 127 queue.RequestStart(type, *key, &request1); 128 queue.RequestStart(type, *key, &request2); 129 queue.RequestStart(type, *key, &request3); 130 131 // request1: cancel the running head 132 // request3: cancel a request that is not the head 133 // request2: cancel the last request 134 // request4: cancel a request that is not in the queue at all 135 queue.RequestCancel(*key, &request1); 136 queue.RequestCancel(*key, &request3); 137 queue.RequestCancel(*key, &request2); 138 queue.RequestCancel(*key, &request4); 139} 140