blob: 503938bda3db93f6c5cc17532727076722be3435 [file] [log] [blame]
# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import unittest
import mock
from google.appengine.ext import ndb
from dashboard import datastore_hooks
from dashboard import testing_common
from dashboard import utils
from dashboard.models import graph_data
from dashboard.models import sheriff
class FakeRequest(object):
def __init__(self):
self.registry = {}
class DatastoreHooksTest(testing_common.TestCase):
def setUp(self):
super(DatastoreHooksTest, self).setUp()
testing_common.SetInternalDomain('google.com')
self._AddDataToDatastore()
datastore_hooks.InstallHooks()
get_request_patcher = mock.patch(
'webapp2.get_request',
mock.MagicMock(return_value=FakeRequest()))
self.mock_get_request = get_request_patcher.start()
self.addCleanup(get_request_patcher.stop)
def tearDown(self):
super(DatastoreHooksTest, self).tearDown()
self.UnsetCurrentUser()
def _AddDataToDatastore(self):
"""Puts a set of entities; some internal-only, some not."""
# Need to be privileged to add Test and Row objects to the datastore because
# there is a get() for the parent_test in the pre_put_hook. This should work
# correctly in production because Rows and Tests should only be added by
# /add_point, which is privileged.
self.SetCurrentUser('foo@google.com')
testing_common.AddTests(
['ChromiumPerf'],
['Win7External', 'FooInternal'], {
'TestInternal': {'SubTestInternal': {}},
'TestExternal': {'SubTestExternal': {}},
})
internal_key = ['Master', 'ChromiumPerf', 'Bot', 'FooInternal']
internal_test_key = ['Test', 'TestInternal']
internal_sub_test_key = ['Test', 'SubTestInternal']
external_key = ['Master', 'ChromiumPerf', 'Bot', 'Win7External']
internal_bot = ndb.Key(*internal_key).get()
internal_bot.internal_only = True
internal_bot.put()
internal_test = ndb.Key(*(external_key + internal_test_key)).get()
internal_test.internal_only = True
internal_test.put()
internal_test = ndb.Key(*(internal_key + internal_test_key)).get()
internal_test.internal_only = True
internal_test.put()
internal_sub_test = ndb.Key(*(
external_key + internal_test_key + internal_sub_test_key)).get()
internal_sub_test.internal_only = True
internal_sub_test.put()
internal_sub_test = ndb.Key(*(
internal_key + internal_test_key + internal_sub_test_key)).get()
internal_sub_test.internal_only = True
internal_sub_test.put()
internal_key = internal_sub_test.key
external_key = ndb.Key(
*(external_key + ['Test', 'TestExternal', 'Test', 'SubTestExternal']))
internal_test_container_key = utils.GetTestContainerKey(internal_key)
external_test_container_key = utils.GetTestContainerKey(external_key)
for i in range(0, 100, 10):
graph_data.Row(
parent=internal_test_container_key, id=i, value=float(i * 2),
internal_only=True).put()
graph_data.Row(
parent=external_test_container_key, id=i, value=float(i * 2)).put()
self.UnsetCurrentUser()
sheriff.Sheriff(
id='external', email='external@chromium.org', internal_only=False).put()
sheriff.Sheriff(
id='internal', email='internal@google.com', internal_only=True).put()
def _CheckQueryResults(self, include_internal):
"""Asserts that the expected entities are fetched.
The expected entities are the ones added in |_AddDataToDatastore|.
Args:
include_internal: Whether or not internal-only entities are included
in the set of expected entities to be fetched.
"""
bots = graph_data.Bot.query().fetch()
if include_internal:
self.assertEqual(2, len(bots))
self.assertEqual('FooInternal', bots[0].key.string_id())
self.assertEqual('Win7External', bots[1].key.string_id())
else:
self.assertEqual(1, len(bots))
self.assertEqual('Win7External', bots[0].key.string_id())
tests = graph_data.Test.query().fetch()
if include_internal:
self.assertEqual(8, len(tests))
self.assertEqual('TestExternal', tests[0].key.string_id())
self.assertEqual('SubTestExternal', tests[1].key.string_id())
self.assertEqual('TestInternal', tests[2].key.string_id())
self.assertEqual('SubTestInternal', tests[3].key.string_id())
self.assertEqual('TestExternal', tests[4].key.string_id())
self.assertEqual('SubTestExternal', tests[5].key.string_id())
self.assertEqual('TestInternal', tests[6].key.string_id())
self.assertEqual('SubTestInternal', tests[7].key.string_id())
else:
self.assertEqual(4, len(tests))
self.assertEqual('TestExternal', tests[0].key.string_id())
self.assertEqual('SubTestExternal', tests[1].key.string_id())
self.assertEqual('TestExternal', tests[2].key.string_id())
self.assertEqual('SubTestExternal', tests[3].key.string_id())
tests = graph_data.Test.query(ancestor=ndb.Key(
'Master', 'ChromiumPerf', 'Bot', 'FooInternal')).fetch()
if include_internal:
self.assertEqual(4, len(tests))
else:
self.assertEqual(2, len(tests))
rows = graph_data.Row.query().fetch()
if include_internal:
self.assertEqual(20, len(rows))
else:
self.assertEqual(10, len(rows))
rows = graph_data.Row.query(ndb.OR(
graph_data.Row.revision < 20, graph_data.Row.revision > 70)).filter(
graph_data.Row.value == 20).fetch()
if include_internal:
self.assertEqual(2, len(rows))
else:
self.assertEqual(1, len(rows))
sheriffs = sheriff.Sheriff.query().fetch()
if include_internal:
self.assertEqual(2, len(sheriffs))
self.assertEqual('external', sheriffs[0].key.string_id())
self.assertEqual('external@chromium.org', sheriffs[0].email)
self.assertEqual('internal', sheriffs[1].key.string_id())
self.assertEqual('internal@google.com', sheriffs[1].email)
else:
self.assertEqual(1, len(sheriffs))
self.assertEqual('external', sheriffs[0].key.string_id())
self.assertEqual('external@chromium.org', sheriffs[0].email)
def testQuery_NoUser_InternalOnlyNotFetched(self):
self.UnsetCurrentUser()
self._CheckQueryResults(include_internal=False)
def testQuery_ExternalUser_InternalOnlyNotFetched(self):
self.SetCurrentUser('foo@yahoo.com')
self._CheckQueryResults(include_internal=False)
def testQuery_InternalUser_InternalOnlyFetched(self):
self.SetCurrentUser('foo@google.com')
self._CheckQueryResults(True)
def testQuery_PrivilegedRequest_InternalOnlyFetched(self):
self.UnsetCurrentUser()
datastore_hooks.SetPrivilegedRequest()
self._CheckQueryResults(True)
def _CheckGet(self, include_internal):
m = ndb.Key('Master', 'ChromiumPerf').get()
self.assertEqual(m.key.string_id(), 'ChromiumPerf')
external_bot = ndb.Key(
'Master', 'ChromiumPerf', 'Bot', 'Win7External').get()
self.assertEqual(external_bot.key.string_id(), 'Win7External')
external_bot_2 = graph_data.Bot.get_by_id('Win7External', parent=m.key)
self.assertEqual(external_bot_2.key.string_id(), 'Win7External')
external_test = ndb.Key(
'Master', 'ChromiumPerf', 'Bot', 'Win7External', 'Test', 'TestExternal',
'Test', 'SubTestExternal').get()
self.assertEqual('SubTestExternal', external_test.key.string_id())
if include_internal:
internal_bot = ndb.Key(
'Master', 'ChromiumPerf', 'Bot', 'FooInternal').get()
self.assertEqual(internal_bot.key.string_id(), 'FooInternal')
internal_bot_2 = graph_data.Bot.get_by_id('FooInternal', parent=m.key)
self.assertEqual(internal_bot_2.key.string_id(), 'FooInternal')
else:
k = ndb.Key('Master', 'ChromiumPerf', 'Bot', 'FooInternal')
self.assertRaises(AssertionError, k.get)
self.assertRaises(AssertionError, graph_data.Bot.get_by_id,
'FooInternal', parent=m.key)
sheriff_entity = ndb.Key('Sheriff', 'external').get()
self.assertEqual(sheriff_entity.email, 'external@chromium.org')
if include_internal:
internal_sheriff_entity = ndb.Key('Sheriff', 'internal').get()
self.assertEqual('internal@google.com', internal_sheriff_entity.email)
else:
k = ndb.Key('Sheriff', 'internal')
self.assertRaises(AssertionError, k.get)
self.assertRaises(
AssertionError, sheriff.Sheriff.get_by_id, 'internal')
def testGet_NoUser(self):
self.UnsetCurrentUser()
self._CheckGet(include_internal=False)
def testGet_ExternalUser(self):
self.SetCurrentUser('foo@yahoo.com')
self._CheckGet(include_internal=False)
def testGet_InternalUser(self):
self.SetCurrentUser('foo@google.com')
self._CheckGet(include_internal=True)
def testGet_AdminUser(self):
self.SetCurrentUser('test@example.com', is_admin=True)
self._CheckGet(include_internal=True)
def testGet_PrivilegedRequest(self):
self.UnsetCurrentUser()
datastore_hooks.SetPrivilegedRequest()
self._CheckGet(include_internal=True)
if __name__ == '__main__':
unittest.main()