def test_backend_service(self):
        """Test backend_service.Key."""
        url_1 = ('https://www.googleapis.com/compute/v1/'
                 'projects/foo/global/backendServices/bar')
        url_2 = ('https://www.googleapis.com/compute/v1/'
                 'projects/foo/regions/bar/backendServices/baz')
        obj_1 = backend_service.BackendService(project_id='foo', name='bar')
        obj_2 = backend_service.BackendService(project_id='foo',
                                               region='bar',
                                               name='baz')
        key_1 = key.Key(backend_service.KEY_OBJECT_KIND, {
            'project_id': 'foo',
            'name': 'bar',
            'region': None
        })
        key_2 = key.Key(backend_service.KEY_OBJECT_KIND, {
            'project_id': 'foo',
            'name': 'baz',
            'region': 'bar'
        })
        self.assertEqual(key_1, obj_1.key)
        self.assertEqual(key_1, backend_service.Key.from_url(url_1))
        self.assertEqual(key_2, obj_2.key)
        self.assertEqual(key_2, backend_service.Key.from_url(url_2))

        url_invalid_1 = ('https://www.googleapis.com/compute/v1/'
                         'projects/foo')
        url_invalid_2 = ('https://www.googleapis.com/compute/v1/'
                         'backendServices/foo')
        self.assertRaises(ValueError, backend_service.Key.from_url,
                          url_invalid_1)
        self.assertRaises(ValueError, backend_service.Key.from_url,
                          url_invalid_2)
    def test_network(self):
        """Test network.Key."""
        url_1 = ('https://www.googleapis.com/compute/v1/'
                 'projects/foo/global/networks/bar')
        url_1a = 'global/networks/bar'
        url_2 = 'projects/blah/global/networks/bar'
        key_1 = key.Key(network.KEY_OBJECT_KIND, {
            'project_id': 'foo',
            'name': 'bar'
        })
        key_2 = key.Key(network.KEY_OBJECT_KIND, {
            'project_id': 'blah',
            'name': 'bar'
        })
        self.assertEqual(key_1, network.Key.from_url(url_1))
        self.assertEqual(key_1, network.Key.from_url(url_1, project_id='blah'))
        self.assertEqual(key_1, network.Key.from_url(url_1a, project_id='foo'))
        self.assertEqual(key_2, network.Key.from_url(url_2, project_id='foo'))

        url_invalid_1 = ('https://www.googleapis.com/compute/v1/'
                         'projects/foo')
        url_invalid_2 = ('https://www.googleapis.com/compute/v1/'
                         'networks/bar')
        self.assertRaises(ValueError, network.Key.from_url, url_invalid_1)
        self.assertRaises(ValueError, network.Key.from_url, url_invalid_2)
    def test_generic(self):
        """Test generic Key functionality."""
        url_1 = ('https://www.googleapis.com/compute/v1/'
                 'projects/foo/global/things/bar')
        url_2 = ('https://www.googleapis.com/compute/v1/'
                 'projects/flub/global/things/bar')
        url_3 = ('https://www.googleapis.com/compute/v1/'
                 'projects/foo/global/things/blah')
        url_4 = ('https://www.googleapis.com/compute/v1/'
                 'projects/foo/scopes/kwyjibo/things/bar')
        key_1 = key.Key('Thing', {
            'project_id': 'foo',
            'scope': None,
            'name': 'bar'
        })
        key_2 = key.Key('Thing', {
            'project_id': 'flub',
            'scope': None,
            'name': 'bar'
        })
        key_3 = key.Key('Thing', {
            'project_id': 'foo',
            'scope': None,
            'name': 'blah'
        })
        key_4 = key.Key('Thing', {
            'project_id': 'foo',
            'scope': 'kwyjibo',
            'name': 'bar'
        })
        path_component_map = {
            'projects': 'project_id',
            'things': 'name',
            'scopes': 'scope'
        }
        from_url = lambda url: key.Key._from_url('Thing', path_component_map,
                                                 url)
        self.assertEqual(key_1, from_url(url_1))
        self.assertEqual(key_2, from_url(url_2))
        self.assertEqual(key_3, from_url(url_3))
        self.assertEqual(key_4, from_url(url_4))
        self.assertNotEqual(key_1, key_2)
        self.assertNotEqual(key_1, key_3)
        self.assertNotEqual(key_1, key_4)

        url_invalid_1 = ('https://www.googleapis.com/compute/v1/' 'xxx/yyy')
        url_invalid_2 = ('https://www.googleapis.com/compute/v1/'
                         'projects/foo/things')
        self.assertRaises(ValueError, from_url, url_invalid_1)
        self.assertRaises(ValueError, from_url, url_invalid_2)
    def test_instance(self):
        """Test instance.Key."""
        url_1 = ('https://www.googleapis.com/compute/v1/'
                 'projects/foo/zones/us-central1-a/instances/bar')
        obj_1 = instance.Instance('bar',
                                  parent=project.Project('foo'),
                                  locations=['us-central1-a'],
                                  name='bar')
        key_1 = key.Key(instance.KEY_OBJECT_KIND, {
            'project_id': 'foo',
            'zone': 'us-central1-a',
            'name': 'bar'
        })
        self.assertEqual(key_1, obj_1.key)
        self.assertEqual(key_1, instance.Key.from_url(url_1))

        url_invalid_1 = ('https://www.googleapis.com/compute/v1/'
                         'zones/bar/instances/baz')
        url_invalid_2 = ('https://www.googleapis.com/compute/v1/'
                         'projects/foo/instances/bar')
        url_invalid_3 = ('https://www.googleapis.com/compute/v1/'
                         'projects/foo/zones/bar')
        self.assertRaises(ValueError, instance.Key.from_url, url_invalid_1)
        self.assertRaises(ValueError, instance.Key.from_url, url_invalid_2)
        self.assertRaises(ValueError, instance.Key.from_url, url_invalid_3)
    def test_instance_group(self):
        """Test instance_group.Key."""
        url_1 = ('https://www.googleapis.com/compute/v1/'
                 'projects/foo/regions/us-central1/instanceGroups/bar')
        url_2 = ('https://www.googleapis.com/compute/v1/'
                 'projects/foo/zones/us-central1-a/instanceGroups/bar')
        obj_1 = instance_group.InstanceGroup(project_id='foo',
                                             region='us-central1',
                                             name='bar')
        obj_2 = instance_group.InstanceGroup(project_id='foo',
                                             zone='us-central1-a',
                                             name='bar')
        key_1 = key.Key(
            instance_group.KEY_OBJECT_KIND, {
                'project_id': 'foo',
                'region': 'us-central1',
                'zone': None,
                'name': 'bar'
            })
        key_2 = key.Key(
            instance_group.KEY_OBJECT_KIND, {
                'project_id': 'foo',
                'region': None,
                'zone': 'us-central1-a',
                'name': 'bar'
            })
        self.assertEqual(key_1, obj_1.key)
        self.assertEqual(key_1, instance_group.Key.from_url(url_1))
        self.assertEqual(key_2, obj_2.key)
        self.assertEqual(key_2, instance_group.Key.from_url(url_2))

        url_invalid_1 = ('https://www.googleapis.com/compute/v1/'
                         'projects/foo/zones/bar')
        url_invalid_2 = ('https://www.googleapis.com/compute/v1/'
                         'zones/bar/instanceGroups/baz')
        url_invalid_3 = ('https://www.googleapis.com/compute/v1/'
                         'projects/foo/instanceGroups/bar')
        url_invalid_4 = ('https://www.googleapis.com/compute/v1/'
                         'projects/foo/zones/a/regions/b/instanceGroups/bar')
        self.assertRaises(ValueError, instance_group.Key.from_url,
                          url_invalid_1)
        self.assertRaises(ValueError, instance_group.Key.from_url,
                          url_invalid_2)
        self.assertRaises(ValueError, instance_group.Key.from_url,
                          url_invalid_3)
        self.assertRaises(ValueError, instance_group.Key.from_url,
                          url_invalid_4)
    def test_instance_template(self):
        """Test instance_template.Key."""
        url_1 = ('https://www.googleapis.com/compute/v1/'
                 'projects/foo/global/instanceTemplates/bar')
        obj_1 = instance_template.InstanceTemplate(project_id='foo',
                                                   name='bar')
        key_1 = key.Key(instance_template.KEY_OBJECT_KIND, {
            'project_id': 'foo',
            'name': 'bar'
        })
        self.assertEqual(key_1, obj_1.key)
        self.assertEqual(key_1, instance_template.Key.from_url(url_1))

        url_invalid_1 = ('https://www.googleapis.com/compute/v1/'
                         'projects/foo')
        url_invalid_2 = ('https://www.googleapis.com/compute/v1/'
                         'instanceTemplates/bar')
        self.assertRaises(ValueError, instance_template.Key.from_url,
                          url_invalid_1)
        self.assertRaises(ValueError, instance_template.Key.from_url,
                          url_invalid_2)