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)