ReactOS  0.4.14-dev-52-g6116262
profile.c File Reference
#include <stdarg.h>
#include <stdio.h>
#include "wine/test.h"
#include "windef.h"
#include "winbase.h"
#include "windows.h"
#include "sddl.h"
Include dependency graph for profile.c:

Go to the source code of this file.

Classes

struct  _profileInt
 

Macros

#define KEY   "ProfileInt"
 
#define SECTION   "Test"
 
#define TESTFILE   ".\\testwine.ini"
 
#define TESTFILE2   ".\\testwine2.ini"
 

Functions

static void test_profile_int (void)
 
static void test_profile_string (void)
 
static void test_profile_sections (void)
 
static void test_profile_sections_names (void)
 
static void test_profile_existing (void)
 
static void test_profile_delete_on_close (void)
 
static void test_profile_refresh (void)
 
static void create_test_file (LPCSTR name, LPCSTR data, DWORD size)
 
static BOOL emptystr_ok (CHAR emptystr[MAX_PATH])
 
static void test_profile_directory_readonly (void)
 
static void test_GetPrivateProfileString (const char *content, const char *descript)
 
static BOOL check_binary_file_data (LPCSTR path, const VOID *data, DWORD size)
 
static BOOL check_file_data (LPCSTR path, LPCSTR data)
 
static void test_WritePrivateProfileString (void)
 
 START_TEST (profile)
 

Macro Definition Documentation

◆ KEY

#define KEY   "ProfileInt"

Definition at line 30 of file profile.c.

◆ SECTION

#define SECTION   "Test"

Definition at line 31 of file profile.c.

◆ TESTFILE

#define TESTFILE   ".\\testwine.ini"

Definition at line 32 of file profile.c.

◆ TESTFILE2

#define TESTFILE2   ".\\testwine2.ini"

Definition at line 33 of file profile.c.

Function Documentation

◆ check_binary_file_data()

static BOOL check_binary_file_data ( LPCSTR  path,
const VOID data,
DWORD  size 
)
static

Definition at line 909 of file profile.c.

910 {
911  HANDLE file;
912  CHAR buf[MAX_PATH];
913  BOOL ret;
914 
916  if (file == INVALID_HANDLE_VALUE)
917  return FALSE;
918 
919  if(size != GetFileSize(file, NULL) )
920  {
921  CloseHandle(file);
922  return FALSE;
923  }
924 
925  ret = ReadFile(file, buf, size, &size, NULL);
926  CloseHandle(file);
927  if (!ret)
928  return FALSE;
929 
930  return !memcmp(buf, data, size);
931 }
#define CloseHandle
Definition: compat.h:398
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
char CHAR
Definition: xmlstorage.h:175
#define INVALID_HANDLE_VALUE
Definition: compat.h:391
#define FILE_SHARE_READ
Definition: compat.h:125
unsigned int BOOL
Definition: ntddk_ex.h:94
smooth NULL
Definition: ftsmooth.c:416
#define OPEN_EXISTING
Definition: compat.h:426
GLsizeiptr size
Definition: glext.h:5919
#define MAX_PATH
Definition: compat.h:26
const char file[]
Definition: icontest.c:11
DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh)
Definition: fileinfo.c:481
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
int ret
#define GENERIC_READ
Definition: compat.h:124
Definition: services.c:325
#define CreateFileA(a, b, c, d, e, f, g)
Definition: compat.h:399
BOOL WINAPI ReadFile(IN HANDLE hFile, IN LPVOID lpBuffer, IN DWORD nNumberOfBytesToRead, OUT LPDWORD lpNumberOfBytesRead OPTIONAL, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:123
Definition: fci.c:126

Referenced by check_file_data(), and test_WritePrivateProfileString().

◆ check_file_data()

static BOOL check_file_data ( LPCSTR  path,
LPCSTR  data 
)
static

Definition at line 933 of file profile.c.

934 {
936 }
static BOOL check_binary_file_data(LPCSTR path, const VOID *data, DWORD size)
Definition: profile.c:909
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
int WINAPI lstrlenA(LPCSTR lpString)
Definition: lstring.c:145
Definition: services.c:325

Referenced by test_WritePrivateProfileString().

◆ create_test_file()

static void create_test_file ( LPCSTR  name,
LPCSTR  data,
DWORD  size 
)
static

Definition at line 511 of file profile.c.

512 {
513  HANDLE hfile;
514  DWORD count;
515 
517  ok(hfile != INVALID_HANDLE_VALUE, "cannot create %s\n", name);
518  WriteFile(hfile, data, size, &count, NULL);
519  CloseHandle(hfile);
520 }
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
#define CloseHandle
Definition: compat.h:398
GLuint GLuint GLsizei count
Definition: gl.h:1545
#define INVALID_HANDLE_VALUE
Definition: compat.h:391
#define GENERIC_WRITE
Definition: nt_native.h:90
smooth NULL
Definition: ftsmooth.c:416
GLsizeiptr size
Definition: glext.h:5919
unsigned long DWORD
Definition: ntddk_ex.h:95
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:126
#define CREATE_ALWAYS
Definition: disk.h:72
#define ok(value,...)
Definition: atltest.h:57
Definition: name.c:36
#define CreateFileA(a, b, c, d, e, f, g)
Definition: compat.h:399

Referenced by test_GetPrivateProfileString(), and test_WritePrivateProfileString().

◆ emptystr_ok()

static BOOL emptystr_ok ( CHAR  emptystr[MAX_PATH])
static

Definition at line 522 of file profile.c.

523 {
524  int i;
525 
526  for(i = 0;i < MAX_PATH;++i)
527  if(emptystr[i] != 0)
528  {
529  trace("emptystr[%d] = %d\n",i,emptystr[i]);
530  return FALSE;
531  }
532 
533  return TRUE;
534 }
#define TRUE
Definition: types.h:120
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define trace
Definition: atltest.h:70
#define MAX_PATH
Definition: compat.h:26

Referenced by test_GetPrivateProfileString().

◆ START_TEST()

START_TEST ( profile  )

Definition at line 1160 of file profile.c.

1161 {
1162  test_profile_int();
1171  "[section1]\r\n"
1172  "name1=val1\r\n"
1173  "name2=\"val2\"\r\n"
1174  "name3\r\n"
1175  "name4=a\r\n"
1176  "[section2]\r\n",
1177  "CR+LF");
1179  "[section1]\r"
1180  "name1=val1\r"
1181  "name2=\"val2\"\r"
1182  "name3\r"
1183  "name4=a\r"
1184  "[section2]\r",
1185  "CR only");
1187 }
static void test_GetPrivateProfileString(const char *content, const char *descript)
Definition: profile.c:571
static void test_profile_directory_readonly(void)
Definition: profile.c:536
static void test_profile_sections_names(void)
Definition: profile.c:253
static void test_profile_sections(void)
Definition: profile.c:165
static void test_profile_int(void)
Definition: profile.c:45
static void test_WritePrivateProfileString(void)
Definition: profile.c:938
static void test_profile_string(void)
Definition: profile.c:94
static void test_profile_existing(void)
Definition: profile.c:352
static void test_profile_refresh(void)
Definition: profile.c:464
static void test_profile_delete_on_close(void)
Definition: profile.c:441

◆ test_GetPrivateProfileString()

static void test_GetPrivateProfileString ( const char content,
const char descript 
)
static

Definition at line 571 of file profile.c.

572 {
573  DWORD ret, len;
574  CHAR buf[MAX_PATH];
575  CHAR def_val[MAX_PATH];
576  CHAR path[MAX_PATH];
577  CHAR windir[MAX_PATH];
578  /* NT series crashes on r/o empty strings, so pass an r/w
579  empty string and check for modification */
580  CHAR emptystr[MAX_PATH] = "";
581  LPSTR tempfile;
582 
583  static const char filename[] = ".\\winetest.ini";
584 
585  trace("test_GetPrivateProfileStringA: %s\n", descript);
586 
587  if(!lstrcmpA(descript, "CR only"))
588  {
589  SetLastError(0xdeadbeef);
591  NULL, 0, NULL);
593  {
594  win_skip("Win9x and WinME don't handle 'CR only' correctly\n");
595  return;
596  }
597  }
598 
600 
601  /* Run this test series with caching. Wine won't cache profile
602  files younger than 2.1 seconds. */
603  Sleep(2500);
604 
605  /* lpAppName is NULL */
606  memset(buf, 0xc, sizeof(buf));
607  lstrcpyA(buf, "kumquat");
608  ret = GetPrivateProfileStringA(NULL, "name1", "default",
609  buf, MAX_PATH, filename);
610  ok(ret == 18 ||
611  broken(ret == 19), /* Win9x and WinME */
612  "Expected 18, got %d\n", ret);
613  len = lstrlenA("section1") + sizeof(CHAR) + lstrlenA("section2") + 2 * sizeof(CHAR);
614  ok(!memcmp(buf, "section1\0section2\0\0", len),
615  "Expected \"section1\\0section2\\0\\0\", got \"%s\"\n", buf);
616 
617  /* lpAppName is empty */
618  memset(buf, 0xc, sizeof(buf));
619  lstrcpyA(buf, "kumquat");
620  ret = GetPrivateProfileStringA(emptystr, "name1", "default",
621  buf, MAX_PATH, filename);
622  ok(ret == 7, "Expected 7, got %d\n", ret);
623  ok(!lstrcmpA(buf, "default"), "Expected \"default\", got \"%s\"\n", buf);
624  ok(emptystr_ok(emptystr), "AppName modified\n");
625 
626  /* lpAppName is missing */
627  memset(buf, 0xc,sizeof(buf));
628  lstrcpyA(buf, "kumquat");
629  ret = GetPrivateProfileStringA("notasection", "name1", "default",
630  buf, MAX_PATH, filename);
631  ok(ret == 7, "Expected 7, got %d\n", ret);
632  ok(!lstrcmpA(buf, "default"), "Expected \"default\", got \"%s\"\n", buf);
633 
634  /* lpAppName is empty, lpDefault is NULL */
635  memset(buf, 0xc,sizeof(buf));
636  lstrcpyA(buf, "kumquat");
637  ret = GetPrivateProfileStringA(emptystr, "name1", NULL,
638  buf, MAX_PATH, filename);
639  ok(ret == 0, "Expected 0, got %d\n", ret);
640  ok(!lstrcmpA(buf, "") ||
641  broken(!lstrcmpA(buf, "kumquat")), /* Win9x, WinME */
642  "Expected \"\", got \"%s\"\n", buf);
643  ok(emptystr_ok(emptystr), "AppName modified\n");
644 
645  /* lpAppName is empty, lpDefault is empty */
646  memset(buf, 0xc,sizeof(buf));
647  lstrcpyA(buf, "kumquat");
648  ret = GetPrivateProfileStringA(emptystr, "name1", "",
649  buf, MAX_PATH, filename);
650  ok(ret == 0, "Expected 0, got %d\n", ret);
651  ok(!lstrcmpA(buf, ""), "Expected \"\", got \"%s\"\n", buf);
652  ok(emptystr_ok(emptystr), "AppName modified\n");
653 
654  /* lpAppName is empty, lpDefault has trailing blank characters */
655  memset(buf, 0xc,sizeof(buf));
656  lstrcpyA(buf, "kumquat");
657  /* lpDefault must be writable (trailing blanks are removed inplace in win9x) */
658  lstrcpyA(def_val, "default ");
659  ret = GetPrivateProfileStringA(emptystr, "name1", def_val,
660  buf, MAX_PATH, filename);
661  ok(ret == 7, "Expected 7, got %d\n", ret);
662  ok(!lstrcmpA(buf, "default"), "Expected \"default\", got \"%s\"\n", buf);
663  ok(emptystr_ok(emptystr), "AppName modified\n");
664 
665  /* lpAppName is empty, many blank characters in lpDefault */
666  memset(buf, 0xc,sizeof(buf));
667  lstrcpyA(buf, "kumquat");
668  /* lpDefault must be writable (trailing blanks are removed inplace in win9x) */
669  lstrcpyA(def_val, "one two ");
670  ret = GetPrivateProfileStringA(emptystr, "name1", def_val,
671  buf, MAX_PATH, filename);
672  ok(ret == 7, "Expected 7, got %d\n", ret);
673  ok(!lstrcmpA(buf, "one two"), "Expected \"one two\", got \"%s\"\n", buf);
674  ok(emptystr_ok(emptystr), "AppName modified\n");
675 
676  /* lpAppName is empty, blank character but not trailing in lpDefault */
677  memset(buf, 0xc,sizeof(buf));
678  lstrcpyA(buf, "kumquat");
679  ret = GetPrivateProfileStringA(emptystr, "name1", "one two",
680  buf, MAX_PATH, filename);
681  ok(ret == 7, "Expected 7, got %d\n", ret);
682  ok(!lstrcmpA(buf, "one two"), "Expected \"one two\", got \"%s\"\n", buf);
683  ok(emptystr_ok(emptystr), "AppName modified\n");
684 
685  /* lpKeyName is NULL */
686  memset(buf, 0xc,sizeof(buf));
687  lstrcpyA(buf, "kumquat");
688  ret = GetPrivateProfileStringA("section1", NULL, "default",
689  buf, MAX_PATH, filename);
690  ok(ret == 18, "Expected 18, got %d\n", ret);
691  ok(!memcmp(buf, "name1\0name2\0name4\0", ret + 1),
692  "Expected \"name1\\0name2\\0name4\\0\", got \"%s\"\n", buf);
693 
694  /* lpKeyName is empty */
695  memset(buf, 0xc,sizeof(buf));
696  lstrcpyA(buf, "kumquat");
697  ret = GetPrivateProfileStringA("section1", emptystr, "default",
698  buf, MAX_PATH, filename);
699  ok(ret == 7, "Expected 7, got %d\n", ret);
700  ok(!lstrcmpA(buf, "default"), "Expected \"default\", got \"%s\"\n", buf);
701  ok(emptystr_ok(emptystr), "KeyName modified\n");
702 
703  /* lpKeyName is missing */
704  memset(buf, 0xc,sizeof(buf));
705  lstrcpyA(buf, "kumquat");
706  ret = GetPrivateProfileStringA("section1", "notakey", "default",
707  buf, MAX_PATH, filename);
708  ok(ret == 7, "Expected 7, got %d\n", ret);
709  ok(!lstrcmpA(buf, "default"), "Expected \"default\", got \"%s\"\n", buf);
710 
711  /* lpKeyName is empty, lpDefault is NULL */
712  memset(buf, 0xc,sizeof(buf));
713  lstrcpyA(buf, "kumquat");
714  ret = GetPrivateProfileStringA("section1", emptystr, NULL,
715  buf, MAX_PATH, filename);
716  ok(ret == 0, "Expected 0, got %d\n", ret);
717  ok(!lstrcmpA(buf, "") ||
718  broken(!lstrcmpA(buf, "kumquat")), /* Win9x, WinME */
719  "Expected \"\", got \"%s\"\n", buf);
720  ok(emptystr_ok(emptystr), "KeyName modified\n");
721 
722  /* lpKeyName is empty, lpDefault is empty */
723  memset(buf, 0xc,sizeof(buf));
724  lstrcpyA(buf, "kumquat");
725  ret = GetPrivateProfileStringA("section1", emptystr, "",
726  buf, MAX_PATH, filename);
727  ok(ret == 0, "Expected 0, got %d\n", ret);
728  ok(!lstrcmpA(buf, ""), "Expected \"\", got \"%s\"\n", buf);
729  ok(emptystr_ok(emptystr), "KeyName modified\n");
730 
731  /* lpKeyName is empty, lpDefault has trailing blank characters */
732  memset(buf, 0xc,sizeof(buf));
733  lstrcpyA(buf, "kumquat");
734  /* lpDefault must be writable (trailing blanks are removed inplace in win9x) */
735  lstrcpyA(def_val, "default ");
736  ret = GetPrivateProfileStringA("section1", emptystr, def_val,
737  buf, MAX_PATH, filename);
738  ok(ret == 7, "Expected 7, got %d\n", ret);
739  ok(!lstrcmpA(buf, "default"), "Expected \"default\", got \"%s\"\n", buf);
740  ok(emptystr_ok(emptystr), "KeyName modified\n");
741 
742  if (0) /* crashes */
743  {
744  /* lpReturnedString is NULL */
745  ret = GetPrivateProfileStringA("section1", "name1", "default",
747  }
748 
749  /* lpFileName is NULL */
750  memset(buf, 0xc,sizeof(buf));
751  lstrcpyA(buf, "kumquat");
752  ret = GetPrivateProfileStringA("section1", "name1", "default",
753  buf, MAX_PATH, NULL);
754  ok(ret == 7 ||
755  broken(ret == 0), /* Win9x, WinME */
756  "Expected 7, got %d\n", ret);
757  ok(!lstrcmpA(buf, "default") ||
758  broken(!lstrcmpA(buf, "kumquat")), /* Win9x, WinME */
759  "Expected \"default\", got \"%s\"\n", buf);
760 
761  /* lpFileName is empty */
762  memset(buf, 0xc,sizeof(buf));
763  lstrcpyA(buf, "kumquat");
764  ret = GetPrivateProfileStringA("section1", "name1", "default",
765  buf, MAX_PATH, "");
766  ok(ret == 7, "Expected 7, got %d\n", ret);
767  ok(!lstrcmpA(buf, "default"), "Expected \"default\", got \"%s\"\n", buf);
768 
769  /* lpFileName is nonexistent */
770  memset(buf, 0xc,sizeof(buf));
771  lstrcpyA(buf, "kumquat");
772  ret = GetPrivateProfileStringA("section1", "name1", "default",
773  buf, MAX_PATH, "nonexistent");
774  ok(ret == 7, "Expected 7, got %d\n", ret);
775  ok(!lstrcmpA(buf, "default"), "Expected \"default\", got \"%s\"\n", buf);
776 
777  /* nSize is 0 */
778  memset(buf, 0xc,sizeof(buf));
779  lstrcpyA(buf, "kumquat");
780  ret = GetPrivateProfileStringA("section1", "name1", "default",
781  buf, 0, filename);
782  ok(ret == 0, "Expected 0, got %d\n", ret);
783  ok(!lstrcmpA(buf, "kumquat"), "Expected buf to be unchanged, got \"%s\"\n", buf);
784 
785  /* nSize is exact size of output */
786  memset(buf, 0xc,sizeof(buf));
787  lstrcpyA(buf, "kumquat");
788  ret = GetPrivateProfileStringA("section1", "name1", "default",
789  buf, 4, filename);
790  ok(ret == 3, "Expected 3, got %d\n", ret);
791  ok(!lstrcmpA(buf, "val"), "Expected \"val\", got \"%s\"\n", buf);
792 
793  /* nSize has room for NULL terminator */
794  memset(buf, 0xc,sizeof(buf));
795  lstrcpyA(buf, "kumquat");
796  ret = GetPrivateProfileStringA("section1", "name1", "default",
797  buf, 5, filename);
798  ok(ret == 4, "Expected 4, got %d\n", ret);
799  ok(!lstrcmpA(buf, "val1"), "Expected \"val1\", got \"%s\"\n", buf);
800 
801  /* output is 1 character */
802  memset(buf, 0xc,sizeof(buf));
803  lstrcpyA(buf, "kumquat");
804  ret = GetPrivateProfileStringA("section1", "name4", "default",
805  buf, MAX_PATH, filename);
806  ok(ret == 1, "Expected 1, got %d\n", ret);
807  ok(!lstrcmpA(buf, "a"), "Expected \"a\", got \"%s\"\n", buf);
808 
809  /* output is 1 character, no room for NULL terminator */
810  memset(buf, 0xc,sizeof(buf));
811  lstrcpyA(buf, "kumquat");
812  ret = GetPrivateProfileStringA("section1", "name4", "default",
813  buf, 1, filename);
814  ok(ret == 0, "Expected 0, got %d\n", ret);
815  ok(!lstrcmpA(buf, ""), "Expected \"\", got \"%s\"\n", buf);
816 
817  /* lpAppName is NULL, not enough room for final section name */
818  memset(buf, 0xc,sizeof(buf));
819  lstrcpyA(buf, "kumquat");
820  ret = GetPrivateProfileStringA(NULL, "name1", "default",
821  buf, 16, filename);
822  ok(ret == 14, "Expected 14, got %d\n", ret);
823  len = lstrlenA("section1") + 2 * sizeof(CHAR);
824  todo_wine
825  ok(!memcmp(buf, "section1\0secti\0\0", ret + 2) ||
826  broken(!memcmp(buf, "section1\0\0", len)), /* Win9x, WinME */
827  "Expected \"section1\\0secti\\0\\0\", got \"%s\"\n", buf);
828 
829  /* lpKeyName is NULL, not enough room for final key name */
830  memset(buf, 0xc,sizeof(buf));
831  lstrcpyA(buf, "kumquat");
832  ret = GetPrivateProfileStringA("section1", NULL, "default",
833  buf, 16, filename);
834  ok(ret == 14, "Expected 14, got %d\n", ret);
835  todo_wine
836  ok(!memcmp(buf, "name1\0name2\0na\0\0", ret + 2) ||
837  broken(!memcmp(buf, "name1\0name2\0n\0\0", ret + 1)), /* Win9x, WinME */
838  "Expected \"name1\\0name2\\0na\\0\\0\", got \"%s\"\n", buf);
839 
840  /* key value has quotation marks which are stripped */
841  memset(buf, 0xc,sizeof(buf));
842  lstrcpyA(buf, "kumquat");
843  ret = GetPrivateProfileStringA("section1", "name2", "default",
844  buf, MAX_PATH, filename);
845  ok(ret == 4, "Expected 4, got %d\n", ret);
846  ok(!lstrcmpA(buf, "val2"), "Expected \"val2\", got \"%s\"\n", buf);
847 
848  /* case does not match */
849  memset(buf, 0xc,sizeof(buf));
850  lstrcpyA(buf, "kumquat");
851  ret = GetPrivateProfileStringA("section1", "NaMe1", "default",
852  buf, MAX_PATH, filename);
853  ok(ret == 4, "Expected 4, got %d\n", ret);
854  ok(!lstrcmpA(buf, "val1"), "Expected \"val1\", got \"%s\"\n", buf);
855 
856  /* only filename is used */
857  memset(buf, 0xc,sizeof(buf));
858  lstrcpyA(buf, "kumquat");
859  ret = GetPrivateProfileStringA("section1", "NaMe1", "default",
860  buf, MAX_PATH, "winetest.ini");
861  ok(ret == 7, "Expected 7, got %d\n", ret);
862  ok(!lstrcmpA(buf, "default"), "Expected \"default\", got \"%s\"\n", buf);
863 
865  SetLastError(0xdeadbeef);
866  ret = GetTempFileNameA(windir, "pre", 0, path);
867  if (!ret && GetLastError() == ERROR_ACCESS_DENIED)
868  {
869  skip("Not allowed to create a file in the Windows directory\n");
871  return;
872  }
873  tempfile = strrchr(path, '\\') + 1;
875 
876  /* only filename is used, file exists in windows directory */
877  memset(buf, 0xc,sizeof(buf));
878  lstrcpyA(buf, "kumquat");
879  ret = GetPrivateProfileStringA("section1", "NaMe1", "default",
880  buf, MAX_PATH, tempfile);
881  ok(ret == 4, "Expected 4, got %d\n", ret);
882  ok(!lstrcmpA(buf, "val1"), "Expected \"val1\", got \"%s\"\n", buf);
883 
884  /* successful case */
885  memset(buf, 0xc,sizeof(buf));
886  lstrcpyA(buf, "kumquat");
887  ret = GetPrivateProfileStringA("section1", "name1", "default",
888  buf, MAX_PATH, filename);
889  ok(ret == 4, "Expected 4, got %d\n", ret);
890  ok(!lstrcmpA(buf, "val1"), "Expected \"val1\", got \"%s\"\n", buf);
891 
892  /* Existing section with no keys in an existing file */
893  memset(buf, 0xc,sizeof(buf));
894  SetLastError(0xdeadbeef);
895  ret=GetPrivateProfileStringA("section2", "DoesntExist", "",
896  buf, MAX_PATH, filename);
897  ok( ret == 0, "expected return size 0, got %d\n", ret );
898  ok(!lstrcmpA(buf, ""), "Expected \"\", got \"%s\"\n", buf);
899  todo_wine
900  ok( GetLastError() == 0xdeadbeef ||
901  GetLastError() == ERROR_FILE_NOT_FOUND /* Win 7 */,
902  "expected 0xdeadbeef or ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
903 
904 
905  DeleteFileA(path);
907 }
INT WINAPI GetPrivateProfileStringW(LPCWSTR section, LPCWSTR entry, LPCWSTR def_val, LPWSTR buffer, UINT len, LPCWSTR filename)
Definition: profile.c:1142
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
Definition: synch.c:790
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
static BOOL emptystr_ok(CHAR emptystr[MAX_PATH])
Definition: profile.c:522
char CHAR
Definition: xmlstorage.h:175
int WINAPI lstrcmpA(LPCSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:18
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
_Check_return_ _CRTIMP _CONST_RETURN char *__cdecl strrchr(_In_z_ const char *_Str, _In_ int _Ch)
char * LPSTR
Definition: xmlstorage.h:182
const char * filename
Definition: ioapi.h:135
INT WINAPI GetPrivateProfileStringA(LPCSTR section, LPCSTR entry, LPCSTR def_val, LPSTR buffer, UINT len, LPCSTR filename)
Definition: profile.c:1204
#define ERROR_ACCESS_DENIED
Definition: compat.h:87
content
Definition: atl_ax.c:994
smooth NULL
Definition: ftsmooth.c:416
BOOL WINAPI DeleteFileA(IN LPCSTR lpFileName)
Definition: delete.c:24
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
#define trace
Definition: atltest.h:70
#define MAX_PATH
Definition: compat.h:26
unsigned long DWORD
Definition: ntddk_ex.h:95
#define SetLastError(x)
Definition: compat.h:409
LPSTR WINAPI lstrcpyA(LPSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:100
int ret
#define todo_wine
Definition: test.h:154
GLenum GLsizei len
Definition: glext.h:6722
#define broken(x)
Definition: _sntprintf.h:21
int WINAPI lstrlenA(LPCSTR lpString)
Definition: lstring.c:145
static void create_test_file(LPCSTR name, LPCSTR data, DWORD size)
Definition: profile.c:511
#define ok(value,...)
Definition: atltest.h:57
Definition: services.c:325
UINT WINAPI GetWindowsDirectoryA(OUT LPSTR lpBuffer, IN UINT uSize)
Definition: path.c:2336
#define skip(...)
Definition: atltest.h:64
#define ERROR_CALL_NOT_IMPLEMENTED
Definition: compat.h:92
#define memset(x, y, z)
Definition: compat.h:39
#define CHAR(Char)
#define win_skip
Definition: test.h:141
UINT WINAPI GetTempFileNameA(IN LPCSTR lpPathName, IN LPCSTR lpPrefixString, IN UINT uUnique, OUT LPSTR lpTempFileName)
Definition: filename.c:26

Referenced by START_TEST().

◆ test_profile_delete_on_close()

static void test_profile_delete_on_close ( void  )
static

Definition at line 441 of file profile.c.

442 {
443  HANDLE h;
444  DWORD size, res;
445  static const CHAR testfile[] = ".\\testwine5.ini";
446  static const char contents[] = "[" SECTION "]\n" KEY "=123\n";
447 
450  res = WriteFile( h, contents, sizeof contents - 1, &size, NULL );
451  ok( res, "Cannot write test file: %x\n", GetLastError() );
452  ok( size == sizeof contents - 1, "Test file: partial write\n");
453 
454  SetLastError(0xdeadbeef);
455  res = GetPrivateProfileIntA(SECTION, KEY, 0, testfile);
456  ok( res == 123 ||
457  broken(res == 0 && GetLastError() == ERROR_SHARING_VIOLATION), /* Win9x, WinME */
458  "Got %d instead of 123\n", res);
459 
460  /* This also deletes the file */
461  CloseHandle(h);
462 }
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
#define CloseHandle
Definition: compat.h:398
char CHAR
Definition: xmlstorage.h:175
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
#define FILE_SHARE_READ
Definition: compat.h:125
GLfloat GLfloat GLfloat GLfloat h
Definition: glext.h:7723
#define GENERIC_WRITE
Definition: nt_native.h:90
smooth NULL
Definition: ftsmooth.c:416
GLsizeiptr size
Definition: glext.h:5919
#define FILE_FLAG_DELETE_ON_CLOSE
Definition: disk.h:42
unsigned long DWORD
Definition: ntddk_ex.h:95
#define SetLastError(x)
Definition: compat.h:409
#define ERROR_SHARING_VIOLATION
Definition: winerror.h:135
#define broken(x)
Definition: _sntprintf.h:21
Definition: btrfs.h:126
#define CREATE_ALWAYS
Definition: disk.h:72
#define ok(value,...)
Definition: atltest.h:57
GLuint res
Definition: glext.h:9613
#define CreateFileA(a, b, c, d, e, f, g)
Definition: compat.h:399
UINT WINAPI GetPrivateProfileIntA(LPCSTR section, LPCSTR entry, INT def_val, LPCSTR filename)
Definition: profile.c:1326

Referenced by START_TEST().

◆ test_profile_directory_readonly()

static void test_profile_directory_readonly ( void  )
static

Definition at line 536 of file profile.c.

537 {
538  BOOL ret;
539  CHAR path_folder[MAX_PATH];
540  CHAR path_file[MAX_PATH];
541  const char *sddl_string_everyone_readonly = "D:PAI(A;;0x1200a9;;;WD)";
542  SECURITY_ATTRIBUTES attributes = {0};
543  char lpStruct[] = { 's', 't', 'r', 'i', 'n', 'g' };
544 
545  attributes.nLength = sizeof(attributes);
547  ok(ret == TRUE, "ConvertStringSecurityDescriptorToSecurityDescriptor failed: %d\n", GetLastError());
548 
549  GetTempPathA(MAX_PATH, path_folder);
550  lstrcatA(path_folder, "wine-test");
551 
552  strcpy(path_file, path_folder);
553  lstrcatA(path_file, "\\tmp.ini");
554 
555  ret = CreateDirectoryA(path_folder, &attributes);
556  ok(ret == TRUE, "CreateDirectoryA failed: %d\n", GetLastError());
557 
558  ret = WritePrivateProfileStringA("App", "key", "string", path_file);
559  ok(ret == FALSE, "Expected FALSE, got %d\n", ret);
560 
561  ret = WritePrivateProfileSectionA("App", "key=string", path_file);
562  ok(ret == FALSE, "Expected FALSE, got %d\n", ret);
563 
564  ret = WritePrivateProfileStructA("App", "key", lpStruct, sizeof(lpStruct), path_file);
565  ok(ret == FALSE, "Expected FALSE, got %d\n", ret);
566 
567  ret = RemoveDirectoryA(path_folder);
568  ok(ret == TRUE, "RemoveDirectoryA failed: %d\n", GetLastError());
569 }
#define TRUE
Definition: types.h:120
char CHAR
Definition: xmlstorage.h:175
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
unsigned int BOOL
Definition: ntddk_ex.h:94
BOOL WINAPI WritePrivateProfileSectionA(LPCSTR section, LPCSTR string, LPCSTR filename)
Definition: profile.c:1553
BOOL WINAPI CreateDirectoryA(IN LPCSTR lpPathName, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
Definition: dir.c:37
smooth NULL
Definition: ftsmooth.c:416
LPSTR WINAPI lstrcatA(LPSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:123
#define MAX_PATH
Definition: compat.h:26
BOOL WINAPI ConvertStringSecurityDescriptorToSecurityDescriptorA(LPCSTR StringSecurityDescriptor, DWORD StringSDRevision, PSECURITY_DESCRIPTOR *SecurityDescriptor, PULONG SecurityDescriptorSize)
Definition: security.c:2708
int ret
BOOL WINAPI WritePrivateProfileStructA(LPCSTR section, LPCSTR key, LPVOID buf, UINT bufsize, LPCSTR filename)
Definition: profile.c:1838
LPVOID lpSecurityDescriptor
Definition: compat.h:181
DWORD WINAPI GetTempPathA(IN DWORD nBufferLength, OUT LPSTR lpBuffer)
Definition: path.c:2053
#define ok(value,...)
Definition: atltest.h:57
BOOL WINAPI RemoveDirectoryA(IN LPCSTR lpPathName)
Definition: dir.c:714
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
BOOL WINAPI DECLSPEC_HOTPATCH WritePrivateProfileStringA(LPCSTR section, LPCSTR entry, LPCSTR string, LPCSTR filename)
Definition: profile.c:1484
#define SDDL_REVISION_1
Definition: sddl.h:30

Referenced by START_TEST().

◆ test_profile_existing()

static void test_profile_existing ( void  )
static

Definition at line 352 of file profile.c.

353 {
354  static const char *testfile1 = ".\\winesharing1.ini";
355  static const char *testfile2 = ".\\winesharing2.ini";
356 
357  static const struct {
358  DWORD dwDesiredAccess;
359  DWORD dwShareMode;
360  DWORD write_error;
361  BOOL read_error;
362  DWORD broken_error;
363  } pe[] = {
372  /*Thief demo (bug 5024) opens .ini file like this*/
374  };
375 
376  int i;
377  BOOL ret;
378  DWORD size;
379  HANDLE h = 0;
380  char buffer[MAX_PATH];
381 
382  for (i=0; i < sizeof(pe)/sizeof(pe[0]); i++)
383  {
384  h = CreateFileA(testfile1, pe[i].dwDesiredAccess, pe[i].dwShareMode, NULL,
386  ok(INVALID_HANDLE_VALUE != h, "%d: CreateFile failed\n",i);
387  SetLastError(0xdeadbeef);
388 
389  ret = WritePrivateProfileStringA(SECTION, KEY, "12345", testfile1);
390  if (!pe[i].write_error)
391  {
392  if (!ret)
393  ok( broken(GetLastError() == pe[i].broken_error),
394  "%d: WritePrivateProfileString failed with error %u\n", i, GetLastError() );
395  CloseHandle(h);
397  if (ret)
398  ok( size == 5, "%d: test failed, number of characters copied: %d instead of 5\n", i, size );
399  else
400  ok( !size, "%d: test failed, number of characters copied: %d instead of 0\n", i, size );
401  }
402  else
403  {
404  DWORD err = GetLastError();
405  ok( !ret, "%d: WritePrivateProfileString succeeded\n", i );
406  if (!ret)
407  ok( err == pe[i].write_error, "%d: WritePrivateProfileString failed with error %u/%u\n",
408  i, err, pe[i].write_error );
409  CloseHandle(h);
411  ok( !size, "%d: test failed, number of characters copied: %d instead of 0\n", i, size );
412  }
413 
414  ok( DeleteFileA(testfile1), "delete failed\n" );
415  }
416 
418  sprintf( buffer, "[%s]\r\n%s=123\r\n", SECTION, KEY );
419  ok( WriteFile( h, buffer, strlen(buffer), &size, NULL ), "failed to write\n" );
420  CloseHandle( h );
421 
422  for (i=0; i < sizeof(pe)/sizeof(pe[0]); i++)
423  {
424  h = CreateFileA(testfile2, pe[i].dwDesiredAccess, pe[i].dwShareMode, NULL,
426  ok(INVALID_HANDLE_VALUE != h, "%d: CreateFile failed\n",i);
427  SetLastError(0xdeadbeef);
429  /* Win9x and WinME returns 0 for all cases except the first one */
430  if (!pe[i].read_error)
431  ok( ret ||
432  broken(!ret && GetLastError() == 0xdeadbeef), /* Win9x, WinME */
433  "%d: GetPrivateProfileString failed with error %u\n", i, GetLastError() );
434  else
435  ok( !ret, "%d: GetPrivateProfileString succeeded\n", i );
436  CloseHandle(h);
437  }
438  ok( DeleteFileA(testfile2), "delete failed\n" );
439 }
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
#define TRUE
Definition: types.h:120
#define CloseHandle
Definition: compat.h:398
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
#define INVALID_HANDLE_VALUE
Definition: compat.h:391
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
GLuint buffer
Definition: glext.h:5915
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
#define FILE_SHARE_READ
Definition: compat.h:125
GLfloat GLfloat GLfloat GLfloat h
Definition: glext.h:7723
INT WINAPI GetPrivateProfileStringA(LPCSTR section, LPCSTR entry, LPCSTR def_val, LPSTR buffer, UINT len, LPCSTR filename)
Definition: profile.c:1204
#define sprintf(buf, format,...)
Definition: sprintf.c:55
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
unsigned int BOOL
Definition: ntddk_ex.h:94
#define GENERIC_WRITE
Definition: nt_native.h:90
smooth NULL
Definition: ftsmooth.c:416
BOOL WINAPI DeleteFileA(IN LPCSTR lpFileName)
Definition: delete.c:24
#define OPEN_EXISTING
Definition: compat.h:426
GLsizeiptr size
Definition: glext.h:5919
#define MAX_PATH
Definition: compat.h:26
unsigned long DWORD
Definition: ntddk_ex.h:95
#define SetLastError(x)
Definition: compat.h:409
int ret
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:126
#define GENERIC_READ
Definition: compat.h:124
#define ERROR_SHARING_VIOLATION
Definition: winerror.h:135
#define err(...)
#define broken(x)
Definition: _sntprintf.h:21
Definition: btrfs.h:126
#define CREATE_ALWAYS
Definition: disk.h:72
#define ok(value,...)
Definition: atltest.h:57
#define CreateFileA(a, b, c, d, e, f, g)
Definition: compat.h:399
BOOL WINAPI DECLSPEC_HOTPATCH WritePrivateProfileStringA(LPCSTR section, LPCSTR entry, LPCSTR string, LPCSTR filename)
Definition: profile.c:1484

Referenced by START_TEST().

◆ test_profile_int()

static void test_profile_int ( void  )
static

Definition at line 45 of file profile.c.

46 {
47  struct _profileInt profileInt[]={
48  { NULL, NULL, NULL, NULL, 70, 0 , 0}, /* 0 */
49  { NULL, NULL, NULL, TESTFILE, -1, 4294967295U, 0},
50  { NULL, NULL, NULL, TESTFILE, 1, 1 , 0},
51  { SECTION, NULL, NULL, TESTFILE, -1, 4294967295U, 0},
52  { SECTION, NULL, NULL, TESTFILE, 1, 1 , 0},
53  { NULL, KEY, NULL, TESTFILE, -1, 4294967295U, 0}, /* 5 */
54  { NULL, KEY, NULL, TESTFILE, 1, 1 , 0},
55  { SECTION, KEY, NULL, TESTFILE, -1, 4294967295U, 4294967295U},
56  { SECTION, KEY, NULL, TESTFILE, 1, 1 , 1},
57  { SECTION, KEY, "-1", TESTFILE, -1, 4294967295U, 4294967295U},
58  { SECTION, KEY, "-1", TESTFILE, 1, 4294967295U, 4294967295U}, /* 10 */
59  { SECTION, KEY, "1", TESTFILE, -1, 1 , 1},
60  { SECTION, KEY, "1", TESTFILE, 1, 1 , 1},
61  { SECTION, KEY, "+1", TESTFILE, -1, 1 , 0},
62  { SECTION, KEY, "+1", TESTFILE, 1, 1 , 0},
63  { SECTION, KEY, "4294967296", TESTFILE, -1, 0 , 0}, /* 15 */
64  { SECTION, KEY, "4294967296", TESTFILE, 1, 0 , 0},
65  { SECTION, KEY, "4294967297", TESTFILE, -1, 1 , 1},
66  { SECTION, KEY, "4294967297", TESTFILE, 1, 1 , 1},
67  { SECTION, KEY, "-4294967297", TESTFILE, -1, 4294967295U, 4294967295U},
68  { SECTION, KEY, "-4294967297", TESTFILE, 1, 4294967295U, 4294967295U}, /* 20 */
69  { SECTION, KEY, "42A94967297", TESTFILE, -1, 42 , 42},
70  { SECTION, KEY, "42A94967297", TESTFILE, 1, 42 , 42},
71  { SECTION, KEY, "B4294967297", TESTFILE, -1, 0 , 0},
72  { SECTION, KEY, "B4294967297", TESTFILE, 1, 0 , 0},
73  };
74  int i, num_test = (sizeof(profileInt)/sizeof(struct _profileInt));
75  UINT res;
76 
78 
79  for (i=0; i < num_test; i++) {
80  if (profileInt[i].value)
82  profileInt[i].iniFile);
83 
84  res = GetPrivateProfileIntA(profileInt[i].section, profileInt[i].key,
85  profileInt[i].defaultVal, profileInt[i].iniFile);
86  ok((res == profileInt[i].result) || (res == profileInt[i].result9x),
87  "test<%02d>: ret<%010u> exp<%010u><%010u>\n",
88  i, res, profileInt[i].result, profileInt[i].result9x);
89  }
90 
92 }
#define U(x)
Definition: wordpad.c:44
INT defaultVal
Definition: profile.c:40
Definition: parser.c:55
#define SECTION
Definition: profile.c:31
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
smooth NULL
Definition: ftsmooth.c:416
BOOL WINAPI DeleteFileA(IN LPCSTR lpFileName)
Definition: delete.c:24
char iniFile[_MAX_PATH]
Definition: tftpd.cpp:37
UINT result9x
Definition: profile.c:42
Definition: btrfs.h:126
#define KEY
Definition: profile.c:30
#define ok(value,...)
Definition: atltest.h:57
unsigned int UINT
Definition: ndis.h:50
GLuint res
Definition: glext.h:9613
BOOL WINAPI DECLSPEC_HOTPATCH WritePrivateProfileStringA(LPCSTR section, LPCSTR entry, LPCSTR string, LPCSTR filename)
Definition: profile.c:1484
UINT WINAPI GetPrivateProfileIntA(LPCSTR section, LPCSTR entry, INT def_val, LPCSTR filename)
Definition: profile.c:1326
GLuint64EXT * result
Definition: glext.h:11304
Definition: path.c:42
#define TESTFILE
Definition: profile.c:32

Referenced by START_TEST().

◆ test_profile_refresh()

static void test_profile_refresh ( void  )
static

Definition at line 464 of file profile.c.

465 {
466  static const CHAR testfile[] = ".\\winetest4.ini";
467  HANDLE h;
468  DWORD size, res;
469  static const char contents1[] = "[" SECTION "]\n" KEY "=123\n";
470  static const char contents2[] = "[" SECTION "]\n" KEY "=124\n";
471 
474  res = WriteFile( h, contents1, sizeof contents1 - 1, &size, NULL );
475  ok( res, "Cannot write test file: %x\n", GetLastError() );
476  ok( size == sizeof contents1 - 1, "Test file: partial write\n");
477 
478  SetLastError(0xdeadbeef);
479  res = GetPrivateProfileIntA(SECTION, KEY, 0, testfile);
480  ok( res == 123 ||
481  broken(res == 0 && GetLastError() == ERROR_SHARING_VIOLATION), /* Win9x, WinME */
482  "Got %d instead of 123\n", res);
483 
484  CloseHandle(h);
485 
486  /* Test proper invalidation of wine's profile file cache */
487 
490  res = WriteFile( h, contents2, sizeof contents2 - 1, &size, NULL );
491  ok( res, "Cannot write test file: %x\n", GetLastError() );
492  ok( size == sizeof contents2 - 1, "Test file: partial write\n");
493 
494  SetLastError(0xdeadbeef);
495  res = GetPrivateProfileIntA(SECTION, KEY, 0, testfile);
496  ok( res == 124 ||
497  broken(res == 0 && GetLastError() == 0xdeadbeef), /* Win9x, WinME */
498  "Got %d instead of 124\n", res);
499 
500  /* This also deletes the file */
501  CloseHandle(h);
502 
503  /* Cache must be invalidated if file no longer exists and default must be returned */
504  SetLastError(0xdeadbeef);
505  res = GetPrivateProfileIntA(SECTION, KEY, 421, testfile);
506  ok( res == 421 ||
507  broken(res == 0 && GetLastError() == 0xdeadbeef), /* Win9x, WinME */
508  "Got %d instead of 421\n", res);
509 }
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
#define CloseHandle
Definition: compat.h:398
char CHAR
Definition: xmlstorage.h:175
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
#define FILE_SHARE_READ
Definition: compat.h:125
GLfloat GLfloat GLfloat GLfloat h
Definition: glext.h:7723
#define GENERIC_WRITE
Definition: nt_native.h:90
smooth NULL
Definition: ftsmooth.c:416
GLsizeiptr size
Definition: glext.h:5919
#define FILE_FLAG_DELETE_ON_CLOSE
Definition: disk.h:42
unsigned long DWORD
Definition: ntddk_ex.h:95
#define SetLastError(x)
Definition: compat.h:409
#define ERROR_SHARING_VIOLATION
Definition: winerror.h:135
#define broken(x)
Definition: _sntprintf.h:21
Definition: btrfs.h:126
#define CREATE_ALWAYS
Definition: disk.h:72
#define ok(value,...)
Definition: atltest.h:57
GLuint res
Definition: glext.h:9613
#define CreateFileA(a, b, c, d, e, f, g)
Definition: compat.h:399
UINT WINAPI GetPrivateProfileIntA(LPCSTR section, LPCSTR entry, INT def_val, LPCSTR filename)
Definition: profile.c:1326

Referenced by START_TEST().

◆ test_profile_sections()

static void test_profile_sections ( void  )
static

Definition at line 165 of file profile.c.

166 {
167  HANDLE h;
168  int ret;
169  DWORD count;
170  char buf[100];
171  char *p;
172  static const char content[]="[section1]\r\nname1=val1\r\nname2=\r\nname3\r\nname4=val4\r\n[section2]\r\n";
173  static const char testfile4[]=".\\testwine4.ini";
174  BOOL on_win98 = FALSE;
175 
176  DeleteFileA( testfile4 );
178  ok( h != INVALID_HANDLE_VALUE, " cannot create %s\n", testfile4);
179  if( h == INVALID_HANDLE_VALUE) return;
180  WriteFile( h, content, sizeof(content), &count, NULL);
181  CloseHandle( h);
182 
183  /* Some parameter checking */
184  SetLastError(0xdeadbeef);
186  ok( ret == 0, "expected return size 0, got %d\n", ret );
188  GetLastError() == 0xdeadbeef /* Win98 */,
189  "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
190  if (GetLastError() == 0xdeadbeef) on_win98 = TRUE;
191 
192  SetLastError(0xdeadbeef);
193  ret = GetPrivateProfileSectionA( NULL, NULL, 0, testfile4 );
194  ok( ret == 0, "expected return size 0, got %d\n", ret );
196  GetLastError() == 0xdeadbeef /* Win98 */,
197  "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
198 
199  if (!on_win98)
200  {
201  SetLastError(0xdeadbeef);
202  ret = GetPrivateProfileSectionA( "section1", NULL, 0, testfile4 );
203  ok( ret == 0, "expected return size 0, got %d\n", ret );
204  ok( GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
205  }
206 
207  SetLastError(0xdeadbeef);
208  ret = GetPrivateProfileSectionA( NULL, buf, sizeof(buf), testfile4 );
209  ok( ret == 0, "expected return size 0, got %d\n", ret );
211  broken(GetLastError() == 0xdeadbeef), /* Win9x, WinME */
212  "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
213 
214  SetLastError(0xdeadbeef);
215  ret = GetPrivateProfileSectionA( "section1", buf, sizeof(buf), NULL );
216  ok( ret == 0, "expected return size 0, got %d\n", ret );
217  todo_wine
219  broken(GetLastError() == 0xdeadbeef), /* Win9x, WinME */
220  "expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
221 
222  /* Existing empty section with no keys */
223  SetLastError(0xdeadbeef);
224  ret=GetPrivateProfileSectionA("section2", buf, sizeof(buf), testfile4);
225  ok( ret == 0, "expected return size 0, got %d\n", ret );
226  ok( GetLastError() == ERROR_SUCCESS ||
227  broken(GetLastError() == 0xdeadbeef), /* Win9x, WinME */
228  "expected ERROR_SUCCESS, got %d\n", GetLastError());
229 
230  /* Existing section with keys and values*/
231  SetLastError(0xdeadbeef);
232  ret=GetPrivateProfileSectionA("section1", buf, sizeof(buf), testfile4);
233  for( p = buf + strlen(buf) + 1; *p;p += strlen(p)+1)
234  p[-1] = ',';
235  ok( ret == 35 && !strcmp( buf, "name1=val1,name2=,name3,name4=val4"), "wrong section returned(%d): %s\n",
236  ret, buf);
237  ok( buf[ret-1] == 0 && buf[ret] == 0, "returned buffer not terminated with double-null\n" );
238  ok( GetLastError() == ERROR_SUCCESS ||
239  broken(GetLastError() == 0xdeadbeef), /* Win9x, WinME */
240  "expected ERROR_SUCCESS, got %d\n", GetLastError());
241 
242  /* Overflow*/
243  ret=GetPrivateProfileSectionA("section1", buf, 24, testfile4);
244  for( p = buf + strlen(buf) + 1; *p;p += strlen(p)+1)
245  p[-1] = ',';
246  ok( ret == 22 && !strcmp( buf, "name1=val1,name2=,name"), "wrong section returned(%d): %s\n",
247  ret, buf);
248  ok( buf[ret] == 0 && buf[ret+1] == 0, "returned buffer not terminated with double-null\n" );
249 
250  DeleteFileA( testfile4 );
251 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:91
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
#define TRUE
Definition: types.h:120
#define CloseHandle
Definition: compat.h:398
#define ERROR_SUCCESS
Definition: deptool.c:10
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLuint GLuint GLsizei count
Definition: gl.h:1545
#define INVALID_HANDLE_VALUE
Definition: compat.h:391
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
GLfloat GLfloat GLfloat GLfloat h
Definition: glext.h:7723
unsigned int BOOL
Definition: ntddk_ex.h:94
#define GENERIC_WRITE
Definition: nt_native.h:90
content
Definition: atl_ax.c:994
smooth NULL
Definition: ftsmooth.c:416
BOOL WINAPI DeleteFileA(IN LPCSTR lpFileName)
Definition: delete.c:24
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
unsigned long DWORD
Definition: ntddk_ex.h:95
#define SetLastError(x)
Definition: compat.h:409
int ret
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:126
#define todo_wine
Definition: test.h:154
#define broken(x)
Definition: _sntprintf.h:21
#define CREATE_ALWAYS
Definition: disk.h:72
#define ok(value,...)
Definition: atltest.h:57
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
#define CreateFileA(a, b, c, d, e, f, g)
Definition: compat.h:399
GLfloat GLfloat p
Definition: glext.h:8902
INT WINAPI GetPrivateProfileSectionA(LPCSTR section, LPSTR buffer, DWORD len, LPCSTR filename)
Definition: profile.c:1381

Referenced by START_TEST().

◆ test_profile_sections_names()

static void test_profile_sections_names ( void  )
static

Definition at line 253 of file profile.c.

254 {
255  HANDLE h;
256  int ret;
257  DWORD count;
258  char buf[100];
259  WCHAR bufW[100];
260  static const char content[]="[section1]\r\n[section2]\r\n[section3]\r\n";
261  static const char testfile3[]=".\\testwine3.ini";
262  static const WCHAR testfile3W[]={ '.','\\','t','e','s','t','w','i','n','e','3','.','i','n','i',0 };
263  static const WCHAR not_here[] = {'.','\\','n','o','t','_','h','e','r','e','.','i','n','i',0};
264  DeleteFileA( testfile3 );
265  h = CreateFileA( testfile3, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
267  ok( h != INVALID_HANDLE_VALUE, " cannot create %s\n", testfile3);
268  if( h == INVALID_HANDLE_VALUE) return;
269  WriteFile( h, content, sizeof(content), &count, NULL);
270  CloseHandle( h);
271 
272  /* Test with sufficiently large buffer */
273  memset(buf, 0xc, sizeof(buf));
274  ret = GetPrivateProfileSectionNamesA( buf, 29, testfile3 );
275  ok( ret == 27 ||
276  broken(ret == 28), /* Win9x, WinME */
277  "expected return size 27, got %d\n", ret );
278  ok( (buf[ret-1] == 0 && buf[ret] == 0) ||
279  broken(buf[ret-1] == 0 && buf[ret-2] == 0), /* Win9x, WinME */
280  "returned buffer not terminated with double-null\n" );
281 
282  /* Test with exactly fitting buffer */
283  memset(buf, 0xc, sizeof(buf));
284  ret = GetPrivateProfileSectionNamesA( buf, 28, testfile3 );
285  ok( ret == 26 ||
286  broken(ret == 28), /* Win9x, WinME */
287  "expected return size 26, got %d\n", ret );
288  todo_wine
289  ok( (buf[ret+1] == 0 && buf[ret] == 0) || /* W2K3 and higher */
290  broken(buf[ret+1] == 0xc && buf[ret] == 0) || /* NT4, W2K, WinXP */
291  broken(buf[ret-1] == 0 && buf[ret-2] == 0), /* Win9x, WinME */
292  "returned buffer not terminated with double-null\n" );
293 
294  /* Test with a buffer too small */
295  memset(buf, 0xc, sizeof(buf));
296  ret = GetPrivateProfileSectionNamesA( buf, 27, testfile3 );
297  ok( ret == 25, "expected return size 25, got %d\n", ret );
298  /* Win9x and WinME only fills the buffer with complete section names (double-null terminated) */
299  count = strlen("section1") + sizeof(CHAR) + strlen("section2");
300  todo_wine
301  ok( (buf[ret+1] == 0 && buf[ret] == 0) ||
302  broken(buf[count] == 0 && buf[count+1] == 0), /* Win9x, WinME */
303  "returned buffer not terminated with double-null\n" );
304 
305  /* Tests on nonexistent file */
306  memset(buf, 0xc, sizeof(buf));
307  ret = GetPrivateProfileSectionNamesA( buf, 10, ".\\not_here.ini" );
308  ok( ret == 0 ||
309  broken(ret == 1), /* Win9x, WinME */
310  "expected return size 0, got %d\n", ret );
311  ok( buf[0] == 0, "returned buffer not terminated with null\n" );
312  ok( buf[1] != 0, "returned buffer terminated with double-null\n" );
313 
314  /* Test with sufficiently large buffer */
315  SetLastError(0xdeadbeef);
316  memset(bufW, 0xcc, sizeof(bufW));
317  ret = GetPrivateProfileSectionNamesW( bufW, 29, testfile3W );
318  if (ret == 0 && (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED))
319  {
320  win_skip("GetPrivateProfileSectionNamesW is not implemented\n");
321  DeleteFileA( testfile3 );
322  return;
323  }
324  ok( ret == 27, "expected return size 27, got %d\n", ret );
325  ok( bufW[ret-1] == 0 && bufW[ret] == 0, "returned buffer not terminated with double-null\n" );
326 
327  /* Test with exactly fitting buffer */
328  memset(bufW, 0xcc, sizeof(bufW));
329  ret = GetPrivateProfileSectionNamesW( bufW, 28, testfile3W );
330  ok( ret == 26, "expected return size 26, got %d\n", ret );
331  ok( (bufW[ret+1] == 0 && bufW[ret] == 0) || /* W2K3 and higher */
332  broken(bufW[ret+1] == 0xcccc && bufW[ret] == 0), /* NT4, W2K, WinXP */
333  "returned buffer not terminated with double-null\n" );
334 
335  /* Test with a buffer too small */
336  memset(bufW, 0xcc, sizeof(bufW));
337  ret = GetPrivateProfileSectionNamesW( bufW, 27, testfile3W );
338  ok( ret == 25, "expected return size 25, got %d\n", ret );
339  ok( bufW[ret+1] == 0 && bufW[ret] == 0, "returned buffer not terminated with double-null\n" );
340 
341  DeleteFileA( testfile3 );
342 
343  /* Tests on nonexistent file */
344  memset(bufW, 0xcc, sizeof(bufW));
345  ret = GetPrivateProfileSectionNamesW( bufW, 10, not_here );
346  ok( ret == 0, "expected return size 0, got %d\n", ret );
347  ok( bufW[0] == 0, "returned buffer not terminated with null\n" );
348  ok( bufW[1] != 0, "returned buffer terminated with double-null\n" );
349 }
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
#define CloseHandle
Definition: compat.h:398
DWORD WINAPI GetPrivateProfileSectionNamesA(LPSTR buffer, DWORD size, LPCSTR filename)
Definition: profile.c:1660
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLuint GLuint GLsizei count
Definition: gl.h:1545
#define INVALID_HANDLE_VALUE
Definition: compat.h:391
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
GLfloat GLfloat GLfloat GLfloat h
Definition: glext.h:7723
#define GENERIC_WRITE
Definition: nt_native.h:90
content
Definition: atl_ax.c:994
smooth NULL
Definition: ftsmooth.c:416
BOOL WINAPI DeleteFileA(IN LPCSTR lpFileName)
Definition: delete.c:24
DWORD WINAPI GetPrivateProfileSectionNamesW(LPWSTR buffer, DWORD size, LPCWSTR filename)
Definition: profile.c:1641
__wchar_t WCHAR
Definition: xmlstorage.h:180
unsigned long DWORD
Definition: ntddk_ex.h:95
#define SetLastError(x)
Definition: compat.h:409
int ret
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:126
#define todo_wine
Definition: test.h:154
#define broken(x)
Definition: _sntprintf.h:21
#define CREATE_ALWAYS
Definition: disk.h:72
#define ok(value,...)
Definition: atltest.h:57
#define ERROR_CALL_NOT_IMPLEMENTED
Definition: compat.h:92
#define CreateFileA(a, b, c, d, e, f, g)
Definition: compat.h:399
#define memset(x, y, z)
Definition: compat.h:39
#define CHAR(Char)
#define win_skip
Definition: test.h:141

Referenced by START_TEST().

◆ test_profile_string()

static void test_profile_string ( void  )
static

Definition at line 94 of file profile.c.

95 {
96  static WCHAR emptyW[] = { 0 }; /* if "const", GetPrivateProfileStringW(emptyW, ...) crashes on win2k */
97  static const WCHAR keyW[] = { 'k','e','y',0 };
98  static const WCHAR sW[] = { 's',0 };
99  static const WCHAR TESTFILE2W[] = {'.','\\','t','e','s','t','w','i','n','e','2','.','i','n','i',0};
100  static const WCHAR valsectionW[] = {'v','a','l','_','e','_','s','e','c','t','i','o','n',0 };
101  static const WCHAR valnokeyW[] = {'v','a','l','_','n','o','_','k','e','y',0};
102  HANDLE h;
103  int ret;
104  DWORD count;
105  char buf[100];
106  WCHAR bufW[100];
107  char *p;
108  /* test that lines without an '=' will not be enumerated */
109  /* in the case below, name2 is a key while name3 is not. */
110  char content[]="[s]\r\nname1=val1\r\nname2=\r\nname3\r\nname4=val4\r\n";
111  char content2[]="\r\nkey=val_no_section\r\n[]\r\nkey=val_e_section\r\n"
112  "[s]\r\n=val_no_key\r\n[t]\r\n";
116  ok( h != INVALID_HANDLE_VALUE, " cannot create %s\n", TESTFILE2);
117  if( h == INVALID_HANDLE_VALUE) return;
118  WriteFile( h, content, sizeof(content), &count, NULL);
119  CloseHandle( h);
120 
121  /* enumerate the keys */
122  ret=GetPrivateProfileStringA( "s", NULL, "", buf, sizeof(buf),
123  TESTFILE2);
124  for( p = buf + strlen(buf) + 1; *p;p += strlen(p)+1)
125  p[-1] = ',';
126  /* and test */
127  ok( ret == 18 && !strcmp( buf, "name1,name2,name4"), "wrong keys returned(%d): %s\n", ret,
128  buf);
129 
130  /* add a new key to test that the file is quite usable */
131  WritePrivateProfileStringA( "s", "name5", "val5", TESTFILE2);
132  ret=GetPrivateProfileStringA( "s", NULL, "", buf, sizeof(buf),
133  TESTFILE2);
134  for( p = buf + strlen(buf) + 1; *p;p += strlen(p)+1)
135  p[-1] = ',';
136  ok( ret == 24 && !strcmp( buf, "name1,name2,name4,name5"), "wrong keys returned(%d): %s\n",
137  ret, buf);
138 
141  ok( h != INVALID_HANDLE_VALUE, " cannot create %s\n", TESTFILE2);
142  if( h == INVALID_HANDLE_VALUE) return;
143  WriteFile( h, content2, sizeof(content2), &count, NULL);
144  CloseHandle( h);
145 
146  /* works only in unicode, ascii crashes */
148  sizeof(bufW)/sizeof(bufW[0]), TESTFILE2W);
149  todo_wine
150  ok(ret == 13, "expected 13, got %u\n", ret);
151  todo_wine
152  ok(!lstrcmpW(valsectionW,bufW), "expected %s, got %s\n",
153  wine_dbgstr_w(valsectionW), wine_dbgstr_w(bufW) );
154 
155  /* works only in unicode, ascii crashes */
157  sizeof(bufW)/sizeof(bufW[0]), TESTFILE2W);
158  ok(ret == 10, "expected 10, got %u\n", ret);
159  ok(!lstrcmpW(valnokeyW,bufW), "expected %s, got %s\n",
160  wine_dbgstr_w(valnokeyW), wine_dbgstr_w(bufW) );
161 
163 }
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
INT WINAPI GetPrivateProfileStringW(LPCWSTR section, LPCWSTR entry, LPCWSTR def_val, LPWSTR buffer, UINT len, LPCWSTR filename)
Definition: profile.c:1142
#define CloseHandle
Definition: compat.h:398
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
char * wine_dbgstr_w(const wchar_t *wstr)
Definition: atltest.h:87
int WINAPI lstrcmpW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:170
GLuint GLuint GLsizei count
Definition: gl.h:1545
#define INVALID_HANDLE_VALUE
Definition: compat.h:391
GLfloat GLfloat GLfloat GLfloat h
Definition: glext.h:7723
INT WINAPI GetPrivateProfileStringA(LPCSTR section, LPCSTR entry, LPCSTR def_val, LPSTR buffer, UINT len, LPCSTR filename)
Definition: profile.c:1204
#define GENERIC_WRITE
Definition: nt_native.h:90
content
Definition: atl_ax.c:994
smooth NULL
Definition: ftsmooth.c:416
BOOL WINAPI DeleteFileA(IN LPCSTR lpFileName)
Definition: delete.c:24
__wchar_t WCHAR
Definition: xmlstorage.h:180
static const WCHAR keyW[]
Definition: tokenize.c:60
unsigned long DWORD
Definition: ntddk_ex.h:95
int ret
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:126
#define todo_wine
Definition: test.h:154
#define TESTFILE2
Definition: profile.c:33
#define CREATE_ALWAYS
Definition: disk.h:72
static const WCHAR emptyW[]
Definition: navigate.c:36
#define ok(value,...)
Definition: atltest.h:57
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
#define CreateFileA(a, b, c, d, e, f, g)
Definition: compat.h:399
GLfloat GLfloat p
Definition: glext.h:8902
BOOL WINAPI DECLSPEC_HOTPATCH WritePrivateProfileStringA(LPCSTR section, LPCSTR entry, LPCSTR string, LPCSTR filename)
Definition: profile.c:1484

Referenced by START_TEST().

◆ test_WritePrivateProfileString()

static void test_WritePrivateProfileString ( void  )
static

Definition at line 938 of file profile.c.

939 {
940  BOOL ret;
941  LPCSTR data;
942  CHAR path[MAX_PATH];
943  CHAR temp[MAX_PATH];
944 
945  SetLastError(0xdeadbeef);
948  {
949  /* Win9x/WinME needs (variable) timeouts between tests and even long timeouts don't
950  * guarantee a correct result.
951  * Win9x/WinMe also produces different ini files where there is always a newline before
952  * a section start (except for the first one).
953  */
954  win_skip("WritePrivateProfileString on Win9x/WinME is hard to test reliably\n");
955  return;
956  }
957 
959  GetTempFileNameA(temp, "wine", 0, path);
960  DeleteFileA(path);
961 
962  /* path is not created yet */
963 
964  /* NULL lpAppName */
965  SetLastError(0xdeadbeef);
966  ret = WritePrivateProfileStringA(NULL, "key", "string", path);
967  ok(ret == FALSE, "Expected FALSE, got %d\n", ret);
969  broken(GetLastError() == ERROR_INVALID_PARAMETER) || /* NT4 */
970  broken(GetLastError() == 0xdeadbeef), /* Win9x and WinME */
971  "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
973  "Expected path to not exist\n");
974 
975  GetTempFileNameA(temp, "wine", 0, path);
976 
977  /* NULL lpAppName, path exists */
978  data = "";
979  SetLastError(0xdeadbeef);
980  ret = WritePrivateProfileStringA(NULL, "key", "string", path);
981  ok(ret == FALSE, "Expected FALSE, got %d\n", ret);
983  broken(GetLastError() == ERROR_INVALID_PARAMETER) || /* NT4 */
984  broken(GetLastError() == 0xdeadbeef), /* Win9x and WinME */
985  "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
986  ok(check_file_data(path, data), "File doesn't match\n");
987  DeleteFileA(path);
988 
989  if (0)
990  {
991  /* empty lpAppName, crashes on NT4 and higher */
992  data = "[]\r\n"
993  "key=string\r\n";
994  ret = WritePrivateProfileStringA("", "key", "string", path);
995  ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
996  ok(check_file_data(path, data), "File doesn't match\n");
997  DeleteFileA(path);
998  }
999 
1000  /* NULL lpKeyName */
1001  data = "";
1002  ret = WritePrivateProfileStringA("App", NULL, "string", path);
1003  ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
1004  todo_wine
1005  {
1006  ok(check_file_data(path, data), "File doesn't match\n");
1007  }
1008  DeleteFileA(path);
1009 
1010  if (0)
1011  {
1012  /* empty lpKeyName, crashes on NT4 and higher */
1013  data = "[App]\r\n"
1014  "=string\r\n";
1015  ret = WritePrivateProfileStringA("App", "", "string", path);
1016  ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
1017  todo_wine
1018  {
1019  ok(check_file_data(path, data), "File doesn't match\n");
1020  }
1021  DeleteFileA(path);
1022  }
1023 
1024  /* NULL lpString */
1025  data = "";
1026  ret = WritePrivateProfileStringA("App", "key", NULL, path);
1027  ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
1028  todo_wine
1029  {
1031  (broken(GetFileAttributesA(path) == INVALID_FILE_ATTRIBUTES)), /* Win9x and WinME */
1032  "File doesn't match\n");
1033  }
1034  DeleteFileA(path);
1035 
1036  /* empty lpString */
1037  data = "[App]\r\n"
1038  "key=\r\n";
1039  ret = WritePrivateProfileStringA("App", "key", "", path);
1040  ok(ret == TRUE ||
1041  broken(!ret), /* Win9x and WinME */
1042  "Expected TRUE, got %d\n", ret);
1044  (broken(GetFileAttributesA(path) == INVALID_FILE_ATTRIBUTES)), /* Win9x and WinME */
1045  "File doesn't match\n");
1046  DeleteFileA(path);
1047 
1048  /* empty lpFileName */
1049  SetLastError(0xdeadbeef);
1050  ret = WritePrivateProfileStringA("App", "key", "string", "");
1051  ok(ret == FALSE, "Expected FALSE, got %d\n", ret);
1053  broken(GetLastError() == ERROR_PATH_NOT_FOUND), /* Win9x and WinME */
1054  "Expected ERROR_ACCESS_DENIED, got %d\n", GetLastError());
1055 
1056  /* Relative paths are relative to X:\\%WINDIR% */
1058  GetTempFileNameA(temp, "win", 1, path);
1060  skip("Not allowed to create a file in the Windows directory\n");
1061  else
1062  {
1063  DeleteFileA(path);
1064 
1065  data = "[App]\r\n"
1066  "key=string\r\n";
1067  ret = WritePrivateProfileStringA("App", "key", "string", "win1.tmp");
1068  ok(ret == TRUE, "Expected TRUE, got %d, le=%u\n", ret, GetLastError());
1069  ok(check_file_data(path, data), "File doesn't match\n");
1070  DeleteFileA(path);
1071  }
1072 
1074  GetTempFileNameA(temp, "wine", 0, path);
1075 
1076  /* build up an INI file */
1077  WritePrivateProfileStringA("App1", "key1", "string1", path);
1078  WritePrivateProfileStringA("App1", "key2", "string2", path);
1079  WritePrivateProfileStringA("App1", "key3", "string3", path);
1080  WritePrivateProfileStringA("App2", "key4", "string4", path);
1081 
1082  /* make an addition and verify the INI */
1083  data = "[App1]\r\n"
1084  "key1=string1\r\n"
1085  "key2=string2\r\n"
1086  "key3=string3\r\n"
1087  "[App2]\r\n"
1088  "key4=string4\r\n"
1089  "[App3]\r\n"
1090  "key5=string5\r\n";
1091  ret = WritePrivateProfileStringA("App3", "key5", "string5", path);
1092  ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
1093  ok(check_file_data(path, data), "File doesn't match\n");
1094 
1095  /* lpString is NULL, key2 key is deleted */
1096  data = "[App1]\r\n"
1097  "key1=string1\r\n"
1098  "key3=string3\r\n"
1099  "[App2]\r\n"
1100  "key4=string4\r\n"
1101  "[App3]\r\n"
1102  "key5=string5\r\n";
1103  ret = WritePrivateProfileStringA("App1", "key2", NULL, path);
1104  ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
1105  ok(check_file_data(path, data), "File doesn't match\n");
1106 
1107  /* try to delete key2 again */
1108  data = "[App1]\r\n"
1109  "key1=string1\r\n"
1110  "key3=string3\r\n"
1111  "[App2]\r\n"
1112  "key4=string4\r\n"
1113  "[App3]\r\n"
1114  "key5=string5\r\n";
1115  ret = WritePrivateProfileStringA("App1", "key2", NULL, path);
1116  ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
1117  ok(check_file_data(path, data), "File doesn't match\n");
1118 
1119  /* lpKeyName is NULL, App1 section is deleted */
1120  data = "[App2]\r\n"
1121  "key4=string4\r\n"
1122  "[App3]\r\n"
1123  "key5=string5\r\n";
1124  ret = WritePrivateProfileStringA("App1", NULL, "string1", path);
1125  ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
1126  ok(check_file_data(path, data), "File doesn't match\n");
1127 
1128  /* lpString is not needed to delete a section */
1129  data = "[App3]\r\n"
1130  "key5=string5\r\n";
1132  ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
1133  ok(check_file_data(path, data), "File doesn't match\n");
1134 
1135  /* leave just the section */
1136  data = "[App3]\r\n";
1137  ret = WritePrivateProfileStringA("App3", "key5", NULL, path);
1138  ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
1139  ok(check_file_data(path, data), "File doesn't match\n");
1140  DeleteFileA(path);
1141 
1142  /* NULLs in file before first section. Should be preserved in output */
1143  data = "Data \0 before \0 first \0 section" /* 31 bytes */
1144  "\r\n[section1]\r\n" /* 14 bytes */
1145  "key1=string1\r\n"; /* 14 bytes */
1146  GetTempFileNameA(temp, "wine", 0, path);
1147  create_test_file(path, data, 31);
1148  ret = WritePrivateProfileStringA("section1", "key1", "string1", path);
1149  ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
1150  todo_wine
1152  broken( check_binary_file_data(path, /* Windows 9x */
1153  "Data \0 before \0 first \0 section" /* 31 bytes */
1154  "\r\n\r\n[section1]\r\n" /* 14 bytes */
1155  "key1=string1" /* 14 bytes */
1156  , 59)), "File doesn't match\n");
1157  DeleteFileA(path);
1158 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:91
#define TRUE
Definition: types.h:120
static BOOL check_file_data(LPCSTR path, LPCSTR data)
Definition: profile.c:933
static BOOL check_binary_file_data(LPCSTR path, const VOID *data, DWORD size)
Definition: profile.c:909
char CHAR
Definition: xmlstorage.h:175
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
#define ERROR_ACCESS_DENIED
Definition: compat.h:87
unsigned int BOOL
Definition: ntddk_ex.h:94
DWORD WINAPI GetFileAttributesA(LPCSTR lpFileName)
Definition: fileinfo.c:786
smooth NULL
Definition: ftsmooth.c:416
BOOL WINAPI DeleteFileA(IN LPCSTR lpFileName)
Definition: delete.c:24
const char * LPCSTR
Definition: xmlstorage.h:183
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
#define MAX_PATH
Definition: compat.h:26
#define SetLastError(x)
Definition: compat.h:409
#define INVALID_FILE_ATTRIBUTES
Definition: vfdcmd.c:23
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
int ret
#define todo_wine
Definition: test.h:154
BOOL WINAPI WritePrivateProfileStringW(LPCWSTR section, LPCWSTR entry, LPCWSTR string, LPCWSTR filename)
Definition: profile.c:1453
#define broken(x)
Definition: _sntprintf.h:21
static void create_test_file(LPCSTR name, LPCSTR data, DWORD size)
Definition: profile.c:511
DWORD WINAPI GetTempPathA(IN DWORD nBufferLength, OUT LPSTR lpBuffer)
Definition: path.c:2053
static calc_node_t temp
Definition: rpn_ieee.c:38
#define ok(value,...)
Definition: atltest.h:57
Definition: services.c:325
UINT WINAPI GetWindowsDirectoryA(OUT LPSTR lpBuffer, IN UINT uSize)
Definition: path.c:2336
#define skip(...)
Definition: atltest.h:64
#define ERROR_CALL_NOT_IMPLEMENTED
Definition: compat.h:92
#define ERROR_PATH_NOT_FOUND
Definition: winerror.h:106
BOOL WINAPI DECLSPEC_HOTPATCH WritePrivateProfileStringA(LPCSTR section, LPCSTR entry, LPCSTR string, LPCSTR filename)
Definition: profile.c:1484
#define win_skip
Definition: test.h:141
UINT WINAPI GetTempFileNameA(IN LPCSTR lpPathName, IN LPCSTR lpPrefixString, IN UINT uUnique, OUT LPSTR lpTempFileName)
Definition: filename.c:26

Referenced by START_TEST().