app_yaml_helper_test.py revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
1#!/usr/bin/env python
2# Copyright 2013 The Chromium Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6import unittest
7
8from app_yaml_helper import AppYamlHelper
9from file_system import FileNotFoundError
10from host_file_system_provider import HostFileSystemProvider
11from mock_file_system import MockFileSystem
12from object_store_creator import ObjectStoreCreator
13from test_file_system import TestFileSystem
14from test_util import DisableLogging
15
16_ExtractVersion, _IsGreater, _GenerateAppYaml = (
17    AppYamlHelper.ExtractVersion,
18    AppYamlHelper.IsGreater,
19    AppYamlHelper.GenerateAppYaml)
20
21class AppYamlHelperTest(unittest.TestCase):
22  def testExtractVersion(self):
23    def run_test(version):
24      self.assertEqual(version, _ExtractVersion(_GenerateAppYaml(version)))
25    run_test('0')
26    run_test('0-0')
27    run_test('0-0-0')
28    run_test('1')
29    run_test('1-0')
30    run_test('1-0-0')
31    run_test('1-0-1')
32    run_test('1-1-0')
33    run_test('1-1-1')
34    run_test('2-0-9')
35    run_test('2-0-12')
36    run_test('2-1')
37    run_test('2-1-0')
38    run_test('2-11-0')
39    run_test('3-1-0')
40    run_test('3-1-3')
41    run_test('3-12-0')
42
43  def testIsGreater(self):
44    def assert_is_greater(lhs, rhs):
45      self.assertTrue(_IsGreater(lhs, rhs), '%s is not > %s' % (lhs, rhs))
46      self.assertFalse(_IsGreater(rhs, lhs),
47                       '%s should not be > %s' % (rhs, lhs))
48    assert_is_greater('0-0', '0')
49    assert_is_greater('0-0-0', '0')
50    assert_is_greater('0-0-0', '0-0')
51    assert_is_greater('1', '0')
52    assert_is_greater('1', '0-0')
53    assert_is_greater('1', '0-0-0')
54    assert_is_greater('1-0', '0-0')
55    assert_is_greater('1-0-0-0', '0-0-0')
56    assert_is_greater('2-0-12', '2-0-9')
57    assert_is_greater('2-0-12', '2-0-9-0')
58    assert_is_greater('2-0-12-0', '2-0-9')
59    assert_is_greater('2-0-12-0', '2-0-9-0')
60    assert_is_greater('2-1', '2-0-9')
61    assert_is_greater('2-1', '2-0-12')
62    assert_is_greater('2-1-0', '2-0-9')
63    assert_is_greater('2-1-0', '2-0-12')
64    assert_is_greater('3-1-0', '2-1')
65    assert_is_greater('3-1-0', '2-1-0')
66    assert_is_greater('3-1-0', '2-11-0')
67    assert_is_greater('3-1-3', '3-1-0')
68    assert_is_greater('3-12-0', '3-1-0')
69    assert_is_greater('3-12-0', '3-1-3')
70    assert_is_greater('3-12-0', '3-1-3-0')
71
72  @DisableLogging('warning')
73  def testInstanceMethods(self):
74    test_data = {
75      'server2': {
76        'app.yaml': _GenerateAppYaml('1-0'),
77        'app_yaml_helper.py': 'Copyright notice etc'
78      }
79    }
80
81    updates = []
82    # Pass a specific file system at head to the HostFileSystemProvider so that
83    # we know it's always going to be backed by a MockFileSystem. The Provider
84    # may decide to wrap it in caching etc.
85    file_system_at_head = MockFileSystem(TestFileSystem(test_data))
86
87    def apply_update(update):
88      file_system_at_head.Update(update)
89      updates.append(update)
90
91    def host_file_system_constructor(branch, revision=None):
92      self.assertEqual('trunk', branch)
93      self.assertTrue(revision is not None)
94      return MockFileSystem.Create(TestFileSystem(test_data),
95                                   updates[:revision])
96
97    object_store_creator = ObjectStoreCreator.ForTest()
98    host_file_system_provider = HostFileSystemProvider(
99        object_store_creator,
100        default_trunk_instance=file_system_at_head,
101        constructor_for_test=host_file_system_constructor)
102    helper = AppYamlHelper('server2/app.yaml',
103                           object_store_creator,
104                           host_file_system_provider)
105
106    def assert_is_up_to_date(version):
107      self.assertTrue(helper.IsUpToDate(version),
108                      '%s is not up to date' % version)
109      self.assertRaises(ValueError,
110                        helper.GetFirstRevisionGreaterThan, version)
111
112    self.assertEqual(0, helper.GetFirstRevisionGreaterThan('0-5-0'))
113    assert_is_up_to_date('1-0-0')
114    assert_is_up_to_date('1-5-0')
115
116    # Revision 1.
117    apply_update({'server2': {
118      'app.yaml': _GenerateAppYaml('1-5-0')
119    }})
120
121    self.assertEqual(0, helper.GetFirstRevisionGreaterThan('0-5-0'))
122    self.assertEqual(1, helper.GetFirstRevisionGreaterThan('1-0-0'))
123    assert_is_up_to_date('1-5-0')
124    assert_is_up_to_date('2-5-0')
125
126    # Revision 2.
127    apply_update({'server2': {
128      'app_yaml_helper.py': 'fixed a bug'
129    }})
130
131    self.assertEqual(0, helper.GetFirstRevisionGreaterThan('0-5-0'))
132    self.assertEqual(1, helper.GetFirstRevisionGreaterThan('1-0-0'))
133    assert_is_up_to_date('1-5-0')
134    assert_is_up_to_date('2-5-0')
135
136    # Revision 3.
137    apply_update({'server2': {
138      'app.yaml': _GenerateAppYaml('1-6-0')
139    }})
140
141    self.assertEqual(0, helper.GetFirstRevisionGreaterThan('0-5-0'))
142    self.assertEqual(1, helper.GetFirstRevisionGreaterThan('1-0-0'))
143    self.assertEqual(3, helper.GetFirstRevisionGreaterThan('1-5-0'))
144    assert_is_up_to_date('2-5-0')
145
146    # Revision 4.
147    apply_update({'server2': {
148      'app.yaml': _GenerateAppYaml('1-8-0')
149    }})
150    # Revision 5.
151    apply_update({'server2': {
152      'app.yaml': _GenerateAppYaml('2-0-0')
153    }})
154    # Revision 6.
155    apply_update({'server2': {
156      'app.yaml': _GenerateAppYaml('2-2-0')
157    }})
158    # Revision 7.
159    apply_update({'server2': {
160      'app.yaml': _GenerateAppYaml('2-4-0')
161    }})
162    # Revision 8.
163    apply_update({'server2': {
164      'app.yaml': _GenerateAppYaml('2-6-0')
165    }})
166
167    self.assertEqual(0, helper.GetFirstRevisionGreaterThan('0-5-0'))
168    self.assertEqual(1, helper.GetFirstRevisionGreaterThan('1-0-0'))
169    self.assertEqual(3, helper.GetFirstRevisionGreaterThan('1-5-0'))
170    self.assertEqual(5, helper.GetFirstRevisionGreaterThan('1-8-0'))
171    self.assertEqual(6, helper.GetFirstRevisionGreaterThan('2-0-0'))
172    self.assertEqual(6, helper.GetFirstRevisionGreaterThan('2-1-0'))
173    self.assertEqual(7, helper.GetFirstRevisionGreaterThan('2-2-0'))
174    self.assertEqual(7, helper.GetFirstRevisionGreaterThan('2-3-0'))
175    self.assertEqual(8, helper.GetFirstRevisionGreaterThan('2-4-0'))
176    self.assertEqual(8, helper.GetFirstRevisionGreaterThan('2-5-0'))
177    assert_is_up_to_date('2-6-0')
178    assert_is_up_to_date('2-7-0')
179
180if __name__ == '__main__':
181  unittest.main()
182