2015-11-19 124 views
3

我在寫一個JUnit測試來測試我的應用程序。該應用程序使用Java編寫,並使用purejavacomm庫。爲了測試串行解析器,我想設置一個虛擬串行端口,以便測試可以與解析器進行通信。除了簡單的解析之外,它還可以動態連接到串行端口,因此我不想使用它,比如PipedInputStreamsocat兩個串口一起

此庫僅查找以ttySttyUSBttyACM開頭的設備文件。正因爲如此,我不能做常規(這將產生/dev/pts/x串口):

socat -d -d pty,raw,echo=0 pty,raw,echo=0 

我試圖做:

socat /dev/ttyS20 /dev/ttyS21 

,但它不工作。它不會退出或打印錯誤。我試圖用屏幕連接到/dev/ttyS20,但它只是說,[screen is terminating]

我查看了ttyS20(和21)的用戶權限,他們都擁有我的用戶在(chris)中的用戶組dialout(user:root)。

我可以忽略權限嗎?有沒有更好的方法一起做到這一點?

+0

如果我以root身份運行(測試沒有),我可以將'pty'符號鏈接到'ttyS's。我認爲這就是'link ='標誌雖然正確嗎? –

+0

你不能簡單[mock](https://en.wikipedia.org/wiki/Mock_object)purejavacomm類嗎? – vlp

回答

1

您將要創建具有socat虛擬端口之後到新創建的pty鏈接到另一個位置

socat -u -u pty,raw,echo=0,link=/dev/ttyS20 pty,raw,echo=0,link=/dev/ttyS21 

,嘗試改變管兩端的所有權,以便更容易獲得。

sudo chown user:user /dev/ttyS20 
sudo chown user:user /dev/ttyS21 

你也可以改變使用chmod的權限爲777

+1

我不想使用'sudo',因爲這需要root訪問權限。我不希望我的測試以root身份運行。作爲測試的一部分,測試將綁定這些串行端口。 –

+0

簡單的事實,即串行端口具有組撥號'應該足以將它們連接在一起,我會認爲... –

+0

你可以有端口已經設置?還是他們的創作必須成爲你考試的一部分?我有幾個系統,操作系統在啓動時創建虛擬COM端口,然後具有普通用戶權限的應用程序使用它們。你的測試不需要這樣擁有root權限。 我相信有人可能會對我感到愁眉不展,但對於這類事情,我通常會寫一個腳本,然後將它粘貼在/etc/rc.local中。 –

0

那麼我的建議是在你的家目錄下創建一個開發文件夾,並指向的鏈接出現。

socat pty,raw,echo=0,link=/home/user/dev/ttyS20 pty,raw,echo=0,link=/home/user/dev/ttyS21 

你應該能夠訪問沒有根。如果它是單向通信,我通常喜歡添加-u選項。

+0

我無法在主目錄中創建一個開發文件夾,這是因爲該庫只搜索/ dev中的東西。 –