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