Skip to content

Commit b5d1d6f

Browse files
committed
Table-drive TestCheckRestartProperty
1 parent c8bc58a commit b5d1d6f

File tree

1 file changed

+111
-50
lines changed

1 file changed

+111
-50
lines changed

subsystems/viamserver/restart_properties_test.go

Lines changed: 111 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -13,63 +13,124 @@ import (
1313
"go.viam.com/utils"
1414
)
1515

16+
// Mimics an old server's response to the restart_status HTTP endpoint.
17+
type oldRestartStatusResponse struct {
18+
RestartAllowed bool `json:"restart_allowed"`
19+
}
20+
21+
// Ensures that checkRestartProperty works correctly for restart_allowed and
22+
// does_not_handle_needs_restart against a fake viamserver instance (HTTP server).
1623
func TestCheckRestartProperty(t *testing.T) {
1724
logger := logging.NewTestLogger(t)
1825
ctx := context.Background()
1926

20-
expectedRestartStatusResponse := RestartStatusResponse{
21-
RestartAllowed: false,
22-
DoesNotHandleNeedsRestart: true,
23-
}
24-
25-
// Set up an HTTP server that reports the expected RestartStatusResponse at the address
26-
// http://localhost:8080/restart_status.
27-
mux := http.NewServeMux()
28-
mux.HandleFunc("/restart_status", func(w http.ResponseWriter, _ *http.Request) {
29-
w.Header().Set("Content-Type", "application/json")
30-
test.That(t, json.NewEncoder(w).Encode(expectedRestartStatusResponse), test.ShouldBeNil)
31-
})
32-
// Use NewPossiblySecureHTTPServer to mimic RDK's behavior.
33-
httpServer, err := utils.NewPossiblySecureHTTPServer(mux, utils.HTTPServerOptions{
34-
Secure: false,
35-
Addr: "localhost:8080",
36-
})
37-
test.That(t, err, test.ShouldBeNil)
38-
ln, err := net.Listen("tcp", "localhost:8080")
39-
test.That(t, err, test.ShouldBeNil)
40-
var wg sync.WaitGroup
41-
wg.Add(1)
42-
go func() {
43-
defer wg.Done()
44-
err := httpServer.Serve(ln)
45-
if err != nil {
46-
println(err.Error())
47-
}
48-
}()
49-
t.Cleanup(func() {
50-
test.That(t, httpServer.Shutdown(ctx), test.ShouldBeNil)
51-
wg.Wait()
52-
})
53-
54-
// Create a new viamserver object with mostly empty fields except for checkURL and
55-
// checkURLAlt.
27+
targetAddr := "localhost:8080"
5628
s := &viamServer{
57-
logger: logger,
58-
checkURL: "http://localhost:8080",
29+
logger: logger,
30+
// checkURL will normally be the .cloud address of the machine; use localhost instead
31+
// here.
32+
checkURL: "http://" + targetAddr,
33+
// checkURLAlt is always 127.0.0.1:[bind-port] in agent code.
5934
checkURLAlt: "http://127.0.0.1:8080",
6035
}
6136

62-
// Run checkRestartProperty on the viamserver object and ensure that expected values are
63-
// returned with no errors.
64-
s.mu.Lock()
65-
restartAllowed, err := s.checkRestartProperty(ctx, RestartPropertyRestartAllowed)
66-
s.mu.Unlock()
67-
test.That(t, err, test.ShouldBeNil)
68-
test.That(t, restartAllowed, test.ShouldEqual, expectedRestartStatusResponse.RestartAllowed)
37+
falseVal := false
38+
trueVal := true
39+
testCases := []struct {
40+
name string
41+
expectedRestartAllowed bool
42+
// Can be unset (mimic old server), false, and true.
43+
expectedDoesNotHandleNeedsRestart *bool
44+
}{
45+
{
46+
"restart_allowed=false;does_not_handle_needs_restart=unset",
47+
false,
48+
nil,
49+
},
50+
{
51+
"restart_allowed=false;does_not_handle_needs_restart=false",
52+
false,
53+
&falseVal,
54+
},
55+
{
56+
"restart_allowed=false;does_not_handle_needs_restart=true",
57+
false,
58+
&trueVal,
59+
},
60+
{
61+
"restart_allowed=true;does_not_handle_needs_restart=unset",
62+
true,
63+
nil,
64+
},
65+
{
66+
"restart_allowed=true;does_not_handle_needs_restart=false",
67+
true,
68+
nil,
69+
},
70+
{
71+
"restart_allowed=true;does_not_handle_needs_restart=true",
72+
true,
73+
&trueVal,
74+
},
75+
}
76+
77+
for _, tc := range testCases {
78+
t.Run(tc.name, func(t *testing.T) {
79+
var expectedRestartStatusResponse any
80+
if tc.expectedDoesNotHandleNeedsRestart != nil {
81+
expectedRestartStatusResponse = RestartStatusResponse{
82+
RestartAllowed: tc.expectedRestartAllowed,
83+
DoesNotHandleNeedsRestart: *tc.expectedDoesNotHandleNeedsRestart,
84+
}
85+
} else {
86+
expectedRestartStatusResponse = oldRestartStatusResponse{
87+
RestartAllowed: tc.expectedRestartAllowed,
88+
}
89+
}
90+
91+
mux := http.NewServeMux()
92+
mux.HandleFunc("/restart_status", func(w http.ResponseWriter, _ *http.Request) {
93+
w.Header().Set("Content-Type", "application/json")
94+
test.That(t, json.NewEncoder(w).Encode(expectedRestartStatusResponse), test.ShouldBeNil)
95+
})
96+
// Use NewPossiblySecureHTTPServer to mimic RDK's behavior.
97+
httpServer, err := utils.NewPossiblySecureHTTPServer(mux, utils.HTTPServerOptions{
98+
Secure: false,
99+
Addr: targetAddr,
100+
})
101+
test.That(t, err, test.ShouldBeNil)
102+
ln, err := net.Listen("tcp", targetAddr)
103+
test.That(t, err, test.ShouldBeNil)
104+
var wg sync.WaitGroup
105+
wg.Add(1)
106+
go func() {
107+
defer wg.Done()
108+
err := httpServer.Serve(ln)
109+
// Should be "server closed" due to Shutdown below.
110+
test.That(t, err, test.ShouldBeError, http.ErrServerClosed)
111+
}()
112+
t.Cleanup(func() {
113+
test.That(t, httpServer.Shutdown(ctx), test.ShouldBeNil)
114+
wg.Wait()
115+
})
69116

70-
s.mu.Lock()
71-
doesNotHandle, err := s.checkRestartProperty(ctx, RestartPropertyDoesNotHandleNeedsRestart)
72-
s.mu.Unlock()
73-
test.That(t, err, test.ShouldBeNil)
74-
test.That(t, doesNotHandle, test.ShouldEqual, expectedRestartStatusResponse.DoesNotHandleNeedsRestart)
117+
s.mu.Lock()
118+
restartAllowed, err := s.checkRestartProperty(ctx, RestartPropertyRestartAllowed)
119+
s.mu.Unlock()
120+
test.That(t, err, test.ShouldBeNil)
121+
test.That(t, restartAllowed, test.ShouldEqual, tc.expectedRestartAllowed)
122+
123+
s.mu.Lock()
124+
doesNotHandleNeedsRestart, err := s.checkRestartProperty(ctx, RestartPropertyDoesNotHandleNeedsRestart)
125+
s.mu.Unlock()
126+
test.That(t, err, test.ShouldBeNil)
127+
// does_not_handle_restart should be false if explicitly false or unset in the test
128+
// case.
129+
var expectedDoesNotHandleNeedsRestart bool
130+
if tc.expectedDoesNotHandleNeedsRestart != nil {
131+
expectedDoesNotHandleNeedsRestart = *tc.expectedDoesNotHandleNeedsRestart
132+
}
133+
test.That(t, doesNotHandleNeedsRestart, test.ShouldEqual, expectedDoesNotHandleNeedsRestart)
134+
})
135+
}
75136
}

0 commit comments

Comments
 (0)