1- #include < fmt/format.h>
21#include < gmock/gmock.h>
32#include < gtest/gtest.h>
43#include < chrono>
109
1110#include " MockSandboxDelegate.h"
1211
13- using namespace facebook ::react ;
12+ using namespace rnsandbox ;
1413using ::testing::_;
1514using ::testing::Return;
1615using ::testing::StrictMock;
@@ -82,23 +81,66 @@ TEST_F(SandboxRegistryTest, EmptyAllowedOrigins) {
8281 EXPECT_FALSE (registry.isPermittedFrom (" test-origin" , " any-origin" ));
8382}
8483
85- TEST_F (SandboxRegistryTest, OverwriteExistingSandbox ) {
84+ TEST_F (SandboxRegistryTest, MultipleDelegatesSameOrigin ) {
8685 auto & registry = SandboxRegistry::getInstance ();
87- auto mockDelegate1 = std::make_shared<StrictMock<MockSandboxDelegate>>();
88- auto mockDelegate2 = std::make_shared<StrictMock<MockSandboxDelegate>>();
86+ auto delegate1 = std::make_shared<StrictMock<MockSandboxDelegate>>();
87+ auto delegate2 = std::make_shared<StrictMock<MockSandboxDelegate>>();
8988
90- std::set<std::string> allowedOrigins1 = {" allowed1" };
91- std::set<std::string> allowedOrigins2 = {" allowed2" };
89+ std::set<std::string> allowedOrigins = {" other" };
90+ registry.registerSandbox (" shared" , delegate1, allowedOrigins);
91+ registry.registerSandbox (" shared" , delegate2, allowedOrigins);
9292
93- registry.registerSandbox (" test-origin" , mockDelegate1, allowedOrigins1);
93+ // find returns the first
94+ EXPECT_EQ (registry.find (" shared" ), delegate1);
9495
95- registry.registerSandbox (" test-origin" , mockDelegate2, allowedOrigins2);
96+ // findAll returns both
97+ auto all = registry.findAll (" shared" );
98+ EXPECT_EQ (all.size (), 2u );
99+ EXPECT_EQ (all[0 ], delegate1);
100+ EXPECT_EQ (all[1 ], delegate2);
101+ }
96102
97- auto found = registry.find (" test-origin" );
98- EXPECT_EQ (found, mockDelegate2);
103+ TEST_F (SandboxRegistryTest, UnregisterDelegateRemovesOnlyThatDelegate) {
104+ auto & registry = SandboxRegistry::getInstance ();
105+ auto delegate1 = std::make_shared<StrictMock<MockSandboxDelegate>>();
106+ auto delegate2 = std::make_shared<StrictMock<MockSandboxDelegate>>();
99107
100- EXPECT_FALSE (registry.isPermittedFrom (" allowed2" , " test-origin" ));
101- EXPECT_FALSE (registry.isPermittedFrom (" allowed1" , " test-origin" ));
108+ std::set<std::string> allowedOrigins = {" other" };
109+ registry.registerSandbox (" shared" , delegate1, allowedOrigins);
110+ registry.registerSandbox (" shared" , delegate2, allowedOrigins);
111+
112+ registry.unregisterDelegate (" shared" , delegate1);
113+
114+ auto all = registry.findAll (" shared" );
115+ EXPECT_EQ (all.size (), 1u );
116+ EXPECT_EQ (all[0 ], delegate2);
117+ EXPECT_EQ (registry.find (" shared" ), delegate2);
118+ }
119+
120+ TEST_F (SandboxRegistryTest, UnregisterDelegateLastCleansUpOrigin) {
121+ auto & registry = SandboxRegistry::getInstance ();
122+ auto delegate = std::make_shared<StrictMock<MockSandboxDelegate>>();
123+
124+ std::set<std::string> allowedOrigins = {" other" };
125+ registry.registerSandbox (" solo" , delegate, allowedOrigins);
126+
127+ registry.unregisterDelegate (" solo" , delegate);
128+
129+ EXPECT_EQ (registry.find (" solo" ), nullptr );
130+ EXPECT_TRUE (registry.findAll (" solo" ).empty ());
131+ EXPECT_FALSE (registry.isPermittedFrom (" solo" , " other" ));
132+ }
133+
134+ TEST_F (SandboxRegistryTest, DuplicateRegistrationIgnored) {
135+ auto & registry = SandboxRegistry::getInstance ();
136+ auto delegate = std::make_shared<StrictMock<MockSandboxDelegate>>();
137+
138+ std::set<std::string> allowedOrigins;
139+ registry.registerSandbox (" dup" , delegate, allowedOrigins);
140+ registry.registerSandbox (" dup" , delegate, allowedOrigins);
141+
142+ auto all = registry.findAll (" dup" );
143+ EXPECT_EQ (all.size (), 1u );
102144}
103145
104146TEST_F (SandboxRegistryTest, EmptyOriginHandling) {
@@ -167,7 +209,7 @@ TEST_F(SandboxRegistryTest, ThreadSafety) {
167209 EXPECT_TRUE (registry.isPermittedFrom (origin, " other_sandbox" ));
168210 EXPECT_FALSE (registry.isPermittedFrom (origin, " blocked_sandbox" ));
169211
170- registry.unregister (origin);
212+ registry.unregisterDelegate (origin, mockDelegate );
171213
172214 auto notFound = registry.find (origin);
173215 EXPECT_EQ (notFound, nullptr );
@@ -180,4 +222,4 @@ TEST_F(SandboxRegistryTest, ThreadSafety) {
180222 EXPECT_EQ (status, std::future_status::ready)
181223 << " Thread safety test timed out after 5 seconds" ;
182224 }
183- }
225+ }
0 commit comments