10f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#!/usr/bin/env python 20f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)# Copyright 2013 The Chromium Authors. All rights reserved. 30f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be 40f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)# found in the LICENSE file. 50f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 60f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)import json 70f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)import unittest 80f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 90f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)from compiled_file_system import CompiledFileSystem 100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)from content_providers import ContentProviders 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)from extensions_paths import CHROME_EXTENSIONS 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)from gcs_file_system_provider import CloudStorageFileSystemProvider 130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)from object_store_creator import ObjectStoreCreator 140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)from test_file_system import TestFileSystem 150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)from test_util import DisableLogging 160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)_CONTENT_PROVIDERS = { 190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 'apples': { 200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 'chromium': { 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 'dir': 'chrome/common/extensions/apples' 220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) }, 230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 'serveFrom': 'apples-dir', 240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) }, 250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 'bananas': { 260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 'serveFrom': '', 270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 'chromium': { 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 'dir': 'chrome/common/extensions' 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) }, 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) }, 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 'github-provider': { 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 'serveFrom': 'gh', 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 'github': { 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 'dir': 'chrome/common/extensions', 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 'owner': 'GoogleChrome', 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 'repo': 'hello-world', 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) }, 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) }, 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 'github-provider-with-dir': { 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 'serveFrom': 'gh2', 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 'github': { 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 'dir': 'chrome/common/extensions/tomatoes/are/a', 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 'owner': 'SomeOwner', 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 'repo': 'some-repo', 450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) }, 460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) }, 470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 'tomatoes': { 480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 'serveFrom': 'tomatoes-dir/are/a', 490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 'chromium': { 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 'dir': 'chrome/common/extensions/tomatoes/are/a' 510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) }, 520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) }, 530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)_FILE_SYSTEM_DATA = { 570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 'docs': { 580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 'templates': { 590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 'json': { 600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 'content_providers.json': json.dumps(_CONTENT_PROVIDERS), 610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) }, 620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) }, 630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) }, 640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 'apples': { 650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 'gala.txt': 'gala apples', 660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 'green': { 670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 'granny smith.txt': 'granny smith apples', 680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) }, 690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) }, 700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 'tomatoes': { 710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 'are': { 720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 'a': { 730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 'vegetable.txt': 'no they aren\'t', 740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 'fruit': { 750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 'cherry.txt': 'cherry tomatoes', 760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) }, 770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) }, 780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) }, 790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) }, 800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class _MockGithubFileSystemProvider(object): 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) '''A GithubFileSystemProvider imitation which records every call to Create 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) and returns them from GetAndReset. 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ''' 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) def __init__(self, file_system): 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) self._file_system = file_system 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) self._calls = [] 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) def Create(self, owner, repo): 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) self._calls.append((owner, repo)) 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return self._file_system 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) def GetAndReset(self): 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) calls = self._calls 98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) self._calls = [] 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return calls 100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)class ContentProvidersTest(unittest.TestCase): 1030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) def setUp(self): 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) object_store_creator = ObjectStoreCreator.ForTest() 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) test_file_system = TestFileSystem(_FILE_SYSTEM_DATA, 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) relative_to=CHROME_EXTENSIONS) 107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) self._github_fs_provider = _MockGithubFileSystemProvider(test_file_system) 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) object_store_creator = ObjectStoreCreator.ForTest() 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) # TODO(mangini): create tests for GCS 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self._gcs_fs_provider = CloudStorageFileSystemProvider(object_store_creator) 1110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) self._content_providers = ContentProviders( 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) object_store_creator, 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CompiledFileSystem.Factory(object_store_creator), 114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) test_file_system, 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self._github_fs_provider, 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self._gcs_fs_provider) 1170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) def testSimpleRootPath(self): 1190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) provider = self._content_providers.GetByName('apples') 1200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) self.assertEqual( 1210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 'gala apples', 122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) provider.GetContentAndType('gala.txt').Get().content) 1230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) self.assertEqual( 1240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 'granny smith apples', 125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) provider.GetContentAndType('green/granny smith.txt').Get().content) 1260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) def testComplexRootPath(self): 1280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) provider = self._content_providers.GetByName('tomatoes') 1290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) self.assertEqual( 1300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 'no they aren\'t', 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) provider.GetContentAndType('vegetable.txt').Get().content) 1320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) self.assertEqual( 1330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 'cherry tomatoes', 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) provider.GetContentAndType('fruit/cherry.txt').Get().content) 1350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) def testParentRootPath(self): 1370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) provider = self._content_providers.GetByName('bananas') 1380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) self.assertEqual( 1390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 'gala apples', 140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) provider.GetContentAndType('apples/gala.txt').Get().content) 1410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) def testSimpleServlet(self): 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) provider, serve_from, path = self._content_providers.GetByServeFrom( 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 'apples-dir') 1450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) self.assertEqual('apples', provider.name) 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self.assertEqual('apples-dir', serve_from) 1470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) self.assertEqual('', path) 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) provider, serve_from, path = self._content_providers.GetByServeFrom( 149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 'apples-dir/') 150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEqual('apples', provider.name) 151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEqual('apples-dir', serve_from) 152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) self.assertEqual('', path) 153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) provider, serve_from, path = self._content_providers.GetByServeFrom( 1540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 'apples-dir/are/forever') 1550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) self.assertEqual('apples', provider.name) 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self.assertEqual('apples-dir', serve_from) 1570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) self.assertEqual('are/forever', path) 1580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) def testComplexServlet(self): 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) provider, serve_from, path = self._content_providers.GetByServeFrom( 1610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 'tomatoes-dir/are/a') 1620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) self.assertEqual('tomatoes', provider.name) 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self.assertEqual('tomatoes-dir/are/a', serve_from) 1640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) self.assertEqual('', path) 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) provider, serve_from, path = self._content_providers.GetByServeFrom( 1660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 'tomatoes-dir/are/a/fruit/they/are') 1670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) self.assertEqual('tomatoes', provider.name) 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self.assertEqual('tomatoes-dir/are/a', serve_from) 1690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) self.assertEqual('fruit/they/are', path) 1700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) def testEmptyStringServlet(self): 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) provider, serve_from, path = self._content_providers.GetByServeFrom( 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 'tomatoes-dir/are') 1740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) self.assertEqual('bananas', provider.name) 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self.assertEqual('', serve_from) 1760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) self.assertEqual('tomatoes-dir/are', path) 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) provider, serve_from, path = self._content_providers.GetByServeFrom('') 1780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) self.assertEqual('bananas', provider.name) 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self.assertEqual('', serve_from) 1800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) self.assertEqual('', path) 1810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) @DisableLogging('error') 1830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) def testProviderNotFound(self): 1840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) self.assertEqual(None, self._content_providers.GetByName('cabbages')) 1850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) def testGithubContentProvider(self): 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) provider, serve_from, path = self._content_providers.GetByServeFrom( 188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 'gh/apples/green/granny smith.txt') 189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) self.assertEqual('github-provider', provider.name) 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self.assertEqual('gh', serve_from) 191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) self.assertEqual('apples/green/granny smith.txt', path) 192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) self.assertEqual([('GoogleChrome', 'hello-world')], 193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) self._github_fs_provider.GetAndReset()) 194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) self.assertEqual( 195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 'granny smith apples', 196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) provider.GetContentAndType(path).Get().content) 197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) def testGithubContentProviderWithDir(self): 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) provider, serve_from, path = self._content_providers.GetByServeFrom( 200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 'gh2/fruit/cherry.txt') 201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) self.assertEqual('github-provider-with-dir', provider.name) 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self.assertEqual('gh2', serve_from) 203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) self.assertEqual('fruit/cherry.txt', path) 204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) self.assertEqual([('SomeOwner', 'some-repo')], 205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) self._github_fs_provider.GetAndReset()) 206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) self.assertEqual( 207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 'cherry tomatoes', 208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) provider.GetContentAndType(path).Get().content) 2090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 2100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)if __name__ == '__main__': 2110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) unittest.main() 212