changeset 41:0f547ed856f6

*** empty log message ***
author gongo
date Fri, 22 Aug 2008 20:27:01 +0900
parents 1978dc75b15c
children 95301aa3ea2f
files test/packet/README test/packet/redit-test-packet-recv.el
diffstat 2 files changed, 140 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/packet/README	Fri Aug 22 20:27:01 2008 +0900
@@ -0,0 +1,62 @@
+emacs が SessionManager(以下SM) から REPcommand(以下cmd) を受け取る時のテスト
+
+--------
+- 状況 -
+--------
+
+emacs は SM (所謂lisp内でいうprocess) からメッセージを受け取ると
+set-process-filter で設定された関数が呼び出される。
+その際、引数で受信した文字列を見れるわけですが、
+このとき、filter の文字列に、複数の cmd がくっついてる可能性がある。
+
+例えば、
+
+SM から cmd が 3 つ(A,B,C)送られてきた
+
+* 例1
+-> filter が呼ばれた (|A| が引数に)
+-> filter が呼ばれた (|B| が引数に)
+-> filter が呼ばれた (|C| が引数に)
+
+* 例2
+-> filter が呼ばれた (|A|B| が引数に)
+-> filter が呼ばれた (|C| が引数に)
+
+みたいな感じで、引数に複数の cmd が連結された状態になってる可能性がある。
+
+------------
+- 解決方法 -
+------------
+
+filter 内では process からのパケットを受け取ることはしない(らしい)ので、
+
+1. filter が呼び出される
+2. 受け取った文字列を、複数の cmd に対応できるように分割する
+3. それぞれの cmd に対して処理を行う
+4. 1 に戻る
+
+まあ書いてみると簡単なんですけどね。
+cmd 自体はサイズがわかっているので、分割はきっと大丈夫と信じる。
+
+/**
+ * $ID:$
+ * 現在、まだ動いてません
+ */
+
+---------
+- Usage -
+---------
+
+0. redit-test-packet-recv.el の redit-test-client-program に書いてある
+   redit-test-packet-send.pl の場所を自分の環境に合う用に書いてください
+1. emacs を起動
+2. M-x load-file [Enter] で recv.el を指定する
+3. M-x redit-test-start で起動
+   *Messages* に、send.pl から送られてきたパケットが表示されているはず。
+
+   41 1 1 0 $i 0
+
+   $i が、0 〜 send_count-1 の数だけパケットが表示されると正常。
+   send.pl で send_count や send_interval を変えると
+   受け取れないパケットがある可能性がある。
+   それがあるうちはバグが取れていない証拠です
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/packet/redit-test-packet-recv.el	Fri Aug 22 20:27:01 2008 +0900
@@ -0,0 +1,78 @@
+;; send.pl のパス。
+(defconst redit-test-client-program "/Users/gongo/Source/Concurrency/REP_project/emacs/test/packet/redit-test-packet-send.pl")
+
+;; プロセス変数
+(defvar redit-test-client-process nil)
+
+
+(defun redit-test-unpack-int-loop (pkt pos count)
+  (if (> count 1)
+      (+
+       (* (redit-test-unpack-int-loop pkt (- pos 1) (- count 1)) 256)
+       (string-to-char (substring pkt (- pos 1) pos)))
+    0
+    ))
+
+(defun redit-test-unpack-int (pkt pos)
+  (redit-test-unpack-int-loop pkt (* pos 4) 4))
+
+(defun rep-test-get-command-from-pkt (pkt)
+  (redit-test-unpack-int pkt 1))
+(defun rep-test-get-session-id-from-pkt (pkt)
+  (redit-test-unpack-int pkt 2))
+(defun rep-test-get-editor-id-from-pkt (pkt)
+  (redit-test-unpack-int pkt 3))
+(defun rep-test-get-sequence-id-from-pkt (pkt)
+  (redit-test-unpack-int pkt 4))
+(defun rep-test-get-line-number-from-pkt (pkt)
+  (redit-test-unpack-int pkt 5))
+(defun rep-test-get-text-size-from-pkt (pkt)
+  (redit-test-unpack-int pkt 6))
+
+
+;; process (send.pl) を起動する。
+;; send.pl がパケットを送るトリガー(?)として
+;; 文字列を送信する(標準入力)。
+(defun redit-test-start ()
+  (interactive)
+  (setq redit-test-client-process
+	(start-process "reditclient" nil redit-test-client-program))
+  (set-process-filter redit-test-client-process
+		      'redit-test-client-process-filter)
+  (set-process-coding-system redit-test-client-process
+			     'binary 'binary)
+
+  (process-send-string redit-test-client-process "a"))
+
+;; process を終了する。
+(defun redit-test-stop ()
+  (interactive)
+  (if (not (eq (process-status redit-test-client-process) 'exit))
+      (kill-process redit-test-client-process)))
+
+;; process の restart。
+(defun redit-test-restart ()
+  (interactive)
+  (redit-test-stop)
+  (redit-test-start))
+
+;; process からのパケットを受け取る。
+;; パケットは REPcommand。
+;; バイトデータと、unpack して取得した値を出力する
+(defun redit-test-client-process-filter (proc string)
+  (let ((cmd (rep-test-get-command-from-pkt string))
+	(sid (rep-test-get-session-id-from-pkt string))
+	(eid (rep-test-get-editor-id-from-pkt string))
+	(seq (rep-test-get-sequence-id-from-pkt string))
+	(lno (rep-test-get-line-number-from-pkt string))
+	(siz (rep-test-get-text-size-from-pkt string)))
+
+    (message (concat string "\n"))
+    (message (concat (number-to-string cmd) " "
+		     (number-to-string sid) " "
+		     (number-to-string eid) " "
+		     (number-to-string seq) " "
+		     (number-to-string lno) " "
+		     (number-to-string siz)
+		     "\n"))
+    ))
\ No newline at end of file