def test_load_all():

    validator_classes.load_all()
    assert 'ns_origin' in validator_classes.ALL_CLASSES
    assert validator_classes.ALL_CLASSES['ns_origin'] == NsOrigin
    assert 'soa_origin' in validator_classes.ALL_CLASSES
    assert validator_classes.ALL_CLASSES['soa_origin'] == SoaOrigin
    def run(self):
        '''
        Runs the instance, which loads a zone with the specified loader, and
        loads and runs the specified tests.

        :return: A 3-tuple (loader_elapsed_time, test_count, error_count)
        '''

        # Create the zone loader instance:
        loader_classes.load_all()
        loader_class = loader_classes.ALL_CLASSES[self.args.loader]
        loader = loader_class(self.args)

        # Create the test instances:
        validator_classes.load_all()
        tests_pool = self.args.include_tests or self.avail_tests
        test_names = [t for t in tests_pool if t not in self.args.exclude_tests]
        tests = {
            validators.ZONE_TEST: [],
            validators.NODE_TEST: [],
            validators.RRSET_TEST: [],
            validators.REC_TEST: []}
        for test_name in test_names:
            test_class = validator_classes.ALL_CLASSES[test_name]
            test = test_class(self.args)
            tests[test.TEST_TYPE].append(test)

        # Load the zone:
        load_start_time = time.time()
        zone_obj = loader.run()
        load_time = time.time() - load_start_time
        if not zone_obj:
            raise RuntimeError('No zone to validate!')
        context = validators.Context(self.args, zone_obj)

        # Print some stats:
        print '# Checking zone:', context.zone_name
        print '# Loader: %s from: %s elapsed=%f secs' % (
            self.args.loader, self.args.source, load_time)
        if self.args.force_dnssec_type == 'detect':
            print '# Zone appears to be DNSSEC type:', context.dnssec_type
        else:
            print '# Forcing DNSSEC type for zone to:', context.dnssec_type
        print '# Extra defines:', self.args.defines

        # Filter tests based on zone's DNSSEC type:
        running_test_names = []
        for tests_type in tests.keys():
            validators.dnssec_filter_tests_by_context(tests[tests_type], context)
            running_test_names += [test.TEST_NAME for test in tests[tests_type]]
        print '# Running tests:', running_test_names

        counts = {'tests': 0, 'errors': 0}

        # Run the zone tests:
        for test in tests[validators.ZONE_TEST]:
            DNSSprocketsImpl._run_test(self.args, test, context, counts)

        # Run the node, rrset, and rec tests:
        for name in context.node_names:
            node = context.zone_obj.get_node(name)
            if node:  # Not present for Empty Non-Terminals

                # Node tests:
                for test in tests[validators.NODE_TEST]:
                    test_node = validators.filter_node(node, test.TEST_RRTYPE)
                    DNSSprocketsImpl._run_test(
                        self.args, test, context, counts,
                        name=name, node=test_node)

                # RRSet tests:
                for rdataset in node.rdatasets:
                    for test in tests[validators.RRSET_TEST]:
                        if validators.test_covers_type(test, rdataset.rdtype):
                            DNSSprocketsImpl._run_test(
                                self.args, test, context, counts,
                                name=name, rdataset=rdataset)

                    # Rec tests:
                    for rdata in rdataset:
                        for test in tests[validators.REC_TEST]:
                            if validators.test_covers_type(test, rdata.rdtype):
                                DNSSprocketsImpl._run_test(
                                    self.args, test, context, counts,
                                    name=name, ttl=rdataset.ttl, rdata=rdata)

        print '# END RESULT: %d ERRORS in %d tests' % (counts['errors'], counts['tests'])
        if hasattr(self.args, 'verbose') and self.args.verbose:
            print '#  TEST TIMES:'
            for key in tests.keys():
                for test in tests[key]:
                    print '#  %f secs for %s (%d runs for %f secs each)' % (
                        test.total_time, 
                        test.TEST_NAME, 
                        test.total_runs,
                        test.total_time / test.total_runs)
        return (load_time, counts['tests'], counts['errors'])