Skip to content

Commit c8348b4

Browse files
ivanmurashkofacebook-github-bot
authored andcommitted
Mock Scuba Logger
Summary: This diff introduces a mock implementation for the Scuba logger in the Glean Swift client. Reviewed By: dmpolukhin Differential Revision: D79433160 fbshipit-source-id: 0f67f537b3965c8fece91b0691a68b01ab02ca17
1 parent 507df0c commit c8348b4

4 files changed

Lines changed: 142 additions & 6 deletions

File tree

glean/client/swift/JsonServer.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ void JsonServer::setGlassAccess(std::unique_ptr<IGlassAccess> glassAccess) {
2020
glassAccess_ = std::move(glassAccess);
2121
}
2222

23+
void JsonServer::setScubaLogger(
24+
std::unique_ptr<facebook::glean::swift::ScubaLogger> scubaLogger) {
25+
scubaLogger_ = std::move(scubaLogger);
26+
}
27+
2328
void JsonServer::start(std::istream& input, std::ostream& output) {
2429
running_ = true;
2530

glean/client/swift/JsonServer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ class JsonServer {
2727
JsonServer& operator=(JsonServer&&) = delete;
2828

2929
void setGlassAccess(std::unique_ptr<IGlassAccess> glassAccess);
30+
void setScubaLogger(
31+
std::unique_ptr<facebook::glean::swift::ScubaLogger> scubaLogger);
3032
void start(std::istream& input = std::cin, std::ostream& output = std::cout);
3133
void stop();
3234

glean/client/swift/test/JsonServerTest.cpp

Lines changed: 50 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,19 @@
99
#include "glean/client/swift/JsonServer.h"
1010
#include <gmock/gmock.h>
1111
#include <gtest/gtest.h>
12-
#include <chrono>
1312
#include <memory>
1413
#include <sstream>
15-
#include <thread>
1614
#include "glean/client/swift/test/GlassAccessMock.h"
17-
18-
using ::testing::Return;
15+
#include "glean/client/swift/test/ScubaLoggerMock.h"
1916

2017
class JsonServerTest : public ::testing::Test {
2118
protected:
2219
void SetUp() override {
2320
// Create JsonServer and set mock GlassAccess
2421
server_ = std::make_unique<JsonServer>();
2522
mockGlassAccess_ = std::make_unique<GlassAccessMock>();
23+
mockScubaLogger_ =
24+
std::make_unique<facebook::glean::swift::ScubaLoggerMock>();
2625

2726
// Set up default expectations for the mock
2827
protocol::LocationList defaultLocations;
@@ -36,12 +35,16 @@ class JsonServerTest : public ::testing::Test {
3635
*mockGlassAccess_,
3736
usrToDefinition(
3837
"s:12IGFriendsMap0aB4ViewC03mapC0So05MKMapC0CvgAFyXEfU_ADL_AFvp"))
39-
.WillByDefault(Return(defaultLocations));
38+
.WillByDefault(testing::Return(defaultLocations));
4039

4140
ON_CALL(*mockGlassAccess_, usrToDefinition("unknown_usr"))
42-
.WillByDefault(Return(std::nullopt));
41+
.WillByDefault(testing::Return(std::nullopt));
42+
43+
// Store raw pointer before moving to server
44+
mockScubaLoggerPtr_ = mockScubaLogger_.get();
4345

4446
server_->setGlassAccess(std::move(mockGlassAccess_));
47+
server_->setScubaLogger(std::move(mockScubaLogger_));
4548
}
4649

4750
void TearDown() override {
@@ -53,6 +56,8 @@ class JsonServerTest : public ::testing::Test {
5356

5457
std::unique_ptr<JsonServer> server_;
5558
std::unique_ptr<GlassAccessMock> mockGlassAccess_;
59+
std::unique_ptr<facebook::glean::swift::ScubaLoggerMock> mockScubaLogger_;
60+
facebook::glean::swift::ScubaLoggerMock* mockScubaLoggerPtr_{};
5661
};
5762

5863
TEST_F(JsonServerTest, USRToDefinitionRequest) {
@@ -76,6 +81,15 @@ TEST_F(JsonServerTest, USRToDefinitionRequest) {
7681
EXPECT_TRUE(result.find("\"line\":25") != std::string::npos);
7782
EXPECT_TRUE(result.find("\"character\":4") != std::string::npos);
7883
EXPECT_TRUE(result.find("\"character\":30") != std::string::npos);
84+
85+
// Verify ScubaLogger was called with correct parameters
86+
mockScubaLoggerPtr_->expectLogRequest(
87+
"usrToDefinition",
88+
"s:12IGFriendsMap0aB4ViewC03mapC0So05MKMapC0CvgAFyXEfU_ADL_AFvp",
89+
facebook::glean::swift::USRType::SWIFT,
90+
facebook::glean::swift::Status::SUCCESS,
91+
"",
92+
"production");
7993
}
8094

8195
TEST_F(JsonServerTest, USRToDefinitionRequestNoResults) {
@@ -93,6 +107,15 @@ TEST_F(JsonServerTest, USRToDefinitionRequestNoResults) {
93107
// Verify the response contains expected JSON structure with empty result
94108
EXPECT_TRUE(result.find("\"id\":2") != std::string::npos);
95109
EXPECT_TRUE(result.find("\"result\":[]") != std::string::npos);
110+
111+
// Verify ScubaLogger was called with correct parameters
112+
mockScubaLoggerPtr_->expectLogRequest(
113+
"clangUSRToDefinition",
114+
"unknown_usr",
115+
facebook::glean::swift::USRType::UNKNOWN,
116+
facebook::glean::swift::Status::NOT_FOUND,
117+
"",
118+
"production");
96119
}
97120

98121
TEST_F(JsonServerTest, UnknownMethodRequest) {
@@ -113,6 +136,15 @@ TEST_F(JsonServerTest, UnknownMethodRequest) {
113136
EXPECT_TRUE(result.find("\"code\":-32601") != std::string::npos);
114137
EXPECT_TRUE(
115138
result.find("\"message\":\"Method not found\"") != std::string::npos);
139+
140+
// Verify ScubaLogger was called with correct parameters
141+
mockScubaLoggerPtr_->expectLogRequest(
142+
"UnknownMethod",
143+
"test",
144+
facebook::glean::swift::USRType::UNKNOWN,
145+
facebook::glean::swift::Status::FAILED,
146+
"Method not found",
147+
"production");
116148
}
117149

118150
TEST_F(JsonServerTest, InvalidJSONRequest) {
@@ -130,4 +162,16 @@ TEST_F(JsonServerTest, InvalidJSONRequest) {
130162
EXPECT_TRUE(result.find("\"error\"") != std::string::npos);
131163
EXPECT_TRUE(result.find("\"code\":-32700") != std::string::npos);
132164
EXPECT_TRUE(result.find("\"message\":\"Parse error:") != std::string::npos);
165+
166+
// Verify ScubaLogger was called with correct parameters
167+
EXPECT_EQ(1, mockScubaLoggerPtr_->logRequestCallCount);
168+
EXPECT_EQ("unknown", mockScubaLoggerPtr_->lastMethod);
169+
EXPECT_EQ("", mockScubaLoggerPtr_->lastUsr);
170+
EXPECT_EQ(
171+
facebook::glean::swift::USRType::UNKNOWN,
172+
mockScubaLoggerPtr_->lastUsrType);
173+
EXPECT_EQ(
174+
facebook::glean::swift::Status::FAILED, mockScubaLoggerPtr_->lastStatus);
175+
EXPECT_TRUE(mockScubaLoggerPtr_->lastError.find("Parse error:") == 0);
176+
EXPECT_EQ("production", mockScubaLoggerPtr_->lastMode);
133177
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
/*
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
* All rights reserved.
4+
*
5+
* This source code is licensed under the BSD-style license found in the
6+
* LICENSE file in the root directory of this source tree.
7+
*/
8+
9+
#pragma once
10+
11+
#include <gmock/gmock.h>
12+
#include "glean/client/swift/ScubaLogger.h"
13+
14+
namespace facebook::glean::swift {
15+
16+
class ScubaLoggerMock : public ScubaLogger {
17+
public:
18+
mutable int logRequestCallCount = 0;
19+
mutable std::string lastMethod;
20+
mutable std::string lastUsr;
21+
mutable USRType lastUsrType{USRType::UNKNOWN};
22+
mutable std::string lastResult;
23+
mutable Status lastStatus{Status::FAILED};
24+
mutable int64_t lastDuration{};
25+
mutable std::string lastError;
26+
mutable std::optional<std::string> lastRevision;
27+
mutable std::string lastMode;
28+
29+
void logRequest(
30+
facebook::rfe::ScubaData* scubaLogger,
31+
const std::string& method,
32+
const std::string& usr,
33+
USRType usrType,
34+
const std::string& result,
35+
Status status,
36+
int64_t duration,
37+
const std::string& error = "",
38+
const std::optional<std::string>& revision = std::nullopt,
39+
const std::string& mode = "production") override {
40+
(void)scubaLogger; // Suppress unused parameter warning
41+
// Don't actually log to Scuba, just record the call
42+
logRequestCallCount++;
43+
lastMethod = method;
44+
lastUsr = usr;
45+
lastUsrType = usrType;
46+
lastResult = result;
47+
lastStatus = status;
48+
lastDuration = duration;
49+
lastError = error;
50+
lastRevision = revision;
51+
lastMode = mode;
52+
}
53+
54+
// Helper methods for testing
55+
void expectLogRequest(
56+
const std::string& expectedMethod,
57+
const std::string& expectedUsr,
58+
USRType expectedUsrType,
59+
Status expectedStatus,
60+
const std::string& expectedError = "",
61+
const std::string& expectedMode = "production") const {
62+
EXPECT_EQ(1, logRequestCallCount);
63+
EXPECT_EQ(expectedMethod, lastMethod);
64+
EXPECT_EQ(expectedUsr, lastUsr);
65+
EXPECT_EQ(expectedUsrType, lastUsrType);
66+
EXPECT_EQ(expectedStatus, lastStatus);
67+
EXPECT_EQ(expectedError, lastError);
68+
EXPECT_EQ(expectedMode, lastMode);
69+
}
70+
71+
void reset() {
72+
logRequestCallCount = 0;
73+
lastMethod.clear();
74+
lastUsr.clear();
75+
lastUsrType = USRType::UNKNOWN;
76+
lastResult.clear();
77+
lastStatus = Status::FAILED;
78+
lastDuration = 0;
79+
lastError.clear();
80+
lastRevision = std::nullopt;
81+
lastMode.clear();
82+
}
83+
};
84+
85+
} // namespace facebook::glean::swift

0 commit comments

Comments
 (0)