|  | // Copyright 2013 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "chrome/browser/extensions/api/identity/extension_token_key.h" | 
|  |  | 
|  | #include <algorithm> | 
|  | #include <set> | 
|  | #include <string> | 
|  | #include <vector> | 
|  |  | 
|  | #include "testing/gtest/include/gtest/gtest.h" | 
|  |  | 
|  | TEST(IdentityExtensionTokenKeyTest, Ordering) { | 
|  | std::string extension_id1("ext_id_1"); | 
|  | std::string extension_id2("ext_id_2"); | 
|  | std::set<std::string> scopes1; | 
|  | std::set<std::string> scopes2; | 
|  | std::set<std::string> scopes3; | 
|  |  | 
|  | scopes1.insert("a"); | 
|  | scopes1.insert("b"); | 
|  | scopes2.insert("a"); | 
|  |  | 
|  | std::vector<std::string> extension_ids; | 
|  | extension_ids.push_back(extension_id1); | 
|  | extension_ids.push_back(extension_id2); | 
|  |  | 
|  | std::vector<std::string> user_ids; | 
|  | user_ids.push_back("user_id_1"); | 
|  | user_ids.push_back("user_id_2"); | 
|  |  | 
|  | std::vector<std::set<std::string> > scopesets; | 
|  | scopesets.push_back(scopes1); | 
|  | scopesets.push_back(scopes2); | 
|  | scopesets.push_back(scopes3); | 
|  |  | 
|  | std::vector<extensions::ExtensionTokenKey> keys; | 
|  | typedef std::vector<extensions::ExtensionTokenKey>::const_iterator | 
|  | ExtensionTokenKeyIterator; | 
|  |  | 
|  | std::vector<std::string>::const_iterator extension_it; | 
|  | std::vector<std::string>::const_iterator user_it; | 
|  | std::vector<std::set<std::string> >::const_iterator scope_it; | 
|  |  | 
|  | for (extension_it = extension_ids.begin(); | 
|  | extension_it != extension_ids.end(); | 
|  | ++extension_it) { | 
|  | for (user_it = user_ids.begin(); user_it != user_ids.end(); ++user_it) { | 
|  | for (scope_it = scopesets.begin(); scope_it != scopesets.end(); | 
|  | ++scope_it) { | 
|  | keys.push_back( | 
|  | extensions::ExtensionTokenKey(*extension_it, *user_it, *scope_it)); | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | // keys should not be less than themselves | 
|  | for (ExtensionTokenKeyIterator it = keys.begin(); it != keys.end(); ++it) { | 
|  | EXPECT_FALSE(*it < *it); | 
|  | } | 
|  |  | 
|  | // comparison should establish an ordering | 
|  | std::sort(keys.begin(), keys.end()); | 
|  | for (ExtensionTokenKeyIterator it1 = keys.begin(); it1 != keys.end(); ++it1) { | 
|  | ExtensionTokenKeyIterator it2 = it1; | 
|  | for (++it2; it2 != keys.end(); ++it2) { | 
|  | EXPECT_LT(*it1, *it2); | 
|  | EXPECT_FALSE(it2 < it1); | 
|  | } | 
|  | } | 
|  | } |