| Index: client/libs/logdog/tests/stream_test.py | 
| diff --git a/client/libs/logdog/tests/stream_test.py b/client/libs/logdog/tests/stream_test.py | 
| index 98cbbdacb971f7362546eb45df12b4afdefe2f44..008379f8c318fee52d8f1fdb7524c07b43ea1092 100755 | 
| --- a/client/libs/logdog/tests/stream_test.py | 
| +++ b/client/libs/logdog/tests/stream_test.py | 
| @@ -14,7 +14,7 @@ ROOT_DIR = os.path.dirname(os.path.abspath(os.path.join( | 
| os.pardir, os.pardir, os.pardir))) | 
| sys.path.insert(0, ROOT_DIR) | 
|  | 
| -from libs.logdog import stream, varint | 
| +from libs.logdog import stream, streamname, varint | 
|  | 
|  | 
| class StreamParamsTestCase(unittest.TestCase): | 
| @@ -93,14 +93,14 @@ class StreamClientTestCase(unittest.TestCase): | 
| return json.loads(header), data.read() | 
|  | 
| class _TestStreamClient(stream.StreamClient): | 
| -    def __init__(self, value): | 
| -      super(StreamClientTestCase._TestStreamClient, self).__init__() | 
| +    def __init__(self, value, **kwargs): | 
| +      super(StreamClientTestCase._TestStreamClient, self).__init__(**kwargs) | 
| self.value = value | 
| self.last_conn = None | 
|  | 
| @classmethod | 
| -    def _create(cls, value): | 
| -      return cls(value) | 
| +    def _create(cls, value, **kwargs): | 
| +      return cls(value, **kwargs) | 
|  | 
| def _connect_raw(self): | 
| conn = StreamClientTestCase._TestStreamClientConnection() | 
| @@ -128,8 +128,17 @@ class StreamClientTestCase(unittest.TestCase): | 
| self.assertEqual(client.value, 'value') | 
|  | 
| def testTextStream(self): | 
| -    client = self._registry.create('test:value') | 
| +    client = self._registry.create('test:value', | 
| +                                   project='test', | 
| +                                   prefix='foo/bar', | 
| +                                   coordinator_host='example.appspot.com') | 
| with client.text('mystream') as fd: | 
| +      self.assertEqual( | 
| +          fd.path, | 
| +          streamname.StreamPath(prefix='foo/bar', name='mystream')) | 
| +      self.assertEqual( | 
| +          fd.get_viewer_url(), | 
| +          'https://example.appspot.com/v/?s=test%2Ffoo%2Fbar%2F%2B%2Fmystream') | 
| fd.write('text\nstream\nlines') | 
|  | 
| conn = client.last_conn | 
| @@ -144,6 +153,14 @@ class StreamClientTestCase(unittest.TestCase): | 
| with client.text('mystream', content_type='foo/bar', | 
| tee=stream.StreamParams.TEE_STDOUT, | 
| tags={'foo': 'bar', 'baz': 'qux'}) as fd: | 
| +      self.assertEqual( | 
| +          fd.params, | 
| +          stream.StreamParams.make( | 
| +              name='mystream', | 
| +              type=stream.StreamParams.TEXT, | 
| +              content_type='foo/bar', | 
| +              tee=stream.StreamParams.TEE_STDOUT, | 
| +              tags={'foo': 'bar', 'baz': 'qux'})) | 
| fd.write('text!') | 
|  | 
| conn = client.last_conn | 
| @@ -160,8 +177,17 @@ class StreamClientTestCase(unittest.TestCase): | 
| self.assertEqual(data, 'text!') | 
|  | 
| def testBinaryStream(self): | 
| -    client = self._registry.create('test:value') | 
| +    client = self._registry.create('test:value', | 
| +                                   project='test', | 
| +                                   prefix='foo/bar', | 
| +                                   coordinator_host='example.appspot.com') | 
| with client.binary('mystream') as fd: | 
| +      self.assertEqual( | 
| +          fd.path, | 
| +          streamname.StreamPath(prefix='foo/bar', name='mystream')) | 
| +      self.assertEqual( | 
| +          fd.get_viewer_url(), | 
| +          'https://example.appspot.com/v/?s=test%2Ffoo%2Fbar%2F%2B%2Fmystream') | 
| fd.write('\x60\x0d\xd0\x65') | 
|  | 
| conn = client.last_conn | 
| @@ -172,8 +198,17 @@ class StreamClientTestCase(unittest.TestCase): | 
| self.assertEqual(data, '\x60\x0d\xd0\x65') | 
|  | 
| def testDatagramStream(self): | 
| -    client = self._registry.create('test:value') | 
| +    client = self._registry.create('test:value', | 
| +                                   project='test', | 
| +                                   prefix='foo/bar', | 
| +                                   coordinator_host='example.appspot.com') | 
| with client.datagram('mystream') as fd: | 
| +      self.assertEqual( | 
| +          fd.path, | 
| +          streamname.StreamPath(prefix='foo/bar', name='mystream')) | 
| +      self.assertEqual( | 
| +          fd.get_viewer_url(), | 
| +          'https://example.appspot.com/v/?s=test%2Ffoo%2Fbar%2F%2B%2Fmystream') | 
| fd.send('datagram0') | 
| fd.send('dg1') | 
| fd.send('') | 
| @@ -187,6 +222,35 @@ class StreamClientTestCase(unittest.TestCase): | 
| self.assertEqual(list(self._split_datagrams(data)), | 
| ['datagram0', 'dg1', '', 'dg3']) | 
|  | 
| +  def testStreamWithoutPrefixCannotGenerateUrls(self): | 
| +    client = self._registry.create('test:value', | 
| +                                   coordinator_host='example.appspot.com') | 
| +    with client.text('mystream') as fd: | 
| +      self.assertRaises(KeyError, fd.get_viewer_url) | 
| + | 
| +  def testStreamWithoutInvalidPrefixCannotGenerateUrls(self): | 
| +    client = self._registry.create('test:value', | 
| +                                   project='test', | 
| +                                   prefix='!!! invalid !!!', | 
| +                                   coordinator_host='example.appspot.com') | 
| +    with client.text('mystream') as fd: | 
| +      self.assertRaises(ValueError, fd.get_viewer_url) | 
| + | 
| +  def testStreamWithoutProjectCannotGenerateUrls(self): | 
| +    client = self._registry.create('test:value', | 
| +                                   prefix='foo/bar', | 
| +                                   coordinator_host='example.appspot.com') | 
| +    with client.text('mystream') as fd: | 
| +      self.assertRaises(KeyError, fd.get_viewer_url) | 
| + | 
| +  def testStreamWithoutCoordinatorHostCannotGenerateUrls(self): | 
| +    client = self._registry.create('test:value', | 
| +                                   project='test', | 
| +                                   prefix='foo/bar') | 
| +    with client.text('mystream') as fd: | 
| +      self.assertRaises(KeyError, fd.get_viewer_url) | 
| + | 
| + | 
| def testCreatingDuplicateStreamNameRaisesValueError(self): | 
| client = self._registry.create('test:value') | 
| with client.text('mystream') as fd: | 
|  |