Ver código fonte

fix data race in bos_service and chat_service tests

Caused by issue described in
https://github.com/stretchr/testify/pull/1229.

The workaround here is to close out the session in the same goroutine as
handleNewConnection. This actually simplifies the code by reducing the #
of goroutines per connection by 1 and allowing the unit tests to
synchronize without a waitgroup.
Mike 2 anos atrás
pai
commit
84c6909f36
82 arquivos alterados com 243 adições e 186 exclusões
  1. 31 0
      .github/workflows/go.yml
  2. 2 2
      .mockery.yaml
  3. 1 1
      LICENSE
  4. 1 0
      README.md
  5. 3 3
      cmd/main.go
  6. 3 0
      codecov.yml
  7. 4 4
      go.mod
  8. 4 4
      go.sum
  9. 3 3
      handler/auth.go
  10. 3 3
      handler/auth_test.go
  11. 2 2
      handler/buddy.go
  12. 1 1
      handler/buddy_test.go
  13. 4 4
      handler/chat.go
  14. 2 2
      handler/chat_message_relayer_mock_test.go
  15. 2 2
      handler/chat_nav.go
  16. 2 2
      handler/chat_nav_test.go
  17. 1 1
      handler/chat_registry_test.go
  18. 60 13
      handler/chat_test.go
  19. 2 2
      handler/feedbag.go
  20. 2 2
      handler/feedbag_manager_mock_test.go
  21. 2 2
      handler/feedbag_test.go
  22. 2 2
      handler/icbm.go
  23. 2 2
      handler/icbm_test.go
  24. 2 2
      handler/locate.go
  25. 2 2
      handler/locate_test.go
  26. 2 2
      handler/message_relayer_mock_test.go
  27. 3 3
      handler/oservice.go
  28. 3 3
      handler/oservice_test.go
  29. 1 1
      handler/session_manager_mock_test.go
  30. 3 2
      handler/test_helpers.go
  31. 2 2
      handler/types.go
  32. 1 1
      handler/user_manager_manager_mock_test.go
  33. 1 1
      server/alert.go
  34. 1 1
      server/alert_test.go
  35. 2 2
      server/auth_mock_test.go
  36. 2 2
      server/bos_router.go
  37. 1 1
      server/bos_router_mock_test.go
  38. 5 7
      server/bos_service.go
  39. 2 11
      server/bos_service_test.go
  40. 2 2
      server/bucp.go
  41. 1 1
      server/bucp_test.go
  42. 1 1
      server/buddy.go
  43. 1 1
      server/buddy_mock_test.go
  44. 1 1
      server/buddy_test.go
  45. 2 2
      server/chat.go
  46. 2 2
      server/chat_mock_test.go
  47. 2 2
      server/chat_nav.go
  48. 2 2
      server/chat_nav_mock_test.go
  49. 1 1
      server/chat_nav_test.go
  50. 9 10
      server/chat_service.go
  51. 2 2
      server/chat_service_router.go
  52. 1 1
      server/chat_service_router_mock_test.go
  53. 2 11
      server/chat_service_test.go
  54. 2 7
      server/chat_test.go
  55. 2 2
      server/connection.go
  56. 2 2
      server/connection_test.go
  57. 2 2
      server/feedbag.go
  58. 2 2
      server/feedbag_mock_test.go
  59. 1 1
      server/feedbag_test.go
  60. 2 2
      server/icbm.go
  61. 2 2
      server/icbm_mock_test.go
  62. 1 1
      server/icbm_test.go
  63. 2 2
      server/locate.go
  64. 2 2
      server/locate_mock_test.go
  65. 1 1
      server/locate_test.go
  66. 1 1
      server/logging.go
  67. 1 1
      server/mgmt_api.go
  68. 1 1
      server/mgmt_api_test.go
  69. 2 2
      server/oservice.go
  70. 2 2
      server/oservice_bos_mock_test.go
  71. 2 2
      server/oservice_chat_mock_test.go
  72. 2 2
      server/oservice_mock_test.go
  73. 1 1
      server/oservice_test.go
  74. 1 1
      server/user_manager_mock_test.go
  75. 1 1
      state/chat_registry.go
  76. 1 1
      state/chat_registry_test.go
  77. 1 1
      state/session.go
  78. 1 1
      state/session_manager.go
  79. 1 1
      state/session_manager_test.go
  80. 1 1
      state/session_test.go
  81. 1 1
      state/user_store.go
  82. 1 1
      state/user_store_test.go

+ 31 - 0
.github/workflows/go.yml

@@ -0,0 +1,31 @@
+# This workflow will build a golang project
+# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-go
+
+name: Go
+
+on:
+  push:
+    branches: [ "main" ]
+  pull_request:
+    branches: [ "main" ]
+
+jobs:
+
+  build:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v3
+
+      - name: Set up Go
+        uses: actions/setup-go@v4
+        with:
+          go-version: '1.21'
+
+      - name: Build
+        run: go build -v ./...
+
+      - name: Test
+        run: go test -v -race -coverprofile=coverage.out -covermode=atomic ./...
+
+      - name: Upload coverage reports to Codecov
+        uses: codecov/codecov-action@v3

+ 2 - 2
.mockery.yaml

@@ -3,7 +3,7 @@ dir: "{{.InterfaceDir}}"
 mockname: "mock{{.InterfaceName}}"
 inpackage: True
 packages:
-  github.com/mkaminski/goaim/server:
+  github.com/mk6i/retro-aim-server/server:
     interfaces:
       AuthHandler:
         config:
@@ -44,7 +44,7 @@ packages:
       ChatServiceRouter:
         config:
           filename: "chat_service_router_mock_test.go"
-  github.com/mkaminski/goaim/handler:
+  github.com/mk6i/retro-aim-server/handler:
     interfaces:
       FeedbagManager:
         config:

+ 1 - 1
LICENSE

@@ -1,6 +1,6 @@
 MIT License
 
-Copyright (c) 2023 Mike Kaminski
+Copyright (c) 2024 mk6i
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal

+ 1 - 0
README.md

@@ -1,4 +1,5 @@
 # Retro AIM Server
+[![codecov](https://codecov.io/github/mk6i/retro-aim-server/graph/badge.svg?token=MATKPP77JT)](https://codecov.io/github/mk6i/retro-aim-server)
 
 Retro AIM Server is a server implementation of the OSCAR protocol that supports AIM versions 5.0-5.9.
 

+ 3 - 3
cmd/main.go

@@ -6,11 +6,11 @@ import (
 	"os"
 	"sync"
 
-	"github.com/mkaminski/goaim/handler"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/handler"
+	"github.com/mk6i/retro-aim-server/state"
 
 	"github.com/kelseyhightower/envconfig"
-	"github.com/mkaminski/goaim/server"
+	"github.com/mk6i/retro-aim-server/server"
 )
 
 func main() {

+ 3 - 0
codecov.yml

@@ -0,0 +1,3 @@
+coverage:
+  round: down
+  range: 70..79

+ 4 - 4
go.mod

@@ -1,11 +1,11 @@
-module github.com/mkaminski/goaim
+module github.com/mk6i/retro-aim-server
 
-go 1.20
+go 1.21.3
 
 require (
-	github.com/google/uuid v1.3.0
+	github.com/google/uuid v1.5.0
 	github.com/kelseyhightower/envconfig v1.4.0
-	github.com/mattn/go-sqlite3 v1.14.17
+	github.com/mattn/go-sqlite3 v1.14.19
 	github.com/stretchr/testify v1.8.4
 )
 

+ 4 - 4
go.sum

@@ -1,12 +1,12 @@
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
-github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=
+github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=
 github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=
-github.com/mattn/go-sqlite3 v1.14.17 h1:mCRHCLDUBXgpKAqIKsaAaAsrAlbkeomtRFKXh2L6YIM=
-github.com/mattn/go-sqlite3 v1.14.17/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
+github.com/mattn/go-sqlite3 v1.14.19 h1:fhGleo2h1p8tVChob4I9HpmVFIAkKGpiukdrgQbWfGI=
+github.com/mattn/go-sqlite3 v1.14.19/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=

+ 3 - 3
handler/auth.go

@@ -6,9 +6,9 @@ import (
 	"errors"
 
 	"github.com/google/uuid"
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/server"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/oscar"
+	"github.com/mk6i/retro-aim-server/server"
+	"github.com/mk6i/retro-aim-server/state"
 )
 
 // NewAuthService creates a new instance of AuthService.

+ 3 - 3
handler/auth_test.go

@@ -5,9 +5,9 @@ import (
 	"testing"
 
 	"github.com/google/uuid"
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/server"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/oscar"
+	"github.com/mk6i/retro-aim-server/server"
+	"github.com/mk6i/retro-aim-server/state"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/mock"
 )

+ 2 - 2
handler/buddy.go

@@ -3,8 +3,8 @@ package handler
 import (
 	"context"
 
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/oscar"
+	"github.com/mk6i/retro-aim-server/state"
 )
 
 func NewBuddyService() *BuddyService {

+ 1 - 1
handler/buddy_test.go

@@ -3,7 +3,7 @@ package handler
 import (
 	"testing"
 
-	"github.com/mkaminski/goaim/oscar"
+	"github.com/mk6i/retro-aim-server/oscar"
 	"github.com/stretchr/testify/assert"
 )
 

+ 4 - 4
handler/chat.go

@@ -3,18 +3,18 @@ package handler
 import (
 	"context"
 
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/oscar"
+	"github.com/mk6i/retro-aim-server/state"
 )
 
-func NewChatService(chatRegistry *state.ChatRegistry) *ChatService {
+func NewChatService(chatRegistry ChatRegistry) *ChatService {
 	return &ChatService{
 		chatRegistry: chatRegistry,
 	}
 }
 
 type ChatService struct {
-	chatRegistry *state.ChatRegistry
+	chatRegistry ChatRegistry
 }
 
 func (s ChatService) ChannelMsgToHostHandler(ctx context.Context, sess *state.Session, chatID string, inFrame oscar.SNACFrame, inBody oscar.SNAC_0x0E_0x05_ChatChannelMsgToHost) (*oscar.SNACMessage, error) {

+ 2 - 2
handler/chat_message_relayer_mock_test.go

@@ -5,10 +5,10 @@ package handler
 import (
 	context "context"
 
-	oscar "github.com/mkaminski/goaim/oscar"
+	oscar "github.com/mk6i/retro-aim-server/oscar"
 	mock "github.com/stretchr/testify/mock"
 
-	state "github.com/mkaminski/goaim/state"
+	state "github.com/mk6i/retro-aim-server/state"
 )
 
 // mockChatMessageRelayer is an autogenerated mock type for the ChatMessageRelayer type

+ 2 - 2
handler/chat_nav.go

@@ -6,8 +6,8 @@ import (
 
 	"log/slog"
 
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/oscar"
+	"github.com/mk6i/retro-aim-server/state"
 )
 
 // NewChatNavService creates a new instance of NewChatNavService.

+ 2 - 2
handler/chat_nav_test.go

@@ -5,8 +5,8 @@ import (
 	"testing"
 	"time"
 
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/oscar"
+	"github.com/mk6i/retro-aim-server/state"
 	"github.com/stretchr/testify/assert"
 )
 

+ 1 - 1
handler/chat_registry_test.go

@@ -3,7 +3,7 @@
 package handler
 
 import (
-	state "github.com/mkaminski/goaim/state"
+	state "github.com/mk6i/retro-aim-server/state"
 	mock "github.com/stretchr/testify/mock"
 )
 

+ 60 - 13
handler/chat_test.go

@@ -4,8 +4,8 @@ import (
 	"context"
 	"testing"
 
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/oscar"
+	"github.com/mk6i/retro-aim-server/state"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/mock"
 )
@@ -18,10 +18,14 @@ func TestChatService_ChannelMsgToHostHandler(t *testing.T) {
 		userSession *state.Session
 		// inputSNAC is the SNAC sent by the sender client
 		inputSNAC oscar.SNACMessage
+		// mockParams is the list of params sent to mocks that satisfy this
+		// method's dependencies
+		mockParams mockParams
 		// expectSNACToParticipants is the message the server broadcast to chat
 		// room participants (except the sender)
 		expectSNACToParticipants oscar.SNACMessage
 		expectOutput             *oscar.SNACMessage
+		wantErr                  error
 	}{
 		{
 			name:        "send chat room message, expect acknowledgement to sender client",
@@ -47,6 +51,13 @@ func TestChatService_ChannelMsgToHostHandler(t *testing.T) {
 					},
 				},
 			},
+			mockParams: mockParams{
+				chatRegistryParams: chatRegistryParams{
+					chatRegistryRetrieveParams: chatRegistryRetrieveParams{
+						chatID: "the-chat-id",
+					},
+				},
+			},
 			expectSNACToParticipants: oscar.SNACMessage{
 				Frame: oscar.SNACFrame{
 					FoodGroup: oscar.Chat,
@@ -104,6 +115,13 @@ func TestChatService_ChannelMsgToHostHandler(t *testing.T) {
 					},
 				},
 			},
+			mockParams: mockParams{
+				chatRegistryParams: chatRegistryParams{
+					chatRegistryRetrieveParams: chatRegistryRetrieveParams{
+						chatID: "the-chat-id",
+					},
+				},
+			},
 			expectSNACToParticipants: oscar.SNACMessage{
 				Frame: oscar.SNACFrame{
 					FoodGroup: oscar.Chat,
@@ -121,7 +139,36 @@ func TestChatService_ChannelMsgToHostHandler(t *testing.T) {
 					},
 				},
 			},
-			expectOutput: &oscar.SNACMessage{},
+		},
+		{
+			name:        "send chat room message, fail due to missing chat room",
+			userSession: newTestSession("user_sending_chat_msg", sessOptCannedSignonTime),
+			inputSNAC: oscar.SNACMessage{
+				Frame: oscar.SNACFrame{
+					RequestID: 1234,
+				},
+				Body: oscar.SNAC_0x0E_0x05_ChatChannelMsgToHost{
+					Cookie:  1234,
+					Channel: 14,
+					TLVRestBlock: oscar.TLVRestBlock{
+						TLVList: oscar.TLVList{
+							{
+								Tag:   oscar.ChatTLVPublicWhisperFlag,
+								Value: []byte{},
+							},
+						},
+					},
+				},
+			},
+			mockParams: mockParams{
+				chatRegistryParams: chatRegistryParams{
+					chatRegistryRetrieveParams: chatRegistryRetrieveParams{
+						chatID: "the-chat-id",
+						err:    state.ErrChatRoomNotFound,
+					},
+				},
+			},
+			wantErr: state.ErrChatRoomNotFound,
 		},
 	}
 
@@ -130,20 +177,20 @@ func TestChatService_ChannelMsgToHostHandler(t *testing.T) {
 			chatID := "the-chat-id"
 
 			chatSessMgr := newMockChatMessageRelayer(t)
-			chatSessMgr.EXPECT().
-				RelayToAllExcept(mock.Anything, tc.userSession, tc.expectSNACToParticipants)
+			if tc.mockParams.chatRegistryRetrieveParams.err == nil {
+				chatSessMgr.EXPECT().
+					RelayToAllExcept(mock.Anything, tc.userSession, tc.expectSNACToParticipants)
+			}
 
-			svc := NewChatService(state.NewChatRegistry())
-			svc.chatRegistry.Register(state.ChatRoom{Cookie: chatID}, chatSessMgr)
+			chatRegistry := newMockChatRegistry(t)
+			chatRegistry.EXPECT().
+				Retrieve(tc.mockParams.chatRegistryRetrieveParams.chatID).
+				Return(state.ChatRoom{}, chatSessMgr, tc.mockParams.chatRegistryRetrieveParams.err)
 
+			svc := NewChatService(chatRegistry)
 			outputSNAC, err := svc.ChannelMsgToHostHandler(context.Background(), tc.userSession, chatID,
 				tc.inputSNAC.Frame, tc.inputSNAC.Body.(oscar.SNAC_0x0E_0x05_ChatChannelMsgToHost))
-			assert.NoError(t, err)
-
-			if tc.expectOutput.Frame == (oscar.SNACFrame{}) {
-				return // handler doesn't return response
-			}
-
+			assert.ErrorIs(t, err, tc.wantErr)
 			assert.Equal(t, tc.expectOutput, outputSNAC)
 		})
 	}

+ 2 - 2
handler/feedbag.go

@@ -4,8 +4,8 @@ import (
 	"context"
 	"time"
 
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/oscar"
+	"github.com/mk6i/retro-aim-server/state"
 )
 
 // NewFeedbagService creates a new instance of FeedbagService.

+ 2 - 2
handler/feedbag_manager_mock_test.go

@@ -3,10 +3,10 @@
 package handler
 
 import (
-	oscar "github.com/mkaminski/goaim/oscar"
+	oscar "github.com/mk6i/retro-aim-server/oscar"
 	mock "github.com/stretchr/testify/mock"
 
-	state "github.com/mkaminski/goaim/state"
+	state "github.com/mk6i/retro-aim-server/state"
 
 	time "time"
 )

+ 2 - 2
handler/feedbag_test.go

@@ -4,8 +4,8 @@ import (
 	"testing"
 	"time"
 
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/oscar"
+	"github.com/mk6i/retro-aim-server/state"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/mock"
 )

+ 2 - 2
handler/icbm.go

@@ -3,8 +3,8 @@ package handler
 import (
 	"context"
 
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/oscar"
+	"github.com/mk6i/retro-aim-server/state"
 )
 
 const (

+ 2 - 2
handler/icbm_test.go

@@ -3,8 +3,8 @@ package handler
 import (
 	"testing"
 
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/oscar"
+	"github.com/mk6i/retro-aim-server/state"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/mock"
 )

+ 2 - 2
handler/locate.go

@@ -3,8 +3,8 @@ package handler
 import (
 	"context"
 
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/oscar"
+	"github.com/mk6i/retro-aim-server/state"
 )
 
 // NewLocateService creates a new instance of LocateService.

+ 2 - 2
handler/locate_test.go

@@ -6,8 +6,8 @@ import (
 
 	"github.com/stretchr/testify/mock"
 
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/oscar"
+	"github.com/mk6i/retro-aim-server/state"
 	"github.com/stretchr/testify/assert"
 )
 

+ 2 - 2
handler/message_relayer_mock_test.go

@@ -5,10 +5,10 @@ package handler
 import (
 	context "context"
 
-	oscar "github.com/mkaminski/goaim/oscar"
+	oscar "github.com/mk6i/retro-aim-server/oscar"
 	mock "github.com/stretchr/testify/mock"
 
-	state "github.com/mkaminski/goaim/state"
+	state "github.com/mk6i/retro-aim-server/state"
 )
 
 // mockMessageRelayer is an autogenerated mock type for the MessageRelayer type

+ 3 - 3
handler/oservice.go

@@ -7,9 +7,9 @@ import (
 	"fmt"
 	"time"
 
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/server"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/oscar"
+	"github.com/mk6i/retro-aim-server/server"
+	"github.com/mk6i/retro-aim-server/state"
 )
 
 // NewOServiceService creates a new instance of OServiceService.

+ 3 - 3
handler/oservice_test.go

@@ -6,9 +6,9 @@ import (
 
 	"github.com/stretchr/testify/mock"
 
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/server"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/oscar"
+	"github.com/mk6i/retro-aim-server/server"
+	"github.com/mk6i/retro-aim-server/state"
 	"github.com/stretchr/testify/assert"
 )
 

+ 1 - 1
handler/session_manager_mock_test.go

@@ -3,7 +3,7 @@
 package handler
 
 import (
-	state "github.com/mkaminski/goaim/state"
+	state "github.com/mk6i/retro-aim-server/state"
 	mock "github.com/stretchr/testify/mock"
 )
 

+ 3 - 2
handler/test_helpers.go

@@ -3,8 +3,8 @@ package handler
 import (
 	"time"
 
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/oscar"
+	"github.com/mk6i/retro-aim-server/state"
 )
 
 // mockParams is a helper struct that centralizes mock function call parameters
@@ -27,6 +27,7 @@ type chatRegistryRetrieveParams struct {
 	chatID         string
 	retChatRoom    state.ChatRoom
 	retChatSessMgr any
+	err            error
 }
 
 // userManagerParams is a helper struct that contains mock parameters for

+ 2 - 2
handler/types.go

@@ -4,8 +4,8 @@ import (
 	"context"
 	"time"
 
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/oscar"
+	"github.com/mk6i/retro-aim-server/state"
 )
 
 type FeedbagManager interface {

+ 1 - 1
handler/user_manager_manager_mock_test.go

@@ -3,7 +3,7 @@
 package handler
 
 import (
-	state "github.com/mkaminski/goaim/state"
+	state "github.com/mk6i/retro-aim-server/state"
 	mock "github.com/stretchr/testify/mock"
 )
 

+ 1 - 1
server/alert.go

@@ -4,7 +4,7 @@ import (
 	"context"
 	"log/slog"
 
-	"github.com/mkaminski/goaim/oscar"
+	"github.com/mk6i/retro-aim-server/oscar"
 )
 
 func NewAlertRouter(logger *slog.Logger) AlertRouter {

+ 1 - 1
server/alert_test.go

@@ -5,7 +5,7 @@ import (
 	"context"
 	"testing"
 
-	"github.com/mkaminski/goaim/oscar"
+	"github.com/mk6i/retro-aim-server/oscar"
 	"github.com/stretchr/testify/assert"
 )
 

+ 2 - 2
server/auth_mock_test.go

@@ -5,10 +5,10 @@ package server
 import (
 	context "context"
 
-	oscar "github.com/mkaminski/goaim/oscar"
+	oscar "github.com/mk6i/retro-aim-server/oscar"
 	mock "github.com/stretchr/testify/mock"
 
-	state "github.com/mkaminski/goaim/state"
+	state "github.com/mk6i/retro-aim-server/state"
 
 	uuid "github.com/google/uuid"
 )

+ 2 - 2
server/bos_router.go

@@ -5,8 +5,8 @@ import (
 	"errors"
 	"io"
 
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/oscar"
+	"github.com/mk6i/retro-aim-server/state"
 )
 
 // BOSRootRouter routes client connections to the OSCAR food group routers.

+ 1 - 1
server/bos_router_mock_test.go

@@ -8,7 +8,7 @@ import (
 
 	mock "github.com/stretchr/testify/mock"
 
-	state "github.com/mkaminski/goaim/state"
+	state "github.com/mk6i/retro-aim-server/state"
 )
 
 // mockBOSRouter is an autogenerated mock type for the BOSRouter type

+ 5 - 7
server/bos_service.go

@@ -7,8 +7,8 @@ import (
 	"net"
 	"os"
 
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/oscar"
+	"github.com/mk6i/retro-aim-server/state"
 )
 
 // BOSRouter is the interface that defines the entrypoint to the BOS service.
@@ -83,11 +83,9 @@ func (rt BOSService) handleNewConnection(ctx context.Context, rwc io.ReadWriteCl
 		return errors.New("session not found")
 	}
 
-	defer sess.Close()
-	defer rwc.Close()
-
-	go func() {
-		<-sess.Closed()
+	defer func() {
+		sess.Close()
+		rwc.Close()
 		if err := rt.Signout(ctx, sess); err != nil {
 			rt.Logger.ErrorContext(ctx, "error notifying departure", "err", err.Error())
 		}

+ 2 - 11
server/bos_service_test.go

@@ -5,13 +5,12 @@ import (
 	"context"
 	"io"
 	"log/slog"
-	"sync"
 	"testing"
 
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/state"
 	"github.com/stretchr/testify/mock"
 
-	"github.com/mkaminski/goaim/oscar"
+	"github.com/mk6i/retro-aim-server/oscar"
 	"github.com/stretchr/testify/assert"
 )
 
@@ -36,9 +35,6 @@ func TestBOSService_handleNewConnection(t *testing.T) {
 	clientReader, serverWriter := io.Pipe()
 	serverReader, clientWriter := io.Pipe()
 
-	wg := sync.WaitGroup{}
-	wg.Add(1)
-
 	go func() {
 		// < receive FLAPSignonFrame
 		flap := oscar.FLAPFrame{}
@@ -91,9 +87,6 @@ func TestBOSService_handleNewConnection(t *testing.T) {
 		Return(sess, nil)
 	authHandler.EXPECT().
 		Signout(mock.Anything, sess).
-		Run(func(ctx context.Context, sess *state.Session) {
-			wg.Done()
-		}).
 		Return(nil)
 
 	bosHandler := newMockOServiceBOSHandler(t)
@@ -122,6 +115,4 @@ func TestBOSService_handleNewConnection(t *testing.T) {
 		PipeWriter: clientWriter,
 	}
 	assert.NoError(t, rt.handleNewConnection(context.Background(), rwc))
-
-	wg.Wait() // wait for server to drain the connection
 }

+ 2 - 2
server/bucp.go

@@ -7,8 +7,8 @@ import (
 	"os"
 
 	"github.com/google/uuid"
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/oscar"
+	"github.com/mk6i/retro-aim-server/state"
 )
 
 type AuthHandler interface {

+ 1 - 1
server/bucp_test.go

@@ -6,7 +6,7 @@ import (
 	"log/slog"
 	"testing"
 
-	"github.com/mkaminski/goaim/oscar"
+	"github.com/mk6i/retro-aim-server/oscar"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/mock"
 )

+ 1 - 1
server/buddy.go

@@ -5,7 +5,7 @@ import (
 	"io"
 	"log/slog"
 
-	"github.com/mkaminski/goaim/oscar"
+	"github.com/mk6i/retro-aim-server/oscar"
 )
 
 type BuddyHandler interface {

+ 1 - 1
server/buddy_mock_test.go

@@ -5,7 +5,7 @@ package server
 import (
 	context "context"
 
-	oscar "github.com/mkaminski/goaim/oscar"
+	oscar "github.com/mk6i/retro-aim-server/oscar"
 	mock "github.com/stretchr/testify/mock"
 )
 

+ 1 - 1
server/buddy_test.go

@@ -5,7 +5,7 @@ import (
 	"log/slog"
 	"testing"
 
-	"github.com/mkaminski/goaim/oscar"
+	"github.com/mk6i/retro-aim-server/oscar"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/mock"
 )

+ 2 - 2
server/chat.go

@@ -5,8 +5,8 @@ import (
 	"io"
 	"log/slog"
 
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/oscar"
+	"github.com/mk6i/retro-aim-server/state"
 )
 
 type ChatHandler interface {

+ 2 - 2
server/chat_mock_test.go

@@ -5,10 +5,10 @@ package server
 import (
 	context "context"
 
-	oscar "github.com/mkaminski/goaim/oscar"
+	oscar "github.com/mk6i/retro-aim-server/oscar"
 	mock "github.com/stretchr/testify/mock"
 
-	state "github.com/mkaminski/goaim/state"
+	state "github.com/mk6i/retro-aim-server/state"
 )
 
 // mockChatHandler is an autogenerated mock type for the ChatHandler type

+ 2 - 2
server/chat_nav.go

@@ -5,8 +5,8 @@ import (
 	"io"
 	"log/slog"
 
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/oscar"
+	"github.com/mk6i/retro-aim-server/state"
 )
 
 type ChatNavHandler interface {

+ 2 - 2
server/chat_nav_mock_test.go

@@ -5,10 +5,10 @@ package server
 import (
 	context "context"
 
-	oscar "github.com/mkaminski/goaim/oscar"
+	oscar "github.com/mk6i/retro-aim-server/oscar"
 	mock "github.com/stretchr/testify/mock"
 
-	state "github.com/mkaminski/goaim/state"
+	state "github.com/mk6i/retro-aim-server/state"
 )
 
 // mockChatNavHandler is an autogenerated mock type for the ChatNavHandler type

+ 1 - 1
server/chat_nav_test.go

@@ -4,7 +4,7 @@ import (
 	"bytes"
 	"testing"
 
-	"github.com/mkaminski/goaim/oscar"
+	"github.com/mk6i/retro-aim-server/oscar"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/mock"
 )

+ 9 - 10
server/chat_service.go

@@ -8,8 +8,8 @@ import (
 	"net"
 	"os"
 
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/oscar"
+	"github.com/mk6i/retro-aim-server/state"
 )
 
 // ChatServiceRouter is the interface that defines the entrypoint to the BOS service.
@@ -57,15 +57,14 @@ func (rt ChatService) Start() {
 			if err := rt.handleNewConnection(ctx, conn); err != nil {
 				rt.Logger.Info("user session failed", "err", err.Error())
 			}
-			conn.Close()
 		}()
 	}
 }
 
-func (rt ChatService) handleNewConnection(ctx context.Context, rw io.ReadWriter) error {
+func (rt ChatService) handleNewConnection(ctx context.Context, rwc io.ReadWriteCloser) error {
 	seq := uint32(100)
 
-	flap, err := flapSignonHandshake(rw, &seq)
+	flap, err := flapSignonHandshake(rwc, &seq)
 	if err != nil {
 		return err
 	}
@@ -90,16 +89,16 @@ func (rt ChatService) handleNewConnection(ctx context.Context, rw io.ReadWriter)
 		return errors.New("session not found")
 	}
 
-	defer chatSess.Close()
-	go func() {
-		<-chatSess.Closed()
+	defer func() {
+		chatSess.Close()
+		rwc.Close()
 		if err := rt.SignoutChat(ctx, chatSess, chatID); err != nil {
 			rt.Logger.ErrorContext(ctx, "unable to sign out user", "err", err.Error())
 		}
 	}()
 
 	msg := rt.WriteOServiceHostOnline()
-	if err := sendSNAC(msg.Frame, msg.Body, &seq, rw); err != nil {
+	if err := sendSNAC(msg.Frame, msg.Body, &seq, rwc); err != nil {
 		return err
 	}
 
@@ -110,6 +109,6 @@ func (rt ChatService) handleNewConnection(ctx context.Context, rw io.ReadWriter)
 		return sendSNAC(msg.Frame, msg.Body, seq, w)
 	}
 	ctx = context.WithValue(ctx, "screenName", chatSess.ScreenName())
-	dispatchIncomingMessages(ctx, chatSess, seq, rw, rt.Logger, fnClientReqHandler, fnAlertHandler)
+	dispatchIncomingMessages(ctx, chatSess, seq, rwc, rt.Logger, fnClientReqHandler, fnAlertHandler)
 	return nil
 }

+ 2 - 2
server/chat_service_router.go

@@ -5,8 +5,8 @@ import (
 	"errors"
 	"io"
 
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/oscar"
+	"github.com/mk6i/retro-aim-server/state"
 )
 
 type ChatServiceRooterRouter struct {

+ 1 - 1
server/chat_service_router_mock_test.go

@@ -8,7 +8,7 @@ import (
 
 	mock "github.com/stretchr/testify/mock"
 
-	state "github.com/mkaminski/goaim/state"
+	state "github.com/mk6i/retro-aim-server/state"
 )
 
 // mockChatServiceRouter is an autogenerated mock type for the ChatServiceRouter type

+ 2 - 11
server/chat_service_test.go

@@ -5,11 +5,10 @@ import (
 	"context"
 	"io"
 	"log/slog"
-	"sync"
 	"testing"
 
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/oscar"
+	"github.com/mk6i/retro-aim-server/state"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/mock"
 )
@@ -22,9 +21,6 @@ func TestChatService_handleNewConnection(t *testing.T) {
 	clientReader, serverWriter := io.Pipe()
 	serverReader, clientWriter := io.Pipe()
 
-	wg := sync.WaitGroup{}
-	wg.Add(1)
-
 	go func() {
 		// < receive FLAPSignonFrame
 		flap := oscar.FLAPFrame{}
@@ -81,9 +77,6 @@ func TestChatService_handleNewConnection(t *testing.T) {
 		Return(sess, nil)
 	authHandler.EXPECT().
 		SignoutChat(mock.Anything, sess, chatCookie).
-		Run(func(ctx context.Context, sess *state.Session, chatID string) {
-			wg.Done()
-		}).
 		Return(nil)
 
 	chatHandler := newMockOServiceChatHandler(t)
@@ -112,6 +105,4 @@ func TestChatService_handleNewConnection(t *testing.T) {
 		PipeWriter: clientWriter,
 	}
 	rt.handleNewConnection(context.Background(), rwc)
-
-	wg.Wait() // wait for server to drain the connection
 }

+ 2 - 7
server/chat_test.go

@@ -4,7 +4,7 @@ import (
 	"bytes"
 	"testing"
 
-	"github.com/mkaminski/goaim/oscar"
+	"github.com/mk6i/retro-aim-server/oscar"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/mock"
 )
@@ -78,12 +78,7 @@ func TestChatRouter_RouteChat(t *testing.T) {
 				Return(tc.output, tc.handlerErr).
 				Maybe()
 
-			router := ChatRouter{
-				ChatHandler: svc,
-				RouteLogger: RouteLogger{
-					Logger: NewLogger(Config{}),
-				},
-			}
+			router := NewChatRouter(NewLogger(Config{}), svc)
 
 			bufIn := &bytes.Buffer{}
 			assert.NoError(t, oscar.Marshal(tc.input.Body, bufIn))

+ 2 - 2
server/connection.go

@@ -7,8 +7,8 @@ import (
 	"io"
 	"log/slog"
 
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/oscar"
+	"github.com/mk6i/retro-aim-server/state"
 )
 
 var (

+ 2 - 2
server/connection_test.go

@@ -8,8 +8,8 @@ import (
 	"sync"
 	"testing"
 
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/oscar"
+	"github.com/mk6i/retro-aim-server/state"
 	"github.com/stretchr/testify/assert"
 )
 

+ 2 - 2
server/feedbag.go

@@ -5,8 +5,8 @@ import (
 	"io"
 	"log/slog"
 
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/oscar"
+	"github.com/mk6i/retro-aim-server/state"
 )
 
 type FeedbagHandler interface {

+ 2 - 2
server/feedbag_mock_test.go

@@ -5,10 +5,10 @@ package server
 import (
 	context "context"
 
-	oscar "github.com/mkaminski/goaim/oscar"
+	oscar "github.com/mk6i/retro-aim-server/oscar"
 	mock "github.com/stretchr/testify/mock"
 
-	state "github.com/mkaminski/goaim/state"
+	state "github.com/mk6i/retro-aim-server/state"
 )
 
 // mockFeedbagHandler is an autogenerated mock type for the FeedbagHandler type

+ 1 - 1
server/feedbag_test.go

@@ -4,7 +4,7 @@ import (
 	"bytes"
 	"testing"
 
-	"github.com/mkaminski/goaim/oscar"
+	"github.com/mk6i/retro-aim-server/oscar"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/mock"
 )

+ 2 - 2
server/icbm.go

@@ -5,8 +5,8 @@ import (
 	"io"
 	"log/slog"
 
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/oscar"
+	"github.com/mk6i/retro-aim-server/state"
 )
 
 type ICBMHandler interface {

+ 2 - 2
server/icbm_mock_test.go

@@ -5,10 +5,10 @@ package server
 import (
 	context "context"
 
-	oscar "github.com/mkaminski/goaim/oscar"
+	oscar "github.com/mk6i/retro-aim-server/oscar"
 	mock "github.com/stretchr/testify/mock"
 
-	state "github.com/mkaminski/goaim/state"
+	state "github.com/mk6i/retro-aim-server/state"
 )
 
 // mockICBMHandler is an autogenerated mock type for the ICBMHandler type

+ 1 - 1
server/icbm_test.go

@@ -4,7 +4,7 @@ import (
 	"bytes"
 	"testing"
 
-	"github.com/mkaminski/goaim/oscar"
+	"github.com/mk6i/retro-aim-server/oscar"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/mock"
 )

+ 2 - 2
server/locate.go

@@ -5,8 +5,8 @@ import (
 	"io"
 	"log/slog"
 
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/oscar"
+	"github.com/mk6i/retro-aim-server/state"
 )
 
 type LocateHandler interface {

+ 2 - 2
server/locate_mock_test.go

@@ -5,10 +5,10 @@ package server
 import (
 	context "context"
 
-	oscar "github.com/mkaminski/goaim/oscar"
+	oscar "github.com/mk6i/retro-aim-server/oscar"
 	mock "github.com/stretchr/testify/mock"
 
-	state "github.com/mkaminski/goaim/state"
+	state "github.com/mk6i/retro-aim-server/state"
 )
 
 // mockLocateHandler is an autogenerated mock type for the LocateHandler type

+ 1 - 1
server/locate_test.go

@@ -4,7 +4,7 @@ import (
 	"bytes"
 	"testing"
 
-	"github.com/mkaminski/goaim/oscar"
+	"github.com/mk6i/retro-aim-server/oscar"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/mock"
 )

+ 1 - 1
server/logging.go

@@ -6,7 +6,7 @@ import (
 	"os"
 	"strings"
 
-	"github.com/mkaminski/goaim/oscar"
+	"github.com/mk6i/retro-aim-server/oscar"
 )
 
 const (

+ 1 - 1
server/mgmt_api.go

@@ -8,7 +8,7 @@ import (
 	"os"
 
 	"github.com/google/uuid"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/state"
 )
 
 type UserManager interface {

+ 1 - 1
server/mgmt_api_test.go

@@ -8,7 +8,7 @@ import (
 	"strings"
 	"testing"
 
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/state"
 	"github.com/stretchr/testify/mock"
 )
 

+ 2 - 2
server/oservice.go

@@ -6,8 +6,8 @@ import (
 	"io"
 	"log/slog"
 
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/state"
+	"github.com/mk6i/retro-aim-server/oscar"
+	"github.com/mk6i/retro-aim-server/state"
 )
 
 type OServiceHandler interface {

+ 2 - 2
server/oservice_bos_mock_test.go

@@ -5,10 +5,10 @@ package server
 import (
 	context "context"
 
-	oscar "github.com/mkaminski/goaim/oscar"
+	oscar "github.com/mk6i/retro-aim-server/oscar"
 	mock "github.com/stretchr/testify/mock"
 
-	state "github.com/mkaminski/goaim/state"
+	state "github.com/mk6i/retro-aim-server/state"
 )
 
 // mockOServiceBOSHandler is an autogenerated mock type for the OServiceBOSHandler type

+ 2 - 2
server/oservice_chat_mock_test.go

@@ -5,10 +5,10 @@ package server
 import (
 	context "context"
 
-	oscar "github.com/mkaminski/goaim/oscar"
+	oscar "github.com/mk6i/retro-aim-server/oscar"
 	mock "github.com/stretchr/testify/mock"
 
-	state "github.com/mkaminski/goaim/state"
+	state "github.com/mk6i/retro-aim-server/state"
 )
 
 // mockOServiceChatHandler is an autogenerated mock type for the OServiceChatHandler type

+ 2 - 2
server/oservice_mock_test.go

@@ -5,10 +5,10 @@ package server
 import (
 	context "context"
 
-	oscar "github.com/mkaminski/goaim/oscar"
+	oscar "github.com/mk6i/retro-aim-server/oscar"
 	mock "github.com/stretchr/testify/mock"
 
-	state "github.com/mkaminski/goaim/state"
+	state "github.com/mk6i/retro-aim-server/state"
 )
 
 // mockOServiceHandler is an autogenerated mock type for the OServiceHandler type

+ 1 - 1
server/oservice_test.go

@@ -4,7 +4,7 @@ import (
 	"bytes"
 	"testing"
 
-	"github.com/mkaminski/goaim/oscar"
+	"github.com/mk6i/retro-aim-server/oscar"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/mock"
 )

+ 1 - 1
server/user_manager_mock_test.go

@@ -3,7 +3,7 @@
 package server
 
 import (
-	state "github.com/mkaminski/goaim/state"
+	state "github.com/mk6i/retro-aim-server/state"
 	mock "github.com/stretchr/testify/mock"
 )
 

+ 1 - 1
state/chat_registry.go

@@ -7,7 +7,7 @@ import (
 	"time"
 
 	"github.com/google/uuid"
-	"github.com/mkaminski/goaim/oscar"
+	"github.com/mk6i/retro-aim-server/oscar"
 )
 
 // ErrChatRoomNotFound indicates that a chat room lookup failed.

+ 1 - 1
state/chat_registry_test.go

@@ -3,7 +3,7 @@ package state
 import (
 	"testing"
 
-	"github.com/mkaminski/goaim/oscar"
+	"github.com/mk6i/retro-aim-server/oscar"
 	"github.com/stretchr/testify/assert"
 )
 

+ 1 - 1
state/session.go

@@ -5,7 +5,7 @@ import (
 	"time"
 
 	"github.com/google/uuid"
-	"github.com/mkaminski/goaim/oscar"
+	"github.com/mk6i/retro-aim-server/oscar"
 )
 
 // capChat is a UID that indicates a client supports the chat capability

+ 1 - 1
state/session_manager.go

@@ -5,7 +5,7 @@ import (
 	"log/slog"
 	"sync"
 
-	"github.com/mkaminski/goaim/oscar"
+	"github.com/mk6i/retro-aim-server/oscar"
 )
 
 // InMemorySessionManager handles the lifecycle of a user session and provides

+ 1 - 1
state/session_manager_test.go

@@ -5,7 +5,7 @@ import (
 	"log/slog"
 	"testing"
 
-	"github.com/mkaminski/goaim/oscar"
+	"github.com/mk6i/retro-aim-server/oscar"
 	"github.com/stretchr/testify/assert"
 )
 

+ 1 - 1
state/session_test.go

@@ -5,7 +5,7 @@ import (
 	"testing"
 	"time"
 
-	"github.com/mkaminski/goaim/oscar"
+	"github.com/mk6i/retro-aim-server/oscar"
 	"github.com/stretchr/testify/assert"
 )
 

+ 1 - 1
state/user_store.go

@@ -10,7 +10,7 @@ import (
 
 	"github.com/google/uuid"
 	_ "github.com/mattn/go-sqlite3"
-	"github.com/mkaminski/goaim/oscar"
+	"github.com/mk6i/retro-aim-server/oscar"
 )
 
 var userStoreDDL = `

+ 1 - 1
state/user_store_test.go

@@ -5,7 +5,7 @@ import (
 	"reflect"
 	"testing"
 
-	"github.com/mkaminski/goaim/oscar"
+	"github.com/mk6i/retro-aim-server/oscar"
 	"github.com/stretchr/testify/assert"
 )