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