def test_03_08_a_sad_moment(self): # # Run using the good pipeline, but change one of the URLs so # an exception is thrown. # self.awthread = self.AWThread(self.announce_addr) self.awthread.start() self.set_work_socket() self.awthread.ex(self.awthread.aw.do_job, cpanalysis.WorkReply( image_set_numbers = [2, 3], worker_runs_post_group = False, wants_dictionary = False)) # # The worker should ask for the pipeline and preferences next. # req = self.awthread.recv(self.work_socket) self.assertIsInstance(req, cpanalysis.PipelinePreferencesRequest) self.assertEqual(req.analysis_id, self.analysis_id) input_dir = os.path.join(example_images_directory(), "ExampleSBSImages") cpprefs.set_default_image_directory(input_dir) preferences = {cpprefs.DEFAULT_IMAGE_DIRECTORY: cpprefs.config_read(cpprefs.DEFAULT_IMAGE_DIRECTORY) } rep = cpanalysis.Reply( pipeline_blob = np.array(GOOD_PIPELINE), preferences = preferences) req.reply(rep) # # The worker asks for the initial measurements. # req = self.awthread.recv(self.work_socket) self.assertIsInstance(req, cpanalysis.InitialMeasurementsRequest) self.assertEqual(req.analysis_id, self.analysis_id) m = get_measurements_for_good_pipeline(nimages=3) m[cpmeas.IMAGE, M_IMAGE_SET, 2] = np.zeros(100, np.uint8) try: req.reply(cpanalysis.Reply(buf = m.file_contents())) finally: m.close() # # Next, the worker asks for the shared dictionary # req = self.awthread.recv(self.work_socket) self.assertIsInstance(req, cpanalysis.SharedDictionaryRequest) shared_dictionaries = [{ ("foo%d" % i):"bar%d" % i} for i in range(1,8)] rep = cpanalysis.SharedDictionaryReply( dictionaries = shared_dictionaries) req.reply(rep) # # The worker should choke somewhere in NamesAndTypes, but we # tell the worker to skip the rest of the imageset. # req = self.awthread.recv(self.work_socket) self.assertIsInstance(req, cpanalysis.ExceptionReport) req.reply(cpanalysis.ExceptionPleaseDebugReply(disposition = ED_SKIP)) # # The worker should send ImageSetSuccess for image set 2 anyway. # req = self.awthread.recv(self.work_socket) self.assertIsInstance(req, cpanalysis.ImageSetSuccess) self.assertEqual(req.image_set_number, 2) req.reply(cpanalysis.Ack()) # # And then it tells us about image set 3 # req = self.awthread.recv(self.work_socket) self.assertIsInstance(req, cpanalysis.ImageSetSuccess) self.assertEqual(req.image_set_number, 3) req.reply(cpanalysis.Ack()) # # The worker should then report the measurements for both 2 and 3 # req = self.awthread.recv(self.work_socket) self.assertIsInstance(req, cpanalysis.MeasurementsReport) self.assertSequenceEqual(req.image_set_numbers, [2, 3]) m = cpmeas.load_measurements_from_buffer(req.buf) # # Spot check for some expected stuff # self.assertTrue(m.has_feature(cpmeas.IMAGE, C_COUNT+"_Nuclei")) self.assertTrue(m.has_feature("Nuclei", M_LOCATION_CENTER_X)) self.assertTrue(m.has_feature("Nuclei", "AreaShape_Area")) # # The count for the skipped image should be None # count = m[cpmeas.IMAGE, C_COUNT + "_Nuclei", 2] self.assertIsNone(count) count = m[cpmeas.IMAGE, C_COUNT + "_Nuclei", 3] center_x = m["Nuclei", M_LOCATION_CENTER_X, 3] self.assertEqual(count, len(center_x)) req.reply(cpanalysis.Ack()) self.awthread.ecute()
def test_03_07_a_sad_ending(self): # # Run using the bad pipeline and lead the analysis worker # through debug post-mortem # self.awthread = self.AWThread(self.announce_addr) self.awthread.start() self.set_work_socket() self.awthread.ex(self.awthread.aw.do_job, cpanalysis.WorkReply( image_set_numbers = [2], worker_runs_post_group = False, wants_dictionary = False)) # # The worker should ask for the pipeline and preferences next. # req = self.awthread.recv(self.work_socket) self.assertIsInstance(req, cpanalysis.PipelinePreferencesRequest) self.assertEqual(req.analysis_id, self.analysis_id) input_dir = os.path.join(example_images_directory(), "ExampleSBSImages") cpprefs.set_default_image_directory(input_dir) preferences = {cpprefs.DEFAULT_IMAGE_DIRECTORY: cpprefs.config_read(cpprefs.DEFAULT_IMAGE_DIRECTORY) } rep = cpanalysis.Reply( pipeline_blob = np.array(BAD_PIPELINE), preferences = preferences) req.reply(rep) # # The worker asks for the initial measurements. # req = self.awthread.recv(self.work_socket) self.assertIsInstance(req, cpanalysis.InitialMeasurementsRequest) self.assertEqual(req.analysis_id, self.analysis_id) m = get_measurements_for_good_pipeline(nimages=2) try: req.reply(cpanalysis.Reply(buf = m.file_contents())) finally: m.close() # # Next, the worker asks for the shared dictionary # req = self.awthread.recv(self.work_socket) self.assertIsInstance(req, cpanalysis.SharedDictionaryRequest) shared_dictionaries = [{ ("foo%d" % i):"bar%d" % i} for i in range(1,8)] rep = cpanalysis.SharedDictionaryReply( dictionaries = shared_dictionaries) req.reply(rep) # # The worker should choke somewhere in NamesAndTypes # req = self.awthread.recv(self.work_socket) self.assertIsInstance(req, cpanalysis.ExceptionReport) password = "******" req.reply(cpanalysis.ExceptionPleaseDebugReply( disposition='DEBUG', verification_hash = hashlib.sha1(password).hexdigest())) # # Next, the worker sends DebugWaiting once it binds to a port # req = self.awthread.recv(self.work_socket) self.assertIsInstance(req, cpanalysis.DebugWaiting) handle = None telnet_socket = socket.socket(socket.AF_INET, proto = socket.IPPROTO_TCP) telnet_socket.connect(("127.0.0.1", req.port)) try: req.reply(cpanalysis.Ack()) # # Should say, "Verification: ", but it could change... # prompt = telnet_socket.recv(20) telnet_socket.send("corned beef\n") pdb = telnet_socket.recv(4000) telnet_socket.send("exit\n") finally: telnet_socket.close() req = self.awthread.recv(self.work_socket) self.assertIsInstance(req, cpanalysis.DebugComplete) req.reply(cpanalysis.ExceptionPleaseDebugReply(disposition = ED_STOP))