11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#!/usr/bin/env python
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci# Copyright 2014 The Chromium Authors. All rights reserved.
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci# Use of this source code is governed by a BSD-style license that can be
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci# found in the LICENSE file.
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport unittest
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifrom owners_data_source import ParseOwnersFile, OwnersDataSource
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifrom server_instance import ServerInstance
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifrom servlet import Request
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifrom test_file_system import TestFileSystem
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci_TEST_FS = {
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  'chrome': {
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    'browser': {
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'extensions': {
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'OWNERS': '\n'.join([
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          '# Core owners.',
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          'satsuki@revocs.tld'
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ]),
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'api': {
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          'some_api': {
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            'OWNERS': '\n'.join([
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              'matoi@owner.tld'
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            ]),
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            'some_api.cc': ''
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          },
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          'another_api': {
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            'another_api.cc': '',
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            'another_api.h': ''
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          },
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          'moar_apis': {
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            'OWNERS': '\n'.join([
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              '# For editing moar_apis.',
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              'satsuki@revocs.tld'
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            ])
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          }
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  },
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  'extensions': {
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    'browser': {
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'api': {
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'a_different_api': {
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          'OWNERS': '\n'.join([
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            '# Hallo!',
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            'nonon@owner.tld',
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            'matoi@owner.tld'
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ])
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass OwnersDataSourceTest(unittest.TestCase):
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def setUp(self):
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    server_instance = ServerInstance.ForTest(
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        file_system=TestFileSystem(_TEST_FS))
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    # Don't randomize the owners to avoid testing issues.
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._owners_ds = OwnersDataSource(server_instance,
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                       Request.ForTest('/'),
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                       randomize=False)
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def testParseOwnersFile(self):
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    owners_content = '\n'.join([
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'satsuki@revocs.tld',
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'mankanshoku@owner.tld',
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      '',
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'matoi@owner.tld'
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ])
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    owners, notes = ParseOwnersFile(owners_content, randomize=False)
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    # The order of the owners list should reflect the order of the owners file.
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self.assertEqual(owners, [
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'email': 'satsuki@revocs.tld',
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'username': 'satsuki'
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      },
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'email': 'mankanshoku@owner.tld',
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'username': 'mankanshoku'
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      },
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'email': 'matoi@owner.tld',
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'username': 'matoi',
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'last': True
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ])
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self.assertEqual(notes, '')
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    owners_content_with_comments = '\n'.join([
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      '# This is a comment concerning this file',
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      '# that should not be ignored.',
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'matoi@owner.tld',
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'mankanshoku@owner.tld',
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      '',
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      '# Only bug satsuki if matoi or mankanshoku are unavailable.',
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'satsuki@revocs.tld'
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ])
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    owners, notes = ParseOwnersFile(owners_content_with_comments,
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                    randomize=False)
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self.assertEqual(owners, [
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'email': 'matoi@owner.tld',
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'username': 'matoi'
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      },
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'email': 'mankanshoku@owner.tld',
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'username': 'mankanshoku'
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      },
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'email': 'satsuki@revocs.tld',
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'username': 'satsuki',
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'last': True
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ])
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self.assertEqual(notes, '\n'.join([
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'This is a comment concerning this file',
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'that should not be ignored.',
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'Only bug satsuki if matoi or mankanshoku are unavailable.'
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ]))
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def testCollectOwners(self):
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    # NOTE: Order matters. The list should be sorted by 'apiName'.
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self.assertEqual(self._owners_ds.get('apis'), [{
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'apiName': 'Core Extensions/Apps Owners',
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'owners': [
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        {
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          'email': 'satsuki@revocs.tld',
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          'username': 'satsuki',
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          'last': True
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ],
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'notes': 'Core owners.',
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'id': 'core'
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    },
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'apiName': 'a_different_api',
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'owners': [
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        {
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          'email': 'nonon@owner.tld',
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          'username': 'nonon'
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        },
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        {
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          'email': 'matoi@owner.tld',
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          'username': 'matoi',
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          'last': True
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ],
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'notes': 'Hallo!',
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'id': 'a_different_api'
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    },
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'apiName': 'another_api',
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'owners': [],
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'notes': 'Use one of the Core Extensions/Apps Owners.',
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'id': 'another_api'
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    },
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'apiName': 'moar_apis',
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'owners': [
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        {
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          'email': 'satsuki@revocs.tld',
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          'username': 'satsuki',
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          'last': True
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ],
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'notes': 'For editing moar_apis.',
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'id': 'moar_apis'
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    },
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'apiName': 'some_api',
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'owners': [
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        {
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          'email': 'matoi@owner.tld',
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          'username': 'matoi',
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          'last': True
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ],
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'notes': '',
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'id': 'some_api'
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }])
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciif __name__ == '__main__':
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  unittest.main()
190