@@ -2,27 +2,25 @@ package ondemand
22
33import (
44 "fmt"
5+ "io"
6+ "net/http"
7+ "net/http/httptest"
58 "os"
9+ "sync"
610 "testing"
711 "time"
812 "yc-agent/internal/capture"
913 "yc-agent/internal/capture/executils"
1014
1115 "github.com/stretchr/testify/assert"
16+ "github.com/stretchr/testify/require"
1217)
1318
1419const (
1520 api = "tier1app@12312-12233-1442134-112"
1621 host = "https://test.gceasy.io"
1722)
1823
19- func init () {
20- // err := os.Chdir("testdata")
21- // if err != nil {
22- // panic(err)
23- // }
24- }
25-
2624func TestFindGCLog (t * testing.T ) {
2725 // Skip: Test requires Java environment with compiled MyClass.java to run background Java processes.
2826 // This is an integration test that verifies GC log detection from running Java processes.
@@ -90,82 +88,78 @@ func TestFindGCLog(t *testing.T) {
9088}
9189
9290func TestPostData (t * testing.T ) {
93- // Skip: Test makes external HTTP calls to test.gceasy.io which is flaky in CI.
94- // This is an integration test that should be run manually or in a dedicated integration test suite.
95- t .Skip ("Skipping: test makes external HTTP calls to test.gceasy.io" )
91+ // Track received requests for assertions
92+ var mu sync.Mutex
93+ receivedRequests := make (map [string ]struct {
94+ method string
95+ bodySize int
96+ })
9697
98+ // Create mock HTTP server
99+ server := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
100+ // Read body to get size
101+ body , _ := io .ReadAll (r .Body )
102+ defer r .Body .Close ()
103+
104+ // Extract dt parameter
105+ dt := r .URL .Query ().Get ("dt" )
106+
107+ mu .Lock ()
108+ receivedRequests [dt ] = struct {
109+ method string
110+ bodySize int
111+ }{
112+ method : r .Method ,
113+ bodySize : len (body ),
114+ }
115+ mu .Unlock ()
116+
117+ w .WriteHeader (http .StatusOK )
118+ w .Write ([]byte ("success" ))
119+ }))
120+ defer server .Close ()
121+
122+ // Build endpoint using mock server URL
97123 timestamp := time .Now ().Format ("2006-01-02T15-04-05" )
98124 parameters := fmt .Sprintf ("de=%s&ts=%s" , capture .GetOutboundIP ().String (), timestamp )
99- endpoint := fmt .Sprintf ("%s/ycrash-receiver?apiKey=%s&%s" , host , api , parameters )
125+ endpoint := fmt .Sprintf ("%s/ycrash-receiver?apiKey=%s&%s" , server .URL , api , parameters )
126+
127+ // Test data files - path relative to ondemand package
128+ testFiles := []struct {
129+ path string
130+ dtType string
131+ }{
132+ {"../testdata/top.out" , "top" },
133+ {"../testdata/disk.out" , "df" },
134+ {"../testdata/netstat.out" , "ns" },
135+ {"../testdata/ps.out" , "ps" },
136+ {"../testdata/vmstat.out" , "vmstat" },
137+ {"../testdata/gc.log" , "gc" },
138+ {"../testdata/threaddump.out" , "td" },
139+ }
100140
101- t .Run ("requestFin" , func (t * testing.T ) {
102- finEp := fmt .Sprintf ("%s/yc-fin?apiKey=%s&%s" , host , api , parameters )
103- RequestFin (finEp )
104- })
141+ for _ , tf := range testFiles {
142+ t .Run (tf .dtType , func (t * testing.T ) {
143+ file , err := os .Open (tf .path )
144+ require .NoError (t , err , "Failed to open test file: %s" , tf .path )
145+ defer file .Close ()
105146
106- vmstat , err := os .Open ("testdata/vmstat.out" )
107- if err != nil {
108- return
109- }
110- defer vmstat .Close ()
111- ps , err := os .Open ("testdata/ps.out" )
112- if err != nil {
113- t .Fatal (err )
114- }
115- defer ps .Close ()
116- top , err := os .Open ("testdata/top.out" )
117- if err != nil {
118- t .Fatal (err )
119- }
120- defer top .Close ()
121- df , err := os .Open ("testdata/disk.out" )
122- if err != nil {
123- t .Fatal (err )
124- }
125- defer df .Close ()
126- netstat , err := os .Open ("testdata/netstat.out" )
127- if err != nil {
128- t .Fatal (err )
147+ msg , ok := capture .PostData (endpoint , tf .dtType , file )
148+ assert .True (t , ok , "PostData failed for %s: %s" , tf .dtType , msg )
149+ })
129150 }
130- defer netstat .Close ()
131- gc , err := os .Open ("testdata/gc.log" )
132- if err != nil {
133- t .Fatal (err )
134- }
135- defer gc .Close ()
136- td , err := os .Open ("testdata/threaddump.out" )
137- if err != nil {
138- t .Fatal (err )
139- }
140- defer td .Close ()
141151
142- msg , ok := capture .PostData (endpoint , "top" , top )
143- if ! ok {
144- t .Fatal ("post data failed" , msg )
145- }
146- msg , ok = capture .PostData (endpoint , "df" , df )
147- if ! ok {
148- t .Fatal ("post data failed" , msg )
149- }
150- msg , ok = capture .PostData (endpoint , "ns" , netstat )
151- if ! ok {
152- t .Fatal ("post data failed" , msg )
153- }
154- msg , ok = capture .PostData (endpoint , "ps" , ps )
155- if ! ok {
156- t .Fatal ("post data failed" , msg )
157- }
158- msg , ok = capture .PostData (endpoint , "vmstat" , vmstat )
159- if ! ok {
160- t .Fatal ("post data failed" , msg )
161- }
162- msg , ok = capture .PostData (endpoint , "gc" , gc )
163- if ! ok {
164- t .Fatal ("post data failed" , msg )
165- }
166- msg , ok = capture .PostData (endpoint , "td" , td )
167- if ! ok {
168- t .Fatal ("post data failed" , msg )
152+ // Verify all requests were received correctly
153+ mu .Lock ()
154+ defer mu .Unlock ()
155+
156+ for _ , tf := range testFiles {
157+ req , exists := receivedRequests [tf .dtType ]
158+ assert .True (t , exists , "Request for dt=%s was not received" , tf .dtType )
159+ if exists {
160+ assert .Equal (t , "POST" , req .method , "Expected POST method for dt=%s" , tf .dtType )
161+ assert .Greater (t , req .bodySize , 0 , "Expected non-empty body for dt=%s" , tf .dtType )
162+ }
169163 }
170164}
171165
0 commit comments