@@ -258,6 +258,25 @@ BOOST_AUTO_TEST_CASE(it_determines_whether_a_project_is_eligible)
258
258
BOOST_CHECK (project.Eligible () == false );
259
259
}
260
260
261
+ BOOST_AUTO_TEST_CASE (it_detects_projects_with_pool_cpids)
262
+ {
263
+ // The XML string contains a subset of data found within a <project> element
264
+ // from BOINC's client_state.xml file:
265
+ //
266
+ NN::MiningProject project = NN::MiningProject::Parse (
267
+ R"XML(
268
+ <project>
269
+ <master_url>https://example.com/</master_url>
270
+ <project_name>Project Name</project_name>
271
+ <team_name>Team Name</team_name>
272
+ <cross_project_id>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</cross_project_id>
273
+ <external_cpid>7d0d73fe026d66fd4ab8d5d8da32a611</external_cpid>
274
+ </project>
275
+ )XML" );
276
+
277
+ BOOST_CHECK (project.m_error == NN::MiningProject::Error::POOL);
278
+ }
279
+
261
280
BOOST_AUTO_TEST_CASE (it_determines_whether_a_project_is_whitelisted)
262
281
{
263
282
NN::MiningProject project (" project name" , NN::Cpid (), " team name" , " url" );
@@ -464,6 +483,17 @@ BOOST_AUTO_TEST_CASE(it_indicates_whether_it_contains_any_projects)
464
483
BOOST_CHECK (projects.empty () == false );
465
484
}
466
485
486
+ BOOST_AUTO_TEST_CASE (it_indicates_whether_it_contains_any_pool_projects)
487
+ {
488
+ NN::MiningProjectMap projects;
489
+ NN::MiningProject project (" project name" , NN::Cpid (), " team name" , " url" );
490
+
491
+ project.m_error = NN::MiningProject::Error::POOL;
492
+ projects.Set (std::move (project));
493
+
494
+ BOOST_CHECK (projects.ContainsPool () == true );
495
+ }
496
+
467
497
BOOST_AUTO_TEST_CASE (it_fetches_a_project_by_name)
468
498
{
469
499
NN::MiningProjectMap projects;
@@ -855,6 +885,15 @@ BOOST_AUTO_TEST_CASE(it_tags_invalid_projects_with_errors_when_parsing_xml)
855
885
<external_cpid>f5d8234352e5a5ae3915debba7258294</external_cpid>
856
886
</project>
857
887
)XML" ,
888
+ // Pool CPID:
889
+ R"XML(
890
+ <project>
891
+ <master_url>https://example.com/</master_url>
892
+ <project_name>Project Name 7</project_name>
893
+ <team_name>Gridcoin</team_name>
894
+ <external_cpid>7d0d73fe026d66fd4ab8d5d8da32a611</external_cpid>
895
+ </project>
896
+ )XML" ,
858
897
}));
859
898
860
899
NN::Cpid cpid = NN::Cpid::Parse (" f5d8234352e5a5ae3915debba7258294" );
@@ -863,7 +902,7 @@ BOOST_AUTO_TEST_CASE(it_tags_invalid_projects_with_errors_when_parsing_xml)
863
902
BOOST_CHECK (NN::Researcher::Get ()->Id () == NN::MiningId::ForInvestor ());
864
903
865
904
const NN::MiningProjectMap& projects = NN::Researcher::Get ()->Projects ();
866
- BOOST_CHECK (projects.size () == 6 );
905
+ BOOST_CHECK (projects.size () == 7 );
867
906
868
907
if (const NN::ProjectOption project1 = projects.Try (" project name 1" )) {
869
908
BOOST_CHECK (project1->m_name == " project name 1" );
@@ -925,6 +964,14 @@ BOOST_AUTO_TEST_CASE(it_tags_invalid_projects_with_errors_when_parsing_xml)
925
964
BOOST_FAIL (" Project 6 does not exist in the mining project map." );
926
965
}
927
966
967
+ if (const NN::ProjectOption project6 = projects.Try (" project name 7" )) {
968
+ BOOST_CHECK (project6->m_name == " project name 7" );
969
+ BOOST_CHECK (project6->m_error == NN::MiningProject::Error::POOL);
970
+ BOOST_CHECK (project6->Eligible () == false );
971
+ } else {
972
+ BOOST_FAIL (" Project 7 does not exist in the mining project map." );
973
+ }
974
+
928
975
// Clean up:
929
976
SetArgument (" email" , " " );
930
977
NN::Researcher::Reload (NN::MiningProjectMap ());
@@ -1484,4 +1531,85 @@ BOOST_AUTO_TEST_CASE(it_resets_to_investor_mode_when_explicitly_configured,
1484
1531
NN::Researcher::Reload (NN::MiningProjectMap ());
1485
1532
}
1486
1533
1534
+ BOOST_AUTO_TEST_CASE (it_resets_to_investor_when_it_only_finds_pool_projects)
1535
+ {
1536
+ const NN::Cpid cpid = NN::Cpid::Parse (" f5d8234352e5a5ae3915debba7258294" );
1537
+ SetArgument (
" email" ,
" [email protected] " );
1538
+ AddTestBeacon (cpid);
1539
+
1540
+ // External CPID is a pool CPID:
1541
+ NN::Researcher::Reload (NN::MiningProjectMap::Parse ({
1542
+ R"XML(
1543
+ <project>
1544
+ <master_url>https://example.com/</master_url>
1545
+ <project_name>Pool Project</project_name>
1546
+ <team_name>Gridcoin</team_name>
1547
+ <cross_project_id>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</cross_project_id>
1548
+ <external_cpid>7d0d73fe026d66fd4ab8d5d8da32a611</external_cpid>
1549
+ </project>
1550
+ )XML" ,
1551
+ }));
1552
+
1553
+ BOOST_CHECK (NN::Researcher::Get ()->Id () == NN::MiningId::ForInvestor ());
1554
+ BOOST_CHECK (NN::Researcher::Get ()->Eligible () == false );
1555
+ BOOST_CHECK (NN::Researcher::Get ()->Status () == NN::ResearcherStatus::POOL);
1556
+
1557
+ NN::Researcher::Reload (NN::MiningProjectMap::Parse ({
1558
+ R"XML(
1559
+ <project>
1560
+ <master_url>https://example.com/</master_url>
1561
+ <project_name>My Project</project_name>
1562
+ <team_name>Gridcoin</team_name>
1563
+ <cross_project_id>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</cross_project_id>
1564
+ <external_cpid>7d0d73fe026d66fd4ab8d5d8da32a611</external_cpid>
1565
+ </project>
1566
+ )XML" ,
1567
+ R"XML(
1568
+ <project>
1569
+ <master_url>https://example.com/</master_url>
1570
+ <project_name>Pool Project</project_name>
1571
+ <team_name>Gridcoin</team_name>
1572
+ <cross_project_id>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</cross_project_id>
1573
+ <external_cpid>f5d8234352e5a5ae3915debba7258294</external_cpid>
1574
+ </project>
1575
+ )XML" ,
1576
+ }));
1577
+
1578
+ BOOST_CHECK (NN::Researcher::Get ()->Id () == cpid);
1579
+ BOOST_CHECK (NN::Researcher::Get ()->Eligible () == true );
1580
+ BOOST_CHECK (NN::Researcher::Get ()->Status () != NN::ResearcherStatus::POOL);
1581
+
1582
+ // Clean up:
1583
+ SetArgument (" email" , " " );
1584
+ RemoveTestBeacon (cpid);
1585
+ NN::Researcher::Reload (NN::MiningProjectMap ());
1586
+ }
1587
+
1588
+ BOOST_AUTO_TEST_CASE (it_allows_pool_operators_to_load_pool_cpids)
1589
+ {
1590
+ SetArgument (" pooloperator" , " 1" );
1591
+
1592
+ // External CPID is a pool CPID:
1593
+ NN::Researcher::Reload (NN::MiningProjectMap::Parse ({
1594
+ R"XML(
1595
+ <project>
1596
+ <master_url>https://example.com/</master_url>
1597
+ <project_name>Name</project_name>
1598
+ <team_name>Gridcoin</team_name>
1599
+ <cross_project_id>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</cross_project_id>
1600
+ <external_cpid>7d0d73fe026d66fd4ab8d5d8da32a611</external_cpid>
1601
+ </project>
1602
+ )XML" ,
1603
+ }));
1604
+
1605
+ // We can't completely test that a pool CPID loads, but we can check that
1606
+ // the it didn't fail because of the pool CPID:
1607
+ //
1608
+ BOOST_CHECK (NN::Researcher::Get ()->Status () != NN::ResearcherStatus::POOL);
1609
+
1610
+ // Clean up:
1611
+ SetArgument (" pooloperator" , " 0" );
1612
+ NN::Researcher::Reload (NN::MiningProjectMap ());
1613
+ }
1614
+
1487
1615
BOOST_AUTO_TEST_SUITE_END ()
0 commit comments