tests/test-http-api.t
changeset 37046 1cfef5693203
child 37093 db114320df7e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-http-api.t	Tue Mar 13 16:53:21 2018 -0700
@@ -0,0 +1,201 @@
+  $ send() {
+  >   hg --verbose debugwireproto --peer raw http://$LOCALIP:$HGPORT/
+  > }
+
+  $ hg init server
+  $ hg -R server serve -p $HGPORT -d --pid-file hg.pid
+  $ cat hg.pid > $DAEMON_PIDS
+
+Request to /api fails unless web.apiserver is enabled
+
+  $ send << EOF
+  > httprequest GET api
+  >     user-agent: test
+  > EOF
+  using raw connection to peer
+  s>     GET /api HTTP/1.1\r\n
+  s>     Accept-Encoding: identity\r\n
+  s>     user-agent: test\r\n
+  s>     host: $LOCALIP:$HGPORT\r\n (glob)
+  s>     \r\n
+  s> makefile('rb', None)
+  s>     HTTP/1.1 404 Not Found\r\n
+  s>     Server: testing stub value\r\n
+  s>     Date: $HTTP_DATE$\r\n
+  s>     Content-Type: text/plain\r\n
+  s>     Content-Length: 44\r\n
+  s>     \r\n
+  s>     Experimental API server endpoint not enabled
+
+  $ send << EOF
+  > httprequest GET api/
+  >     user-agent: test
+  > EOF
+  using raw connection to peer
+  s>     GET /api/ HTTP/1.1\r\n
+  s>     Accept-Encoding: identity\r\n
+  s>     user-agent: test\r\n
+  s>     host: $LOCALIP:$HGPORT\r\n (glob)
+  s>     \r\n
+  s> makefile('rb', None)
+  s>     HTTP/1.1 404 Not Found\r\n
+  s>     Server: testing stub value\r\n
+  s>     Date: $HTTP_DATE$\r\n
+  s>     Content-Type: text/plain\r\n
+  s>     Content-Length: 44\r\n
+  s>     \r\n
+  s>     Experimental API server endpoint not enabled
+
+Restart server with support for API server
+
+  $ killdaemons.py
+  $ cat > server/.hg/hgrc << EOF
+  > [experimental]
+  > web.apiserver = true
+  > EOF
+
+  $ hg -R server serve -p $HGPORT -d --pid-file hg.pid
+  $ cat hg.pid > $DAEMON_PIDS
+
+/api lists available APIs (empty since none are available by default)
+
+  $ send << EOF
+  > httprequest GET api
+  >     user-agent: test
+  > EOF
+  using raw connection to peer
+  s>     GET /api HTTP/1.1\r\n
+  s>     Accept-Encoding: identity\r\n
+  s>     user-agent: test\r\n
+  s>     host: $LOCALIP:$HGPORT\r\n (glob)
+  s>     \r\n
+  s> makefile('rb', None)
+  s>     HTTP/1.1 200 OK\r\n
+  s>     Server: testing stub value\r\n
+  s>     Date: $HTTP_DATE$\r\n
+  s>     Content-Type: text/plain\r\n
+  s>     Content-Length: 100\r\n
+  s>     \r\n
+  s>     APIs can be accessed at /api/<name>, where <name> can be one of the following:\n
+  s>     \n
+  s>     (no available APIs)\n
+
+  $ send << EOF
+  > httprequest GET api/
+  >     user-agent: test
+  > EOF
+  using raw connection to peer
+  s>     GET /api/ HTTP/1.1\r\n
+  s>     Accept-Encoding: identity\r\n
+  s>     user-agent: test\r\n
+  s>     host: $LOCALIP:$HGPORT\r\n (glob)
+  s>     \r\n
+  s> makefile('rb', None)
+  s>     HTTP/1.1 200 OK\r\n
+  s>     Server: testing stub value\r\n
+  s>     Date: $HTTP_DATE$\r\n
+  s>     Content-Type: text/plain\r\n
+  s>     Content-Length: 100\r\n
+  s>     \r\n
+  s>     APIs can be accessed at /api/<name>, where <name> can be one of the following:\n
+  s>     \n
+  s>     (no available APIs)\n
+
+Accessing an unknown API yields a 404
+
+  $ send << EOF
+  > httprequest GET api/unknown
+  >     user-agent: test
+  > EOF
+  using raw connection to peer
+  s>     GET /api/unknown HTTP/1.1\r\n
+  s>     Accept-Encoding: identity\r\n
+  s>     user-agent: test\r\n
+  s>     host: $LOCALIP:$HGPORT\r\n (glob)
+  s>     \r\n
+  s> makefile('rb', None)
+  s>     HTTP/1.1 404 Not Found\r\n
+  s>     Server: testing stub value\r\n
+  s>     Date: $HTTP_DATE$\r\n
+  s>     Content-Type: text/plain\r\n
+  s>     Content-Length: 33\r\n
+  s>     \r\n
+  s>     Unknown API: unknown\n
+  s>     Known APIs: 
+
+Accessing a known but not enabled API yields a different error
+
+  $ send << EOF
+  > httprequest GET api/exp-http-v2-0001
+  >     user-agent: test
+  > EOF
+  using raw connection to peer
+  s>     GET /api/exp-http-v2-0001 HTTP/1.1\r\n
+  s>     Accept-Encoding: identity\r\n
+  s>     user-agent: test\r\n
+  s>     host: $LOCALIP:$HGPORT\r\n (glob)
+  s>     \r\n
+  s> makefile('rb', None)
+  s>     HTTP/1.1 404 Not Found\r\n
+  s>     Server: testing stub value\r\n
+  s>     Date: $HTTP_DATE$\r\n
+  s>     Content-Type: text/plain\r\n
+  s>     Content-Length: 33\r\n
+  s>     \r\n
+  s>     API exp-http-v2-0001 not enabled\n
+
+Restart server with support for HTTP v2 API
+
+  $ killdaemons.py
+  $ cat > server/.hg/hgrc << EOF
+  > [experimental]
+  > web.apiserver = true
+  > web.api.http-v2 = true
+  > EOF
+
+  $ hg -R server serve -p $HGPORT -d --pid-file hg.pid
+  $ cat hg.pid > $DAEMON_PIDS
+
+/api lists the HTTP v2 protocol as available
+
+  $ send << EOF
+  > httprequest GET api
+  >     user-agent: test
+  > EOF
+  using raw connection to peer
+  s>     GET /api HTTP/1.1\r\n
+  s>     Accept-Encoding: identity\r\n
+  s>     user-agent: test\r\n
+  s>     host: $LOCALIP:$HGPORT\r\n (glob)
+  s>     \r\n
+  s> makefile('rb', None)
+  s>     HTTP/1.1 200 OK\r\n
+  s>     Server: testing stub value\r\n
+  s>     Date: $HTTP_DATE$\r\n
+  s>     Content-Type: text/plain\r\n
+  s>     Content-Length: 96\r\n
+  s>     \r\n
+  s>     APIs can be accessed at /api/<name>, where <name> can be one of the following:\n
+  s>     \n
+  s>     exp-http-v2-0001
+
+  $ send << EOF
+  > httprequest GET api/
+  >     user-agent: test
+  > EOF
+  using raw connection to peer
+  s>     GET /api/ HTTP/1.1\r\n
+  s>     Accept-Encoding: identity\r\n
+  s>     user-agent: test\r\n
+  s>     host: $LOCALIP:$HGPORT\r\n (glob)
+  s>     \r\n
+  s> makefile('rb', None)
+  s>     HTTP/1.1 200 OK\r\n
+  s>     Server: testing stub value\r\n
+  s>     Date: $HTTP_DATE$\r\n
+  s>     Content-Type: text/plain\r\n
+  s>     Content-Length: 96\r\n
+  s>     \r\n
+  s>     APIs can be accessed at /api/<name>, where <name> can be one of the following:\n
+  s>     \n
+  s>     exp-http-v2-0001