| Index: client/libs/logdog/tests/streamname_test.py
 | 
| diff --git a/client/libs/logdog/tests/streamname_test.py b/client/libs/logdog/tests/streamname_test.py
 | 
| index c84292a6554a30417868d8ed57089a6afd84c422..25adfb6b9e024773fc23cf2616d544ad52d22178 100755
 | 
| --- a/client/libs/logdog/tests/streamname_test.py
 | 
| +++ b/client/libs/logdog/tests/streamname_test.py
 | 
| @@ -62,5 +62,59 @@ class StreamNameTestCase(unittest.TestCase):
 | 
|      self.assertRaises(ValueError, streamname.normalize, '_invalid_start_char')
 | 
|  
 | 
|  
 | 
| +class StreamPathTestCase(unittest.TestCase):
 | 
| +
 | 
| +  def testParseValidPath(self):
 | 
| +    for path in (
 | 
| +        'foo/+/bar',
 | 
| +        'foo/bar/+/baz',
 | 
| +    ):
 | 
| +      prefix, name = path.split('/+/')
 | 
| +      parsed = streamname.StreamPath.parse(path)
 | 
| +      self.assertEqual(
 | 
| +          parsed,
 | 
| +          streamname.StreamPath(prefix=prefix, name=name))
 | 
| +      self.assertEqual(str(parsed), path)
 | 
| +
 | 
| +  def testParseInvalidValidPathRaisesValueError(self):
 | 
| +    for path in (
 | 
| +        '',
 | 
| +        'foo/+',
 | 
| +        'foo/+/',
 | 
| +        '+/bar',
 | 
| +        '/+/bar',
 | 
| +        'foo/bar',
 | 
| +        '!!!invalid!!!/+/bar',
 | 
| +        'foo/+/!!!invalid!!!',
 | 
| +    ):
 | 
| +      with self.assertRaises(ValueError):
 | 
| +        streamname.StreamPath.parse(path)
 | 
| +
 | 
| +  def testLogDogViewerUrl(self):
 | 
| +    for project, path, url in (
 | 
| +        ('test', streamname.StreamPath(prefix='foo', name='bar/baz'),
 | 
| +         'https://example.appspot.com/v/?s=test%2Ffoo%2F%2B%2Fbar%2Fbaz'),
 | 
| +
 | 
| +        ('test', streamname.StreamPath(prefix='foo', name='bar/**'),
 | 
| +         'https://example.appspot.com/v/?s=test%2Ffoo%2F%2B%2Fbar%2F%2A%2A'),
 | 
| +
 | 
| +        ('test', streamname.StreamPath(prefix='**', name='**'),
 | 
| +         'https://example.appspot.com/v/?s=test%2F%2A%2A%2F%2B%2F%2A%2A'),
 | 
| +    ):
 | 
| +      self.assertEqual(
 | 
| +          streamname.get_logdog_viewer_url('example.appspot.com', project,
 | 
| +                                           path),
 | 
| +          url)
 | 
| +
 | 
| +    # Multiple streams.
 | 
| +    self.assertEqual(
 | 
| +        streamname.get_logdog_viewer_url('example.appspot.com', 'test',
 | 
| +            streamname.StreamPath(prefix='foo', name='bar/baz'),
 | 
| +            streamname.StreamPath(prefix='qux', name='**'),
 | 
| +        ),
 | 
| +        ('https://example.appspot.com/v/?s=test%2Ffoo%2F%2B%2Fbar%2Fbaz&'
 | 
| +         's=test%2Fqux%2F%2B%2F%2A%2A'))
 | 
| +
 | 
| +
 | 
|  if __name__ == '__main__':
 | 
|    unittest.main()
 | 
| 
 |