Ejemplo n.º 1
0
 def test_server_capabilities_network_failure(self):
     self.mock(isolateserver.net, 'url_open',
               lambda *_args, **_kwargs: None)
     with self.assertRaises(isolateserver.MappingError):
         storage = isolateserver.IsolateServer('http://example.com',
                                               'default')
         _ = storage._server_capabilities
Ejemplo n.º 2
0
 def test_push_failure_finalize(self):
     server = 'http://example.com'
     namespace = 'default'
     token = 'fake token'
     data = ''.join(str(x) for x in xrange(1000))
     item = FakeItem(data)
     push_urls = (server + '/push_here', server + '/call_this')
     contains_request = [{'h': item.digest, 's': item.size, 'i': 0}]
     contains_response = [push_urls]
     self._requests = [
         self.mock_handshake_request(server, token),
         self.mock_contains_request(server, namespace, token,
                                    contains_request, contains_response),
         (push_urls[0], {
             'data': data,
             'content_type': 'application/octet-stream',
             'method': 'PUT',
         }, ''),
         (push_urls[1], {
             'data': '',
             'content_type': 'application/json',
             'method': 'POST',
         }, None),
     ]
     storage = isolateserver.IsolateServer(server, namespace)
     missing = storage.contains([item])
     self.assertEqual([item], missing)
     with self.assertRaises(IOError):
         storage.push(item, [data])
     self.assertTrue(item.push_state.uploaded)
     self.assertFalse(item.push_state.finalized)
Ejemplo n.º 3
0
 def test_push_failure_upload(self):
   server = 'http://example.com'
   namespace = 'default'
   data = ''.join(str(x) for x in xrange(1000))
   item = FakeItem(data)
   contains_request = {'items': [
       {'digest': item.digest, 'size': item.size, 'is_isolated': 0}]}
   contains_response = {'items': [{'index': 0, 'upload_ticket': 'ticket!'}]}
   requests = [
     self.mock_contains_request(
         server, namespace, contains_request, contains_response),
     self.mock_upload_request(
         server,
         base64.b64encode(data),
         contains_response['items'][0]['upload_ticket'],
     ),
   ]
   self.expected_requests(requests)
   storage = isolateserver.IsolateServer(server, namespace)
   missing = storage.contains([item])
   self.assertEqual([item], missing.keys())
   push_state = missing[item]
   with self.assertRaises(IOError):
     storage.push(item, push_state, [data])
   self.assertFalse(push_state.uploaded)
   self.assertFalse(push_state.finalized)
Ejemplo n.º 4
0
    def test_fetch_offset_bad_header(self):
        server = 'http://example.com'
        namespace = 'default'
        data = ''.join(str(x) for x in xrange(1000))
        item = ALGO(data).hexdigest()
        offset = 200
        size = len(data)

        bad_content_range_headers = [
            # Missing header.
            None,
            '',
            # Bad format.
            'not bytes %d-%d/%d' % (offset, size - 1, size),
            'bytes %d-%d' % (offset, size - 1),
            # Bad offset.
            'bytes %d-%d/%d' % (offset - 1, size - 1, size),
            # Incomplete chunk.
            'bytes %d-%d/%d' % (offset, offset + 10, size),
        ]

        for content_range_header in bad_content_range_headers:
            self._requests = [
                self.mock_fetch_request(
                    server,
                    namespace,
                    item,
                    data[offset:],
                    request_headers={'Range': 'bytes=%d-' % offset},
                    response_headers={'Content-Range': content_range_header}),
            ]
            storage = isolateserver.IsolateServer(server, namespace)
            with self.assertRaises(IOError):
                _ = ''.join(storage.fetch(item, offset))
Ejemplo n.º 5
0
    def test_fetch_offset_success(self):
        server = 'http://example.com'
        namespace = 'default'
        data = ''.join(str(x) for x in xrange(1000))
        item = ALGO(data).hexdigest()
        offset = 200
        size = len(data)

        good_content_range_headers = [
            'bytes %d-%d/%d' % (offset, size - 1, size),
            'bytes %d-%d/*' % (offset, size - 1),
        ]

        for content_range_header in good_content_range_headers:
            self._requests = [
                self.mock_fetch_request(
                    server,
                    namespace,
                    item,
                    data[offset:],
                    request_headers={'Range': 'bytes=%d-' % offset},
                    response_headers={'Content-Range': content_range_header}),
            ]
            storage = isolateserver.IsolateServer(server, namespace)
            fetched = ''.join(storage.fetch(item, offset))
            self.assertEqual(data[offset:], fetched)
Ejemplo n.º 6
0
 def test_contains_success(self):
   server = 'http://example.com'
   namespace = 'default'
   files = [
     FakeItem('1', high_priority=True),
     FakeItem('2' * 100),
     FakeItem('3' * 200),
   ]
   request = {'items': [
       {'digest': f.digest, 'is_isolated': not i, 'size': f.size}
       for i, f in enumerate(files)]}
   response = {
       'items': [
           {'index': str(i), 'upload_ticket': 'ticket_%d' % i}
           for i in xrange(3)],
   }
   missing = [
       files[0],
       files[1],
       files[2],
   ]
   self._requests = [
     self.mock_contains_request(server, namespace, request, response),
   ]
   storage = isolateserver.IsolateServer(server, namespace)
   result = storage.contains(files)
   self.assertEqual(set(missing), set(result.keys()))
   for i, (_item, push_state) in enumerate(result.iteritems()):
     self.assertEqual(
         push_state.upload_url, '_ah/api/isolateservice/v1/store_inline')
     self.assertEqual(push_state.finalize_url, None)
Ejemplo n.º 7
0
 def test_server_capabilities_success(self):
     server = 'http://example.com'
     namespace = 'default'
     self.expected_requests([self.mock_server_details_request(server)])
     storage = isolateserver.IsolateServer(server, namespace)
     caps = storage._server_capabilities
     self.assertEqual({'server_version': 'such a good version'}, caps)
Ejemplo n.º 8
0
 def test_contains_format_failure(self):
   server = 'http://example.com'
   namespace = 'default'
   self.expected_requests([self.mock_contains_request(
       server, namespace, {'items': []}, None)])
   storage = isolateserver.IsolateServer(server, namespace)
   with self.assertRaises(isolated_format.MappingError):
     storage.contains([])
Ejemplo n.º 9
0
 def test_fetch_failure(self):
     server = 'http://example.com'
     namespace = 'default'
     item = isolateserver_mock.hash_content('something')
     self.expected_requests(
         [self.mock_fetch_request(server, namespace, item)[:-1] + (None, )])
     storage = isolateserver.IsolateServer(server, namespace)
     with self.assertRaises(IOError):
         _ = ''.join(storage.fetch(item))
Ejemplo n.º 10
0
 def test_fetch_failure(self):
     server = 'http://example.com'
     namespace = 'default'
     item = ALGO('something').hexdigest()
     self._requests = [
         self.mock_fetch_request(server, namespace, item, None),
     ]
     storage = isolateserver.IsolateServer(server, namespace)
     with self.assertRaises(IOError):
         _ = ''.join(storage.fetch(item))
Ejemplo n.º 11
0
 def test_server_capabilities_respects_error(self):
     server = 'http://example.com'
     namespace = 'default'
     error = 'Im sorry, Dave. Im afraid I cant do that.'
     self._requests = [self.mock_handshake_request(server, error=error)]
     storage = isolateserver.IsolateServer(server, namespace)
     with self.assertRaises(isolateserver.MappingError) as context:
         _ = storage._server_capabilities
     # Server error message should be reported to user.
     self.assertIn(error, str(context.exception))
Ejemplo n.º 12
0
 def test_fetch_success(self):
     server = 'http://example.com'
     namespace = 'default'
     data = ''.join(str(x) for x in xrange(1000))
     item = isolateserver_mock.hash_content(data)
     self.expected_requests(
         [self.mock_fetch_request(server, namespace, item, data)])
     storage = isolateserver.IsolateServer(server, namespace)
     fetched = ''.join(storage.fetch(item))
     self.assertEqual(data, fetched)
Ejemplo n.º 13
0
 def test_server_capabilities_success(self):
     server = 'http://example.com'
     namespace = 'default'
     access_token = 'fake token'
     self._requests = [
         self.mock_handshake_request(server, access_token),
     ]
     storage = isolateserver.IsolateServer(server, namespace)
     caps = storage._server_capabilities
     self.assertEqual(access_token, caps['access_token'])
Ejemplo n.º 14
0
 def test_server_capabilities_format_failure(self):
     server = 'http://example.com'
     namespace = 'default'
     handshake_req = self.mock_handshake_request(server)
     self._requests = [
         (handshake_req[0], handshake_req[1], 'Im a bad response'),
     ]
     storage = isolateserver.IsolateServer(server, namespace)
     with self.assertRaises(isolateserver.MappingError):
         _ = storage._server_capabilities
Ejemplo n.º 15
0
 def test_contains_format_failure(self):
     server = 'http://example.com'
     namespace = 'default'
     token = 'fake token'
     self._requests = [
         self.mock_handshake_request(server, token),
         self.mock_contains_request(server, namespace, token, [], [1, 2, 3])
     ]
     storage = isolateserver.IsolateServer(server, namespace)
     with self.assertRaises(isolateserver.MappingError):
         storage.contains([])
Ejemplo n.º 16
0
 def test_fetch_success(self):
     server = 'http://example.com'
     namespace = 'default'
     data = ''.join(str(x) for x in xrange(1000))
     item = ALGO(data).hexdigest()
     self._requests = [
         self.mock_fetch_request(server, namespace, item, data),
     ]
     storage = isolateserver.IsolateServer(server, namespace)
     fetched = ''.join(storage.fetch(item))
     self.assertEqual(data, fetched)
Ejemplo n.º 17
0
 def test_contains_network_failure(self):
     server = 'http://example.com'
     namespace = 'default'
     token = 'fake token'
     req = self.mock_contains_request(server, namespace, token, [], [])
     self._requests = [
         self.mock_handshake_request(server, token),
         (req[0], req[1], None),
     ]
     storage = isolateserver.IsolateServer(server, namespace)
     with self.assertRaises(isolateserver.MappingError):
         storage.contains([])
Ejemplo n.º 18
0
 def test_push_failure_finalize(self):
     server = 'http://example.com'
     namespace = 'default'
     data = ''.join(str(x) for x in xrange(1000))
     item = FakeItem(data)
     contains_request = {
         'items': [{
             'digest': item.digest,
             'size': item.size,
             'is_isolated': 0
         }]
     }
     contains_response = {
         'items': [{
             'index': 0,
             'gs_upload_url': server + '/content-gs/whatevs/1234',
             'upload_ticket': 'ticket!'
         }]
     }
     requests = [
         self.mock_contains_request(server, namespace, contains_request,
                                    contains_response),
         (
             server + '/content-gs/whatevs/1234',
             {
                 'data': data,
                 'content_type': 'application/octet-stream',
                 'method': 'PUT',
             },
             '',
             None,
         ),
         (
             server + '/_ah/api/isolateservice/v1/finalize_gs_upload',
             {
                 'data': {
                     'upload_ticket': 'ticket!'
                 }
             },
             None,
         ),
     ]
     self.expected_requests(requests)
     storage = isolateserver.IsolateServer(server, namespace)
     missing = storage.contains([item])
     self.assertEqual([item], missing.keys())
     push_state = missing[item]
     with self.assertRaises(IOError):
         storage.push(item, push_state, [data])
     self.assertTrue(push_state.uploaded)
     self.assertFalse(push_state.finalized)
Ejemplo n.º 19
0
 def test_contains_success(self):
     server = 'http://example.com'
     namespace = 'default'
     token = 'fake token'
     files = [
         FakeItem('1', is_isolated=True),
         FakeItem('2' * 100),
         FakeItem('3' * 200),
     ]
     request = [
         {
             'h': files[0].digest,
             's': files[0].size,
             'i': 1
         },
         {
             'h': files[1].digest,
             's': files[1].size,
             'i': 0
         },
         {
             'h': files[2].digest,
             's': files[2].size,
             'i': 0
         },
     ]
     response = [
         None,
         ['http://example/upload_here_1', None],
         ['http://example/upload_here_2', 'http://example/call_this'],
     ]
     missing = [
         files[1],
         files[2],
     ]
     self._requests = [
         self.mock_handshake_request(server, token),
         self.mock_contains_request(server, namespace, token, request,
                                    response),
     ]
     storage = isolateserver.IsolateServer(server, namespace)
     result = storage.contains(files)
     self.assertEqual(missing, result)
     self.assertEqual([x for x in response if x],
                      [[i.push_state.upload_url, i.push_state.finalize_url]
                       for i in missing])
Ejemplo n.º 20
0
  def test_fetch_offset_success(self):
    server = 'http://example.com'
    namespace = 'default'
    data = ''.join(str(x) for x in xrange(1000))
    item = isolateserver_mock.hash_content(data)
    offset = 200
    size = len(data)

    good_content_range_headers = [
      'bytes %d-%d/%d' % (offset, size - 1, size),
      'bytes %d-%d/*' % (offset, size - 1),
    ]

    for _content_range_header in good_content_range_headers:
      self.expected_requests([self.mock_fetch_request(
          server, namespace, item, data, offset=offset)])
      storage = isolateserver.IsolateServer(server, namespace)
      fetched = ''.join(storage.fetch(item, offset))
      self.assertEqual(data[offset:], fetched)