def test_custom_create(self):
        """
        Create build slave with custom options.
        """
        slave = BuildSlave(
            project  = self.project,
            name     = "test-slave",
            password = "******",
            max_builds = 123,
            timeout   = 51,
        )
        slave.save()
        
        # check generated arguments
        args = slave.get_config_args()
        self.assertEqual(args.get("name", None), slave.name)
        self.assertEqual(args.get("password", None), slave.password)
        self.assertEqual(args.get("missing_timeout", None), 51 * 60)
        self.assertEqual(args.get("max_builds", None), 123)
        notify_list = args.get("notify_on_missing", None)
        self.assertEqual(type(notify_list), type([]))
        self.assertEqual(len(notify_list), 0)
        
        # add an admin that should receive notification on this slave
        admin = BuildAdmin(project=self.project, name="admin1", email="*****@*****.**")
        admin.save()
        self.assertNotEqual(admin.id, None)
        slave.admins.add(admin)
        # check new args
        notify_list = slave.get_config_args().get("notify_on_missing", None)
        self.assertEqual(len(notify_list), 1)
        self.assertEqual(notify_list[0], admin.email)
        
        # add admin that should receive ALL notifcations (including this one of course)
        admin2 = BuildAdmin(project=self.project, name="admin1", 
            email="*****@*****.**", 
            receive_slave_events=True,
        )
        admin2.save()
        # check new args
        notify_list = slave.get_config_args().get("notify_on_missing", None)
        self.assertEqual(len(notify_list), 2)
        for i,e in enumerate(["*****@*****.**", "*****@*****.**"]):
            self.assertEqual(e, notify_list[i])
            
        # ensure no duplicates
        admin.receive_slave_events = True
        admin.save()
        notify_list = slave.get_config_args().get("notify_on_missing", None)
        self.assertEqual(len(notify_list), 2)
        for i,e in enumerate(["*****@*****.**", "*****@*****.**"]):
            self.assertEqual(e, notify_list[i])

        # try instantiating buildbot config object
        self.assert_valid_buildbot_config(slave.get_config_class(), slave.get_config_args())
        
        # Check that the resulting config string is sensible
        self.assert_config_string_executable(slave)
        
        
 def test_default_create(self):
     """
     Test generation of buildbot config.
     """
     
     slave = BuildSlave(
         project  = self.project,
         name     = "test-slave",
         password = "******",
     )
     slave.save()
     
     # check config type
     self.assertEqual(slave.get_config_type(), _("build slave"))
     
     # check generated arguments
     args = slave.get_config_args()
     self.assertEqual(args.get("name", None), slave.name)
     self.assertEqual(args.get("password", None), slave.password)
     self.assertEqual(args.get("missing_timeout", None), settings.DEFAULT_SLAVE_TIMEOUT * 60)
     self.assertEqual(args.get("max_builds", None), settings.DEFAULT_SLAVE_MAXBUILD)
     notify_list = args.get("notify_on_missing", None)
     self.assertEqual(type(notify_list), type([]))
     self.assertEqual(len(notify_list), 0)
     
     # try instantiating buildbot config object
     self.assert_valid_buildbot_config(slave.get_config_class(), args)
     
     # Check that the resulting config string is sensible
     self.assert_config_string_executable(slave)
    def test_name_uniqueness(self):
        """
        Ensure that a project cannot have multiple slaves with the same name
        """
        self.assertFalse(self.project.has_buildslave)
        
        # create build slave
        s0 = BuildSlave(
            project  = self.project,
            name     = "test-slave",
            password = "******",
        )
        s0.save()
        self.assertTrue(s0.id != None)
        self.assertEqual(unicode(s0), "test-slave")
        self.assertTrue(self.project.has_buildslave)
        
        s = BuildSlave(
            project  = self.project,
            name     = "test-slave",
            password = "******",
        )
        self.assertRaises(IntegrityError, s.save)
        self.assertEqual(s.id, None)

        # ... but the the same name can be used for a different project
        np = Project(
            name  = "Another Test Project",
            owner = self.user,
        )
        np.save()
        s = BuildSlave(
            project  = np,
            name     = "test-slave",
            password = "******",
        )
        s.save()
        self.assertNotEqual(s.id, None)