Skip to content

Commit b5a0b14

Browse files
authored
Bug: Go Coverage (#20)
* fix ci * add codecov as orb * upgrade codecov ver * fix go routine error * fix ci error * fix ci error
1 parent 57c3ef5 commit b5a0b14

File tree

4 files changed

+61
-57
lines changed

4 files changed

+61
-57
lines changed

.circleci/config.yml

+4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
version: 2.1
2+
3+
orbs:
4+
codecov: codecov/[email protected]
5+
26
jobs:
37
build:
48
working_directory: ~/repo

app.go

+29-22
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
11
package pulse
22

33
import (
4-
"errors"
4+
"context"
55
"fmt"
66
"github.com/common-nighthawk/go-figure"
77
"net"
88
"net/http"
9-
"sync"
9+
"time"
1010
)
1111

1212
type (
1313
Pulse struct {
1414
config *Config
1515
server *http.Server
1616
Router *Router
17-
mx sync.Mutex
1817
}
1918

2019
Config struct {
@@ -38,6 +37,7 @@ func New(config ...Config) *Pulse {
3837
app := &Pulse{
3938
config: &Config{},
4039
server: &http.Server{},
40+
Router: NewRouter(),
4141
}
4242

4343
if len(config) > 0 {
@@ -55,51 +55,58 @@ func New(config ...Config) *Pulse {
5555
return app
5656
}
5757

58-
func (f *Pulse) Run(address string) {
59-
f.mx.Lock()
60-
defer f.mx.Unlock()
58+
func (p *Pulse) Run(address string) {
6159
// setup handler
62-
handler := RouterHandler(f.Router)
63-
f.server.Handler = handler
60+
handler := RouterHandler(p.Router)
61+
p.server.Handler = handler
6462

6563
// setup listener
66-
listener, err := net.Listen(f.config.Network, address)
64+
listener, err := net.Listen(p.config.Network, address)
6765
if err != nil {
6866
panic(fmt.Errorf("failed to listen: %v", err))
6967
}
7068

7169
// print startup message
72-
fmt.Println(f.startupMessage(listener.Addr().String()))
70+
fmt.Println(p.startupMessage(listener.Addr().String()))
7371

7472
// start server
75-
err = f.server.Serve(listener)
73+
err = p.server.Serve(listener)
7674
if err != nil {
7775
fmt.Errorf("failed to start server on %s: %v", listener.Addr().String(), err)
7876
}
7977
}
8078

81-
func (f *Pulse) Stop() error {
82-
f.mx.Lock()
83-
defer f.mx.Unlock()
84-
85-
if f.server == nil {
86-
return errors.New("server not running")
79+
func (p *Pulse) Stop() error {
80+
// Check if the server is already stopped.
81+
if p.server == nil {
82+
return nil
8783
}
88-
err := f.server.Shutdown(nil)
84+
85+
// Disable HTTP keep-alive connections to prevent the server from
86+
// accepting any new requests.
87+
p.server.SetKeepAlivesEnabled(false)
88+
89+
// Shutdown the server gracefully to allow existing connections to finish.
90+
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
91+
defer cancel()
92+
err := p.server.Shutdown(ctx)
8993
if err != nil {
90-
return fmt.Errorf("failed to stop server: %v", err)
94+
return fmt.Errorf("failed to shut down server: %v", err)
9195
}
92-
f.server = nil
96+
97+
// Set the server to a new instance of http.Server to allow starting it again.
98+
p.server = &http.Server{}
99+
93100
return nil
94101
}
95102

96-
func (f *Pulse) startupMessage(addr string) string {
103+
func (p *Pulse) startupMessage(addr string) string {
97104
myFigure := figure.NewFigure("PULSE", "", true)
98105
myFigure.Print()
99106

100107
var textOne = "=> Server started on <%s>" + "\n"
101108
var textTwo = "=> App Name: %s" + "\n"
102109
var textThree = "=> Press CTRL+C to stop" + "\n"
103110

104-
return fmt.Sprintf(textOne, addr) + fmt.Sprintf(textTwo, f.config.AppName) + fmt.Sprintf(textThree)
111+
return fmt.Sprintf(textOne, addr) + fmt.Sprintf(textTwo, p.config.AppName) + fmt.Sprintf(textThree)
105112
}

app_test.go

+28-33
Original file line numberDiff line numberDiff line change
@@ -71,48 +71,43 @@ func TestRouterHandler2(t *testing.T) {
7171
handler.ServeHTTP(rr, req)
7272
}
7373

74-
func TestPulse_Run_Stop(t *testing.T) {
75-
// Create a new Pulse instance.
76-
pulse := &Pulse{
77-
Router: NewRouter(),
78-
config: &Config{Network: "tcp"},
79-
server: &http.Server{},
80-
}
74+
func TestPulse_Run(t *testing.T) {
75+
app := New(Config{
76+
AppName: "test-app",
77+
})
8178

82-
// Start the server.
83-
address := "localhost:9000"
84-
go pulse.Run(address)
79+
go app.Run(":9090")
8580

86-
// Wait for the server to start.
87-
time.Sleep(100 * time.Millisecond)
81+
// Wait for server to start
82+
time.Sleep(time.Second)
8883

89-
// Make a test request to verify that the server is running.
90-
req, err := http.NewRequest("GET", "http://"+address, nil)
84+
_, err := http.Get("http://localhost:9090/")
9185
if err != nil {
92-
t.Fatalf("unexpected error creating request: %v", err)
86+
t.Errorf("failed to make GET request: %v", err)
9387
}
94-
respRecorder := httptest.NewRecorder()
95-
done := make(chan bool)
96-
go func() {
97-
pulse.server.Handler.ServeHTTP(respRecorder, req)
98-
done <- true
99-
}()
100-
101-
// Wait for the request to complete.
102-
<-done
103-
104-
// Stop the server.
105-
err = pulse.Stop()
88+
89+
err = app.Stop()
10690
if err != nil {
107-
t.Fatalf("failed to stop server: %v", err)
91+
t.Errorf("failed to stop server: %v", err)
10892
}
93+
}
10994

110-
// Wait for the server to stop.
111-
time.Sleep(3 * time.Second)
95+
func TestPulse_Stop(t *testing.T) {
96+
app := New()
97+
98+
go app.Run(":9090")
99+
100+
// Wait for server to start
101+
time.Sleep(time.Second)
112102

113-
// Close the test request to ensure that all active connections are closed.
114-
err = respRecorder.Result().Body.Close()
103+
err := app.Stop()
115104
if err != nil {
116-
t.Fatalf("failed to close response body: %v", err)
105+
t.Errorf("failed to stop server: %v", err)
106+
}
107+
108+
// Make sure server is stopped by attempting to make a GET request
109+
_, err = http.Get("http://localhost:9090/")
110+
if err == nil {
111+
t.Errorf("expected error, got nil")
117112
}
118113
}

context_test.go

-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package pulse
22

33
import (
4-
"fmt"
54
"net/http"
65
"net/http/httptest"
76
"net/url"
@@ -100,7 +99,6 @@ func TestContext_Cookie(t *testing.T) {
10099

101100
// Get the value of the cookie using the GetCookie method.
102101
retrievedValue := ctx.GetCookie(cookieName)
103-
fmt.Println(retrievedValue)
104102
if retrievedValue != cookieValue {
105103
t.Errorf("Expected retrieved cookie value to be '%s', but got '%s'", cookieValue, retrievedValue)
106104
}

0 commit comments

Comments
 (0)