Introduction
本来是我的一门课的作业。。看到助教给的评测demo以后深受启发,就拿去考小朋友了。
另外友元也的确是一个神奇的存在。。我是本学期过了一半才代替我的室友(他有事)当了这门课的助教。
当时正好讲到友元,我第一次去答疑,顶门来一个人问我“友元blahblahblah”,我都愣了,啥?我混迹开源社区两年了,哪个西方国家的程序员写的代码我没有见过?就是没听说过友元这个东西。。。
然后我就想起了一句经验之谈:每个程序设计语言都有他设计的渣的地方。。一查,果然是java,c#,oc什么的都把这个玩意去了,嗯。。yahaliyahali。。
所以这玩意我就耿耿于怀了半个学期,心想一定要和大家分享一下。。
题目描述
下述两个类用来模拟一个分布式存储系统,
|
|
Server对象负责将字符串分配给多个Worker对象,Worker对象将字符串拆分为若干小文件存储。
Server中有存储Worker编号到Worker指针的映射。
Server通过调用UpdateTable这个函数来向所有Worker上传名为table内容为content的字符串。
Server会依次调用所有Worker的UpdateTable函数,如果所有Worker都成功则用CleanTable这个函数来清理老文件,
生成一个从table到已经上传了的worker编号的映射,之后返回上传成功。
如果任意一个Worker上传失败,Server需要用CleanTable让所有Worker回滚到上传之前的状态,之后返回更新失败。
Worker中存有table到一组真实文件路径的映射。
Worker中可以通过CreateFile,DeleteFile,ReadFile,WriteFile,函数来创建,删除,读出和写入文件。
现将Server::UpdateTable,Worker::UpdateTable,Worker::cleanTable这3个函数挖空,作为某课程的作业交给同学们实现。
你的任务是编写验证这些程序正确性的测试代码。要测试的流程如下:
(a) 正常的文件上传流程
原有代码中Worker的CreateFile,DeleteFile,ReadFile,WriteFile函数都是必定成功的。
所以这一步需要让Server调用一次UpdateTable,看是否返回上传成功。
(b) 检查Server::mTables的正确性
再添加一个新的TestWorker到TestServer中,之后检查mTableFiles的某些值是否为预期值。
(c) 检查上传的内容的正确性
(d) CreateFile出现问题时,检查回滚逻辑是否实现
新加的TestWorker的CreateFile必定会失败。
此时再向同一个table进行一次UpdateTable,看是否返回了更新失败。
之后检查原先的内容是否仍然可读。
(e) 检查多余的文件是否已经被删除
移除TestWorker,检查Worker::mTableFiles是否和(a)之后的一样。
再向同一个table进行一次成功的UpdateTable。
检查(a)之后的mTableFiles中的元素是否都为不可读。
为了方便测试,我们在Server类和Worker类中安插一个友元类Test。
|
|
之后,请你对上述测试流程,完善下面的测试代码:
|
|
点评
这句话其实最早我写在题目正文里面了。。
对程序安全性而言,友元类哪里是friend,简直就是fiend啊!!