Example #1
0
    def __init__(self, fast: bool, file_utils: FileUtils=FileUtils()):

        collectors = [JavaPackageImports('usageof.CacheBuilder',
                                         'Imports of CacheBuilder: prevent caches other than EhCache',
                                         'com.google.common.cache.CacheBuilder').unchecked(),
                      JavaPackageImports('usageof.java.util.Calendar',
                                         'Stop using java.util.Calendar - use joda time instead',
                                         'java.util.Calendar'),
                      ManagersInJiraApi(),
                      FileCountAndSize('velocity', lambda x: x.endswith('.vm'), 'Get rid of velocity files').unchecked(),
                      FileCountAndSize('jsp', lambda x: x.endswith('.jsp'), 'Get rid of jsp files').unchecked(),
                      GrepCount('usageof.css.important', lambda x: x.endswith(('.css', '.less')),
                                'Get rid of css !important usages', '!important'),
                      GrepCount('usageof.system.getproperty',
                                lambda x: x.endswith('.java') and not x.endswith('/SystemPropertiesAccessor.java'),
                                'Get rid of System.getProperty family usages '
                                '(use JiraSystemProperties class if you must)',
                                ['System.getProperty', 'System.getProperties', 'Boolean.getBoolean',
                                 'System.clearProperty', 'Integer.getInteger', 'Long.getLong', 'System.setProperty',
                                 'System.setProperties']),
                      GrepCount('usageof.actioncontext.getrequest', lambda x: x.endswith('.java'),
                                'Get rid of ActionContext.getRequest usages', 'ActionContext.getRequest'),
                      GrepCount('usageof.webwork.action.jelly.tag', lambda x: x.endswith('.java'),
                                'Jelly dependencies on webwork actions blocks their removal',
                                ('extends ActionTagSupport', 'extends UserAwareActionTagSupport',
                                 'extends IssueSchemeAwareActionTagSupport', 'extends ProjectAwareActionTagSupport',
                                 'extends PermissionSchemeAwareActionTagSupport')),
                      GrepCount('usageof.not.component.accessor', lambda x: x.endswith('.java'),
                                'Should use component accessor to get components',
                                ['import com.atlassian.jira.ComponentManager',
                                 'import com.atlassian.jira.ManagerFactory',
                                 'import com.atlassian.jira.util.ComponentLocator'
                                 'import com.atlassian.jira.plugin.ComponentClassManager'],
                                'class'),
                      GrepCount('tests.qunit.core.count', lambda x: x.endswith(('-test.js', '-tests.js')),
                                'Keep count of Qunit tests', ['test(', 'asyncTest(']).unchecked().rising(),
                      GrepCount('frontend.number.of.soy.templates', lambda x: x.endswith('.soy'),
                                'Keep count of soy templates', '{/template}').unchecked().rising(),
                      GrepCount('frontend.number.of.ww.tags', lambda x: x.endswith('.jsp'),
                                'Get rid of jsp webwork tags', '<ww:').unchecked(),
                      GrepCount('frontend.number.of.velocity.macros', lambda x: x.endswith('.vm'),
                                'Rewrite velocity macros to soy', lambda x: x.strip().startswith('#macro')),
                      GrepCount('frontend.number.of.css.rules', lambda x: x.endswith(('.css', '.less')),
                                'Keep track of styles complexity.', '{').unchecked(),
                      GrepCount('frontend.number.of.lcss.mixins.invocations',
                                lambda x: x.endswith('.less'),
                                'Keep track of mixin complexity.',
                                lambda line: ');' in line and ':' not in line).unchecked(),
                      FileCount('soy', lambda x: x.endswith('.soy'), 'Keep count of soy files.').unchecked().rising(),
                      FileCount('frontend.helpers', lambda x: any(path in x for path in
                                ['/webapp/template/aui/', 'webapp/template/standard', 'webapp/ui/aui-layout']),
                                'Number of files with JIRA exceptions in AUI').unchecked(),
                      JavaPackageImports('usageof.generic.value.webwork.action',
                                         'Should not be using GenericValue in webwork actions',
                                         'org.ofbiz.core.entity.GenericValue', 'web.action'),
                      JavaPackageImports('usageof.property.set.webwork.action',
                                         'Should not be using Property Set in webwork actions',
                                         'com.opensymphony.module.propertyset.PropertySet', 'web.action'),
                      JavaPackageImports('usageof.crowd.user',
                                         'use UserRename user',
                                         'com.atlassian.crowd.embedded.api.User').unchecked(),
                      JavaPackageImports('usageof.event.publisher.webwork.action',
                                         'Should not be using Event Publisher in webwork actions',
                                         'com.atlassian.event.api.EventPublisher', 'web.action'),
                      JavaPackageImports('usageof.issue.event.dispatcher.webwork.action',
                                         'Should not be using IssueEventDispatcher in webwork actions',
                                         'com.atlassian.jira.event.issue.IssueEventDispatcher', 'web.action'),
                      JavaPackageImports('usageof.issue.event.manager.webwork.action',
                                         'Should not be using IssueEventManager in webwork actions',
                                         'com.atlassian.jira.event.issue.IssueEventManager', 'web.action'),
                      JavaPackageImports('usageof.ofbiz.delegator.interface.webwork.action',
                                         'Should not be calling straight to Ofbiz in webwork actions '
                                         '(DelegatorInterface)',
                                         'org.ofbiz.core.entity.DelegatorInterface', 'web.action'),
                      JavaPackageImports('usageof.ofbiz.delegator.webwork.action',
                                         'Should not be calling straight to Ofbiz in webwork actions (OfBizDelegator)',
                                         'com.atlassian.jira.ofbiz.OfBizDelegator', 'web.action'),
                      JavaPackageImports('usageof.entity.engine.webwork.action',
                                         'Should not be calling straight to Ofbiz in webwork actions (EntityEngine)',
                                         'com.atlassian.jira.entity.EntityEngine', 'web.action'),
                      JavaPackageImports('usageof.managers.webwork.action',
                                         'Should not be using Managers in webwork actions', 'Manager',
                                         'web.action', whitelist = ['.FeatureManager']),
                      ModulesDescription.commonJUnitFinder,
                      InvocationOfSoyTemplates().unchecked().rising(),
                      InvocationOfVelocityMacros().unchecked()] + ([] if fast else [DeprecatedMethodUsage().unchecked()])

        super().__init__(collectors, 'Scan JIRA source files')
        self.file_utils = file_utils
 def setUp(self):
     self.metric = InvocationOfSoyTemplates(metrics_logger=Mock())
     self.metric.pre_files_scan('test-module')
 def setUp(self):
     self.metric = InvocationOfSoyTemplates(metrics_logger=Mock())
     self.metric.pre_files_scan('test-module')
class TestSoyInvocations(TestCase):

    def setUp(self):
        self.metric = InvocationOfSoyTemplates(metrics_logger=Mock())
        self.metric.pre_files_scan('test-module')

    def test_wants_files(self):
        self.assertTrue(self.metric.wants_file('some-file.soy'), 'should scan soy files.')
        self.assertTrue(self.metric.wants_file('another.vm'), 'should scan vm files.')
        self.assertTrue(self.metric.wants_file('legacy.jsp'), 'should scan jsp files.')
        self.assertTrue(self.metric.wants_file('lots.of.java'), 'should scan java files.')
        self.assertTrue(self.metric.wants_file('from/somewhere/actions.xml'), 'should scan action.xml file.')

        self.assertFalse(self.metric.wants_file('from/somewhere/else/epicactions.xml'), 'should not scan this file.')

    def test_java_scanner_with_variable(self):
        self.metric.wants_file('my-servlet.java')
        self.metric.on_read_line('package somepackage;')

        self.metric.on_read_line('import com.atlassian.soy.renderer.SoyTemplateRenderer;')
        self.metric.on_read_line(' SoyTemplateRenderer myRenderer = null')
        self.metric.on_read_line(' myRenderer.render();')
        self.metric.on_read_line(' myOtherRenderer.render();')

        self.assertEqual(self.metric.value, 1)

    def test_java_scanner_without_import_gives_up(self):
        self.metric.wants_file('my-servlet.java')
        self.metric.on_read_line('package somepackage;')

        self.assertFalse(self.metric.on_read_line('public class MyClass {'),
                         msg='should give up on no import of soy renderer.')

    def test_java_scanner_with_method(self):
        self.metric.wants_file('my-servlet.java')
        self.metric.on_read_line('package somepackage;')

        self.metric.on_read_line('import com.atlassian.soy.renderer.SoyTemplateRenderer;')
        self.metric.on_read_line('public SoyTemplateRenderer getRenderer() {')
        self.metric.on_read_line('  this.getRenderer().render(myTemplate);')
        self.metric.on_read_line('  getSoyRenderer().render(somethingElse);')
        self.metric.on_read_line('  soyRenderer.render(somethingElse);')

        self.assertEqual(self.metric.value, 1)

    def test_java_scanner_defers_possible_hits(self):
        self.metric.wants_file('my-servlet.java')
        self.metric.on_read_line('package somepackage;')

        self.metric.on_read_line('import com.atlassian.soy.renderer.SoyTemplateRenderer;')
        self.metric.on_read_line('  this.getRenderer().render(templateA);')
        self.metric.on_read_line('  other.getRenderer().render(templateB);')
        self.metric.on_read_line('  someOtherRenderer.render(weird);')
        self.metric.on_read_line('  getRenderer().render(templateC);')
        self.metric.on_read_line('private SoyTemplateRenderer getRenderer() {')
        self.metric.on_read_line('  this.getRenderer().render(templateE);')

        self.assertEqual(self.metric.value, 4)

    def test_java_scanner_deferred_hits_get_lost(self):
        self.metric.wants_file('my-servlet.java')
        self.metric.on_read_line('package somepackage;')

        self.metric.on_read_line('import com.atlassian.soy.renderer.SoyTemplateRenderer;')
        self.metric.on_read_line('  this.getRenderer().render(templateA);')
        self.metric.on_read_line('  other.getRenderer().render(templateB);')
        self.metric.on_read_line('  someOtherRenderer.render(weird);')
        self.metric.on_read_line('  getRenderer().render(templateC);')
        self.metric.on_read_line('  this.getRenderer().render(templateE);')

        self.metric.wants_file('another-servlet.java')

        self.assertEqual(self.metric.value, 0)
class TestSoyInvocations(TestCase):
    def setUp(self):
        self.metric = InvocationOfSoyTemplates(metrics_logger=Mock())
        self.metric.pre_files_scan('test-module')

    def test_wants_files(self):
        self.assertTrue(self.metric.wants_file('some-file.soy'),
                        'should scan soy files.')
        self.assertTrue(self.metric.wants_file('another.vm'),
                        'should scan vm files.')
        self.assertTrue(self.metric.wants_file('legacy.jsp'),
                        'should scan jsp files.')
        self.assertTrue(self.metric.wants_file('lots.of.java'),
                        'should scan java files.')
        self.assertTrue(self.metric.wants_file('from/somewhere/actions.xml'),
                        'should scan action.xml file.')

        self.assertFalse(
            self.metric.wants_file('from/somewhere/else/epicactions.xml'),
            'should not scan this file.')

    def test_java_scanner_with_variable(self):
        self.metric.wants_file('my-servlet.java')
        self.metric.on_read_line('package somepackage;')

        self.metric.on_read_line(
            'import com.atlassian.soy.renderer.SoyTemplateRenderer;')
        self.metric.on_read_line(' SoyTemplateRenderer myRenderer = null')
        self.metric.on_read_line(' myRenderer.render();')
        self.metric.on_read_line(' myOtherRenderer.render();')

        self.assertEqual(self.metric.value, 1)

    def test_java_scanner_without_import_gives_up(self):
        self.metric.wants_file('my-servlet.java')
        self.metric.on_read_line('package somepackage;')

        self.assertFalse(self.metric.on_read_line('public class MyClass {'),
                         msg='should give up on no import of soy renderer.')

    def test_java_scanner_with_method(self):
        self.metric.wants_file('my-servlet.java')
        self.metric.on_read_line('package somepackage;')

        self.metric.on_read_line(
            'import com.atlassian.soy.renderer.SoyTemplateRenderer;')
        self.metric.on_read_line('public SoyTemplateRenderer getRenderer() {')
        self.metric.on_read_line('  this.getRenderer().render(myTemplate);')
        self.metric.on_read_line('  getSoyRenderer().render(somethingElse);')
        self.metric.on_read_line('  soyRenderer.render(somethingElse);')

        self.assertEqual(self.metric.value, 1)

    def test_java_scanner_defers_possible_hits(self):
        self.metric.wants_file('my-servlet.java')
        self.metric.on_read_line('package somepackage;')

        self.metric.on_read_line(
            'import com.atlassian.soy.renderer.SoyTemplateRenderer;')
        self.metric.on_read_line('  this.getRenderer().render(templateA);')
        self.metric.on_read_line('  other.getRenderer().render(templateB);')
        self.metric.on_read_line('  someOtherRenderer.render(weird);')
        self.metric.on_read_line('  getRenderer().render(templateC);')
        self.metric.on_read_line('private SoyTemplateRenderer getRenderer() {')
        self.metric.on_read_line('  this.getRenderer().render(templateE);')

        self.assertEqual(self.metric.value, 4)

    def test_java_scanner_deferred_hits_get_lost(self):
        self.metric.wants_file('my-servlet.java')
        self.metric.on_read_line('package somepackage;')

        self.metric.on_read_line(
            'import com.atlassian.soy.renderer.SoyTemplateRenderer;')
        self.metric.on_read_line('  this.getRenderer().render(templateA);')
        self.metric.on_read_line('  other.getRenderer().render(templateB);')
        self.metric.on_read_line('  someOtherRenderer.render(weird);')
        self.metric.on_read_line('  getRenderer().render(templateC);')
        self.metric.on_read_line('  this.getRenderer().render(templateE);')

        self.metric.wants_file('another-servlet.java')

        self.assertEqual(self.metric.value, 0)