@@ -258,6 +258,25 @@ BOOST_AUTO_TEST_CASE(it_determines_whether_a_project_is_eligible)
258258 BOOST_CHECK (project.Eligible () == false );
259259}
260260
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+
261280BOOST_AUTO_TEST_CASE (it_determines_whether_a_project_is_whitelisted)
262281{
263282 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)
464483 BOOST_CHECK (projects.empty () == false );
465484}
466485
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+
467497BOOST_AUTO_TEST_CASE (it_fetches_a_project_by_name)
468498{
469499 NN::MiningProjectMap projects;
@@ -855,6 +885,15 @@ BOOST_AUTO_TEST_CASE(it_tags_invalid_projects_with_errors_when_parsing_xml)
855885 <external_cpid>f5d8234352e5a5ae3915debba7258294</external_cpid>
856886 </project>
857887 )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" ,
858897 }));
859898
860899 NN::Cpid cpid = NN::Cpid::Parse (" f5d8234352e5a5ae3915debba7258294" );
@@ -863,7 +902,7 @@ BOOST_AUTO_TEST_CASE(it_tags_invalid_projects_with_errors_when_parsing_xml)
863902 BOOST_CHECK (NN::Researcher::Get ()->Id () == NN::MiningId::ForInvestor ());
864903
865904 const NN::MiningProjectMap& projects = NN::Researcher::Get ()->Projects ();
866- BOOST_CHECK (projects.size () == 6 );
905+ BOOST_CHECK (projects.size () == 7 );
867906
868907 if (const NN::ProjectOption project1 = projects.Try (" project name 1" )) {
869908 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)
925964 BOOST_FAIL (" Project 6 does not exist in the mining project map." );
926965 }
927966
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+
928975 // Clean up:
929976 SetArgument (" email" , " " );
930977 NN::Researcher::Reload (NN::MiningProjectMap ());
@@ -1484,4 +1531,85 @@ BOOST_AUTO_TEST_CASE(it_resets_to_investor_mode_when_explicitly_configured,
14841531 NN::Researcher::Reload (NN::MiningProjectMap ());
14851532}
14861533
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+
14871615BOOST_AUTO_TEST_SUITE_END ()
0 commit comments