def testIsHostname(self):
    self.assertTrue(self.data_validation_instance.isHostname(
        u'university.edu.'))
    self.assertTrue(self.data_validation_instance.isHostname(
        u'blah.university.edu.'))
    self.assertFalse(self.data_validation_instance.isHostname(
        u'university.edu'))
    self.assertFalse(self.data_validation_instance.isHostname(u'.edu.'))
    self.assertFalse(self.data_validation_instance.isHostname(u'not_valid'))
    self.assertFalse(self.data_validation_instance.isHostname(2))

    #Despite what I have written in these hostnames, don't actually read them
    #and believe what they say.
    ok_hostname_1 = '%s' % (u'this.is.a.super.long.target.host.name.'
                             'that.should.trip.the.length.check.in.'
                             'core.helpers.and.if.it.doesnt.we.have.'
                             'problems.and.need.to.fix.something.or.'
                             'roster.will.ship.with.bugs.but.software.'
                             'has.been.shipped.with.bugs.before.so.'
                             'maybe.it.wont.be.too.awful.')

    hostname_too_long = '%s' % (u'this.is.a.super.long.target.host.name.'
                                 'that.should.trip.the.length.check.in.'
                                 'core.helpers.and.if.it.doesnt.we.have.'
                                 'problems.and.need.to.fix.something.or.'
                                 'roster.will.ship.with.bugs.but.software.'
                                 'has.been.shipped.with.bugs.before.so.'
                                 'maybe.it.wont.be.tooo.awful.')

    ok_hostname_2 = '%s' % (u'thisisanothersuperlongtargethostnamethat'
                             'shouldtripthecheckincor.helpers.for.'
                             'having.a.component.that.is.too.long.')

    hostname_component_too_long = '%s' % (u'thisisanothersuperlongtargethost'
                                           'namethatshouldtripthecheckincore.'
                                           'helpers.for.having.a.component.'
                                           'that.is.to.long.')

    #Just long enough to be valid
    self.assertEqual(len(punycode_lib.Uni2Puny(ok_hostname_1)), 255)
    self.assertTrue(self.data_validation_instance.isHostname(ok_hostname_1))

    #Just long enough to be invalid
    self.assertEqual(len(punycode_lib.Uni2Puny(hostname_too_long)), 256)
    self.assertFalse(
        self.data_validation_instance.isHostname(hostname_too_long))

    #First component is just long enough to be valid
    self.assertEqual(len(punycode_lib.Uni2Puny(ok_hostname_2.split('.')[0])), 
      63)
    self.assertTrue(self.data_validation_instance.isHostname(ok_hostname_2))

    #First component is just long enough to be invalid
    self.assertEqual(
        len(punycode_lib.Uni2Puny(hostname_component_too_long.split('.')[0])), 
        64)
    self.assertFalse(
        self.data_validation_instance.isHostname(hostname_component_too_long))
 def testPunycodeModule(self):
     file = codecs.open('test_data/snowman', mode='r', encoding='utf-8')
     unicode = file.read().replace('\n', '')
     self.assertEqual(unicode, u'\u2603\u2190\u2191.sn')
     punycode = punycode_lib.Uni2Puny(unicode)
     self.assertEqual(punycode, 'xn--35gc625a.sn')
     unicode = punycode_lib.Puny2Uni(punycode)
     self.assertEqual(unicode, u'\u2603\u2190\u2191.sn')
     ascii = 'sub.ascii.com.'
     punycode = punycode_lib.Uni2Puny(ascii)
     self.assertEqual(punycode, ascii)
     ascii = punycode_lib.Puny2Uni(punycode)
     self.assertEqual(ascii, punycode)
  def testisTarget(self):
    #Despite what I have written in these targets, don't actually read them
    #and believe what they say.
    target_too_long = '%s' % ('this.is.a.super.long.target.host.name.that.'
                              'should.trip.the.length.check.in.core.helpers.'
                              'and.if.it.doesnt.we.have.problems.and.need.to.'
                              'fix.something.or.roster.will.ship.with.bugs.but.'
                              'software.has.been.shipped.with.bugs.before.so.'
                              'maybe.it.wont.be.too.bad.com')

    ok_target_1 = '%s' % ('this.is.a.super.long.target.host.name.that.should.'
                          'trip.the.length.check.in.core.helpers.and.if.it.'
                          'doesnt.we.have.problems.and.need.to.fix.something.'
                          'or.roster.will.ship.with.bugs.but.software.has.been.'
                          'shipped.with.bugs.before.so.maybe.it.wont.be.too.'
                          'bad.co')

    target_component_too_long = '%s' % ('thisisanothersuperlongtargethostname'
                                        'thatshouldtripthecheckincore.helpers.'
                                        'for.having.a.component.that.is.too.'
                                        'long')

    ok_target_2 = '%s' % ('thisisanothersuperlongtargethostnamethatshouldtrip'
                          'thecheckincor.helpers.for.having.a.component.that.'
                          'is.too.long')

    self.assertEqual(len(punycode_lib.Uni2Puny(ok_target_1)), 255)
    self.assertTrue(self.data_validation_instance.isTarget(ok_target_1))

    self.assertEqual(len(punycode_lib.Uni2Puny(target_too_long)), 256)
    self.assertFalse(self.data_validation_instance.isTarget(target_too_long))

    self.assertEqual(len(punycode_lib.Uni2Puny(ok_target_2.split('.')[0])), 63)
    self.assertTrue(self.data_validation_instance.isTarget(ok_target_2))

    self.assertEqual(
      len(punycode_lib.Uni2Puny(target_component_too_long.split('.')[0])), 64)
    self.assertFalse(
      self.data_validation_instance.isTarget(target_component_too_long))

    #Now we basically do the entire test over again but with unicode targets, 
    #just to make sure. (I don't think it's necessary but whatever)

    self.assertEqual(len(punycode_lib.Uni2Puny(unicode(ok_target_1))), 255)
    self.assertTrue(self.data_validation_instance.isTarget(ok_target_1))

    self.assertEqual(len(punycode_lib.Uni2Puny(unicode(target_too_long))), 256)
    self.assertFalse(self.data_validation_instance.isTarget(target_too_long))

    self.assertEqual(
        len(punycode_lib.Uni2Puny(unicode(ok_target_2).split('.')[0])), 63)
    self.assertTrue(self.data_validation_instance.isTarget(ok_target_2))

    self.assertEqual(len(punycode_lib.Uni2Puny(
        unicode(target_component_too_long).split('.')[0])), 64)
    self.assertFalse(
      self.data_validation_instance.isTarget(target_component_too_long))
    def isTarget(self, target):
        """Checks that a target and it's components have the correct length

    Inputs:
    target: target string

    Outputs:
    bool: if it is a valid target"""

        target = punycode_lib.Uni2Puny(unicode(target))

        if (len(target) > 255):
            return False

        for component in target.split('.'):
            if (len(component) > 63):
                return False

        return True
    def CookData(self, data):
        """Cooks data for zone exporter

    Inputs:
      data: dictionary of raw data from database

    Outputs:
      dict: dictionary with dns_server_sets and dns_servers keys, then keyed by
      dns_server_set and dns_server, respectively ex:
      {u'dns_server_sets':
          {u'external_dns':
              {'dns_servers': [u'[ns1.university.edu]',
                               u'[dns2.university.edu]',
                               u'[dns3.university.edu]']}
               'views':
                   {u'external':
                       {u'university.edu':
                           {'records': [
                               {u'serial_number': 20091227,
                                u'refresh_seconds': 5,
                                'target': u'university.edu.',
                                u'name_server': u'ns1.university.edu.',
                                u'retry_seconds': 5, 'ttl': 3600,
                                u'minimum_seconds': 5, 'record_type': u'soa',
                                'view_name': u'external',
                                'last_user': u'sharrell',
                                'zone_name': u'university.edu',
                                u'admin_email': u'[email protected].',
                                u'expiry_seconds': 5},
                               {'target': u'computer1', 'ttl': 3600,
                                'record_type': u'a', 'view_name': u'external',
                                'last_user': u'sharrell',
                                'zone_name': u'university.edu',
                                u'assignment_ip': u'1.2.3.5'},
                                'zone_origin': u'example.',
                                'zone_type': u'master'}}}},
      u'dns_servers':
          {u'ns1.university.edu':
               {'dns_server_remote_bind_directory': u'/etc/named/',
                'dns_server_remote_test_directory': u'/etc/named/test/',
                'dns_server_ssh_username': u'dchayes'},
           u'dns2.university.edu':
              {'dns_server_remote_bind_directory': u'/etc/bind/',
               'dns_server_remote_test_directory': u'/etc/bind/test/',
               'dns_server_ssh_username': u'ssh_user'}}}
           u'dns3.university.edu':
              {'dns_server_remote_bind_directory': u'/etc/bind/',
               'dns_server_remote_test_directory': u'/etc/bind/test/',
               'dns_server_ssh_username': u'dchayes'}}}
    """
        cooked_data = {}
        cooked_data['dns_server_sets'] = {}
        cooked_data['dns_servers'] = {}
        sorted_records = self.SortRecords(data['records'])

        for dns_server_set in data['dns_server_sets']:
            dns_server_set_name = dns_server_set['dns_server_set_name']

            if (not dns_server_set_name in cooked_data['dns_server_sets']):
                cooked_data['dns_server_sets'][dns_server_set_name] = {}
            if (not 'dns_servers'
                    in cooked_data['dns_server_sets'][dns_server_set_name]):
                cooked_data['dns_server_sets'][dns_server_set_name][
                    'dns_servers'] = []
            if (not 'views'
                    in cooked_data['dns_server_sets'][dns_server_set_name]):
                cooked_data['dns_server_sets'][dns_server_set_name][
                    'views'] = {}

            for dns_server_set_assignment in data[
                    'dns_server_set_assignments']:
                if (dns_server_set_assignment[
                        'dns_server_set_assignments_dns_server_set_name']
                        == dns_server_set['dns_server_set_name']
                        and dns_server_set_assignment[
                            'dns_server_set_assignments_dns_server_name']
                        not in cooked_data['dns_server_sets']
                    [dns_server_set_name]['dns_servers']):

                    cooked_data['dns_server_sets'][dns_server_set_name][
                        'dns_servers'].append(dns_server_set_assignment[
                            'dns_server_set_assignments_dns_server_name'])

                    cooked_data['dns_server_sets'][dns_server_set_name][
                        'view_order'] = {}

            for dns_server_set_view_assignment in data[
                    'dns_server_set_view_assignments']:
                dns_server_set_name = dns_server_set_view_assignment[
                    'dns_server_set_view_assignments_dns_server_set_name']
                view_name = dns_server_set_view_assignment[
                    'dns_server_set_view_assignments_view_name']
                view_order = dns_server_set_view_assignment['view_order']
                view_options = dns_server_set_view_assignment['view_options']
                if (dns_server_set_name ==
                        dns_server_set['dns_server_set_name']):

                    cooked_data['dns_server_sets'][dns_server_set_name][
                        'view_order'][view_order] = view_name

                    for view_dependency in data['view_dependency_assignments']:
                        if (view_name == view_dependency[
                                'view_dependency_assignments_view_name']):
                            if (not view_name in cooked_data['dns_server_sets']
                                [dns_server_set_name]['views']):
                                cooked_data['dns_server_sets'][
                                    dns_server_set_name]['views'][
                                        view_name] = {}

                                for view_names in data['views']:
                                    if (view_names['view_name'] == view_name):
                                        cooked_data['dns_server_sets'][
                                            dns_server_set_name]['views'][
                                                view_name]['view_options'] = (
                                                    iscpy.Deserialize(
                                                        view_options).replace(
                                                            '\n', '\n\t'))
                                        break

                            if (not 'acls' in cooked_data['dns_server_sets']
                                [dns_server_set_name]['views'][view_name]):
                                cooked_data['dns_server_sets'][
                                    dns_server_set_name]['views'][view_name][
                                        'acls'] = self.ListACLNamesByView(
                                            data, view_name)
                            if (not 'zones' in cooked_data['dns_server_sets']
                                [dns_server_set_name]['views'][view_name]):
                                cooked_data['dns_server_sets'][
                                    dns_server_set_name]['views'][view_name][
                                        'zones'] = {}

                            for zone in data['zone_view_assignments']:
                                view_dependency_name = view_dependency[
                                    'view_dependency_assignments_view_dependency']
                                zone_name = zone[
                                    'zone_view_assignments_zone_name']
                                if (view_dependency_name == zone[
                                        'zone_view_assignments_view_dependency']
                                        and
                                    ((zone_name, view_dependency_name)
                                     in sorted_records
                                     or zone['zone_view_assignments_zone_type']
                                     == 'slave')):
                                    if (not zone_name
                                            in cooked_data['dns_server_sets']
                                        [dns_server_set_name]['views']
                                        [view_name]['zones']):
                                        cooked_data['dns_server_sets'][
                                            dns_server_set_name]['views'][
                                                view_name]['zones'][
                                                    zone_name] = {}
                                    if ('records' not in
                                            cooked_data['dns_server_sets']
                                        [dns_server_set_name]['views']
                                        [view_name]['zones'][zone_name]):
                                        cooked_data['dns_server_sets'][
                                            dns_server_set_name]['views'][
                                                view_name]['zones'][zone_name][
                                                    'records'] = []

                                    cooked_data['dns_server_sets'][
                                        dns_server_set_name]['views'][
                                            view_name]['zones'][zone_name][
                                                'zone_origin'] = (
                                                    punycode_lib.Uni2Puny(
                                                        zone['zone_origin']))

                                    cooked_data['dns_server_sets'][
                                        dns_server_set_name]['views'][
                                            view_name]['zones'][zone_name][
                                                'zone_options'] = iscpy.Deserialize(
                                                    zone['zone_options'])

                                    cooked_data['dns_server_sets'][
                                        dns_server_set_name]['views'][
                                            view_name]['zones'][zone_name][
                                                'zone_type'] = zone[
                                                    'zone_view_assignments_zone_type']

                                    # if the zone is a slave
                                    if ((zone_name, view_dependency_name)
                                            not in sorted_records):
                                        continue

                                    for record in sorted_records[(
                                            zone_name,
                                            view_dependency_name)].values():
                                        try:
                                            record[
                                                'target'] = punycode_lib.Uni2Puny(
                                                    record['target'])
                                        except (KeyError):
                                            pass
                                        try:
                                            record[
                                                'assignment_host'] = punycode_lib.Uni2Puny(
                                                    record['assignment_host'])
                                        except (KeyError):
                                            pass
                                    cooked_data['dns_server_sets'][
                                        dns_server_set_name]['views'][
                                            view_name]['zones'][zone_name][
                                                'records'].extend(
                                                    sorted_records[(
                                                        zone_name,
                                                        view_dependency_name
                                                    )].values())

        # Insert dns_servers into cooked_data
        for dns_server in data['dns_servers']:
            dns_server_name = dns_server['dns_server_name']
            if (not dns_server_name in cooked_data['dns_servers']):
                cooked_data['dns_servers'][dns_server_name] = {}
            cooked_data['dns_servers'][dns_server_name][
                'dns_server_ssh_username'] = (
                    dns_server['dns_server_ssh_username'])
            cooked_data['dns_servers'][dns_server_name][
                'dns_server_remote_test_directory'] = dns_server[
                    'dns_server_remote_test_directory']
            cooked_data['dns_servers'][dns_server_name][
                'dns_server_remote_bind_directory'] = dns_server[
                    'dns_server_remote_bind_directory']

        return cooked_data
 def testUni2Puny(self):
     file = codecs.open('test_data/snowman', mode='r', encoding='utf-8')
     unicode = file.read().replace('\n', '')
     self.assertEqual(unicode, u'\u2603\u2190\u2191.sn')
     punycode = punycode_lib.Uni2Puny(unicode)
     self.assertEqual(punycode, 'xn--35gc625a.sn')