1#!/usr/bin/env python
2# Copyright (c) 2012 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
6'''Unit tests for the admin template gatherer.'''
7
8import os
9import sys
10if __name__ == '__main__':
11  sys.path.append(os.path.join(os.path.dirname(__file__), '../..'))
12
13import StringIO
14import tempfile
15import unittest
16
17from grit.gather import admin_template
18from grit import util
19from grit import grd_reader
20from grit import grit_runner
21from grit.tool import build
22
23
24class AdmGathererUnittest(unittest.TestCase):
25  def testParsingAndTranslating(self):
26    pseudofile = StringIO.StringIO(
27      'bingo bongo\n'
28      'ding dong\n'
29      '[strings] \n'
30      'whatcha="bingo bongo"\n'
31      'gotcha = "bingolabongola "the wise" fingulafongula" \n')
32    gatherer = admin_template.AdmGatherer(pseudofile)
33    gatherer.Parse()
34    self.failUnless(len(gatherer.GetCliques()) == 2)
35    self.failUnless(gatherer.GetCliques()[1].GetMessage().GetRealContent() ==
36                    'bingolabongola "the wise" fingulafongula')
37
38    translation = gatherer.Translate('en')
39    self.failUnless(translation == gatherer.GetText().strip())
40
41  def testErrorHandling(self):
42    pseudofile = StringIO.StringIO(
43      'bingo bongo\n'
44      'ding dong\n'
45      'whatcha="bingo bongo"\n'
46      'gotcha = "bingolabongola "the wise" fingulafongula" \n')
47    gatherer = admin_template.AdmGatherer(pseudofile)
48    self.assertRaises(admin_template.MalformedAdminTemplateException,
49                      gatherer.Parse)
50
51  _TRANSLATABLES_FROM_FILE = (
52    'Google', 'Google Desktop', 'Preferences',
53    'Controls Google Desktop preferences',
54    'Indexing and Capture Control',
55    'Controls what files, web pages, and other content will be indexed by Google Desktop.',
56    'Prevent indexing of email',
57    # there are lots more but we don't check any further
58  )
59
60  def VerifyCliquesFromAdmFile(self, cliques):
61    self.failUnless(len(cliques) > 20)
62    for clique, expected in zip(cliques, self._TRANSLATABLES_FROM_FILE):
63      text = clique.GetMessage().GetRealContent()
64      self.failUnless(text == expected)
65
66  def testFromFile(self):
67    fname = util.PathFromRoot('grit/testdata/GoogleDesktop.adm')
68    gatherer = admin_template.AdmGatherer(fname)
69    gatherer.Parse()
70    cliques = gatherer.GetCliques()
71    self.VerifyCliquesFromAdmFile(cliques)
72
73  def MakeGrd(self):
74    grd = grd_reader.Parse(StringIO.StringIO('''<?xml version="1.0" encoding="UTF-8"?>
75      <grit latest_public_release="2" source_lang_id="en-US" current_release="3">
76        <release seq="3">
77          <structures>
78            <structure type="admin_template" name="IDAT_GOOGLE_DESKTOP_SEARCH"
79              file="GoogleDesktop.adm" exclude_from_rc="true" />
80            <structure type="txt" name="BINGOBONGO"
81              file="README.txt" exclude_from_rc="true" />
82          </structures>
83        </release>
84        <outputs>
85          <output filename="de_res.rc" type="rc_all" lang="de" />
86        </outputs>
87      </grit>'''), util.PathFromRoot('grit/testdata'))
88    grd.SetOutputLanguage('en')
89    grd.RunGatherers()
90    return grd
91
92  def testInGrd(self):
93    grd = self.MakeGrd()
94    cliques = grd.children[0].children[0].children[0].GetCliques()
95    self.VerifyCliquesFromAdmFile(cliques)
96
97  def testFileIsOutput(self):
98    grd = self.MakeGrd()
99    dirname = tempfile.mkdtemp()
100    try:
101      tool = build.RcBuilder()
102      tool.o = grit_runner.Options()
103      tool.output_directory = dirname
104      tool.res = grd
105      tool.Process()
106
107      self.failUnless(os.path.isfile(
108        os.path.join(dirname, 'de_GoogleDesktop.adm')))
109      self.failUnless(os.path.isfile(
110        os.path.join(dirname, 'de_README.txt')))
111    finally:
112      for f in os.listdir(dirname):
113        os.unlink(os.path.join(dirname, f))
114      os.rmdir(dirname)
115
116if __name__ == '__main__':
117  unittest.main()
118