packageloggerimport("honeypot/internal/database""honeypot/internal/types""log/slog""net/http""os""testing")typemockMetricsCollectorstruct{events[]types.LogEvent}func(m*mockMetricsCollector)RecordEvent(etypes.LogEvent){m.events=append(m.events,e)}func(m*mockMetricsCollector)GetHandler()http.Handler{returnnil}func(m*mockMetricsCollector)SetDatabase(db*database.Database){}typemockEventSinkstruct{events[]types.LogEvent}func(m*mockEventSink)EmitEvent(etypes.LogEvent){m.events=append(m.events,e)}funcTestLogEvent(t*testing.T){logger:=slog.New(slog.NewJSONHandler(os.Stdout,nil))metrics:=&mockMetricsCollector{}sink:=&mockEventSink{}RegisterMetricsCollector(metrics)RegisterEventSink(sink)e:=types.LogEvent{Type:"test",Event:"unit_test",RemoteAddr:"1.2.3.4",Fields:map[string]interface{}{"foo":"bar"},}LogEvent(logger,e)iflen(metrics.events)!=1{t.Errorf("expected 1 event in metrics, got %v",len(metrics.events))}iflen(sink.events)!=1{t.Errorf("expected 1 event in sink, got %v",len(sink.events))}ifmetrics.events[0].Type!="test"{t.Errorf("expected type 'test', got %v",metrics.events[0].Type)}}funcTestSetup(t*testing.T){logFile:="test.log"deferos.Remove(logFile)logger,err:=Setup(logFile)iferr!=nil{t.Fatalf("Setup failed: %v",err)}iflogger==nil{t.Fatal("Setup returned nil logger")}if_,err:=os.Stat(logFile);os.IsNotExist(err){t.Error("log file was not created")}}funcTestRegisterDatabase(t*testing.T){db:=&database.Database{}RegisterDatabase(db)ifglobalDatabase.DB!=db.DB{t.Error("database was not registered correctly")}}funcTestLogError(t*testing.T){logger:=slog.New(slog.NewJSONHandler(os.Stdout,nil))LogError(logger,"test","error_event",os.ErrNotExist,[]any{"extra","info"})// Primarily verifying it doesn't panic and prints to stderr}funcTestLogInfo(t*testing.T){logger:=slog.New(slog.NewJSONHandler(os.Stdout,nil))LogInfo(logger,"test","info message",[]any{"extra","info"})// Primarily verifying it doesn't panic and prints to stdout}typetopNMockstruct{mockMetricsCollectorregisteredTypestringregisteredFieldstring}func(m*topNMock)RegisterTopNField(honeypotType,fieldNamestring){m.registeredType=honeypotTypem.registeredField=fieldName}funcTestRegisterTopNField(t*testing.T){mock:=&topNMock{}RegisterMetricsCollector(mock)RegisterTopNField("ssh","username")ifmock.registeredType!="ssh"||mock.registeredField!="username"{t.Errorf("expected ssh/username, got %v/%v",mock.registeredType,mock.registeredField)}}