Source code for armi.tests.test_apps

# Copyright 2019 TerraPower, LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Tests for the App class."""
import copy
import unittest

from armi import configure
from armi import context
from armi import getApp
from armi import getDefaultPluginManager
from armi import isStableReleaseVersion
from armi import meta
from armi import plugins
from armi.reactor.flags import Flags
from armi.__main__ import main


[docs]class TestPlugin1(plugins.ArmiPlugin): """This should be fine on its own."""
[docs] @staticmethod @plugins.HOOKIMPL def defineParameterRenames(): return {"oldType": "type"}
[docs]class TestPlugin2(plugins.ArmiPlugin): """This should lead to an error if it coexists with Plugin1."""
[docs] @staticmethod @plugins.HOOKIMPL def defineParameterRenames(): return {"oldType": "type"}
[docs]class TestPlugin3(plugins.ArmiPlugin): """This should lead to errors, since it collides with the framework `type` param."""
[docs] @staticmethod @plugins.HOOKIMPL def defineParameterRenames(): return {"type": "newType"}
[docs]class TestPlugin4(plugins.ArmiPlugin): """This should be fine on its own, and safe to merge with TestPlugin1."""
[docs] @staticmethod @plugins.HOOKIMPL def defineParameterRenames(): return {"arealPD": "arealPowerDensity"}
[docs]class TestApps(unittest.TestCase): """Test the base apps.App interfaces.""" def setUp(self): """ Manipulate the standard App. We can't just configure our own, since the pytest environment bleeds between tests. """ self._backupApp = copy.deepcopy(getApp()) def tearDown(self): """Restore the App to its original state.""" import armi armi._app = self._backupApp context.APP_NAME = "armi"
[docs] def test_getParamRenames(self): # a basic test of the method app = getApp() app.pluginManager.register(TestPlugin1) app.pluginManager.register(TestPlugin4) app._paramRenames = None # need to implement better cache invalidation rules renames = app.getParamRenames() self.assertIn("oldType", renames) self.assertEqual(renames["oldType"], "type") self.assertIn("arealPD", renames) self.assertEqual(renames["arealPD"], "arealPowerDensity") # test an invalid param manager situation app._paramRenames[0][1] = -3 renames = app.getParamRenames() self.assertIn("oldType", renames) self.assertEqual(renames["oldType"], "type") self.assertIn("arealPD", renames) self.assertEqual(renames["arealPD"], "arealPowerDensity") # test the exceptions that get raised app.pluginManager.register(TestPlugin2) app._paramRenames = None # need to implement better cache invalidation rules with self.assertRaisesRegex( plugins.PluginError, ".*parameter renames are already defined by another plugin.*", ): app.getParamRenames() app.pluginManager.unregister(TestPlugin2) app.pluginManager.register(TestPlugin3) with self.assertRaisesRegex( plugins.PluginError, ".*currently-defined parameters.*" ): app.getParamRenames()
[docs] def test_registerPluginFlags(self): # set up the app, pm, and register some plugins app = getApp() # validate our flags have been registered self.assertEqual(Flags.fromString("FUEL"), Flags.FUEL) self.assertEqual(Flags.fromString("PRIMARY"), Flags.PRIMARY) # validate we can only register the flags once for _ in range(3): with self.assertRaises(RuntimeError): app.registerPluginFlags()
[docs] def test_getParamRenamesInvalids(self): # a basic test of the method app = getApp() app.pluginManager.register(TestPlugin1) app.pluginManager.register(TestPlugin4) app._paramRenames = None # need to implement better cache invalidation rules renames = app.getParamRenames() self.assertIn("oldType", renames) self.assertEqual(renames["oldType"], "type") self.assertIn("arealPD", renames) self.assertEqual(renames["arealPD"], "arealPowerDensity") # test the strange, invalid case self.assertIsNotNone(app._paramRenames) app._pm._counter = -1 renames = app.getParamRenames() self.assertIn("oldType", renames) self.assertEqual(renames["oldType"], "type") self.assertIn("arealPD", renames) self.assertEqual(renames["arealPD"], "arealPowerDensity")
[docs] def test_version(self): app = getApp() ver = app.version self.assertEqual(ver, meta.__version__)
[docs] def test_getSettings(self): app = getApp() settings = app.getSettings() self.assertGreater(len(settings), 100) self.assertEqual(settings["numProcessors"].value, 1) self.assertEqual(settings["nCycles"].value, 1)
[docs] def test_splashText(self): app = getApp() splash = app.splashText self.assertIn("========", splash) self.assertIn("Advanced", splash) self.assertIn("version", splash) self.assertIn(meta.__version__, splash)
[docs] def test_splashTextDifferentApp(self): import armi app = getApp() name = "DifferentApp" app.name = name armi._app = app context.APP_NAME = name splash = app.splashText self.assertIn("========", splash) self.assertIn("Advanced", splash) self.assertIn("version", splash) self.assertIn(meta.__version__, splash) self.assertIn("DifferentApp", splash)
[docs] def test_isStableReleaseVersion(self): self.assertTrue(isStableReleaseVersion(None)) self.assertTrue(isStableReleaseVersion("0.1.2")) self.assertFalse(isStableReleaseVersion("1.2.3-asda132a"))
[docs] def test_disableFutureConfigures(self): import armi # save off, in in case of poorly parallelized tests old = armi._ignoreConfigures # test it works (should be False to start) armi.disableFutureConfigures() self.assertTrue(armi._ignoreConfigures) # reset, in case of poorly parallelized tests armi._ignoreConfigures = old
[docs]class TestArmiHighLevel(unittest.TestCase): """Tests for functions in the ARMI __init__ module."""
[docs] def test_getDefaultPluginManager(self): """Test the default plugin manager. .. test:: The default application consists of a list of default plugins. :id: T_ARMI_APP_PLUGINS :tests: R_ARMI_APP_PLUGINS """ pm = getDefaultPluginManager() pm2 = getDefaultPluginManager() self.assertNotEqual(pm, pm2) pluginsList = "".join([str(p) for p in pm.get_plugins()]) self.assertIn("BookkeepingPlugin", pluginsList) self.assertIn("EntryPointsPlugin", pluginsList) self.assertIn("NeutronicsPlugin", pluginsList) self.assertIn("ReactorPlugin", pluginsList)
[docs] def test_overConfigured(self): with self.assertRaises(RuntimeError): configure()
[docs] def test_main(self): with self.assertRaises(SystemExit): main()