def testWhitelistedUntouched(self):
        # When a change doesn't touch the whitelist file, any updated files
        # (except deleted) must be checked. The whitelist used for analysis
        # must be trimmed to the changed files subset.
        #
        # A_NW.cc - added, not whitelisted => check
        # A_W.cc - added, whitelisted => check, remain on the trimmed whitelist
        # D_NW.cc - deleted, not whitelisted => ignore
        # D_W.cc - deleted and whitelisted => remain on w/l
        # M_NW.cc - modified, not whitelisted => check
        # M_W.cc - modified and whitelisted => check, remain on w/l
        # NM_W.cc - not modified, whitelisted => trim from w/l
        # W - the whitelist file

        self.input_api.AffectedFiles = self.CreateAffectedFilesFunc([
            'A_NW.cc', 'A', 'A_W.cc', 'A', 'D_NW.cc', 'D', 'D_W.cc', 'D',
            'M_NW.cc', 'M', 'M_W.cc', 'M'
        ])
        self.mox.StubOutWithMock(copyright_scanner, '_GetWhitelistFileName')
        copyright_scanner._GetWhitelistFileName = lambda _: 'W'
        self.mox.StubOutWithMock(copyright_scanner, 'LoadWhitelistedFilesList')
        copyright_scanner.LoadWhitelistedFilesList = \
            lambda _: ['A_W.cc', 'D_W.cc', 'M_W.cc', 'NM_W.cc']
        self.mox.StubOutWithMock(copyright_scanner, '_DoScanAtPresubmit')
        copyright_scanner._DoScanAtPresubmit = self.CreateDoScanAtPresubmitFunc(
        )
        self.mox.ReplayAll()
        copyright_scanner.ScanAtPresubmit(self.input_api, self.output_api)
        self.assertEqual(['A_W.cc', 'D_W.cc', 'M_W.cc'],
                         self.GetWhitelistedFiles())
        self.assertEqual(['A_NW.cc', 'A_W.cc', 'M_NW.cc', 'M_W.cc'],
                         self.GetFilesToCheck())
 def testWhitelistTouched(self):
   # When the whitelist file is touched by the change, all the files listed in
   # it, including deleted entries, must be re-checked. All modified files
   # (including the deleted ones) must be checked as well. The current contents
   # of the whitelist are used for analysis.
   # Whitelist addition or deletion are not considered.
   #
   # All the files from names testWhitelistedUntouched are re-used, but now
   # action for all of them is 'check' (except for the w/l file itself).
   # A_DW.cc - added, deleted from w/l => check
   # D_DW.cc - deleted from repo and w/l => check
   # M_DW.cc - modified, deleted from w/l => check
   self.input_api.AffectedFiles = self.CreateAffectedFilesFunc(
     ['A_DW.cc', 'A', 'A_NW.cc', 'A', 'A_W.cc', 'A',
      'D_DW.cc', 'D', 'D_NW.cc', 'D', 'D_W.cc', 'D',
      'M_DW.cc', 'M', 'M_NW.cc', 'M', 'M_W.cc', 'M', 'W', 'M'])
   self.mox.StubOutWithMock(copyright_scanner, '_GetWhitelistFileName')
   copyright_scanner._GetWhitelistFileName = lambda _: 'W'
   self.mox.StubOutWithMock(copyright_scanner, '_GetDeletedContents')
   def GetDeletedContentsStub(affected_file):
     self.assertEqual('W', affected_file.LocalPath())
     return ['A_DW.cc', 'D_DW.cc', 'M_DW.cc']
   copyright_scanner._GetDeletedContents = GetDeletedContentsStub
   self.mox.StubOutWithMock(copyright_scanner, 'LoadWhitelistedFilesList')
   copyright_scanner.LoadWhitelistedFilesList = \
       lambda _: ['A_W.cc', 'D_W.cc', 'M_W.cc', 'NM_W.cc']
   self.mox.StubOutWithMock(copyright_scanner, '_DoScanAtPresubmit')
   copyright_scanner._DoScanAtPresubmit = self.CreateDoScanAtPresubmitFunc()
   self.mox.ReplayAll()
   copyright_scanner.ScanAtPresubmit(self.input_api, self.output_api)
   self.assertEqual(
     ['A_W.cc', 'D_W.cc', 'M_W.cc', 'NM_W.cc'], self.GetWhitelistedFiles())
   self.assertEqual(
     ['A_DW.cc', 'A_NW.cc', 'A_W.cc', 'D_DW.cc', 'D_NW.cc', 'D_W.cc',
      'M_DW.cc', 'M_NW.cc', 'M_W.cc', 'NM_W.cc' ], self.GetFilesToCheck())