@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
at recaptime-dev/main 56 lines 1.7 kB view raw
1<?php 2 3final class DiffusionMercurialWireSSHTestCase extends PhabricatorTestCase { 4 5 public function testMercurialClientWireProtocolParser() { 6 $data = dirname(__FILE__).'/hgwiredata/'; 7 $dir = Filesystem::listDirectory($data, $include_hidden = false); 8 foreach ($dir as $file) { 9 $raw = Filesystem::readFile($data.$file); 10 $raw = explode("\n~~~~~~~~~~\n", $raw, 2); 11 $this->assertEqual(2, count($raw)); 12 $expect = phutil_json_decode($raw[1]); 13 $this->assertTrue(is_array($expect), $file); 14 15 $this->assertParserResult($expect, $raw[0], $file); 16 } 17 } 18 19 private function assertParserResult(array $expect, $input, $file) { 20 list($x, $y) = PhutilSocketChannel::newChannelPair(); 21 $xp = new DiffusionMercurialWireClientSSHProtocolChannel($x); 22 23 $y->write($input); 24 $y->flush(); 25 $y->closeWriteChannel(); 26 27 $messages = array(); 28 for ($ii = 0; $ii < count($expect); $ii++) { 29 try { 30 $messages[] = $xp->waitForMessage(); 31 } catch (Exception $ex) { 32 // This is probably the parser not producing as many messages as 33 // we expect. Log the exception, but continue to the assertion below 34 // since that will often be easier to diagnose. 35 phlog($ex); 36 break; 37 } 38 } 39 40 $this->assertEqual($expect, $messages, $file); 41 42 // Now, make sure the channel doesn't have *more* messages than we expect. 43 // Specifically, it should throw when we try to read another message. 44 $caught = null; 45 try { 46 $xp->waitForMessage(); 47 } catch (Exception $ex) { 48 $caught = $ex; 49 } 50 51 $this->assertTrue( 52 ($caught instanceof Exception), 53 pht("No extra messages for '%s'.", $file)); 54 } 55 56}