Skip to content

Commit 99a13a3

Browse files
authored
add more compare tool test (#787)
* add more compare tool test * Fixed global variables causing failure in unit test * refactor globals out * add more tests - to be enable after the single level property compare failure fix is ready
1 parent 00a1f04 commit 99a13a3

File tree

5 files changed

+655
-27
lines changed

5 files changed

+655
-27
lines changed

core/src/main/python/compare_model.py

Lines changed: 32 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,6 @@
7070
CommandLineArgUtil.VARIABLE_FILE_SWITCH
7171
]
7272

73-
all_changes = []
74-
all_added = []
75-
all_removed = []
76-
compare_msgs = sets.Set()
77-
78-
7973
def __process_args(args):
8074
"""
8175
Process the command-line arguments.
@@ -94,7 +88,7 @@ def __process_args(args):
9488

9589
class ModelDiffer:
9690

97-
def __init__(self, current_dict, past_dict, aliases):
91+
def __init__(self, current_dict, past_dict, aliases, all_changes, all_added, all_removed, compare_msgs):
9892
self.aliases = aliases
9993
self.final_changed_model = PyOrderedDict()
10094
self.current_dict = current_dict
@@ -108,6 +102,11 @@ def __init__(self, current_dict, past_dict, aliases):
108102
for item in self.past_dict.keys():
109103
self.set_past.add(item)
110104
self.intersect = self.set_current.intersection(self.set_past)
105+
self.all_changes = all_changes
106+
self.all_added = all_added
107+
self.all_removed = all_removed
108+
self.compare_msgs = compare_msgs
109+
111110

112111
def added(self):
113112
return self.set_current - self.intersect
@@ -144,7 +143,8 @@ def recursive_changed_detail(self, key, token, root):
144143
"""
145144
debug("DEBUG: Entering recursive_changed_detail key=%s token=%s root=%s", key, token, root)
146145

147-
a = ModelDiffer(self.current_dict[key], self.past_dict[key], self.aliases)
146+
a = ModelDiffer(self.current_dict[key], self.past_dict[key], self.aliases, self.all_changes, self.all_added,
147+
self.all_removed, self.compare_msgs)
148148
diff = a.changed()
149149
added = a.added()
150150
removed = a.removed()
@@ -164,7 +164,7 @@ def recursive_changed_detail(self, key, token, root):
164164
last = token.rfind(PATH_TOKEN)
165165
token = root
166166
else:
167-
all_changes.append(token)
167+
self.all_changes.append(token)
168168
last = token.rfind(PATH_TOKEN)
169169
token = root
170170

@@ -176,14 +176,14 @@ def recursive_changed_detail(self, key, token, root):
176176
for item in added:
177177
token = saved_token
178178
debug('DEBUG: recursive added token %s item %s ', token, item)
179-
all_added.append(token + PATH_TOKEN + item)
179+
self.all_added.append(token + PATH_TOKEN + item)
180180

181181
# We don't really care about this, just put something here is enough
182182
if len(removed) > 0:
183183
for item in removed:
184184
token = saved_token
185185
debug('DEBUG: removed %s', item)
186-
all_removed.append(token + PATH_TOKEN + item)
186+
self.all_removed.append(token + PATH_TOKEN + item)
187187
debug('DEBUG: Exiting recursive_changed_detail')
188188

189189
def is_dict(self, key):
@@ -220,24 +220,24 @@ def calculate_changed_model(self):
220220
#
221221
for s in changed:
222222
self.recursive_changed_detail(s, s, s)
223-
self._add_results(all_changes)
224-
self._add_results(all_added)
225-
self._add_results(all_removed, True)
223+
self._add_results(self.all_changes)
224+
self._add_results(self.all_added)
225+
self._add_results(self.all_removed, True)
226226

227227
for s in added:
228228
self.recursive_changed_detail(s, s, s)
229-
self._add_results(all_changes)
230-
self._add_results(all_added)
229+
self._add_results(self.all_changes)
230+
self._add_results(self.all_added)
231231

232232
# Clean up previous delete first
233-
for x in all_removed:
234-
all_removed.remove(x)
233+
for x in self.all_removed:
234+
self.all_removed.remove(x)
235235

236236
# Top level: e.g. delete all resources, all appDeployments
237237

238238
for s in removed:
239239
self.recursive_changed_detail(s, s, s)
240-
self._add_results(all_removed, True)
240+
self._add_results(self.all_removed, True)
241241

242242
except (KeyError, IndexError), ke:
243243
_logger.severe('WLSDPLY-05709', str(ke)),
@@ -317,7 +317,7 @@ def _add_results(self, change_paths, is_delete=False):
317317

318318
if is_delete and not is_folder_path:
319319
# Skip adding if it is a delete of an attribute
320-
compare_msgs.add(('WLSDPLY-05701', change_path))
320+
self.compare_msgs.add(('WLSDPLY-05701', change_path))
321321
continue
322322

323323
# splitted is a tuple containing the next token, and a delimited string of remaining tokens
@@ -468,6 +468,11 @@ def __init__(self, current_dict, past_dict, model_context, output_dir=None):
468468
self.past_dict_file = past_dict
469469
self.output_dir = output_dir
470470
self.model_context = model_context
471+
# For recursive calls
472+
self.all_changes = []
473+
self.all_added = []
474+
self.all_removed = []
475+
self.compare_msgs = sets.Set()
471476

472477
def get_dictionary(self, file):
473478
"""
@@ -563,7 +568,8 @@ def compare(self):
563568
_logger.throwing(ex, class_name=_class_name, method_name=_method_name)
564569
return VALIDATION_FAIL
565570

566-
obj = ModelDiffer(current_dict, past_dict, aliases)
571+
obj = ModelDiffer(current_dict, past_dict, aliases, self.all_changes, self.all_added,
572+
self.all_removed, self.compare_msgs)
567573
obj.calculate_changed_model()
568574
net_diff = obj.get_final_changed_model()
569575

@@ -615,7 +621,7 @@ def get_compare_msgs(self):
615621
Return any warning or info messages.
616622
:return: Set of warning or info messages
617623
"""
618-
return compare_msgs
624+
return self.compare_msgs
619625

620626

621627
def debug(format_string, *arguments):
@@ -675,15 +681,15 @@ def main():
675681
fos = None
676682
writer = None
677683
file_name = None
678-
if len(compare_msgs) > 0:
684+
if len(obj.get_compare_msgs()) > 0:
679685
try:
680686
file_name = _outputdir + '/compare_model_stdout'
681687
fos = JFileOutputStream(file_name, False)
682688
writer = JPrintWriter(fos, True)
683689
writer.println(BLANK_LINE)
684690
writer.println(BLANK_LINE)
685691
index = 1
686-
for line in compare_msgs:
692+
for line in obj.get_compare_msgs():
687693
msg_key = line[0]
688694
msg_value = line[1]
689695
writer.println("%s. %s" % (index, format_message(msg_key,msg_value.replace(PATH_TOKEN, "-->"))))
@@ -699,11 +705,11 @@ def main():
699705
_logger.severe('WLSDPLY-05708', file_name, ioe.getLocalizedMessage(),
700706
error=ioe, class_name=_class_name, method_name=_method_name)
701707
else:
702-
if len(compare_msgs) > 0:
708+
if len(obj.get_compare_msgs()) > 0:
703709
print BLANK_LINE
704710
print BLANK_LINE
705711
index = 1
706-
for line in compare_msgs:
712+
for line in obj.get_compare_msgs():
707713
msg_key = line[0]
708714
msg_value = line[1]
709715
print "%s. %s" % (index, format_message(msg_key,msg_value.replace(PATH_TOKEN, "-->")))

core/src/test/python/compare_model_test.py

Lines changed: 182 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ def testDeleteModelAppDeployments(self):
224224
yaml_exists = os.path.exists(yaml_result)
225225

226226
self.assertEqual(yaml_exists, True)
227-
self.assertEqual(len(stdout_result), 1)
227+
self.assertEqual(len(stdout_result), 0)
228228

229229
self.assertEqual(model_dictionary.has_key('appDeployments'), True)
230230
self.assertEqual(model_dictionary['appDeployments'].has_key('Library'), True)
@@ -244,6 +244,187 @@ def testDeleteModelAppDeployments(self):
244244

245245
self.assertEqual(return_code, 0)
246246

247+
def testCompareModelFull2(self):
248+
_method_name = 'testCompareModelFull2'
249+
# This test for
250+
# 1. Changing weblogic password
251+
# 2. Changing RCU password
252+
# 3. Deleting an application
253+
254+
_variables_file = self._resources_dir + '/compare_model_model1.10.properties'
255+
_new_model_file = self._resources_dir + '/compare_model_model7.yaml'
256+
_old_model_file = self._resources_dir + '/compare_model_model6.yaml'
257+
_temp_dir = os.path.join(tempfile.gettempdir(), _method_name)
258+
259+
if os.path.exists(_temp_dir):
260+
shutil.rmtree(_temp_dir)
261+
262+
os.mkdir(_temp_dir)
263+
264+
mw_home = os.environ['MW_HOME']
265+
args_map = {
266+
'-oracle_home': mw_home,
267+
'-variable_file': _variables_file,
268+
'-output_dir' : _temp_dir,
269+
'-domain_type' : 'WLS',
270+
'-trailing_arguments': [ _new_model_file, _old_model_file ]
271+
}
272+
273+
try:
274+
model_context = ModelContext('CompareModelTestCase', args_map)
275+
obj = ModelFileDiffer(_new_model_file, _old_model_file, model_context, _temp_dir)
276+
return_code = obj.compare()
277+
self.assertEqual(return_code, 0)
278+
279+
yaml_result = _temp_dir + os.sep + 'diffed_model.yaml'
280+
json_result = _temp_dir + os.sep + 'diffed_model.json'
281+
stdout_result = obj.get_compare_msgs()
282+
model_dictionary = FileToPython(yaml_result).parse()
283+
yaml_exists = os.path.exists(yaml_result)
284+
json_exists = os.path.exists(json_result)
285+
286+
self.assertEqual(yaml_exists, True)
287+
self.assertEqual(json_exists, True)
288+
self.assertEqual(len(stdout_result), 0)
289+
290+
self.assertEqual(model_dictionary.has_key('domainInfo'), True)
291+
self.assertEqual(model_dictionary['domainInfo'].has_key('AdminPassword'), True)
292+
self.assertEqual(model_dictionary['domainInfo']['AdminPassword'], 'welcome2')
293+
self.assertEqual(model_dictionary['domainInfo'].has_key('AdminUser'), False)
294+
self.assertEqual(model_dictionary['domainInfo'].has_key('RCUDbInfo'), True)
295+
self.assertEqual(model_dictionary['domainInfo']['RCUDbInfo'].has_key('rcu_admin_password'), True)
296+
self.assertEqual(len(model_dictionary['domainInfo']['RCUDbInfo']), 1)
297+
self.assertEqual(len(model_dictionary['domainInfo']), 2)
298+
self.assertEqual(model_dictionary.has_key('appDeployments'), True)
299+
self.assertEqual(model_dictionary['appDeployments'].has_key('Application'), True)
300+
self.assertEqual(model_dictionary['appDeployments']['Application'].has_key('!yourear'), True)
301+
self.assertEqual(len(model_dictionary['appDeployments']['Application']), 1)
302+
303+
304+
except (CompareException, PyWLSTException), te:
305+
return_code = 2
306+
self._logger.severe('WLSDPLY-05709',
307+
te.getLocalizedMessage(), error=te,
308+
class_name=self._program_name, method_name=_method_name)
309+
310+
if os.path.exists(_temp_dir):
311+
shutil.rmtree(_temp_dir)
312+
313+
self.assertEqual(return_code, 0)
314+
315+
def _testCompareModelFull3(self):
316+
_method_name = 'testCompareModelFull3'
317+
# This test for
318+
# 1. Changing MailSessionProperty
319+
# 2. Changing ODL HandlerDefaults
320+
# 3. Changing ODL Handler property
321+
# 4. Changing ODL Logger attributes
322+
323+
_variables_file = self._resources_dir + '/compare_model_model1.10.properties'
324+
_new_model_file = self._resources_dir + '/compare_model_model7.yaml'
325+
_old_model_file = self._resources_dir + '/compare_model_model6.yaml'
326+
_temp_dir = os.path.join(tempfile.gettempdir(), _method_name)
327+
328+
if os.path.exists(_temp_dir):
329+
shutil.rmtree(_temp_dir)
330+
331+
os.mkdir(_temp_dir)
332+
333+
mw_home = os.environ['MW_HOME']
334+
args_map = {
335+
'-oracle_home': mw_home,
336+
'-variable_file': _variables_file,
337+
'-output_dir' : _temp_dir,
338+
'-domain_type' : 'WLS',
339+
'-trailing_arguments': [ _new_model_file, _old_model_file ]
340+
}
341+
342+
try:
343+
model_context = ModelContext('CompareModelTestCase', args_map)
344+
obj = ModelFileDiffer(_new_model_file, _old_model_file, model_context, _temp_dir)
345+
return_code = obj.compare()
346+
self.assertEqual(return_code, 0)
347+
348+
yaml_result = _temp_dir + os.sep + 'diffed_model.yaml'
349+
json_result = _temp_dir + os.sep + 'diffed_model.json'
350+
stdout_result = obj.get_compare_msgs()
351+
model_dictionary = FileToPython(yaml_result).parse()
352+
yaml_exists = os.path.exists(yaml_result)
353+
json_exists = os.path.exists(json_result)
354+
355+
self.assertEqual(yaml_exists, True)
356+
self.assertEqual(json_exists, True)
357+
self.assertEqual(len(stdout_result), 0)
358+
359+
self.assertEqual(model_dictionary.has_key('resources'), True)
360+
self.assertEqual(model_dictionary['resources'].has_key('MailSession'), True)
361+
self.assertEqual(model_dictionary['resources']['MailSession'].has_key('MyMailSession'), True)
362+
self.assertEqual(model_dictionary['resources']['MailSession']['MyMailSession'].has_key('mail.imap.port'),
363+
True)
364+
self.assertEqual(model_dictionary['resources']['MailSession']['MyMailSession']['mail.imap.port'], 993)
365+
self.assertEqual(len(model_dictionary['resources']['MailSession']['MyMailSession']['mail.imap.port']), 1)
366+
367+
self.assertEqual(model_dictionary['resources'].has_key('ODLConfiguration'), True)
368+
self.assertEqual(model_dictionary['resources']['ODLConfiguration'].has_key('config'), True)
369+
self.assertEqual(model_dictionary['resources']['ODLConfiguration']['config'].has_key('HandlerDefaults'),
370+
True)
371+
self.assertEqual(
372+
model_dictionary['resources']['ODLConfiguration']['config']['HandlerDefaults'].has_key('maxFileSize'),
373+
True)
374+
self.assertEqual(
375+
model_dictionary['resources']['ODLConfiguration']['config']['HandlerDefaults']['maxFileSize'],
376+
14857620)
377+
378+
self.assertEqual(model_dictionary['resources']['ODLConfiguration']['config'].has_key('Handler'),
379+
True)
380+
self.assertEqual(
381+
model_dictionary['resources']['ODLConfiguration']['config']['Handler'].has_key('odl-handler'),
382+
True)
383+
self.assertEqual(
384+
model_dictionary['resources']['ODLConfiguration']['config']['Handler']['odl-handler']
385+
.has_key('Properties'), True)
386+
self.assertEqual(
387+
model_dictionary['resources']['ODLConfiguration']['config']['Handler']['odl-handler']['Properties']
388+
.has_key('maxFileSize'), True)
389+
self.assertEqual(
390+
model_dictionary['resources']['ODLConfiguration']['config']['Handler']['odl-handler']
391+
['Properties']['maxFileSize'], 14857620)
392+
393+
394+
self.assertEqual(model_dictionary['resources']['ODLConfiguration']['config'].has_key('Logger'),
395+
True)
396+
self.assertEqual(
397+
model_dictionary['resources']['ODLConfiguration']['config']['Logger']
398+
.has_key('oracle.communications.ordermanagement.automation.plugin.AutomationPluginManager'),
399+
True)
400+
self.assertEqual(
401+
model_dictionary['resources']['ODLConfiguration']['config']['Logger']
402+
['oracle.communications.ordermanagement.automation.plugin.AutomationPluginManager']
403+
.has_key('Level'), True)
404+
self.assertEqual(
405+
model_dictionary['resources']['ODLConfiguration']['config']['Logger']
406+
['oracle.communications.ordermanagement.automation.plugin.AutomationPluginManager']['Level'],
407+
'TRACE:16')
408+
self.assertEqual(
409+
len(model_dictionary['resources']['ODLConfiguration']['config']), 3)
410+
411+
self.assertEqual(
412+
len(model_dictionary['resources']['ODLConfiguration']['config']['Logger']), 1)
413+
414+
self.assertEqual(
415+
len(model_dictionary['resources']['ODLConfiguration']['config']['HandlerDefaults']), 1)
416+
417+
except (CompareException, PyWLSTException), te:
418+
return_code = 2
419+
self._logger.severe('WLSDPLY-05709',
420+
te.getLocalizedMessage(), error=te,
421+
class_name=self._program_name, method_name=_method_name)
422+
423+
if os.path.exists(_temp_dir):
424+
shutil.rmtree(_temp_dir)
425+
426+
self.assertEqual(return_code, 0)
427+
247428

248429
if __name__ == '__main__':
249430
unittest.main()

0 commit comments

Comments
 (0)