15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# Copyright 2013 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# This file is expected to be used under another directory to use,
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# so we disable checking import path of GAE tools from this directory.
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# pylint: disable=F0401,E0611
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)import json
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)import unittest
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)from google.appengine.api import files
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)from google.appengine.ext import ndb
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)from google.appengine.ext import testbed
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)from google.appengine.ext.blobstore import BlobInfo
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)import services
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ServicesTest(unittest.TestCase):
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  @staticmethod
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  def CreateBlob(path):
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    # Initialize blob dictionary to return.
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    blob = {}
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    # Read sample file.
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    blob['json_str'] = open(path, 'r').read()
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    # Create file in blobstore according to sample file.
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    file_name = files.blobstore.create(mime_type='text/plain')
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    with files.open(file_name, 'a') as f:
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      f.write(blob['json_str'])
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    files.finalize(file_name)
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    # Get BlobInfo of sample file.
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    blob['blob_info'] = BlobInfo.get(files.blobstore.get_blob_key(file_name))
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return blob
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  def setUp(self):
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.testbed = testbed.Testbed()
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.testbed.activate()
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.testbed.init_all_stubs()
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    # Read sample file.
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.correct_blob = ServicesTest.CreateBlob('testdata/sample.json')
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.error_blob = ServicesTest.CreateBlob('testdata/error_sample.json')
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  def tearDown(self):
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.testbed.deactivate()
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  def testProfiler(self):
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    correct_blob = self.correct_blob
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    # Call services function to create Profiler entity.
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    run_id = services.CreateProfiler(correct_blob['blob_info'])
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    # Test GetProfiler
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.assertEqual(services.GetProfiler(run_id), correct_blob['json_str'])
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    # Create Profiler entity with the same file again and check uniqueness.
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    services.CreateProfiler(correct_blob['blob_info'])
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.assertEqual(services.Profiler.query().count(), 1)
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  def testTemplate(self):
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    correct_blob = self.correct_blob
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    # Call services function to create template entities.
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    services.CreateTemplates(correct_blob['blob_info'])
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    # Test templates being stored in database correctly.
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    json_obj = json.loads(correct_blob['json_str'])
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    for content in json_obj['templates'].values():
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      template_entity = ndb.Key('Template', json.dumps(content)).get()
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      self.assertEqual(template_entity.content, content)
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    # Create template entities with the same file again and check uniqueness.
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    services.CreateTemplates(correct_blob['blob_info'])
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.assertEqual(services.Template.query().count(), 2)
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  def testErrorBlob(self):
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    error_blob = self.error_blob
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    # Test None when default template not indicated or found in templates.
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dflt_tmpl = services.CreateTemplates(error_blob['blob_info'])
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.assertIsNone(dflt_tmpl)
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)