@@ -16,28 +16,41 @@ import (
1616 "github.com/stretchr/testify/require"
1717)
1818
19- func TestDaemon_ServeAndPing (t * testing.T ) {
20- corpusAMPR := testutil .FindMPR (t , "CORPUS_A_MPR" , "testdata/corpus-a/app.mpr" )
21-
22- d , err := daemon .New (corpusAMPR , 5 * time .Minute )
23- require .NoError (t , err )
24-
25- go func () { _ = d .Serve () }()
26- t .Cleanup (func () { _ = d .Stop () })
27-
28- // 等待 socket 出现 (最多 2s)
29- sockPath := daemon .SocketPath (corpusAMPR )
30- deadline := time .Now ().Add (2 * time .Second )
19+ // waitForAlive polls the socket until it is alive or a 6-second deadline
20+ // expires. 6 s covers the corpus-a index build (~5 s) plus headroom.
21+ func waitForAlive (t * testing.T , sockPath string ) {
22+ t .Helper ()
23+ deadline := time .Now ().Add (6 * time .Second )
3124 for time .Now ().Before (deadline ) {
3225 if daemon .IsAlive (sockPath ) {
33- break
26+ return
3427 }
3528 time .Sleep (20 * time .Millisecond )
3629 }
37- require .True (t , daemon .IsAlive (sockPath ), "socket should be alive after Serve" )
30+ require .True (t , daemon .IsAlive (sockPath ), "daemon not alive within 6 s at %s" , sockPath )
31+ }
32+
33+ // newTestDaemon starts a daemon bound to a unique socket in t.TempDir()
34+ // so tests that call Serve() can run in parallel without socket conflicts.
35+ func newTestDaemon (t * testing.T , mprPath string ) * daemon.Daemon {
36+ t .Helper ()
37+ sock := filepath .Join (t .TempDir (), "d.sock" )
38+ d , err := daemon .NewWithSocket (mprPath , sock , 5 * time .Minute )
39+ require .NoError (t , err )
40+ go func () { _ = d .Serve () }()
41+ t .Cleanup (func () { _ = d .Stop () })
42+ return d
43+ }
44+
45+ func TestDaemon_ServeAndPing (t * testing.T ) {
46+ t .Parallel ()
47+ corpusAMPR := testutil .FindMPR (t , "CORPUS_A_MPR" , "testdata/corpus-a/app.mpr" )
48+
49+ d := newTestDaemon (t , corpusAMPR )
50+ waitForAlive (t , d .SocketPath ())
3851
3952 // 用空 MprPath 触发 ping 路径
40- conn , err := net .Dial ("unix" , sockPath )
53+ conn , err := net .Dial ("unix" , d . SocketPath () )
4154 require .NoError (t , err )
4255 defer conn .Close ()
4356 require .NoError (t , json .NewEncoder (conn ).Encode (daemon.ValidateRequest {}))
@@ -51,24 +64,13 @@ func TestDaemon_ServeAndPing(t *testing.T) {
5164}
5265
5366func TestDaemon_ValidateReturnsResults (t * testing.T ) {
67+ t .Parallel ()
5468 corpusAMPR := testutil .FindMPR (t , "CORPUS_A_MPR" , "testdata/corpus-a/app.mpr" )
5569
56- d , err := daemon .New (corpusAMPR , 5 * time .Minute )
57- require .NoError (t , err )
58- go func () { _ = d .Serve () }()
59- t .Cleanup (func () { _ = d .Stop () })
60-
61- sockPath := daemon .SocketPath (corpusAMPR )
62- deadline := time .Now ().Add (2 * time .Second )
63- for time .Now ().Before (deadline ) {
64- if daemon .IsAlive (sockPath ) {
65- break
66- }
67- time .Sleep (20 * time .Millisecond )
68- }
69- require .True (t , daemon .IsAlive (sockPath ))
70+ d := newTestDaemon (t , corpusAMPR )
71+ waitForAlive (t , d .SocketPath ())
7072
71- conn , err := net .Dial ("unix" , sockPath )
73+ conn , err := net .Dial ("unix" , d . SocketPath () )
7274 require .NoError (t , err )
7375 defer conn .Close ()
7476 require .NoError (t , json .NewEncoder (conn ).Encode (daemon.ValidateRequest {
@@ -78,12 +80,11 @@ func TestDaemon_ValidateReturnsResults(t *testing.T) {
7880 require .NoError (t , json .NewDecoder (conn ).Decode (& resp ))
7981
8082 assert .Empty (t , resp .Error , "no daemon-side error expected" )
81- // corpus-a 项目期望至少有少量 SEM 命中(不强求精确数字)
82- // 仅验证 daemon pipeline 跑通;results 可能为 0 也可能 >0。
8383 assert .NotNil (t , resp .Results )
8484}
8585
8686func TestDaemon_SocketDirExists (t * testing.T ) {
87+ t .Parallel ()
8788 corpusAMPR := testutil .FindMPR (t , "CORPUS_A_MPR" , "testdata/corpus-a/app.mpr" )
8889 d , err := daemon .New (corpusAMPR , 5 * time .Minute )
8990 require .NoError (t , err )
@@ -95,6 +96,7 @@ func TestDaemon_SocketDirExists(t *testing.T) {
9596}
9697
9798func TestDaemon_NewWithSocket_HonoursOverride (t * testing.T ) {
99+ t .Parallel ()
98100 corpusAMPR := testutil .FindMPR (t , "CORPUS_A_MPR" , "testdata/corpus-a/app.mpr" )
99101 custom := filepath .Join (t .TempDir (), "custom.sock" )
100102 d , err := daemon .NewWithSocket (corpusAMPR , custom , 5 * time .Minute )
@@ -107,6 +109,7 @@ func TestDaemon_NewWithSocket_HonoursOverride(t *testing.T) {
107109}
108110
109111func TestDaemon_NewWithSocket_EmptyFallsBackToDefault (t * testing.T ) {
112+ t .Parallel ()
110113 corpusAMPR := testutil .FindMPR (t , "CORPUS_A_MPR" , "testdata/corpus-a/app.mpr" )
111114 d , err := daemon .NewWithSocket (corpusAMPR , "" , 5 * time .Minute )
112115 require .NoError (t , err )
@@ -117,21 +120,13 @@ func TestDaemon_NewWithSocket_EmptyFallsBackToDefault(t *testing.T) {
117120}
118121
119122func TestDaemon_NewWithSocket_ServeBindsCustom (t * testing.T ) {
123+ t .Parallel ()
120124 corpusAMPR := testutil .FindMPR (t , "CORPUS_A_MPR" , "testdata/corpus-a/app.mpr" )
121- custom := filepath .Join (t .TempDir (), "bind.sock" )
122- d , err := daemon .NewWithSocket (corpusAMPR , custom , 5 * time .Minute )
123- require .NoError (t , err )
124- go func () { _ = d .Serve () }()
125- t .Cleanup (func () { _ = d .Stop () })
126125
127- deadline := time .Now ().Add (2 * time .Second )
128- for time .Now ().Before (deadline ) {
129- if daemon .IsAlive (custom ) {
130- break
131- }
132- time .Sleep (20 * time .Millisecond )
133- }
134- assert .True (t , daemon .IsAlive (custom ),
126+ d := newTestDaemon (t , corpusAMPR )
127+ waitForAlive (t , d .SocketPath ())
128+
129+ assert .True (t , daemon .IsAlive (d .SocketPath ()),
135130 "Serve() must bind the override socket path" )
136131 assert .False (t , daemon .IsAlive (daemon .SocketPath (corpusAMPR )),
137132 "default SocketPath must NOT be bound when override is given" )
0 commit comments