>From 9145f6044a75b45807a1c2b9e1703da73d5ddf59 Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Thu, 7 Jan 2021 01:10:49 -0800 Subject: [PATCH 1/2] Drop me: add test for SOCKS5 auth protocol --- test/lisp/net/socks-tests.el | 87 ++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 test/lisp/net/socks-tests.el diff --git a/test/lisp/net/socks-tests.el b/test/lisp/net/socks-tests.el new file mode 100644 index 00000000000..94ba49ab487 --- /dev/null +++ b/test/lisp/net/socks-tests.el @@ -0,0 +1,87 @@ +;;; socks-tests.el --- tests for SOCKS -*- coding: utf-8; lexical-binding: t; -*- + +;;; Commentary: + +;; | (let ((default-directory (expand-file-name "../.."))) +;; | (compile "make lisp/net/socks-tests.log")) + +;;; Code: + +(require 'socks) +(require 'url-http) + +;; This ran successfully against curl 7.71 with the following options: +;; $ curl --verbose -U foo:bar --proxy socks5h://127.0.0.1:10080 example.com +(defun socks-tests-fake-server () + (let* ((lines '(([5 2 0 2] . [5 2]) ; Emacs + ([5 3 0 1 2] . [5 2]) ; curl (+ gssapi) + ([1 3 #x66 #x6f #x6f 3 #x62 #x61 #x72] . [1 0]) + ([5 1 0 3 11 ?e ?x ?a ?m ?p ?l ?e ?. ?c ?o ?m 0 80] + . [5 0 0 1 0 0 0 0 0 0]))) + (sentinel '(lambda (proc event) + (message "[%s]: %s" proc event) + (unless (string-match-p "^open" event) + (message "Quitting") + (kill-emacs 0)))) + (content (concat "HTTP/1.1 200 OK\r\n" + "Content-Type: text/plain; charset=UTF-8\r\n" + "Content-Length: 13\r\n\r\n" + "Hello World!\n")) + (filter `(lambda (proc line) + (let* ((content ,content) + (resp (or (assoc-default (vconcat line) test-lines) + (when (string-prefix-p "GET /" line) + content)))) + (message "-> %s" line) + (message "<- %s" resp) + (process-send-string proc (concat resp))))) + (program `(progn + (defvar test-lines ',lines) + (let ((proc (make-network-process :server 1 + :buffer (current-buffer) + :filter ,filter + :sentinel ,sentinel + :name "testnet" + :family 'ipv4 + :coding 'raw-text + :host "127.0.0.1" + :service 10080))) + (message "[%s] Listening on 127.0.0.1:10080" proc) + (while (process-live-p proc) + (sleep-for 1))))) + (buffer (generate-new-buffer "*fake-socks-server*")) + (server (start-process "fake-socks-server" buffer + (concat invocation-directory invocation-name) + "-Q" "--batch" "--eval" (format "%S" program)))) + (set-process-query-on-exit-flag server nil) + (with-current-buffer buffer + (while (not (string-match-p "Listening" (buffer-string))) + (sleep-for 0.1))) + server)) + +(ert-deftest socks-tests-auth-filter-canned-e2e () + ;; 0.31 secs on my machine but marked as expensive because involves IO + :tags '(:expensive-test) + (let* ((socks-server `("fake-server" "127.0.0.1" 10080 5)) + (socks-username "foo") + (socks-password "bar") + (url-gateway-method 'socks) + (url (url-generic-parse-url "http://example.com")) + (server (socks-tests-fake-server)) + ;; + done + ;; + (cb (lambda (&rest _r) + (goto-char (point-min)) + (should (search-forward "Hello World" nil t)) + (message "Found: %S" (buffer-substring (line-beginning-position) + (line-end-position))) + (setq done t)))) + (ignore url-gateway-method) + (ert-info ("Connect to HTTP endpoint over SOCKS5 with USER/PASS method") + (url-http url cb '(nil)) + (while (not done) (sleep-for 0.1))) + (delete-process server) + (kill-buffer (process-buffer server)))) + +;;; socks-tests.el ends here -- 2.29.2