def test_getUnusedPort_pickAny(self):
        # Initialize the testConfig with our test data.
        util._test_config = util._GetSharedTestConfig()
        util._test_config.min_port = -1
        util._test_config.min_port = -1

        self.assertGreater(util.getUnusedPort(), 0)
    def test_getUnusedPort_pickRange(self):
        # Initialize the testConfig with our test data.
        util._test_config = util._GetSharedTestConfig()
        # Note that the could failed if these port are already in use...
        START_PORT = 12345
        util._test_config.min_port = START_PORT
        util._test_config.max_port = START_PORT + 5

        self.assertEqual(util.getUnusedPort(), START_PORT)
        self.assertEqual(util.getUnusedPort(), START_PORT + 1)
        self.assertEqual(util.getUnusedPort(), START_PORT + 2)
        self.assertEqual(util.getUnusedPort(), START_PORT + 3)
        self.assertEqual(util.getUnusedPort(), START_PORT + 4)
        with self.assertRaises(AssertionError):
            util.getUnusedPort()

        util.releasePort(START_PORT + 2)
        self.assertEqual(util.getUnusedPort(), START_PORT + 2)
        with self.assertRaises(AssertionError):
            util.getUnusedPort()
  def generate_GPR_2_default_config(self, filename):
    """ Generates the WinnForum configuration for GPR.2. """

    # Load GWPZ Record
    gwpz_record_1 = json.load(
      open(os.path.join('testcases', 'testdata', 'gwpz_record_0.json')))

    # Load devices info
    device_1 = json.load(
      open(os.path.join('testcases', 'testdata', 'device_a.json')))
    # Moving device_1 to a location within 40 KMs of GWPZ zone
    device_1['installationParam']['latitude'] = 39.10448
    device_1['installationParam']['longitude'] = -99.7792

    device_2 = json.load(
      open(os.path.join('testcases', 'testdata', 'device_b.json')))
    # Moving device_2 to a location outside 40 KMs of GWPZ zone
    device_2['installationParam']['latitude'] = 37.83075
    device_2['installationParam']['longitude'] = -107.65025

    device_3 = json.load(
      open(os.path.join('testcases', 'testdata', 'device_c.json')))
    # Moving device_3 to a location inside GWPZ zone
    device_3['installationParam']['latitude'], \
    device_3['installationParam']['longitude'] = getRandomLatLongInPolygon(gwpz_record_1)

    device_4 = json.load(
      open(os.path.join('testcases', 'testdata', 'device_d.json')))
    # Moving device_4 to a location outside 40 KMs of GWPZ zone
    device_4['installationParam']['latitude'] = 38.0934
    device_4['installationParam']['longitude'] = -106.91676

    # Load Grant requests
    grant_request_1 = json.load(
      open(os.path.join('testcases', 'testdata', 'grant_0.json')))
    grant_request_1['operationParam']['operationFrequencyRange']['lowFrequency'] = 3650000000
    grant_request_1['operationParam']['operationFrequencyRange']['highFrequency'] = 3655000000

    grant_request_2 = json.load(
      open(os.path.join('testcases', 'testdata', 'grant_1.json')))
    grant_request_2['operationParam']['operationFrequencyRange']['lowFrequency'] = 3660000000
    grant_request_2['operationParam']['operationFrequencyRange']['highFrequency'] = 3665000000

    grant_request_3 = json.load(
      open(os.path.join('testcases', 'testdata', 'grant_2.json')))
    grant_request_3['operationParam']['operationFrequencyRange']['lowFrequency'] = 3670000000
    grant_request_3['operationParam']['operationFrequencyRange']['highFrequency'] = 3680000000

    grant_request_4 = json.load(
      open(os.path.join('testcases', 'testdata', 'grant_0.json')))
    grant_request_4['operationParam']['operationFrequencyRange']['lowFrequency'] = 3690000000
    grant_request_4['operationParam']['operationFrequencyRange']['highFrequency'] = 3700000000

    # device_b and device_d are Category B
    # Load Conditional Data
    self.assertEqual(device_2['cbsdCategory'], 'B')
    conditionals_device_2 = {
        'cbsdCategory': device_2['cbsdCategory'],
        'fccId': device_2['fccId'],
        'cbsdSerialNumber': device_2['cbsdSerialNumber'],
        'airInterface': device_2['airInterface'],
        'installationParam': device_2['installationParam'],
        'measCapability': device_2['measCapability']
    }

    self.assertEqual(device_4['cbsdCategory'], 'B')
    conditionals_device_4 = {
        'cbsdCategory': device_4['cbsdCategory'],
        'fccId': device_4['fccId'],
        'cbsdSerialNumber': device_4['cbsdSerialNumber'],
        'airInterface': device_4['airInterface'],
        'installationParam': device_4['installationParam'],
        'measCapability': device_4['measCapability']
    }

    # Remove conditionals from registration
    del device_2['cbsdCategory']
    del device_2['airInterface']
    del device_2['installationParam']
    del device_2['measCapability']
    del device_4['cbsdCategory']
    del device_4['airInterface']
    del device_4['installationParam']
    del device_4['measCapability']

    # Registration and grant records
    cbsd_records_domain_proxy_0 = {
        'registrationRequests': [device_1, device_2],
        'grantRequests': [grant_request_1, grant_request_2],
        'conditionalRegistrationData': [conditionals_device_2]
    }
    cbsd_records_domain_proxy_1 = {
        'registrationRequests': [device_3],
        'grantRequests': [grant_request_3],
        'conditionalRegistrationData': []
    }

    # Protected entity record
    protected_entities = {
        'gwpzRecords': [gwpz_record_1]
    }

    # SAS Test Harnesses configurations,
    # Following configurations are for two SAS test harnesses
    sas_test_harness_device_1 = json.load(
      open(os.path.join('testcases', 'testdata', 'device_a.json')))
    sas_test_harness_device_1['fccId'] = "test_fcc_id_e"
    sas_test_harness_device_1['userId'] = "test_user_id_e"

    sas_test_harness_device_2 = json.load(
      open(os.path.join('testcases', 'testdata', 'device_b.json')))
    sas_test_harness_device_2['fccId'] = "test_fcc_id_f"
    sas_test_harness_device_2['userId'] = "test_user_id_f"

    sas_test_harness_device_3 = json.load(
      open(os.path.join('testcases', 'testdata', 'device_c.json')))
    sas_test_harness_device_3['fccId'] = "test_fcc_id_g"
    sas_test_harness_device_3['userId'] = "test_user_id_g"

    # Generate Cbsd FAD Records for SAS Test Harness 0
    cbsd_fad_records_sas_test_harness_0 = generateCbsdRecords(
                                          [sas_test_harness_device_1],
                                          [[grant_request_1]]
    )

    # Generate Cbsd FAD Records for SAS Test Harness 1
    cbsd_fad_records_sas_test_harness_1 = generateCbsdRecords(
                                          [sas_test_harness_device_2, sas_test_harness_device_3],
                                          [[grant_request_2], [grant_request_3]]
    )

    # Generate SAS Test Harnesses dump records
    dump_records_sas_test_harness_0 = {
        'cbsdRecords': cbsd_fad_records_sas_test_harness_0
    }
    dump_records_sas_test_harness_1 = {
        'cbsdRecords': cbsd_fad_records_sas_test_harness_1
    }

    # SAS Test Harnesses configuration
    sas_test_harness_0_config = {
        'sasTestHarnessName': 'SAS-TH-1',
        'hostName': getFqdnLocalhost(),
        'port': getUnusedPort(),
        'serverCert': getCertFilename('sas.cert'),
        'serverKey': getCertFilename('sas.key'),
        'caCert': getCertFilename('ca.cert')
    }
    sas_test_harness_1_config = {
        'sasTestHarnessName': 'SAS-TH-2',
        'hostName': getFqdnLocalhost(),
        'port': getUnusedPort(),
        'serverCert': getCertFilename('sas_1.cert'),
        'serverKey': getCertFilename('sas_1.key'),
        'caCert': getCertFilename('ca.cert')
    }

    iteration_config = {
        'cbsdRequestsWithDomainProxies': [cbsd_records_domain_proxy_0,
                                          cbsd_records_domain_proxy_1],
        'cbsdRecords': [{
            'registrationRequest': device_4,
            'grantRequest': grant_request_4,
            'conditionalRegistrationData': conditionals_device_4,
            'clientCert': getCertFilename('device_d.cert'),
            'clientKey': getCertFilename('device_d.key')
        }],
        'protectedEntities': protected_entities,
        'dpaActivationList': [],
        'dpaDeactivationList': [],
        'sasTestHarnessData': [dump_records_sas_test_harness_0,
                               dump_records_sas_test_harness_1]
    }

    # Create the actual config.
    config = {
        'initialCbsdRequestsWithDomainProxies': self.getEmptyCbsdRequestsWithDomainProxies(2),
        'initialCbsdRecords': [],
        'iterationData': [iteration_config],
        'sasTestHarnessConfigs': [sas_test_harness_0_config,
                                  sas_test_harness_1_config],
        'domainProxyConfigs': [{
             'cert': getCertFilename('domain_proxy.cert'),
             'key': getCertFilename('domain_proxy.key')
        }, {
             'cert': getCertFilename('domain_proxy_1.cert'),
             'key': getCertFilename('domain_proxy_1.key')}]
    }
    writeConfig(filename, config)
  def generate_EPR_2_default_config(self, filename):
    """ Generates the WinnForum configuration for EPR.2. """

    # Load ESC record
    esc_record_1 = json.load(
      open(os.path.join('testcases', 'testdata', 'esc_sensor_record_0.json')))

    # Load devices info
    device_1 = json.load(
      open(os.path.join('testcases', 'testdata', 'device_a.json')))
    # Moving device_1(Cat A) to a location within 40 KMs of ESC sensor
    device_1['installationParam'][
        'latitude'] = esc_record_1['installationParam']['latitude'] + 0.20
    device_1['installationParam'][
        'longitude'] = esc_record_1['installationParam']['longitude']

    device_2 = json.load(
      open(os.path.join('testcases', 'testdata', 'device_b.json')))
    # Moving device_2(Cat B) to a location within 80 KMs of ESC sensor
    device_2['installationParam'][
        'latitude'] = esc_record_1['installationParam']['latitude'] + 0.70
    device_2['installationParam'][
        'longitude'] = esc_record_1['installationParam']['longitude']

    device_3 = json.load(
      open(os.path.join('testcases', 'testdata', 'device_c.json')))
    # Moving device_3(Cat A) to a location outside 40 KMs of ESC sensor
    device_3['installationParam'][
        'latitude'] = esc_record_1['installationParam']['latitude'] + 0.50
    device_3['installationParam'][
        'longitude'] = esc_record_1['installationParam']['longitude']

    device_4 = json.load(
      open(os.path.join('testcases', 'testdata', 'device_d.json')))
    # Moving device_4(Cat B) to a location outside 80 KMs of ESC sensor
    device_4['installationParam'][
        'latitude'] = esc_record_1['installationParam']['latitude'] + 1.0
    device_4['installationParam'][
        'longitude'] = esc_record_1['installationParam']['longitude']

    # Load Grant requests with In-band frequency range for all devices
    grant_request_1 = json.load(
      open(os.path.join('testcases', 'testdata', 'grant_0.json')))
    grant_request_1['operationParam']['operationFrequencyRange']['lowFrequency'] = 3550000000
    grant_request_1['operationParam']['operationFrequencyRange']['highFrequency'] = 3560000000

    grant_request_2 = json.load(
      open(os.path.join('testcases', 'testdata', 'grant_1.json')))
    grant_request_2['operationParam']['operationFrequencyRange']['lowFrequency'] = 3570000000
    grant_request_2['operationParam']['operationFrequencyRange']['highFrequency'] = 3580000000

    grant_request_3 = json.load(
      open(os.path.join('testcases', 'testdata', 'grant_2.json')))
    grant_request_3['operationParam']['operationFrequencyRange']['lowFrequency'] = 3590000000
    grant_request_3['operationParam']['operationFrequencyRange']['highFrequency'] = 3600000000

    grant_request_4 = json.load(
      open(os.path.join('testcases', 'testdata', 'grant_0.json')))
    grant_request_4['operationParam']['operationFrequencyRange']['lowFrequency'] = 3610000000
    grant_request_4['operationParam']['operationFrequencyRange']['highFrequency'] = 3620000000

    # device_b and device_d are Category B
    # Load Conditional Data
    self.assertEqual(device_2['cbsdCategory'], 'B')
    conditionals_device_2 = {
        'cbsdCategory': device_2['cbsdCategory'],
        'fccId': device_2['fccId'],
        'cbsdSerialNumber': device_2['cbsdSerialNumber'],
        'airInterface': device_2['airInterface'],
        'installationParam': device_2['installationParam'],
        'measCapability': device_2['measCapability']
    }

    self.assertEqual(device_4['cbsdCategory'], 'B')
    conditionals_device_4 = {
        'cbsdCategory': device_4['cbsdCategory'],
        'fccId': device_4['fccId'],
        'cbsdSerialNumber': device_4['cbsdSerialNumber'],
        'airInterface': device_4['airInterface'],
        'installationParam': device_4['installationParam'],
        'measCapability': device_4['measCapability']
    }

    # Remove conditionals from registration
    del device_2['cbsdCategory']
    del device_2['airInterface']
    del device_2['installationParam']
    del device_2['measCapability']
    del device_4['cbsdCategory']
    del device_4['airInterface']
    del device_4['installationParam']
    del device_4['measCapability']

    # Registration and grant records
    cbsd_records_domain_proxy_0 = {
        'registrationRequests': [device_1, device_2],
        'grantRequests': [grant_request_1, grant_request_2],
        'conditionalRegistrationData': [conditionals_device_2]

    }
    cbsd_records_domain_proxy_1 = {
        'registrationRequests': [device_3],
        'grantRequests': [grant_request_3],
        'conditionalRegistrationData': []
    }

    # Protected entity record
    protected_entities = {
        'escRecords': [esc_record_1]
    }

    # SAS Test Harnesses configurations,
    # Following configurations are for two SAS test harnesses
    sas_test_harness_device_1 = json.load(
      open(os.path.join('testcases', 'testdata', 'device_a.json')))
    sas_test_harness_device_1['fccId'] = "test_fcc_id_e"
    sas_test_harness_device_1['userId'] = "test_user_id_e"

    sas_test_harness_device_2 = json.load(
      open(os.path.join('testcases', 'testdata', 'device_b.json')))
    sas_test_harness_device_2['fccId'] = "test_fcc_id_f"
    sas_test_harness_device_2['userId'] = "test_user_id_f"

    sas_test_harness_device_3 = json.load(
      open(os.path.join('testcases', 'testdata', 'device_c.json')))
    sas_test_harness_device_3['fccId'] = "test_fcc_id_g"
    sas_test_harness_device_3['userId'] = "test_user_id_g"

    # Generate Cbsd FAD Records for SAS Test Harness 0
    cbsd_fad_records_sas_test_harness_0 = generateCbsdRecords(
                                          [sas_test_harness_device_1],
                                          [[grant_request_1]]
    )

    # Generate Cbsd FAD Records for SAS Test Harness 1
    cbsd_fad_records_sas_test_harness_1 = generateCbsdRecords(
                                          [sas_test_harness_device_2, sas_test_harness_device_3],
                                          [[grant_request_2], [grant_request_3]]
    )

    # Generate SAS Test Harnesses dump records
    dump_records_sas_test_harness_0 = {
        'cbsdRecords': cbsd_fad_records_sas_test_harness_0
    }
    dump_records_sas_test_harness_1 = {
        'cbsdRecords': cbsd_fad_records_sas_test_harness_1
    }

    # SAS Test Harnesses configuration
    sas_test_harness_0_config = {
        'sasTestHarnessName': 'SAS-TH-1',
        'hostName': getFqdnLocalhost(),
        'port': getUnusedPort(),
        'serverCert': getCertFilename('sas.cert'),
        'serverKey': getCertFilename('sas.key'),
        'caCert': getCertFilename('ca.cert')
    }
    sas_test_harness_1_config = {
        'sasTestHarnessName': 'SAS-TH-2',
        'hostName': getFqdnLocalhost(),
        'port': getUnusedPort(),
        'serverCert': getCertFilename('sas_1.cert'),
        'serverKey': getCertFilename('sas_1.key'),
        'caCert': getCertFilename('ca.cert')
    }

    iteration_config = {
        'cbsdRequestsWithDomainProxies': [cbsd_records_domain_proxy_0,
                                          cbsd_records_domain_proxy_1],
        'cbsdRecords': [{
            'registrationRequest': device_4,
            'grantRequest': grant_request_4,
            'conditionalRegistrationData': conditionals_device_4,
            'clientCert': getCertFilename('device_d.cert'),
            'clientKey': getCertFilename('device_d.key')
        }],
        'protectedEntities': protected_entities,
        'dpaActivationList': [],
        'dpaDeactivationList': [],
        'sasTestHarnessData': [dump_records_sas_test_harness_0,
                               dump_records_sas_test_harness_1]
    }

    # Create the actual config.
    config = {
        'initialCbsdRequestsWithDomainProxies': self.getEmptyCbsdRequestsWithDomainProxies(2),
        'initialCbsdRecords': [],
        'iterationData': [iteration_config],
        'sasTestHarnessConfigs': [
            sas_test_harness_0_config, sas_test_harness_1_config
        ],
        'domainProxyConfigs': [{
            'cert': getCertFilename('domain_proxy.cert'),
            'key': getCertFilename('domain_proxy.key')
        }, {
            'cert': getCertFilename('domain_proxy_1.cert'),
            'key': getCertFilename('domain_proxy_1.key')
        }]
    }
    writeConfig(filename, config)
    def generate_FAD_2_default_config(self, filename):
        """Generates the WinnForum configuration for FAD_2"""
        # Create the actual config for FAD_2

        # Load the esc sensor in SAS Test Harness
        esc_sensor = json.load(
            open(
                os.path.join('testcases', 'testdata',
                             'esc_sensor_record_0.json')))

        # Load the device_c1 with registration in SAS Test Harness
        device_c1 = json.load(
            open(os.path.join('testcases', 'testdata', 'device_a.json')))

        # Get a latitude and longitude within 40 kms from ESC.
        latitude, longitude, _ = vincenty.GeodesicPoint(
            esc_sensor['installationParam']['latitude'],
            esc_sensor['installationParam']['longitude'], 0.1,
            30)  # distance of 0.1 km from ESC at 30 degrees

        # Load the device_c1 in the neighborhood area of the ESC sensor
        device_c1['installationParam']['latitude'] = latitude
        device_c1['installationParam']['longitude'] = longitude

        # Load grant request for device_c1
        grant_g1 = json.load(
            open(os.path.join('testcases', 'testdata', 'grant_0.json')))
        grant_g1['operationParam']['maxEirp'] = 20

        # Load one ppa in SAS Test Harness
        pal_record_0 = json.load(
            open(os.path.join('testcases', 'testdata', 'pal_record_0.json')))
        pal_low_frequency = 3550000000
        pal_high_frequency = 3560000000
        ppa_record_0 = json.load(
            open(os.path.join('testcases', 'testdata', 'ppa_record_0.json')))

        ppa_record_a, pal_records = makePpaAndPalRecordsConsistent(
            ppa_record_0, [pal_record_0], pal_low_frequency,
            pal_high_frequency, 'test_user_1')

        # Load device_c3 in SAS Test Harness
        device_c3 = json.load(
            open(os.path.join('testcases', 'testdata', 'device_c.json')))

        # Load the device_c3 in the neighborhood area of the PPA
        device_c3['installationParam']['latitude'] = 38.821322
        device_c3['installationParam']['longitude'] = -97.280040

        # Load grant request for device_c3 in SAS Test Harness
        grant_g3 = json.load(
            open(os.path.join('testcases', 'testdata', 'grant_0.json')))
        grant_g3['operationParam']['maxEirp'] = 20

        # Update grant_g3 frequency to overlap with PPA zone frequency for C3 device
        grant_g3['operationParam']['operationFrequencyRange'] = {
            'lowFrequency': 3550000000,
            'highFrequency': 3555000000
        }

        # Load the device_c2 with registration to SAS UUT
        device_c2 = json.load(
            open(os.path.join('testcases', 'testdata', 'device_b.json')))
        # Get a latitude and longitude within 40 kms from ESC.
        latitude, longitude, _ = vincenty.GeodesicPoint(
            esc_sensor['installationParam']['latitude'],
            esc_sensor['installationParam']['longitude'], 0.1,
            30)  # distance of 0.1 km from ESC at 30 degrees

        device_c2['installationParam']['latitude'] = latitude
        device_c2['installationParam']['longitude'] = longitude

        # Creating conditionals for C2 and C4.
        self.assertEqual(device_c2['cbsdCategory'], 'B')
        conditional_parameters_c2 = {
            'cbsdCategory': device_c2['cbsdCategory'],
            'fccId': device_c2['fccId'],
            'cbsdSerialNumber': device_c2['cbsdSerialNumber'],
            'airInterface': device_c2['airInterface'],
            'installationParam': device_c2['installationParam'],
            'measCapability': device_c2['measCapability']
        }
        del device_c2['cbsdCategory']
        del device_c2['airInterface']
        del device_c2['installationParam']

        # Load grant request for device_c2 to SAS UUT
        grant_g2 = json.load(
            open(os.path.join('testcases', 'testdata', 'grant_0.json')))
        grant_g2['operationParam']['maxEirp'] = 30

        # Load the device_c4 with registration to SAS UUT.
        device_c4 = json.load(
            open(os.path.join('testcases', 'testdata', 'device_d.json')))

        # Move device_c4 in the neighborhood area of the PPA
        device_c4['installationParam']['latitude'] = 38.8363
        device_c4['installationParam']['longitude'] = -97.2642
        device_c4['installationParam']['antennaBeamwidth'] = 0

        # Creating conditionals for Cat B devices.
        self.assertEqual(device_c4['cbsdCategory'], 'B')
        conditional_parameters_c4 = {
            'cbsdCategory': device_c4['cbsdCategory'],
            'fccId': device_c4['fccId'],
            'cbsdSerialNumber': device_c4['cbsdSerialNumber'],
            'airInterface': device_c4['airInterface'],
            'installationParam': device_c4['installationParam'],
            'measCapability': device_c4['measCapability']
        }
        del device_c4['cbsdCategory']
        del device_c4['airInterface']
        del device_c4['installationParam']

        # Load grant request for device_c4 to SAS UUT
        grant_g4 = json.load(
            open(os.path.join('testcases', 'testdata', 'grant_0.json')))
        grant_g4['operationParam']['maxEirp'] = 20

        #Update grant_g4 frequency to overlap with PPA zone frequency for C4 device
        grant_g4['operationParam']['operationFrequencyRange'] = {
            'lowFrequency': 3550000000,
            'highFrequency': 3555000000
        }

        conditionals = {
            'registrationData':
            [conditional_parameters_c2, conditional_parameters_c4]
        }

        cbsd_records = [device_c1, device_c3]
        grant_record_list = [[grant_g1], [grant_g3]]
        ppa_records = [ppa_record_a]

        # Creating CBSD reference IDs of valid format
        cbsd_reference_id1 = generateCbsdReferenceId('test_fcc_id_x',
                                                     'test_serial_number_x')
        cbsd_reference_id2 = generateCbsdReferenceId('test_fcc_id_y',
                                                     'test_serial_number_y')
        cbsd_reference_ids = [[cbsd_reference_id1, cbsd_reference_id2]]

        # SAS test harness configuration
        sas_harness_config = {
            'sasTestHarnessName': 'SAS-TH-1',
            'hostName': getFqdnLocalhost(),
            'port': getUnusedPort(),
            'serverCert': getCertFilename('sas.cert'),
            'serverKey': getCertFilename('sas.key'),
            'caCert': "certs/ca.cert"
        }
        # Generate FAD Records for each record type like cbsd,zone and esc_sensor
        cbsd_fad_records = generateCbsdRecords(cbsd_records, grant_record_list)
        ppa_fad_records = generatePpaRecords(ppa_records, cbsd_reference_ids)
        esc_fad_records = [esc_sensor]

        sas_harness_dump_records = {
            'cbsdRecords': cbsd_fad_records,
            'ppaRecords': ppa_fad_records,
            'escSensorRecords': esc_fad_records
        }
        config = {
            'registrationRequestC2': device_c2,
            'registrationRequestC4': device_c4,
            'conditionalRegistrationData': conditionals,
            'grantRequestG2': grant_g2,
            'grantRequestG4': grant_g4,
            'palRecords': pal_records,
            'sasTestHarnessConfig': sas_harness_config,
            'sasTestHarnessDumpRecords': sas_harness_dump_records
        }
        writeConfig(filename, config)
    def generate_FAD_1_default_config(self, filename):
        """Generates the WinnForum configuration for FAD.1"""
        # Load device info
        device_a = json.load(
            open(os.path.join('testcases', 'testdata', 'device_a.json')))
        device_b = json.load(
            open(os.path.join('testcases', 'testdata', 'device_b.json')))
        device_c = json.load(
            open(os.path.join('testcases', 'testdata', 'device_c.json')))
        # Device #2 is Category B
        # pre-loaded.
        self.assertEqual(device_b['cbsdCategory'], 'B')
        conditionals_b = {
            'cbsdCategory': device_b['cbsdCategory'],
            'fccId': device_b['fccId'],
            'cbsdSerialNumber': device_b['cbsdSerialNumber'],
            'airInterface': device_b['airInterface'],
            'installationParam': device_b['installationParam']
        }
        conditionals = {'registrationData': [conditionals_b]}
        del device_b['cbsdCategory']
        del device_b['airInterface']
        del device_b['installationParam']
        devices = [device_a, device_b, device_c]
        # Grants
        grants = []
        for index in range(len(devices)):
            grants.append(
                json.load(
                    open(os.path.join('testcases', 'testdata',
                                      'grant_0.json'))))
        # PPAs and PALs
        ppas = []
        pals = []
        pal_low_frequency = 3550000000.0
        pal_high_frequency = 3560000000.0
        pal_record = json.load(
            open(os.path.join('testcases', 'testdata', 'pal_record_0.json')))
        ppa_record = json.load(
            open(os.path.join('testcases', 'testdata', 'ppa_record_0.json')))
        ppa, pal = makePpaAndPalRecordsConsistent(ppa_record, [pal_record],
                                                  pal_low_frequency,
                                                  pal_high_frequency,
                                                  device_a['userId'])

        device_a['installationParam']['latitude'], device_a[
            'installationParam']['longitude'] = getRandomLatLongInPolygon(ppa)
        # Devices inside and part of the claimed PPA.
        # Contains the index of devices in the devices list.
        ppas.append({'ppaRecord': ppa, 'ppaClusterList': [0]})
        pals.extend(pal)
        # ESC senosrs
        esc_sensors = []
        esc_sensors.append(
            json.load(
                open(
                    os.path.join('testcases', 'testdata',
                                 'esc_sensor_record_0.json'))))
        # SAS test harness configuration
        sas_test_harness_0_config = {
            'sasTestHarnessName': 'SAS-TH-2',
            'hostName': getFqdnLocalhost(),
            'port': getUnusedPort(),
            'serverCert': getCertFilename('sas.cert'),
            'serverKey': getCertFilename('sas.key'),
            'caCert': "certs/ca.cert"
        }
        sas_test_harness_1_config = {
            'sasTestHarnessName': 'SAS-TH-2',
            'hostName': getFqdnLocalhost(),
            'port': getUnusedPort(),
            'serverCert': getCertFilename('sas_1.cert'),
            'serverKey': getCertFilename('sas_1.key'),
            'caCert': getCertFilename('ca.cert')
        }
        config = {
            'registrationRequests':
            devices,
            'conditionalRegistrationData':
            conditionals,
            'grantRequests':
            grants,
            'ppaRecords':
            ppas,
            'palRecords':
            pals,
            'escSensorRecords':
            esc_sensors,
            'sasTestHarnessConfigs':
            [sas_test_harness_0_config, sas_test_harness_1_config]
        }
        writeConfig(filename, config)
  def generate_PPR_3_default_config(self, filename):
    """High-level description of the default config:

        SAS UUT has devices B, D; all of which have a PAL grant.
        SAS TH has devices A, C, E, all of which have a PAL grant.

        SAS UUT has one PPA, with devices B and D on the cluster list.
        SAS TH has one PPA, with devices A, C, and E on the cluster list.
        The PPAs derive from different but adjacent PALs.

        Both PPAs are on 3620-3630 MHz, as are all grants.
    """
    # Load Devices
    device_a = json.load(
        open(os.path.join('testcases', 'testdata', 'device_a.json')))
    device_a['installationParam']['latitude'] = 38.842176
    device_a['installationParam']['longitude'] = -97.092863
    device_b = json.load(
        open(os.path.join('testcases', 'testdata', 'device_b.json')))
    device_b['installationParam']['latitude'] = 38.845323113
    device_b['installationParam']['longitude'] = -97.15514587
    device_b['installationParam']['antennaBeamwidth'] = 0
    device_b['installationParam']['antennaDowntilt'] = 0
    device_c = json.load(
        open(os.path.join('testcases', 'testdata', 'device_c.json')))
    device_c['installationParam']['latitude'] = 38.816782
    device_c['installationParam']['longitude'] = -97.102965
    device_d = json.load(
        open(os.path.join('testcases', 'testdata', 'device_d.json')))
    device_d['installationParam']['latitude'] = 38.846125
    device_d['installationParam']['longitude'] = -97.156184
    device_d['installationParam']['antennaBeamwidth'] = 0
    device_d['installationParam']['antennaDowntilt'] = 0
    device_e = json.load(
        open(os.path.join('testcases', 'testdata', 'device_e.json')))
    device_e['installationParam']['latitude'] = 38.761748
    device_e['installationParam']['longitude'] = -97.118459

    # Pre-load conditionals and remove REG-conditional fields from registration
    # requests.
    conditional_keys = [
        'cbsdCategory', 'fccId', 'cbsdSerialNumber', 'airInterface',
        'installationParam', 'measCapability'
    ]
    reg_conditional_keys = [
        'cbsdCategory', 'airInterface', 'installationParam', 'measCapability'
    ]
    conditionals_b = {key: device_b[key] for key in conditional_keys}
    device_b = {
        key: device_b[key]
        for key in device_b
        if key not in reg_conditional_keys
    }
    conditionals_d = {key: device_d[key] for key in conditional_keys}
    device_d = {
        key: device_d[key]
        for key in device_d
        if key not in reg_conditional_keys
    }

    # Load grant requests (default is 3620-3630).
    grant_a = json.load(
        open(os.path.join('testcases', 'testdata', 'grant_0.json')))
    grant_b = json.load(
        open(os.path.join('testcases', 'testdata', 'grant_0.json')))
    grant_b['operationParam']['maxEirp'] = 30
    grant_c = json.load(
        open(os.path.join('testcases', 'testdata', 'grant_0.json')))
    grant_d = json.load(
        open(os.path.join('testcases', 'testdata', 'grant_0.json')))
    grant_d['operationParam']['maxEirp'] = 30
    grant_e = json.load(
        open(os.path.join('testcases', 'testdata', 'grant_0.json')))

    # CBSDs in SAS UUT.
    domain_proxy = {
        'registrationRequests': [device_b, device_d],
        'grantRequests': [grant_b, grant_d],
        'conditionalRegistrationData': [conditionals_b, conditionals_d],
        'cert': getCertFilename('domain_proxy.cert'),
        'key': getCertFilename('domain_proxy.key')
    }

    # One PPA in SAS UUT.
    pal_low_frequency = 3620000000
    pal_high_frequency = 3630000000
    pal_record_0 = json.load(
        open(os.path.join('testcases', 'testdata', 'pal_record_0.json')))
    ppa_record_0 = json.load(
        open(os.path.join('testcases', 'testdata', 'ppa_record_0.json')))
    ppa_record_0['zone']['features'][0]['geometry']['coordinates'] = [[[
        -97.155, 38.75
    ], [-97.155, 38.85], [-97.165, 38.85], [-97.165, 38.75], [-97.155, 38.75]]]
    ppa_record_0, pal_records_0 = makePpaAndPalRecordsConsistent(
        ppa_record_0, [pal_record_0], pal_low_frequency, pal_high_frequency,
        'test_user_1')
    device_b['userId'] = 'test_user_1'
    device_d['userId'] = 'test_user_1'
    ppa_cluster_list = [0, 1]

    # One PPA in the peer SAS test harness.
    pal_record_1 = json.load(
        open(os.path.join('testcases', 'testdata', 'pal_record_1.json')))
    pal_record_1['fipsCode'] = 20041084500
    ppa_record_1 = json.load(
        open(os.path.join('testcases', 'testdata', 'ppa_record_1.json')))
    ppa_record_1['zone']['features'][0]['geometry']['coordinates'] = [[[
        -97.145, 38.85
    ], [-97.145, 38.75], [-97.05, 38.75], [-97.05, 38.85], [-97.145, 38.85]]]
    ppa_record_1, pal_records_1 = makePpaAndPalRecordsConsistent(
        ppa_record_1, [pal_record_1], pal_low_frequency, pal_high_frequency,
        'test_user_2')

    # Generate FAD records.
    cbsd_records = [device_a, device_c, device_e]
    # Create CBSD reference IDs.
    cbsd_reference_id_a = generateCbsdReferenceId(device_a['fccId'],
                                                  device_a['cbsdSerialNumber'])
    cbsd_reference_id_c = generateCbsdReferenceId(device_c['fccId'],
                                                  device_c['cbsdSerialNumber'])
    cbsd_reference_id_e = generateCbsdReferenceId(device_e['fccId'],
                                                  device_e['cbsdSerialNumber'])
    cbsd_reference_ids = [[
        cbsd_reference_id_a, cbsd_reference_id_c, cbsd_reference_id_e
    ]]
    grant_record_list = [[grant_a], [grant_c], [grant_e]]
    cbsd_records = generateCbsdRecords(cbsd_records, grant_record_list)
    for cbsd in cbsd_records:
      for grant in cbsd['grants']:
        grant['channelType'] = 'PAL'
    # Create records.
    sas_harness_dump_records = {
        'cbsdRecords': cbsd_records,
        'ppaRecords': generatePpaRecords([ppa_record_1], cbsd_reference_ids),
    }

    # SAS test harness configuration.
    sas_harness_config = {
        'sasTestHarnessName': 'SAS-TH-1',
        'hostName': getFqdnLocalhost(),
        'port': getUnusedPort(),
        'serverCert': getCertFilename('sas.cert'),
        'serverKey': getCertFilename('sas.key'),
        'caCert': 'certs/ca.cert'
    }

    config = {
        'domainProxy':
            domain_proxy,  # Includes registration and grant requests.
        'ppaRecord': ppa_record_0,  # PPA in SAS UUT.
        'ppaClusterList':
            ppa_cluster_list,  # Same format and semantics as SIQ.12.
        'palRecords': [pal_records_0[0],
                       pal_records_1[0]],  # PALs for both PPAs.
        'sasTestHarnessDumpRecords':
            sas_harness_dump_records,  # CBSDs and one PPA.
        'sasTestHarnessConfig':
            sas_harness_config,  # Just the config, no records.
    }
    writeConfig(filename, config)
示例#8
0
    def generate_WDB_1_default_config(self, filename):
        """Generates the WinnForum configuration for WDB.1"""

        # Load devices info
        device_a = json.load(
            open(os.path.join('testcases', 'testdata', 'device_a.json')))
        device_b = json.load(
            open(os.path.join('testcases', 'testdata', 'device_b.json')))

        # Load PAL records
        pal_record_a_0 = json.load(
            open(os.path.join('testcases', 'testdata', 'pal_record_0.json')))
        pal_record_a_1 = json.load(
            open(os.path.join('testcases', 'testdata', 'pal_record_1.json')))
        pal_record_b_0 = json.load(
            open(os.path.join('testcases', 'testdata', 'pal_record_2.json')))

        # FIPS codes of adjacent census tracts
        pal_record_a_0['fipsCode'] = 20063955100
        pal_record_a_1['fipsCode'] = 20063955200

        pal_record_b_0['fipsCode'] = 20195955800

        # Set the PAL frequency.
        pal_low_frequency = 3570000000
        pal_high_frequency = 3580000000

        # Setting the frequency range and user ID(s) 'U' for PAL records.
        pal_records_a = makePalRecordsConsistent(
            [pal_record_a_0, pal_record_a_1], pal_low_frequency,
            pal_high_frequency, device_a['userId'])
        pal_records_b = makePalRecordsConsistent([pal_record_b_0],
                                                 pal_low_frequency,
                                                 pal_high_frequency,
                                                 device_b['userId'])

        # Set the locations of devices to reside with in census tracts.
        device_a['installationParam']['latitude'], device_a[
            'installationParam']['longitude'] = 39.0373, -100.4184
        device_b['installationParam']['latitude'], device_b[
            'installationParam']['longitude'] = 38.9583, -99.9055

        # Getting PAL IDs from pal records
        pal_ids_a = [pal_records_a[0]['palId'], pal_records_a[1]['palId']]
        pal_ids_b = [pal_records_b[0]['palId']]

        # Creating conditionals for Cat B devices
        self.assertEqual(device_b['cbsdCategory'], 'B')
        conditionals_b = {
            'cbsdCategory': device_b['cbsdCategory'],
            'fccId': device_b['fccId'],
            'cbsdSerialNumber': device_b['cbsdSerialNumber'],
            'airInterface': device_b['airInterface'],
            'installationParam': device_b['installationParam'],
            'measCapability': device_b['measCapability']
        }
        del device_b['cbsdCategory']
        del device_b['airInterface']
        del device_b['installationParam']
        del device_b['measCapability']

        conditionals = [conditionals_b]

        pal_db_relative_file_path = os.path.join('testcases', 'testdata',
                                                 'pal_db', 'pal_db.json')

        # Create the PAL database file.
        pal_db_contents = pal_records_a
        pal_db_contents.extend(pal_records_b)
        ensureFileDirectoryExists(pal_db_relative_file_path)
        with open(pal_db_relative_file_path, 'w+') as file_handle:
            file_handle.write(json.dumps(pal_db_contents, indent=2))

        pal_database_config = {
            'hostName': getFqdnLocalhost(),
            'port': getUnusedPort(),
            'fileUrl': '/rest/pal/v1/pal_db.json/pal_db.json',
            'filePath': pal_db_relative_file_path
        }

        # Create the actual configuration file
        config = {
            'palIds': [pal_ids_a, pal_ids_b],
            'registrationRequests': [device_a, device_b],
            'conditionalRegistrationData': conditionals,
            'palDatabaseConfig': pal_database_config
        }
        writeConfig(filename, config)
示例#9
0
    def generate_WDB_2_default_config(self, filename):
        """Generates the WinnForum configuration for WDB.2"""

        # Load category B devices info
        device_b = json.load(
            open(os.path.join('testcases', 'testdata', 'device_b.json')))
        device_d = json.load(
            open(os.path.join('testcases', 'testdata', 'device_d.json')))

        # Device_b and Device_d are of Category B
        self.assertEqual(device_b['cbsdCategory'], 'B')
        self.assertEqual(device_d['cbsdCategory'], 'B')

        # Load CPI users info
        cpi_id_b = 'professional_installer_id_1'
        cpi_name_b = 'b_name'
        cpi_id_d = 'professional_installer_id_2'
        cpi_name_d = 'd_name'

        # Generate CPI keys for device b.
        cpi_private_key_device_b, cpi_public_key_device_b = generateCpiRsaKeys(
        )

        # Generate CPI keys for device d.
        cpi_private_key_device_d, cpi_public_key_device_d = generateCpiRsaKeys(
        )

        # Convert CBSDs registration requests to embed cpiSignatureData
        convertRequestToRequestWithCpiSignature(cpi_private_key_device_b,
                                                cpi_id_b, cpi_name_b, device_b)
        convertRequestToRequestWithCpiSignature(cpi_private_key_device_d,
                                                cpi_id_d, cpi_name_d, device_d)

        cpi_device_b_public_key_relative_file_path = os.path.join(
            'testcases', 'testdata', 'cpi_db', 'CPI_Database-Public_b.txt')

        # Create the pal_db record file consistent with CBSDs and PAL records.
        ensureFileDirectoryExists(cpi_device_b_public_key_relative_file_path)
        with open(cpi_device_b_public_key_relative_file_path,
                  'w+') as file_handle:
            file_handle.write(cpi_public_key_device_b)

        cpi_device_d_public_key_relative_file_path = os.path.join(
            'testcases', 'testdata', 'cpi_db', 'CPI_Database-Public_d.txt')

        # Create the pal_db record file consistent with CBSDs and PAL records.
        ensureFileDirectoryExists(cpi_device_d_public_key_relative_file_path)
        with open(cpi_device_d_public_key_relative_file_path,
                  'w+') as file_handle:
            file_handle.write(cpi_public_key_device_d)

        cpi_database_config = {
            'hostName':
            getFqdnLocalhost(),
            'port':
            getUnusedPort(),
            'cpis': [{
                'cpiId':
                cpi_id_b,
                'status':
                'ACTIVE',
                'publicKeyIdentifierFile':
                cpi_device_b_public_key_relative_file_path
            }, {
                'cpiId':
                cpi_id_d,
                'status':
                'ACTIVE',
                'publicKeyIdentifierFile':
                cpi_device_d_public_key_relative_file_path
            }],
            'indexUrl':
            '/rest/cpi/v1/index.csv',
            'indexPath':
            os.path.join('testcases', 'testdata', 'cpi_db', 'index.csv')
        }

        # Create the actual configuration.
        config = {
            'registrationRequests': [device_b, device_d],
            'cpiDatabaseConfig': cpi_database_config
        }
        writeConfig(filename, config)